Ganz einfach: Quersumme
-
Hallo zusammen
Ich bin der absolute Anfänger, was C++ betrifft und ich bin im Moment daran, die Grundlagen zu erlernen.
Nun versuche ich, eine Funktion zu schreiben, die von einer eingegebenen, vierstelligen Zahl die Quersumme berrechnet.
Ich weiss, es gibt viele Beispiele im Internet, aber keines hat grosse Ähnlichkeit mit meinem Beispiel, ich bin mir jedoch sicher, dass es so ähnlich gehen sollte.Dies ist mein Code:
#include <iostream> using namespace std; int main() { char Zahl[3]; cout << "Bitte geben Sie eine vierstellige Zahl ein!" << endl; cin >> Zahl; int Quersumme=0; for (int Zaehler=0;Zaehler<=3;Zaehler++) { Quersumme+=Zahl[Zaehler]; } cout << "Quersumme: " << Quersumme << endl; system("Pause"); }
Jedoch gibt dies nie das richtige Resultat
Könnt ihr mir helfen?
Vielen Dank
Lukas
-
Quersumme+=Zahl[Zaehler]-'0';
-
char Zahl[3];
kann 2 zeichen weil das letze zeichen für die NULL (ende String) reserviert ist, und du willst 4 zahlen eingeben?? d.h ->
char Zahl[5];
2. char == Zeichen also char != Zahl/Ziffer das bedeutet du musst jede Zahl des Strings , welche vom PC als Zeichen interpretiert wird erst in eine für ihn in eine reale Zahl umwandeln Stichwort "atoi()" d.h. ->
Quersumme+=atoi(Zahl[iZaheler]);
3. WEnn du mit C++ hantierst, dann nim std::string statt char
-
Nö, nimm int und spiel mit / und % (Modulo) rum.
-
Michael E. schrieb:
Nö, nimm int und spiel mit / und % (Modulo) rum.
#include <iostream> using namespace std; int groesseErmitteln( int zahl, int basis = 1 ) { if( zahl < basis ) return basis / 10; return groesseErmitteln( zahl, basis * 10 ); } int quersumme( int zahl ) { int qs = 0; int teiler = groesseErmitteln( zahl ); for( ; zahl >= 1; zahl %= teiler, teiler /= 10 ) qs += zahl / teiler; return qs; } int main() { int zahl; cout << "Zahl eingeben: "; cin >> zahl; cout << quersumme( zahl ) << endl; }
-
int zahl = 1337; int qs = 0; while(zahl != 0) { qs += zahl % 10; zahl /= 10: }
-
Michael E. schrieb:
int zahl = 1337; int qs = 0; while(zahl != 0) { qs += zahl % 10; zahl /= 10: }
oder so
-
@Michael:
So hätte ich es ja auch gemacht, aber so kann man das ganze auch mit double oder float machen : )int zahl = 1337; //double/float/... zahl = 1338 ^^ int qs = 0; while(zahl > 9) { qs += zahl % 10; zahl /= 10; } qs += zahl;
Das ganze könnte man noch in ne Funktion packen - die sich immer wieder aufruft, so lange die Quersumme größer als neun ist?!
Oder so (wobei es mir noch nicht so recht gefällt -.-):<template T> unsigned char Quersumme (T zahl) { T qs (0); while(zahl >= 10) { qs += zahl%10; zahl /= 10; } qs += zahl; while (qs >= 10) { qs = qs%10; zahl = qs/10; while(zahl >= 10) { qs += zahl%10; zahl /= 10; } qs += zahl; }; return static_cast <unsigned char> (qs); };
-
unskilled schrieb:
@Michael:
So hätte ich es ja auch gemacht, aber so kann man das ganze auch mit double oder float machen : )Nö, weil Modulo nur bei Ganzzahltypen benutzt werden kann. Desweiteren machen Fließkommazahlen auch keinen Sinn, da ich Quersummen nur im Zusammenhang mit natürlichen (höchstens ganzen) Zahlen kenne.
Edit: Willst du die einstellige Quersumme, kannst du das folgendermaßen machen:
int sumOfDigits(int number) { if(number < 10) return number; int result = 0; while(number != 0) { result += number % 10; number /= 10; } return umOfDigits(result); }
-
Oder so:
int sum(int zahl) { if (!(zahl)) return 0; return zahl%10+sum(zahl/10); }
Mein 300ter Beitrag!!!
-
Hallo Lukas !
LukasM schrieb:
... ich bin mir jedoch sicher, dass es so ähnlich gehen sollte.
Jo, tut es.
LukasM schrieb:
Jedoch gibt dies nie das richtige Resultat
Könnt ihr mir helfen?Quersumme+=Zahl[Zaehler];
Deine Rechnung addiert den ASCII Code.
Jedem Zeichen ist intern eine Zahl zugeordnet. Wenn du nicht gerade im Unicode Modus programmierst, wird meist der ASCII Code benutzt.Die Zahl 0 ist intern 48, die Zahl 1 ist intern 49, ..., usw.
http://de.wikipedia.org/wiki/ASCII-Tabelle
Wenn du also in deinem Programm 00 eingibst, bekommst du als Quersumme 96 raus, nehme ich mal stark an.Schreibst du nun aber
Quersumme+=Zahl[Zaehler] - '0';
Wird eine eingegebene '0' intern zu 48 - 48 berechnet und du bekommst das gewünschte Ergebnis !
Achso und wenn du 4 Zeichen einlesen möchtest, dann solltest du auch
char Zahl[4] schreiben, sonst kommen auch falsche Werte raus, weil auf einen nicht definierten Speicherbereich zugegriffen wird.
-
Hallo zusammen
Ja, ich geb's zu, ich bin total überrascht - so viele Antworten hätte ich nicht erwartet
Also ich hab jetzt mal alle Varianten ausprobiert, oder auf jeden Fall probiert. Mit der Möglichkeit von rname und B.B. hatte ich keine Probleme, und die Lösung ist mir verständlich.
Beim Punkt 1 des Posts von BorisDieKlinge blicke ich noch nicht ganz durch: Ein Array beginnt doch bei Null (so bin ich es auf jeden Fall von anderen Programmiersprachen gewohnt). Das letzte Zeichen muss NULL sein (danke für den Hinweis :)). Müsste es denn nicht so deklariert werden (B.B. hat es ja auch so beschrieben):char Zahl[4]
Zum 2. Punkt bei BorisDieKlinge: Irgendwie bringe ich das nicht fertig mit atoi - kannst du mir sagen, was ich falsch mache:
#include <iostream> using namespace std; int main() { char Zahl[4]; cout << "Bitte geben Sie eine vierstellige Zahl ein!" << endl; cin >> Zahl; int Quersumme=0; for (int Zaehler=0;Zaehler<=3;Zaehler++) { Quersumme+=atoi(Zahl[Zaehler]); } cout << "Quersumme: " << Quersumme << endl; system("Pause"); }
Die Fehlermeldung heisst "invalid conversion from `char' to `const char*'" und tritt in Zeile 12 des obenstehenden Codes auf.
Mit / und % hab ich's eben schon geschafft, aber ich wollte eben noch eine andere Variante versuchen.Vielen Dank für eure bisherigen Antworten - und auch für die, welche sich nochmals die Mühe geben
Lukas
-
-
Hmmm - sry, ich nahm an, dass double und float auch den Modulo-Operator besitzen (ja, ich weiß mathematisch gesehen genug um zu erkennen, dass es bei Dezimalzahlen keinen Sinn hat, aber so könnte man das eben mit größeren Zahlen durchspielen als 2^64-1). Mein Fehler : /
-
LukasM schrieb:
.. Das letzte Zeichen muss NULL sein (danke für den Hinweis :)). Müsste es denn nicht so deklariert werden (B.B. hat es ja auch so beschrieben):
char Zahl[4]Sagen wir mal so, wenn du mit der Variable als String weiter arbeiten willst, dann solltest du auch noch ein Byte mehr für die 0 spendieren.
So ziemlich alle Funktionen, die Strings bearbeiten, verlassen sich auf den Abschluss mit der 0.
Bloss in deinem Fall weisst du ja, wie viele Stellen du bearbeitest.
In einem 'richtigen' Programm würde man sicherlich mit der 0 abschliessen und prüfen, ob auch wirklich nur Zahlen und nicht mittendrin Buchstaben oder sonstige Zeichen eingegeben wurden.
Die Arrayversion hat gegenüber der Moduloversion den Vorteil, das sie wesentlich größere Zahlen bearbeiten kann. Der Moduloversion geht nach spätestens 10 Stellen die Luft aus, wobei du noch nicht einmal alle 10 Stellen voll nutzen kannst.
Bei der Arrayversion kann die Zahl genau 477218588Stellen haben (unsigned int, 32 bit), ohne das es zu einer Wertebereichüberschreitung kommt.
Also ne recht große Zahl. Bloß ein rund 0,5 GB großes Array sprengt dir natürlich den Stack
Wäre mit viel RAM nur als dynamisches Array machbar.
Nagut, soviel zur Gendankenspielerei.#define O0o_o__QsumProffessionale__o_o0O int main( int argc, char* argv[] ) #include <string> #include <iostream> using namespace std; int chk_num( char* num ) { if( !*num ) return 1; // No number while(*num) if( *num < '0' || *num++ > '9' ) return 1; // Activate Stupid Modus :D return 0; // User, well done !!! :+1: } bool bUserStupidModus = false; // Hopefully assumption. :p void SetStupidModus( bool b ) { bUserStupidModus = b; return; } int EnterStupidMode() { cout << endl; cout << "Stupid mode entered." << endl; cout << "Disclaimer: Not implemented yet." << endl; return 0; } unsigned Q_SUM( const char* q ) { unsigned qsum = 0; for ( int i=0; q[i]!=0; i++ ) qsum += q[i] - '0'; return qsum; } O0o_o__QsumProffessionale__o_o0O { enum{n = 256}; // Wollen ja nicht übertreiben :D char q[n+1] = {0}; unsigned qsum = 0; cout << "Hi Alter, alles klar ?" << endl; cout << "Ey gibma ne positive Nummer ein f\x81r ne Quersummenberechnung,\n" "maximal " << n << " Stellen lang das Teil: "; cin.get( q, n ); if( chk_num(q) ) { cout << "Hey Kumpel, ich glaube das m\x81ssen wir noch \x81\x62\x65n!" << endl; SetStupidModus( true ); } bUserStupidModus ? EnterStupidMode() : qsum = Q_SUM(q); cout << qsum << endl; return 0; }
-
Hallo B.B.
OK, also mit atoi hat es jetzt auch noch funktioniert
Und den Code von B.B. konnte ich eigentlich auch nachvollziehen, auch wenn ich ihn nicht selber hätte schreiben können. Aber nachvollziehen ging.
Vielen Dank allen, die geholfen haben.
Lukas
-
Beim Punkt 1 des Posts von BorisDieKlinge blicke ich noch nicht ganz durch: Ein Array beginnt doch bei Null (so bin ich es auf jeden Fall von anderen Programmiersprachen gewohnt). Das letzte Zeichen muss NULL sein (danke für den Hinweis :)). Müsste es denn nicht so deklariert werden (B.B. hat es ja auch so beschrieben):
ein array beginnt bei 0 ja. ein array mit der größe 4 hat dann die index 0-3;)
-
Hallo BorisDieKlinge
Jetzt hab ich's begriffenDas Array beginnt bei Null, wenn man jedoch die Dimension angibt, beginnt es bei Eins!
Danke und bis zu einem anderen Mal
Lukas