Quersumme Problem
-
@ alle die das hier lesen,
Ich wollte ein Programm schreiben welches die Quersumme einer Zahl berechnet.
Bis jetzt hab ich diesen Code:
//--------------------------------------------------------------------------- #include <stdio.h> #include <conio.h> #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int a, b, erg, zahl; int main(int argc, char* argv[]) { printf("\n\n Quersumme einer ganzen Zahl"); printf("\n Geben Sie eine ganze Zahl ein deren Quersumme berechnet" "werden soll"); scanf("%i",&zahl); a=0; do { b=a; scanf("%1i",&a); if(a!=10) { erg=a+b; } else{} }while(a!=10); printf("Die Quersumme aus %i",zahl," lautet %i",erg," !"); getch(); return 0; } //---------------------------------------------------------------------------
Irgendwie scheint die Abbruchbedingung nicht richtig zu sein. Das Programm soll das Einlesen und Addieren der einzelnen Ziffern beenden wenn Return gedrückt wurde.
-
Weshalb muss der Anwender die Ziffern eingeben?
Viel schöner wäre doch:#include <stdio.h> #include <string.h> int main (void) { char buf[15+1]; int quersumme = 0; register int i,laenge = 0; printf ("Geben sie die Zahl ein deren Quersumme gebildet werden soll. "); gets (buf); laenge = strlen (buf); while (i < laenge ) { quersumme += (buf[i] - '0'); i++; } printf ("\nDie Quersumme ist %d", quersumme); getchar (); return 0; }
Edit:
Dummer Fehler unterlaufenEdit2:
Hab ja ganz vergessen dass die Quersumme über 10 ja weiter berechnet werden muss,
wart mal 5min dann liefer ich ne richtige Version
-
Vielleicht hab ich da was falsch verstanden, aber der Anwender gibt die Zahl in einem ein, und wenn er Return drückt soll das Programm das Ergebnis ausgeben.
Noch ein Problem: Ich bin C noch am lernen und kenne einige Befehle gar nicht.
Strings, Arrays und Zeiger hatten wir noch gar nicht.Also was ich eigentlich wissen wollte war: Wie check ich ob Return gedrückt wurde (am Ende der Eingabe).
-
Also Return muss gedrückt werden, damit dein Programm überhaupt die eingegebenen
Zeichen erhält.
Wenn ihr das alles noch nicht hattet wird es etwas schwerer, du musst die Zahl
dann in ihre Ziffern zerlegen, ich mach dir das mal fix, meine jetztige Methode
hätte mit ner rekursiven Funktion und nem Zeiger gearbeitet, aber wenn ihr das
noch nicht hattet, dann mach ich es anderst.
-
Ich dachte mit diesem Algorithmus
do{ scanf("%1i",&a); // %1i liest ein integer ein // %1c liest ein char ein; oder nicht?? }while(Abbruchbedingung)
würde man immer nur ein Zeichen einlesen.
-
Ja so liest du immer ein Zeichen ein, wenn der Benutzer also die Quersumme von
52 wollte müsste er einmal die 5 und einmal die 2 eingeben, was dazu führen würde,
dass er genau wissen muss wie er die Quersumme errechnen kann und was außerdem
umständlich ist, viel einfacher wäre es doch einfach "52" einzugeben und der PC
berechnet die Quersumme, was 7 wäre und gibt sie aus.Deine Abbruchbedingung ist auch nicht ganz optimal, bei a != 10, würde er nur bei
10 abbrechne, jedoch muss er nur so lange rechnen wie a > 9 ist, also 10 und höher,
unter 10 ist er fertig und kann die Quersumme ausgeben.Edit:
Ich muss gleich los und komme gerade nicht mehr darauf wie man Zahlen in ihre
Ziffern zerlegen kann, hatte das erst vor kurzem mal ausgetüftelt, aber mir fällt
es einfach nicht mehr einAlso das Konzept:
-Zahl vom Benutzer einlesen (int zahl)
-Ergebnis den Wert von Zahl zuweisen
-So lange das Ergebnis (int ergebnis) größer oder gleich 10 ist weitermachen
in der Schleife
-In der Schleife Ergebnis in Ziffern zerlegen und diese addieren, entweder direkt
zu Ergebnis oder in eine Temp-Variable, am Ende der Schleife Ergebnis den
Wert der Temp-Variable zuweisenDu brauchst gar keine do-while Schleife, eine while reicht, denn wenn a <= 9
ist, dann hast du die Quersumme ja schon und kannst sie direkt ausgeben.Mal zu dem ganzen Pseudocode, denke das gekrakel da oben hilft dir nicht.
int ergebnis;
int temp;scanf ("%d",&ergebnis),
while ( ergebnis >= 10) {
temp = ergebnis_ziffer_1+ergebnis_ziffer_2+ergebnis_ziffer_x;
ergebnis = temp;
}printf ("Quersumme %d",ergebnis
so sieht das dann aus, aber wie gesagt mir fällt grad nicht mehr ein wie man
die Ziffern einer Zahl bekommt.
-
weiß auch nicht wie ich auf 10 gekommen bin. man müsste doch '\n' als Abbruchbedingung eingeben.
-
Verwende doch einfach a != 'e' , wenn der benutzer ein e eingibt, dann bricht
das ganze ab, aber eine while-schleife wäre da besser, da sonst die ASCII-Zahl
von dem e auch noch mitaddiert wird.
Eine 0 würde sich auch anbieten, da man bei der Quersumme ja keine 0 zu addieren braucht.
-
TheSilence schrieb:
weiß auch nicht wie ich auf 10 gekommen bin. man müsste doch '\n' als Abbruchbedingung eingeben.
ASCII Wert von '\r' und '\n' sind 10 und 13
ein Zeilenumbruch unter Windows ist ein "\r\n"So bist du vermutlich darauf gekommen.
Aber bedenke: schreibe NIE ASCII Code in den Quelltext - das bringt nix.
Ein '\n' ist viel deutlicher
Um alle Ziffern einer eingegebenen Zahl zu bekommen empfehle ich ein:
int c; int sum=0; while((c=getchar())!='\n') { if(!isdigit(c)) continue; sum+=c-'0'; }
-
Shade Of Mine schrieb:
int c; int sum=0; while((c=getchar())!='\n') { if(!isdigit(c)) continue; sum+=c-'0'; }
So hast du zwar alle Ziffern am Anfang,das kann mein erstes oben auch, aber
was wenn sum > 9 ist?
Wie rechnest du nun weiter?
-
SirLant schrieb:
So hast du zwar alle Ziffern am Anfang,das kann mein erstes oben auch, aber
was wenn sum > 9 ist?
Wie rechnest du nun weiter?Verstehe ich nicht
sum ist ein int - dh da passt eigentlich genug rein, und mehr als 9 sowieso.
Was meinst du genau?
-
SirLant schrieb:
Ich muss gleich los und komme gerade nicht mehr darauf wie man Zahlen in ihre
Ziffern zerlegen kann, hatte das erst vor kurzem mal ausgetüftelt, aber mir fällt
es einfach nicht mehr einMan kann eine Zahl mit dem modulus Operator ( % ) in ihre Ziffern zerlegen.
int quersumme=0; while(zahl>0) { quersumme+=zahl%10; zahl/=10; }
Aber ich würde empfehlen die Methode von Shade Of Mine zu benutzen.