Seite 1 von 1

Anfängerfrage: Woher rührt der "Rechenfehler"?

Verfasst: Mi Jul 31, 2013 9:28 am
von ProgBeginner
Hallo ;)

Da ich noch dabei bin, C zu lernen, und mich hierfür hauptsächlich ( aber nicht nur ) an dem hier zu findenden Tutorial bediene, habe ich mal eine eigene Implementierung gefertigt, welche allerdings irgendwo, zumindest für die menschenverständliche Rechenlogik der Grundschule, einen Rechenfehler begeht, und zwar einen ziemlich großen.

Basierend auf der bekannten Aussage, dass ein Jahr Hundealter 7 Menschenjahren entspricht, fragt mein Code den Benutzer nach seinem Alter und legt diese in der Variable :

Code: Alles auswählen

int Jahre;
ab. In der Variable JahreHund wird Jahre durch 7 geteilt.

Code: Alles auswählen

int JahreHund = Jahre / 7;
Wenn ich die Frage nach meinem Alter mit 35 beantworte ( um eine Zahl zu haben, deren Teilung durch 7 Modulo 0 ergibt, also durch 7 teilbar ist ), wird mir allerdings gesagt, das entspräche 8 Hundejahren - also "zwischen den Zeilen" die Aussage, 35 / 7 ergäbe 8. Wenn ich richtig rechne, sind 35 durch 7 aber 5.

Hier der komplette Quellcode:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int Jahre;
int JahreHund = Jahre / 7;

printf("Gebe bitte ein, wie alt du bist : ");
scanf("%d",&Jahre);
fflush(stdin);
printf("\nDu bist %d Jahre alt.\n",Jahre);
printf("\nDas macht %d Hundejahre\n", JahreHund);
system("PAUSE"); // Auf Tastendruck warten, erst dann beenden
return 0;
}
Woher die 8 in JahreHund bei Eingabe von 35 als Alter? Ich versteh's nicht ...


ProgBeginner

// EDIT // Hat sich schon erledigt - Fehler gefunden.

Hier der korrigierte ( und korrekt arbeitende ) Code :

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int Jahre;

printf("Gebe bitte ein, wie alt du bist : ");
scanf("%d",&Jahre);
fflush(stdin);
printf("\nDu bist %d Jahre alt.\n",Jahre);
int JahreHund = Jahre / 7;
printf("\nDas macht %d Hundejahre\n", JahreHund);
system("PAUSE"); // Auf Tastendruck warten, erst dann beenden
return 0;
}
Gezogenes Fazit: Die Variablendeklaration für JahreHund war an der falschen Stelle ....

Re: Anfängerfrage: Woher rührt der "Rechenfehler"?

Verfasst: Mi Jul 31, 2013 3:01 pm
von Xin
Aber nach unserem Tutorial lernst Du nicht. ^^

scanf() habe ich hoffentlich nie in einer Form erwähnt, dass es jemand absichtlich benutzt. :->

Re: Anfängerfrage: Woher rührt der "Rechenfehler"?

Verfasst: Mi Jul 31, 2013 4:23 pm
von cloidnerux
Gezogenes Fazit: Die Variablendeklaration für JahreHund war an der falschen Stelle ...
Falsches Fazit.
Dein Problem ist nicht die Deklaration sondern die Zuweisung. Mich hat schon gewundert, dass da konstant 8 rauskommen sollte.
In C/C++ und sehr vielen anderen Sprachen ändert eine Variable nur ihren Wert, wenn man ihr einen neuen zuweist:

Code: Alles auswählen

int i = 0;   //i ist 0
i = 10; //i ist 10
//i bleibt auch erstmal 10
Was du aber gemacht hast:

Code: Alles auswählen

int Jahre;
int JahreHund = Jahre / 7;
war die Variable in Gedanken zu verknüpfen: JahreHund soll immer ein Siebtel von Jahre sein. Ist es aber nicht. Weil du nichts verknüpfen kannst. Du hast etwas zugewiesen. Nämlich Jahre/7. Aber da Jahre zum einen nicht Definiert ist, zum anderen gar nicht dem vom Benutzer eingegeben Wert beinhaltet, kommt da nur mist raus.
Daher funktioniert auch dein zweiter Code: Da hat Jahre schon den richtigen Wert! Daher funktioniert es auch.
Du hättest dir dabei aber auch die Verschiebung der Deklaration sparen können. Du hättest nur nach Eingabe des Alters den durch 7 geteilten Wert in der Richtigen Variable speichern müssen.

Re: Anfängerfrage: Woher rührt der "Rechenfehler"?

Verfasst: Do Aug 01, 2013 6:03 am
von ProgBeginner
Xin : scanf() hab ich auch nicht von hier, da hast Du gut aufgepasst :D

Re: Anfängerfrage: Woher rührt der "Rechenfehler"?

Verfasst: Do Aug 01, 2013 10:10 am
von Xin
ProgBeginner hat geschrieben:Xin : scanf() hab ich auch nicht von hier, da hast Du gut aufgepasst :D
Bitte schau Dir, wenn Du soweit bist, die Seite zu scanf() an und dann beschäftige Dich doch mal mit den Programm-Parametern aus dem Tutorial.

Re: Anfängerfrage: Woher rührt der "Rechenfehler"?

Verfasst: So Aug 04, 2013 11:55 am
von naums
inhaltliche Frage: Hundejahre sind länger als Menschenjahre?

Und kleiner Hinweis: wenn du auf die Idee kommen solltest und dein Programm mal mit Kommazahlen arbeiten lassen willst, zb. so:

Code: Alles auswählen

double JahreHund = Jahre / 7;
Dann bekommst du immernoch ganze Zahlen heraus. Das passiert, weil dein Programm intern erst zwei Ganzzahlen dividiert, wo immer eine Ganzzahl bei rauskommt, und dann erst ins double-Format überführt. das könntest du Ändern, indem du einen der beiden Parameter dem programm als float aufdrückst:

Code: Alles auswählen

double JahreHund = float(Jahre) / 7;
Siehe dazu casts.

Huch. Dezent offtopic. ;)

MfG