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

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

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

Beitrag von ProgBeginner » Mi Jul 31, 2013 9:28 am

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 ....
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

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

Beitrag von Xin » Mi Jul 31, 2013 3:01 pm

Aber nach unserem Tutorial lernst Du nicht. ^^

scanf() habe ich hoffentlich nie in einer Form erwähnt, dass es jemand absichtlich benutzt. :->
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

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

Beitrag von cloidnerux » Mi Jul 31, 2013 4:23 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

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

Beitrag von ProgBeginner » Do Aug 01, 2013 6:03 am

Xin : scanf() hab ich auch nicht von hier, da hast Du gut aufgepasst :D
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

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

Beitrag von Xin » Do Aug 01, 2013 10:10 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

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

Beitrag von naums » So Aug 04, 2013 11:55 am

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
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten