Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zum Befehl ? :



°Light°
29.05.2010, 19:55
Hallo zusamen ich arbeite mich grade durch diese (http://www.eggdrop.ch/texts/c/) Seite bei Punkt 5.5 kommt eine Aufgabe bei der man einen mini Taschenrechner macht der jeweils 2 zahlen + - * oder / macht. Die Lösung davon sieht so aus


#include <stdio.h>

int main(int argc, char *argv[])
{
int x,z1,z2,ergebnis;

printf("Welche Operation möchtest du durchführen?\n");
printf("1. Addition\n");
printf("2. Subtraktion\n");
printf("3. Multiplikation\n");
printf("4. Division\n");
printf("5. Programm beenden\n");
scanf("%d", &x);

if (x>4?0:x<1?0:1)
{
printf("Eingabe: %d\n", x);
printf("Gib die 1. Zahl ein: ");
scanf("%d", &z1);
printf("Gib die 2. Zahl ein: ");
scanf("%d", &z2);

printf("Ergebnis: ");
switch(x)
{
case 1:
ergebnis=z1+z2;
printf("%d + %d = %d\n", z1, z2, ergebnis);
break;
case 2:
ergebnis=z1-z2;
printf("%d - %d = %d\n", z1, z2, ergebnis);
break;
case 3:
ergebnis=z1*z2;
printf("%d * %d = %d\n", z1, z2, ergebnis);
break;
case 4:
ergebnis=z1/z2;
printf("%d / %d = %d", z1, z2, ergebnis);
if (z1%z2!=0)
{
ergebnis=z1%z2;
printf(" Rest %d", ergebnis);
}
printf("\n");
}
}
else
{
if (x!=5)
{
printf("Falsche Eingabe!\n");
return 1;
}
}
printf("Vielen Dank für das Benutzen dieses Programms!\n");

return 0;
}


so und nun zu frage bei dem Befehl der Fett ist verstehe ich nicht warum die letze zahl eine 1 ist ? eigentlich sollte das doch ein x sein oder sehe ich das falsch ? Wenn da eine 1 steht so müsst aus dem x eine 1 werden un immer nur der 1 Fall auftreret also die addition. Hoffe ihr versteht was ich meine und einer kann mir das erklären ^^

blackberry
29.05.2010, 20:20
Eigentlich sollte man diesen Source gleich löschen und nie wieder davon sprechen, damit niemals jemand einen so schlechten Stil nachmacht.
Ich bitte dich: gewöhne dir das NIE an!

Was der Typ hier macht ist in einem If zweimal einen Ternery-Operator verschachtelt zu benutzen.
Geklammert sieht das so aus:
x>4 ? 0 : (x<1 ? 0 : 1)

Es steht also da:
0, wenn x > 4, oder x < 1
1, wenn nicht 0 (also 1 <= x <= 4)

In C gibt es eine besondere Art Wahrheitswerte auszudrücken:
0 = falsch
alles ungleich 0 = wahr (folglich: 1 = wahr)

Sollte also aufgrund der Bedingungen im Ternary-Operator eine 0 rauskommen wird der Code der zur If-Abfrage gehört nicht ausgeführt - sollte dort eine 1 stehen jedoch schon.


Besserer Stil:
if (x >= 1 && x <= 4)

oder:
if (!(x < 1 || x > 4))

°Light°
29.05.2010, 21:48
ahh jetz verstehe ich es :) deine art das zu schreiben ist eindeutig viel einfacher zu verstehen. Danke dir BlackBerry

noch iene Frage wenn ich ein "oder" negiere also !(||) dann wird daraus ein "und" also && ist das richtig ?

sp1nny
29.05.2010, 23:52
Nein.

Bei dieser Aufgabe wäre es dann nach deiner Logik:

if (!(x < 1 || x > 4))
->
if (x < 1 && x > 4)

Dies kann deshalb schon nicht sein, da es keine Zahl gibt die kleiner 1 und gleichzeitig größer 4 ist.
Dies würde zudem zu einem Fehler führen, da Zahlen Ausserhalb {1, 2, 3 ,4} garnicht bearbeitet werden könnten (in der Aufgabe (die IF-Abfrage schließt ja diesen Bereich aus)).

Das '||' liefert ein true zurück wenn eine der beiden Bedingungen zutrifft. Dieses wird mit '!' zu einem false. '&&' wird false wenn nur eine oder keine der beide Bedinungen zutreffen.

(true || true) -> true
(true || false) -> true
(false || false) -> false

___ Umkehrung ___

(!(true || true)) -> false
(!(true || false)) -> false
(!(false || false)) -> true

___ ungleich ___

(true && true) -> true
(true && false) -> false
(false && false) -> false

°Light°
30.05.2010, 10:48
ahso okay ich ich habe das mit größer und kleiner nicht berucksichtigt.
Danke nochmal für die Erklärung :)

Mfg °LIGHT°

habe da nochmal so ne frage da ich kein neues thema öffnen wollte schreib ichs hier rein
ich habe in wxdev c++ folgendes geschrieben


#include <stdio.h>
#include <conio.h>

main()
{
char buchstabe;

printf ("Gebe einen Buchstaben ein: ");
scanf ("%c", buchstabe);
fflush(stdin);

printf("Sie haben %c eingegeben\n", buchstabe);
getch();

}
wen ich das ausfürhe sollte mir am ende der buchstabe gezeigt werden den ich eingegeben habe aber ich kireg immer diese (http://img228.imageshack.us/img228/9304/unbenanntya.png) Meldung liegt das an wxdev c++ oder an mir ^^

blackberry
30.05.2010, 10:57
scanf ("%c", &buchstabe);

Edit: Erklärung:
C übergibt Variablen in der Regel "by value" - das heißt nur den Wert.
Für scanf heißt das, dass es im Grunde keine Ahnung hat wo deine Variable liegt - du übergibst nur deren Wert - eine lokale Änderung dieses Wertes in scanf selber hat keine Auswirkungen nach außen.

Um dieses Problem zu überwinden nimmt scanf nur Adressen von Variablen an (in der Praxis natürlich auch anderes, da scanf es nicht überprüfen kann, das führt jedoch zu dem dir bekannten Fehler).

Scanf macht dann im Grunde sowas wenn etwas eingelesen wurde und das nun gespeichert werden soll:
*((int *) dieAdresseVonDerVariablen) = was auch immer

Wenn du nur einen char übergibst steht da ein Wert von 0 bis 0xFF drin und es wird versucht das eingelesene an diese Speicheradresse zu schreiben - das führt zu fehlern.

Edit 2:
Bitte bitte bitte NIEMALS einfach nur main() { ... schreiben.
main ist eine Funktion, die einen Integer zurückgibt und sollte darum auch int main() { ... heißen.
Das sage ich nicht, weil es einfach schöner und sauberer ist, sondern weil die andere Variante falsch ist.
Sollte dein Compiler das tatsächlich fressen, dann stammt er entweder aus dem letzten Jahrhundert (im C-89 Standart war das noch erlaubt), oder ist einfach kein echter C-Compiler.

sp1nny
30.05.2010, 10:58
Du hast den Adressoperator (&) bei scanf vergessen.


#include <stdio.h>
#include <conio.h>

main()
{
char buchstabe;

printf ("Gebe einen Buchstaben ein: ");
scanf ("%c", &buchstabe);
fflush(stdin);

printf("Sie haben %c eingegeben\n", buchstabe);
getch();

}

°Light°
30.05.2010, 11:05
ajajaj immer diese keleine dinge ^^ danke euch