"Taschenrechner"
-
Moin!
Ich bin ein blutiger Anfänger in der Programmiersprache C. Ich habe bisschen rumgetüfftelt und habe jetzt folgendes Problem, das mein Programm fehler macht.
Der Code sieht wie folgt aus:
#include <stdio.h> void main() { int a,b,c; c=a+b; printf("die rechenoperation heisst: a + b = c\n\n"); printf("gib eine zahl fuer a ein:"); scanf("%d\n",&a); printf("a = %d\n\n", a); printf("gib eine zahl fuer b ein:"); scanf("%d\n",&b); printf("b = %d\n\n", b); printf("damit lautet das ergebnis: c = %d\n", c); }
Ich benutze den Compiler LCC Win32.
Das Problem bei diesem "Programm" ist folgendes:
Ich gebe "1" ein und dann "2". Eigentlich sollte "3" rauskommen.
Stattdessen kommt aber: -740172 raus. Irgendwas stimmt da doch nicht.Dann ist mir folgendes aufgefallen:
Wenn ich oben "int" in "short" umänder, kommt folgendes raus: 23124
Dazu kommt noch, dass mein Compiler bei dem Befehl "short" immer eine Fehlermeldung rausgibt.Beispiel zu dem Fehler:
Obwohl das Programm funktioniert, bringt er trotzdem den Fehler bei dem Befehl "short".
Dann habe ich noch eine Frage: Für ganze Zahlen nimmt man ja "short, int, long".
Den Unterschied zwischen short und long verstehe ich ja (short: +/- 32 Tausend; long: +/- 2 Milliarden).
Aber wozu brauche ich den Befehl "int". Und wenn es bei den Befehlen nur um die verschiedenen Längen im Speicher geht, warum kommen dann immer noch andere Ergebnisse raus?!Kann mir jemand bei meinen "Problemen" helfen?
Danke!
gruß sheddy
-
Grundlagen:
int ist kein Befehl, sondern ein Typ.
(Eventuell mit 0 initialisieren? Denn sonst haste irgendwas drin.)Und wo rechnest Du überhaupt?
c = a + b kannste erst ausführen, nachdem Du die zahlen eingegeben hast.#include <stdio.h> int main() { int a,b,c; c=0; printf("die rechenoperation heisst: a + b = c\n\n"); printf("gib eine zahl fuer a ein:"); scanf("%d\n",&a); printf("a = %d\n\n", a); printf("gib eine zahl fuer b ein:"); scanf("%d\n",&b); printf("b = %d\n\n", b); c = a + b; printf("damit lautet das ergebnis: c = %d\n", c); }
edit: es heisst
int main() {}
-
Eigentlich sollte "3" rauskommen.
Sollte man dazu nicht irgendwo im Quelltext vermerken, dass er beide Zahlen addieren soll?
-
-
wie wärs wenn wir den rechenvorgang einfach nach dem eingeben der zahlen machen??
ps du kannst dir c sparen wenn du
printf("Ergebnis: %d",a+b);
schreibst.
-
/* Kleiner Taschenrechner */ #include <stdio.h> int main() { /* Variablen zum Rechnen */ int a,b,c; /* ## Daten vom User einlesen ########################################### */ printf("die rechenoperation heisst: a + b = c\n\n"); printf("gib eine zahl fuer a ein:"); /* 'a' einlesen. * NICHT: scanf("%d\n", &a); * scanf() soll nicht auf 2x [ENTER] warten. */ scanf("%d",&a); printf("a = %d\n\n", a); printf("gib eine zahl fuer b ein:"); /* 'b' einlesen. * NICHT: scanf("%d\n", &b); * scanf() soll nicht auf 2x [ENTER] warten. */ scanf("%d",&b); printf("b = %d\n\n", b); /* ## Eingelesene Daten verarbeiten ##################################### */ /* NACHDEM 'a' und 'b' eingelesen wurden, Berechnung * durchfuehren... */ c = a + b; /* Ergebnis ausgeben... */ printf("damit lautet das ergebnis: c = %d\n", c); return 0; }
Hinweis: Das
\n
im Formatstring vonscanf()
anzugeben, ist eigentlich keine so gute Idee.scanf()
ist eine Funktion zum Einlesen von Eingaben über die Tastatur, und ein\n
im Formatstring (das ist das, was sich nun als"%d"
darstellt und die Formatierung des eingelesenen Werts regelt) fordert zusätzlich zum ohnehin notwendigen [ENTER] für den Abschluss der Eingabe noch ein weiteres.Ausserdem sollte man sich angewöhnen, anstatt
void main()
int main()
zu schreiben, und dann ganz unten (vor dem letzten{
) mitreturn 0;
den Programmfluss zu beenden.Das bei dir beim Rechnen solche seltsamen Werte (noch dazu völlig unterschiedliche) herausgekommen sind, ist kein Wunder. Durch die Anweisung (nicht Befehl!)
int a;
hast du im Speicher den Platz für einenint
reserviert. An diesem reservierten Speicherplatz steht aber ein zufälliger Wert, da ihn entweder ein anderes Programm vorher verwendet hat oder eine Initialisierung des Speichers durch das Betriebssystem nicht stattgefunden hat (sowas wäre eigentlich ja auch Schwachsinn). Nachdem du also den Speicher für deine Variablen erhalten hast, beginnst du mit den zufälligen Zahlen zu rechnen. Nachdem das Ergebnis feststeht und inc
gespeichert wurde, überschreibst dua
undb
durch die User-Eingaben. Wenn du dannc
als Ergebnis ausgibst, steht aber immernoch die Summe der beiden zufälligen Zahlen drinnen.Probiere es einfach mal aus, starte das Programm auf einem anderen Rechner (meistens genügt auch schon ein Neustart, manchmal sogar einfach ein Neuaufruf des Programms) und du wirst feststellen, dass das Ergebnis ein Anderes ist (purer Zufall eben). Um solche Seiteneffekte zu umgehen, initialisiert man neu angelegte Variablen meistens mit 0 (in etwa so:
int a = 0;
). Und dass die Berechnung erst ausgeführt werden kann, wenn du die beiden Operanden eingelesen hast, sollte inzwischen klar sein...
-
Danke euch.
Dann habe ich irgendwie ein Buch, das viele Fehler enthält.
In dem Buch wird jedes Prgramm mit "void main()" begonnen. Ich weiß zwar noch nicht genau, was das bedeutet, aber das bekomme ich noch raus.
Des Weiteren sagt das Buch nichts über die vorherige Initialisierung der Varibalen, sondern beginnt eben mit "int a,b,c;".
Danke für die Hinweise...
lg sheddy
-
Joah, ist wohl schon etwas älter, das Buch. Ich bin jetzt auch nicht gerade in der
void main()
-Thematik drinnen, aber eigentlich wird derreturn
-Wert verwendet, um dem OS mitzuteilen, ob das Programm korrekt beendet wurde oder Fehler aufgetreten sind. Beivoid
hat das OS dann allerdings keine Chance, so etwas herauszufinden...Vom Standard wird IMHO
int main()
erwartet, aber die meisten Compiler unterstützen diese Schreibweise immernoch, da dasvoid main()
relativ weit verbreitet ist. Meistens gibt's dann lediglich ein Warning.Dass dort nichts über Initialisierung von Variablen steht, ist teils verständlich, teils aber auch nicht. Wenn sie angelegt werden, sind sie immer (es sei denn, sie sind global - aber darauf verlasse ich mich persönlich nicht) uninitialisiert. D.h. in ihnen steht der Wert, der vorher an der jetzt reservierten Stelle im Speicher stand - und der ist rein zufällig. Allerdings kann man Variablen beim Erzeugen auch gleich initialisieren, was viel sicherer ist, da dann keine seltsamen, unverständlichen Ergebnisse rauskommen und man den Fehler an falscher Stelle sucht. Hier ein Beispiel:
int a; /* Uninitialisiert! */ int b, c; /* Beide uninitialisiert! */ int d = 0; /* Mit 0 initialisiert */ int e = 42, f = 23; /* Beide initialisiert */
Hier nochmal der direkte Vergleich für deine Berechnungen:
/* Uninitialisiert */ int a, b, c; c = a + b; /* -> c = zufaellig, da a und b zufaellig. Folgerung: * Berechnungsfehler */ /* Initialisiert */ int d = 0, e = 0, f = 0; f = d + e; /* -> f = 0, da d und e 0. Folgerung: * Berechnung mit falschen Werten, d und e muessen offensichtlich * falsch sein */
Ich glaube, wenn man die Variablen initialisiert, ist es ganz leicht, den Fehler zu finden, wie die möglichen Folgerungen hier demonstrieren. Bei 1 + 2 = -740172 vermutet man in erster Linie einen Überlauf und sucht evtl. an völlig falscher Stelle, bei 1 + 2 = 0 ist allerdings relativ schnell klar, dass da was mit der 1 und 2 nicht stimmen kann...oder es ist zumindest einfacher, darauf zu schließen.