Lösung zu Aufgabe von highscore.de

Arvenius

Grünschnabel
UPDATE: Lösung zu Aufgabe von highscore.de

Hallo erstmal.

Also ich lern nun seit ein paar Tagen C++ und schaffs im Normalfall auch, die kleinen Probleme, die bis jetzt autauchen zu lösen.

Ich lerne mit Hilfe von highscore.de und hänge da nun an einer Aufgabe, die wie folgt lautet:

Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe einer vierstelligen Zahl auffordert. Das Programm soll daraufhin die Quersumme der vierstelligen Zahl errechnen und das Ergebnis auf den Bildschirm ausgeben.

So und nun habe ich folgendes geschrieben:

Code:
int main ()
    {
         char zahl[3];
         
         std::cout << "Willkommen in Bennis \"Quersummenausrechnen\" Programm\n" << std::endl;
         std::cout << "Sie müssen eine 4-stellige Zahl eingeben damit es funktioniert!\n" << std::endl;
         
         std::cout << "Bitte geben Sie eine 4-stellige Zahl ein: ";
         std::cin  >> zahl;
         std::cout << "Die eingegebene Zahl lautet " << zahl << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << zahl[0] << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << zahl[1] << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << zahl[2] << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << zahl[3] << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << zahl[0] << "\n" << std::endl;
         
         int erg1, erg2, erg3, erg4;
         erg1 = zahl[0];
         erg2 = zahl[1];
         erg3 = zahl[2];
         erg4 = zahl[3];
         
         std::cout << "Die eingegebene Zahl lautet " << erg1 << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << erg2 << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << erg3 << "\n" << std::endl;
         std::cout << "Die eingegebene Zahl lautet " << erg4 << "\n" << std::endl;
         
         int ergebnis;
         ergebnis = (erg1 + erg2 + erg3 + erg4);
         
         std::cout << "Das Ergebnis der Quersumme aus der Zahl lautet: " << ergebnis << std::endl;
         
         system("PAUSE");
         }

Ums einfach zu benutzen gebe ich 1234 ein. Im ersten Durchlauf der Abfrage, welche Zahlen ich eingegeben habe (also zahl[0]-zahl[4]) bekomme ich auch noch 1234 angezeigt. Da trat dann das Problem auf, dass ich als Ergebnis der Quersumme allerdings 202 raus bekam, deswegen das umspeichern in ne neue Variable um zu sehen wo der Fehler liegt. Das er daran liegt, dass die Zahlen als ASCII-Code (also 49,50,51,52) abgespeichert werden weiß ich nun, aber ich bekomme es partout nicht auf die Reihe, die Ergebnisse aus der Abfrage weiterhin als die eingegebenen Zahlen abzuspeichern. Könnt ihr mir da helfen?
 
Zuletzt bearbeitet:
Du könntest dir eine Funktion bauen, die eine Zahl als String in eine Zahl als Integer konvertiert.
Das sollte ziemlich leicht sein, vor allem weil du nur eine Stelle hast.
 
Ich muss dazu sagen, dass Funktionen erst im nächsten Kapitel behandelt werden. Kennen gelernt hab ich bis jetzt nur Operatoren und Variablen. Also muss es auch mit den bislang vorhandenen Kenntnissen (vielleicht komplizierter) möglich sein.

Und meine Frage ist ja im Grunde auch recht simpel: Die eingegebene Zahl (1234) wird auch in ihren Einzelteilen in der Variable zahl[] gespeichert. Beim ersten Abruf eben dieser Variable wird das auch korrekt angezeigt. Allerdings, was ja bei char normal ist, sehe ich zwar die 1234, in der Variable steht aber eigentlich der Wert des dazugehörigen ASCII-Codes.
Nun könnte ich ja sicher, und da weiß ich nicht wie, das ganze, ähnlich wie bei Buchstaben so in die Variable eintragen kann, dass ich am Ende auch die Zahl wieder angezeigt bekomme. Also so: zahl[1] = '2' statt zahl[1] = 50.
 
Mir ist gerade noch eine Lösung eingefallen:

Wenn man sich die Zahlenfolge 0-9 anschaut, sieht man, dass die ASCII-Codes direkt hintereinander liegen.
Somit kannst du vom ASCII-Code auf die Zahl schließen.

Den Code überlasse ich mal dir ;)
Falls du noch einen Tipp brauchst, kannst dich gerne melden.
 
Haltet mich für blöd, aber ich komm nicht drauf...
Ich dachte jetzt vielleicht, dass du irgendwas mit inkrementieren meinst, das kanns aber ja nich sein, da das Programm ja auch auf Zahlen wie 9234 richtig reagieren soll...
 
ComFreek bezieht sich auf die ASCII-Werte, die du ja schon richtig erkannt hast:

Eine 2 wird in ASCII mit dem Byte-Wert 50 dargestellt. D.h. wenn du den ASCII-Byte-Wert einer Ziffer hast, rechnest du einfach auf den eigentlich Wert um. Das ist ja für alle 10 Ziffern der gleiche Vorgang.

50 - wieviel = 2?

Ab da sollte es dann ein leichtes sein.
 
Sollte, ist es aber nicht... Ich müsste ja theorethisch für jede Eingabe eine if Abfrage oder ähnliches erstellen. Kann natürlich sein, dass ich komplett auf dem Holzweg bin, aber auch das, da dies erst in nem späteren Kapitel erwähnt wird, kann nicht teil der Aufgabenstellung sein. Wie gesagt: Die einzugebene Zahl ist Variabel, ich rede hier nicht von den festen Werten 1234...
 
Lasst mich bloß alle in Ruhe, meine Freundin hats mir grad verständlich erklärt... Sone Denkblockade muss man erstmal haben... Danke an euch beide und natürlich an Steffi, die Helferin in der Not ;-)

Ach und für alle, die hier nach ner Lösung suchen sollten:

C++:
#include <iostream>

int main ()
    {
         char zahl[3];
         
         std::cout << "Willkommen in Bennis \"Quersummenausrechnen\" Programm\n" << std::endl;
         std::cout << "Sie muessen eine 4-stellige Zahl eingeben damit es funktioniert!\n" << std::endl;
         
         std::cout << "Bitte geben Sie eine 4-stellige Zahl ein: ";
         std::cin  >> zahl;
         std::cout << "Die eingegebene Zahl lautet " << zahl << "\n" << std::endl;
         
         int ergebnis1;
         ergebnis1 = (zahl[0] + zahl[1] + zahl[2] + zahl[3]) - (4*48);
         
         std::cout << "Das Quersumme lautet: " << ergebnis1 << std::endl;
                  
         system("PAUSE");
         }
 
Zuletzt bearbeitet:
Hallo,

ist denn niemandem der Fehler im Programm aufgefallen? :eek:

C++:
         char zahl[3];
Hier wird Platz für drei Zeichen auf dem Stack reserviert.

C++:
         std::cin  >> zahl;
Und hier werden nahezu beliebig viele Zeichen auf den Stack geschrieben. Das ist ein klassischer Pufferüberlauf. Selbst wenn sich der Benutzer brav an die Vorgabe hält und nur vier Zeichen eingibt, werden insgesamt fünf Zeichen (vier eingegebene Zeichen + Nullterminierung) auf den Stack geschrieben und damit zwei zu viel. Daher:
  • Genügend Platz reservieren:
C++:
char zahl[5];
  • Überlauf verhindern:
C++:
std::cin >> std::setw(5) >> zahl;
std::setw(5) gibt dem Eingabestream zu verstehen, dass in zahl höchstens fünf Zeichen (inkl. Nullterminierung) Platz haben. Es benötigt #include <iomanip>. Alternativ kann man auch
C++:
std::cin.width(5);
vor dem Einlesen schreiben.


Grüße,
Matthias
 
Aber ist es nicht so, dass bei char die [0] auch mitzählt? So hab ich Platz für 4 Zeichen.
Das mit dem width allerdings werd ich beherzigen, denn daran, dass beim cin mehr als 4 Zeichen eingegeben werden können hab ich nicht beachtet. Aber wie gesagt, ich lerne seit ungefähr 5 Tagen C++, da dürfen solche Fehler noch unterlaufen (zumal ich bislang ja nur Variablen und Operatoren kennen lernen durfte!
 
Zurück