c++ Anfänger brauch Hilfe bei einen Problem.



  • hallo,
    ich bin im ersten Lehrjahr als it-systemelekroniker.
    da wir Awp Haben = Anwendungs Entwicklung.
    habe ich ein Programm geschrieben das aber anfällig ist für Fehler wenn man einen hohen wert für unsigned int A eingibt,
    tut das Programm nur noch Runter Ratern
    Zu dem Code:

    #include <iostream>
    #include <windows.h>
    using namespace std;
    int main ()
    {
    SetConsoleTitle ("Quersummerechner");
    HWND console = FindWindow (NULL, "Quersummerechner");
    ShowWindow (console, SW_HIDE);
    unsigned int z=0;
    unsigned int A=0;
    unsigned int sum = 0;
    cout<<"Bitte gebe an wie oft du die quersumme rechenen moechtest"<<endl;
    cin>>A;
    ANFANG:
    if(A>=1)
    
    		{
    cout<<"bitte gebe eine zahl ein wir machen die quersumme draus yuhuu!"<<endl;
    system("PAUSE");
    cin>>z;
    while (z != 0) {
    sum += z % 10;
    z /= 10; }
    
    cout<<sum<<endl;
    A--;
    goto ANFANG;	
    		}
    		
    else
    		{
    system("PAUSE");
    		}
    		
    return sum; 
    }
    

    Wenn es Verbesserung vorläge gibt alle bitte schreiben ich bin euch für eure Hilfe sehr dankbar.
    Danke im Voraus.



  • @Mikeww sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    habe ich ein Programm geschrieben das aber anfällig ist für Fehler wenn man einen hohen wert für unsigned int A eingibt,
    tut das Programm nur noch Runter Ratern

    Was genau bedeutet das? Was macht Dein Programm bei einem hohen Wert für A? Beschreib das bitte genau(er).
    Auf den ersten schnellen Blick:
    Nach der ersten Berechnung einer Quersumme musst Du sum wieder mit 0 initialisieren, sonst zählst Du die zweite Quersumme zur ersten hinzu, usw.



  • Mein Kollegen haben als wert A das hier eingegeben = 157548985448.
    dann hat das programm gleich nichts mehr gemacht.
    der sinn war ja eine abfrage wie oft man die Quersumme von was ausrechnen will .. dann kommt ja die eigentliche Rechnung aber wenn wert A = 157548985448 ist kommt es nicht zur der Rechnung in dem sinne.



  • Das liegt daran, dass ein unsigned int 32bit groß ist und einen wert von maximal 4294967295 annehmen kann.
    Der eingegebene Wert 157548985448 ist zu groß.

    Beim einlesen des wertes stellt das die logik von cin fest und geht in einen Fehlerzustand.
    In diesem Falle wird die übergebene Variable (hier A) nicht beschrieben und behält ihren alten Wert (in diesem Falle 0)

    Dadurch ist die Bedingung in Zeile 15 unwahr und deshalb wird der restliche code für die Berechnung der quersumme nicht ausgeführt.



  • Wenn du nur die Quersumme berechnen willst, dann musst du die Zahl nicht als Zahl einlesen. Du kannst sie genau so gut als String einlesen. Dann kannst du direkt auf die einzelnen Stellen zugreifen. Dabei musst du dann nur prüfen ob jede Stelle wirklich eine Ziffer ist, und dann die ASCII-Darstellung der Ziffer in den Wert der Ziffer konvertieren (=einfach die ASCII-Darstellung von 0 abziehen).

    Damit kannst du (fast) beliebig lange Zahlen bearbeiten.



  • @hustbaer sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    einfach die ASCII-Darstellung von 0 abziehen

    Einfach '0' abziehen.



  • Ja, hast ja Recht. Wobei es meistens ein ASCII-kompatibles Encoding sein wird.


  • Mod

    @hustbaer sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    Ja, hast ja Recht. Wobei es meistens ein ASCII-kompatibles Encoding sein wird.

    Wird sogar explizit im Standard gefordert, dass das Encoding diese Eigenschaft haben muss. Leider trifft das nur auf Ziffern zu, nicht auf das Alphabet.

    In both the source and execution basic character sets, the value of each character after 0 in the
    above list of decimal digits shall be one greater than the value of the previous.

    Zum Glück hat wohl jedes reale Encoding diese Eigenschaft, selbst das berühmt berüchtigte EBCDIC.

    Wobei ich mich gerade frage, warum diese Eigenschaft auch vom Source Character Set gefordert wird. Zugeständnis an die armen Compilerbauer?


  • Mod

    @SeppJ sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    Zum Glück hat wohl jedes reale Encoding diese Eigenschaft, selbst das berühmt berüchtigte EBCDIC.

    Man kann sich doch immer auf IBM verlassen. Beim zufälligen Herumklicken auf Wikipedia habe ich doch tatsächlich eine Ausnahme gefunden.
    Ich präsentiere: IBM 704 Fortran Code (und andere Abwandlungen von BCD auf der gleichen Seite)
    😟
    Wobei der auch sonst nicht die Anforderungen an C++ erfüllt, da Kleinbuchstaben und viele Sonderzeichen fehlen. Aber wenn man länger sucht, wird man gewiss etwas finden.



  • @SeppJ
    Ja, zusammenhängend muss 0-9 für C++ schon sein, aber es muss '0' nicht 48 sein wie in ASCII. Daher wäre es falsch ch - 48 zu schreiben (also die "ASCII-Darstellung von 0 abziehen" wie ich geschrieben habe). ch - '0' dagegen ist richtig. Weil man dann die Representation im execution-character-set bekommt - die eben nicht 48 sein muss.



  • @SeppJ sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    Man kann sich doch immer auf IBM verlassen. Beim zufälligen Herumklicken auf Wikipedia habe ich doch tatsächlich eine Ausnahme gefunden.
    Ich präsentiere: IBM 704 Fortran Code (und andere Abwandlungen von BCD auf der gleichen Seite)

    704 sieht OK aus. Aber einige der anderen Codepages auf der Seite haben tatsächlich die 0 hinter der 9. Krass.


  • Mod

    @hustbaer sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    704 sieht OK aus. Aber einige der anderen Codepages auf der Seite haben tatsächlich die 0 hinter der 9. Krass.

    Argh, ich meinte 716! Wo vor der 1 ein * ist und nach der 9 ein =, und die 0 ist gaaaanz weit weg. Das hat mich schockiert. Da ist bestimmt eine richtig interessante Erklärung dahinter, die niemand mehr kennt oder aufgeschrieben hat. Wikipedia hebt bei 704 hervor, dass die 0 an der passenden Stelle ist, aber ich finde keine Erklärung, warum das bei 716 anders ist. Es steckt wahrscheinlich in diesem Satz "The straightforward translation from punched form would place the blank before digits 1–9, and encode 0 somewhere else entirely.", aber ohne Hintergrundwissen über Lochkarten verstehe ich das halt nicht!



  • @SeppJ sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    Argh, ich meinte 716! Wo vor der 1 ein * ist und nach der 9 ein =, und die 0 ist gaaaanz weit weg. Das hat mich schockiert. Da ist bestimmt eine richtig interessante Erklärung dahinter, die niemand mehr kennt oder aufgeschrieben hat. Wikipedia hebt bei 704 hervor, dass die 0 an der passenden Stelle ist, aber ich finde keine Erklärung, warum das bei 716 anders ist. Es steckt wahrscheinlich in diesem Satz "The straightforward translation from punched form would place the blank before digits 1–9, and encode 0 somewhere else entirely.", aber ohne Hintergrundwissen über Lochkarten verstehe ich das halt nicht!

    Schau Dir einmal die Telex Kodierung an, da wird es erst richtig spaßig, da sind die Ziffern faktisch nicht mehr beisammen bzw. am Anfang gab es gar keine Ziffern.


  • Mod

    Wunderschön! So etwas hatte ich gesucht. Ich hatte schon an Morsecode gedacht, aber da kann man ja nicht wirklich sinnvoll eine Ordnung definieren. Hier ist ein wunderschönes Mittelding aus der mechanischen und der Digitalelektronikzeit. Hier führen mechano-ergonomische Überlegungen zu scheinbar sinnlosem Durcheinander, hinter dem aber trotzdem sehr viel Methode steht. 👍

    Es fehlen wieder die geforderten Kleinbuchstaben, aber wenn man die verfügbaren Sonderzeichen passend definiert könnte der Rest sogar ausreichend für die Anforderungen von C++ sein. Außer natürlich der Ordnung der Ziffern.

    Apropos Sonderzeichen: Da sind ja erstaunlich viele (Halb-)Brüche drin, dafür dass man nur 5 Bit zur Verfügung hat. Hat man früher so viele Brüche per Fernschreiben verschickt? Muss sich ja gelohnt haben, ein Viertel der Codepage zu belegen, um hier und dort mal ein "Byte" zu sparen.



  • @SeppJ sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    Apropos Sonderzeichen: Da sind ja erstaunlich viele (Halb-)Brüche drin, dafür dass man nur 5 Bit zur Verfügung hat. Hat man früher so viele Brüche per Fernschreiben verschickt? Muss sich ja gelohnt haben, ein Viertel der Codepage zu belegen, um hier und dort mal ein "Byte" zu sparen.

    Glaube nur in der britischen Variante, oder? Schau dir mal an, wie in England Preise notiert wurden, bevor 1971 eine Dezimalwährung eingeführt wurde: https://www.ghostofthedoll.co.uk/retromusings/wp-content/uploads/2016/07/Toys-03.jpg

    Das könnte eine plausible Erklärung sein.


  • Mod

    @Finnegan sagte in c++ Anfänger brauch Hilfe bei einen Problem.:

    Das könnte eine plausible Erklärung sein.

    Klingt nachvollziehbar.


Anmelden zum Antworten