-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
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?Geändert von Arvenius (19.07.11 um 20:30 Uhr)
-
17.07.11 17:39 #2
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.mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
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.
-
17.07.11 18:32 #4
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.mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
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:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#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"); }
Geändert von Arvenius (18.07.11 um 19:38 Uhr)
-
Hallo,
ist denn niemandem der Fehler im Programm aufgefallen?
Hier wird Platz für drei Zeichen auf dem Stack reserviert.
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:Code cpp:
1
char zahl[5];
- Überlauf verhindern: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 auchCode cpp:
1
std::cin >> std::setw(5) >> zahl;
vor dem Einlesen schreiben.Code cpp:1
std::cin.width(5);
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
- Genügend Platz reservieren:
-
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!
-
Hi
beim Zugriff auf die einzelnen chars (generall auf Arraylemente, egal welcher Typ) beginnt man bei 0.
Beim Anlegen muss aber die tatsächliche Anzahl angegeben werden.
Also wenn man die Variable mit [3] anlegt, hat das Array 3 Elemente: [0], [1] und [2].
Bei char-Arrays gibt es aber noch eine Besonderheit: Da sie ja oft verwendet werden, um Strings (Tastatureingaben etc) abzuspeichern und diese ja nicht immer gleich viel Buchstaben haben, sondern auch kürzer sein können, gibt es so eine Art Ende-Zeichen.
Das wird eben am Schluss, nach dem letzten Buchstaben, noch mit abgespeichert.
cin, cout... kommen damit von selber klar, ohne dass man noch was tun muss.
Hier ist allerdings das Problem, dass dieses Schlusszeichen wie ein normaler Buchstabe auch seinen Platz im Array braucht.
Wenn du jetzt also 4 wirkliche Zeichen speichern willst, kommt noch das Schlusszeichen dazu = 5.
Anlegen musst du das Array dann auch mit [5], macht [0] [1] [2] [3] und [4].
[0] bis [3] für deine 4 Zeichen und [4] für das Schlusszeichen.
Gruß
-
Bei der Deklaration eines Arrays gibt man nicht den höchsten Index, sondern die Anzahl der Elemente an. Somit stehen dir bei char zahl[3]; genau drei Zeichen zur Verfügung. Mit char zahl[4]; hättest du dementsprechend vier Zeichen, was für deine Zahl auch reichen würde. Allerdings kommt bei C-Strings immer noch ein abschließendes Nullzeichen ('\0') dazu, welches das Ende des Strings markiert. Also brauchst du tatsächlich fünf Zeichen, um eine vierstellige Zahl (als C-String) zu speichern.
Der „Vorwurf“ war auch überhaupt nicht an dich gerichtet. Ich wünsche dir jedenfalls noch viel Erfolg mit C++ und viel Spaß auf tutorials.de
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
Anmerkung:
Einige ältere versionen des micrsoft visual studio compilers wichen hier vom standart ab (k.a. ob sies immer noch tun) und reservierten für ein char[4] beispielsweise tatsächlich 5 byte.
Verursachte lustige probleme, wenn man versucht von einem windows programm an einen linux server datenstrukturen zu übermitteln die statische strings beinhalten und hat mich damals einige stunden debugging gekostet.
-
So, da bin ich wieder...
Danke erstmal für eure mehr als tollen Ratschläge, das hilft mir wirklich enorm weiter... Sich selbst in Eigenarbeit C++ beizubringen ist gar nicht so simpel wenn einem nur mehr oder weniger gute Tutorials zur Verfügung stehen.
Also die nächste Aufgabe, die es zu lösen gilt lautet:
Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe einer vierstelligen Zahl auffordert. Das Programm soll daraufhin die Quersumme der Zahl mit Hilfe einer Schleife errechnen und das Ergebnis dann auf den Bildschirm ausgeben.
Also quasi die gleiche Aufgabe wie oben, allerdings soll diesmal das Ergebnis als Schleife ausgerechnet werden.
Ich zeig euch einfach mal, wie weit ich gekommen bin und erklär euch dann meine Denkansätze:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include <iostream> #include <iomanip> int main() { char zahl[5]; std::cout << "Willkommen!\n\n"; std::cout << "Bitte geben eine 4-stellige Zahl ein: "; std::cin >> std::setw(5) >> zahl; std::cout << "Die eingegebene Zahl lautet " << zahl << "\n" << std::endl; int i; int ergebnis; int ergebnis1; for (int i = 0; i < 3; i++) { std::cout << "i ist " << i << std::endl; ergebnis1 = (zahl[i] + zahl[i++]); std::cout << "ergebnis ist " << ergebnis << std::endl; std::cout << "zahl ist " << zahl[i] << std::endl; } ergebnis = ergebnis1 - (4*48); std::cout << "\nDie Zahl ist " << zahl << std::endl; std::cout << "Das Ergebnis lautet: " << ergebnis << std::endl; system("PAUSE"); }
Also zunächst habe ich eure Ratschläge beherzigt und die Eingabe ein wenig begrenzt und das Array größer gemacht.
So, dann zur Schleife... Ich möchte ja, dass die Variable zahl hochgezählt wird von zahl[0] bis zahl[3] um das Ergebnis ausrechnen zu können, deshalb die for Schleife. Das hochzählen von i funktioniert auch grundsätzlich, allerdings weiß ich nicht, wie ich die Schleife so aufbaue, dass ergebnis = immer weiter aufgebaut wird (also mit zahl[0] beginnend und mit zahl[3] endend). Vielleicht weiß hier jemand Rat?
Ich weiß, dass das absolute Anfängerfragen sind, dafür möchte ich mich bei euch auch vielmals entschuldigen. Aber lesen allein hilft nicht immer, um logische Zusammenhänge zu erkennen (zumindest bei mir nicht).
-
19.07.11 22:38 #15
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Versuch doch mal die Eingabe als Zahl einzulesen und nicht als String.
Eine Zahl kannst du mit Hilfe der Modulo Operation (%) und der Ganzzahldivision in Teile zerlegen.
Außerdem solltest du immer auch prüfen ob überhaupt etwas eingelesen wurde:
GrußCode cpp:1 2 3
if (cin >> zahl) { ... }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Highscore
Von ShadowDomE im Forum PHPAntworten: 1Letzter Beitrag: 01.06.10, 21:06 -
Highscore
Von knapper im Forum C/C++Antworten: 7Letzter Beitrag: 16.08.06, 07:09 -
Lösung von einer Aufgabe
Von SMoeller im Forum JavaAntworten: 5Letzter Beitrag: 27.01.06, 15:00 -
Highscore?
Von ICEWeasel im Forum C/C++Antworten: 6Letzter Beitrag: 25.10.03, 00:39 -
Highscore mit PHP?
Von fraus im Forum PHPAntworten: 2Letzter Beitrag: 07.07.01, 20:35



6Danke

Zitieren


Login






