tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
20
ZUGRIFFE
872
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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)
     

  2. #2
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    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.
    Arvenius bedankt sich. 
    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 erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #3
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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.
     

  4. #4
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    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.
    Arvenius bedankt sich. 
    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 erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  5. #5
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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...
     

  6. #6
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
    Arvenius bedankt sich. 

  7. #7
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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...
     

  8. #8
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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)
     

  9. #9
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Hallo,

    ist denn niemandem der Fehler im Programm aufgefallen?

    Zitat Zitat von Arvenius Beitrag anzeigen
    Code cpp:
    1
    
             char zahl[3];
    Hier wird Platz für drei Zeichen auf dem Stack reserviert.

    Zitat Zitat von Arvenius Beitrag anzeigen
    Code cpp:
    1
    
             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:
    1. Genügend Platz reservieren:
      Code cpp:
      1
      
      char zahl[5];
    2. Überlauf verhindern:
      Code cpp:
      1
      
      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
      Code cpp:
      1
      
      std::cin.width(5);
      vor dem Einlesen schreiben.

    Grüße,
    Matthias
    Arvenius bedankt sich. 
    „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

  10. #10
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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!
     

  11. #11
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    Arvenius bedankt sich. 

  12. #12
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Zitat Zitat von Arvenius Beitrag anzeigen
    Aber ist es nicht so, dass bei char die [0] auch mitzählt? So hab ich Platz für 4 Zeichen.
    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.

    Zitat Zitat von Arvenius Beitrag anzeigen
    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!
    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
    Arvenius bedankt sich. 
    „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

  13. #13
    chibisuke chibisuke ist offline Mitglied Brillant
    Registriert seit
    Sep 2003
    Beiträge
    807
    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.
     

  14. #14
    Arvenius Arvenius ist offline Mitglied
    Registriert seit
    Jul 2011
    Beiträge
    13
    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).
     

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    Code cpp:
    1
    2
    3
    
    if (cin >> zahl) {
      ...
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Highscore
    Von ShadowDomE im Forum PHP
    Antworten: 1
    Letzter Beitrag: 01.06.10, 21:06
  2. Highscore
    Von knapper im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 16.08.06, 07:09
  3. Lösung von einer Aufgabe
    Von SMoeller im Forum Java
    Antworten: 5
    Letzter Beitrag: 27.01.06, 15:00
  4. Highscore?
    Von ICEWeasel im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 25.10.03, 00:39
  5. Highscore mit PHP?
    Von fraus im Forum PHP
    Antworten: 2
    Letzter Beitrag: 07.07.01, 20:35