C++ Quersumme errechnen?
Hallo Gutefrage.net Comunity, Ich hab vor einiger Zeit angefangen die Programmiersprache C++ zu lernen. Bisher habe ich viel gelernt. Ich kann Variablen erstellen und initialisieren. Einfache Schleifen mit while, for. Befehle wie cout,cin und if sind auch kein Problem für mich. Sagen wir rinfach ich habe grundfähigkreiten erlernt. Wenn auch nicht alle Grundlegenden Themen behandelt bisher aber schon ein sehr solides Gerüst geschaffen (meiner meinung nach) um weiter diese Programmiersprache vertiefen zu können. Nun zu meiner eigentlichen Frage: Ich stelle mir ein Programm vor (natürlich alles auf der windows konsole) in welches man sein alter eingibt. Das Alter wird in einer integer variable abgespeichert. Danach rechnet das Programm die Quersumme des eingegebenen Alters aus und die quersumme wird als cout ausgegeben. z.B Ich schreibe mein Alter 18 rein. Das Programm errechnet die quersumme (1+8) und schreibt anschließend "9" als ergebnis auf. Zu meinem Problem: Ich kann die integer variable wo das Alter drin steht nicht "zerstückeln" um die beiden ziffern addieren zu können. Ich hab viel gegoogelt und etwas von arrays gelesen. Was arrays sind hab ich grundsätzIch verstanden aber wie ich sie hier anwenden kann? Ich wäre zutiefst froh wenn mir hier ein/e erfahrene/r Programmierer/in einen einfachen Weg aufweisen und somit einem Anfänger helfen könnte. Ich danke fürs durchlesen meiner Frage. Schönen Tag wünsch ich.
9 Antworten
Für die Quersumme:
#include <iostream>
//"Normale" Quersumme
int quersumme(int zahl){
//Initialisiere eine Variable für das Ergebnis
int ergebnis = 0;
while(zahl > 0){
//Addiere den Rest der Division "zahl/10" zum Ergebnis.
ergebnis += zahl % 10;
//Dividiere "zahl" durch 10 und setze den Wert von Zahl auf den Quotienten. (Beim "int" werden die Nachkommastellen dadurch abgeschnitten.)
zahl /= 10;
}
//Gebe das Ergebnis an die aufrufende Stelle zurück.
return ergebnis;
}
//Das Ergebnis hat exakt eine Stelle (0-9)
int iterierte_quersumme(int zahl){
//Initialisiere eine Variable für das Ergebnis
int ergebnis = quersumme(zahl);
//Solange "ergebnis" größer oder gleich 10 ist...
while(ergebnis >= 10){
//Setze den Wert von "ergebnis" auf die Quersumme von "ergebnis".
ergebnis = quersumme(ergebnis);
}
//Gebe das Ergebnis an die aufrufende Stelle zurück.
return ergebnis;
}
int main(int argc, char *argv[]){
//Test 1: Sollte 10 ergeben.
std::cout << "quersumme(1234) = " << quersumme(1234) << std::endl;
//Test 2: Sollte 24 ergeben.
std::cout << "quersumme(7278) = " << quersumme(7278) << std::endl;
//Test 1: Sollte 1 ergeben.
std::cout << "iterierte_quersumme(1234) = " << iterierte_quersumme(1234) << std::endl;
//Test 1: Sollte 6 ergeben.
std::cout << "iterierte_quersumme(7278) = " << iterierte_quersumme(7278) << std::endl;
return 0;
}
Zu den Arrays: Die sind in diesem Fall weniger hilfreich als mehr verwirrend bzw. überflüssig.
Dabei ist "Modulo 10" für diesen Zweck geradezu prädestiniert... ;)
du könntest das Problem auch mit einer Whileschleife lösen
Vorher eine Abfrage, dass die zahl nicht größer als 99 sein darf.
dann einfach eine Schleife, die der eingegebenen Zahl 10 abzieht und das so lange, wie die Zahl größer 10 ist. Gleichzeit zählt ein counter hoch.
zB eingegebene Zahl 23
schleife läuft 2x durch, übrig bleibt 3 und schon hast ebenfalls beide zahlen.
Bei größeren Werten bleibt dir wie hier schon erwähnt nur noch die Konvertierung in einen anderen Datentypen
Wieso sollte man das auf Zahlen kleine 100 beschränken? Ein sinnvoller Algorithmus (siehe meine Funktion) braucht keine Einschränkung und funktioniert allgemein.
Es geht ja darum, dass der Fragesteller was lernen will. Es macht keinen Sinn die Bedingungen so einzuschränken damit ein schlechter Algorithmus auch noch funktioniert!
Das klingt gut umd einfach zu schaffen für den Anfang danke für deine Idee.
Wandel die eingabe doch in einen String um. Ein String ist ja ein Char Array, somit kannst du dann jede einzelne Ziffer in deinem String Array dann per Index anspringen und so die Quersummer berechnen.
Und wenn du scho dabei bist, eine Prüfung ob jemand vielleicht eine ungültige Zahl, wie 1A eingegeben hat kannst du dann auch gleich einbauen.
"Zerstückeln" kannst du eine Zahl, wenn du weißt, wie eine Zahl grundsätzlich "aufgebaut" ist.
Bei einer Dezimalzahl ist das:
a*10^0 + b * 10^1 + c * 10^2 usw.
Deine Aufgabe ist es nun die Faktoren zu bestimmen.
Und wie das geht steht in meiner Antwort ^^
Im Prinzip einfach indem man mehrmals eine Integerdivision durch 10 durchführt.
Noch besser, als Methode/Funktion:
int quersumme(int zahl)
{
int hilf;
int quer = 0;
while (zahl != 0)
{
hilf = zahl;
zahl = zahl / 10;
quer += hilf - (zahl*10);
}
return quer;
}
Aufruf wäre dann beispielsweise:
int q = quersumme(1234);
==> in q steht 10;
Im Prinzip meine Version, nur das ich den Modulo Operator "ignoriert" habe. So kann man sich noch eine Zeile sparen ^^