Anfängerfrage -> Falsche Eingaben abfangen



  • #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Countdown \n\n\n" << "Bitte gerade zahl eingeben: \n";
    
    	int startzahl;
    	cin >> startzahl;
    
    	if ((startzahl>0) and (startzahl%2==0))
    	{
    		cout << "Sie haben eingegeben : \n" << startzahl << "\n";
    
    		for (int i=startzahl; i>=0; i--)
    		{
    			if (i == (startzahl/2))
    			{
    				cout << "Halbzeit: " << i << endl;
    			}
    			else
    			{
    				cout << "aktuell bearbeite Zahl: " << i << endl;
    			}
    		}
    	}
    	else
    	{
    		cout << "Sie haben leider eine kleinere als 0 oder ungerade Zahl eingegeben - dies ist nicht möglich!" << endl;
    	}
    
    	return 0;
    }
    

    bei mir funktionieren alle prüfungen also ich kann keine ungeraden zahlen und keine kleineren als 0 eingaben ohne das die fehlermeldung erscheint.

    theoretisch musst du noch prüfen ob die "länge" der eingegeben zahl auch wirklich in eine int variable passt, aber gehen wir jetzt einfach mal davon aus das das schon passt.

    hoff ich konnte helfen
    lg[/quote]

    Funktioniert tadellos , Danke !

    Habe meinen eigenen Code daraufhin auch etwas umgebaut und habe jetzt dieses hier :

    #include <iostream>
    
    using namespace std;
    
    int main()
    
    {
    
        cout << "Countdown" << endl;
    
        cout << "Bitte eine gew\201nschte gerade Startzahl eingeben \n" << endl;
    
    unsigned short startzahl;
    
    cin >> startzahl;
    
    if ((startzahl>0) && (startzahl%2==0))
    
     {
    
        cout << "Sie haben eingegeben : " << startzahl << endl;
    
        cout << "\n\nHier also der Countdown" << endl;
    
        for (int i=startzahl; i>=0;i--)
    
            if (i==(startzahl/2) )
            {
              cout << "\t" << i <<" \tSie haben die H\204lfte erreicht" << endl;
            }
                 else
                 {
                 cout << "\t" << i  << endl;
                 }
    
     }
    
    else cout << "Sie haben leider eine falsche Zahl eingegeben \001 !\n\n\n" << endl;
    
        return 0;
    
    }
    

    Habe aber immer noch das selbe Problem... bei allen Eingaben die ungerade oder Buchstaben sind geht es auch... bei allen Zahlen mit Minus die gerade sind macht er das bei mir immer noch.... Wenn ich mir nun Deinen Code ansehe fällt mir natürlich sofort die übersichtliche Formatierung auf... und genau hier scheint auch mein Problem zu liegen.... da werde ich definitiv noch üben üben üben müssen.... dieses Verschachteln scheint mir nicht ganz ohne.... aber das bekomme ich schon noch hin , Danke jedenfalls für Deine Mühe 🙂

    [quote="UMLAUT"]

    Whitedragon276 schrieb:

    schau mal wegen den umlauten in der konsole:
    https://www.c-plusplus.net/forum/viewtopic.php?t=39326

    das sollte helfen... 🙄

    lg

    genau das ist es !!! Vielen vielen Dank ! 👍



  • Whitedragon276 schrieb:

    bei allen Zahlen mit Minus die gerade sind macht er das bei mir immer noch....

    du verwendest ja auch unsigned short. weiß nicht, ob dir "zweierkomplement" etwas sagt, aber abhängig von signed oder unsigned wird das so oder anders interpretiert und aus der -100 wird plötzlich eine 65436, die logischer weise größer 0 ist.



  • Für die Umlautproblematik stellt Windows:
    https://msdn.microsoft.com/en-us/library/windows/desktop/dd319646(v=vs.85).aspx
    zur Verfügung, bzw., wenn man Konsoleneingaben entgegennimmt und dann lesbar in eine Datei schreiben will, also für den umgekehrten Fall:
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms647494(v=vs.85).aspx



  • Unter Windows kannst Du durch Einsatz geeigneter Funktionen dafür sorgen, dass unerwünschte Zeichen (Buchstaben, Minuszeichen, Leerzeichen usw.) gar nicht erst akzeptiert werden, ein schnell hingeklöppeltes Beispiel:

    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int getInput()
    {
        INPUT_RECORD ir;
    
        DWORD dummy;
        do
        {
            ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &ir, 1, &dummy);
        }while(ir.EventType != KEY_EVENT || !ir.Event.KeyEvent.bKeyDown);
    
        return ir.Event.KeyEvent.uChar.AsciiChar;
    }
    
    int getPositiveInt()
    {
       //Enter-Taste definieren
       char Enter = 13;
    
       //Gültige Werte festlegen
       char werte[256] = {0};
       //Für das erste Zeichen sind nur 1 - 9 gültig
       for(int i = '1'; i <= '9'; ++i)
          werte[i] = 1;
    
       int zahl = 0;
       int zeichen;
    
       //Zeichen von der Tastatur lesen
       do
       {
          zeichen = getInput();
          if(werte[zeichen])
          {
             //Nach mindestens einer gültigen Ziffer ist auch die 0 gültig
             werte['0'] = 1;
             cout << static_cast<char>(zeichen);
             zahl = zahl * 10 + zeichen - '0';
          }
       }
       while(zeichen != Enter);
    
       return zahl;
    }
    
    int main()
    {
       cout << "Gib eine Zahl ein:\n";
       int zahl = getPositiveInt();
       cout << "\nDu hast eingegeben: " << zahl;
    
    }
    


  • HansKlaus schrieb:

    Whitedragon276 schrieb:

    bei allen Zahlen mit Minus die gerade sind macht er das bei mir immer noch....

    du verwendest ja auch unsigned short. weiß nicht, ob dir "zweierkomplement" etwas sagt, aber abhängig von signed oder unsigned wird das so oder anders interpretiert und aus der -100 wird plötzlich eine 65436, die logischer weise größer 0 ist.

    -10 fängt er bei 65436 an, -100 ebenso, -2, -1000088 usw auch

    -1, -1001, -55555555 funktioniert

    Ich gehe davon aus dass ich beim Verschachteln Mist gebaut habe... wobei ich den Code von Wertz mit meinem verglichen ( und auch die Gültigkeitsbereiche farblich markiert und verglichen habe... ) und bin der Meinung das sich bis auf die Lesbarkeit den selben Code habe. Jedenfalls kann ich keine Abweichung finden die das Problem erklären könnte...
    Bleibt ja wirklich fast nur die unsigned short über.. denn da hat Wertz ein int genommen..... muss ich noch mal testen....

    "zweierkomplement" sagt mir so nichts.... aber während ich mir das noch mal durchlese macht das vielleicht doch Sinn...Überlauf kenn ich - dürfte ähnlich sein...Gott ist das alles kompliziert...

    Danke für den Tipp! 👍



  • zweierkomplement bedeutet, dass du den betrag der zahl negierst und 1 hinzu zählst. die 10 ist also (aufgrund von faulheit am beispiel char) 0000 1010, invertiert dann 1111 0101 und mit 1 mehr 1111 0110, was dann die entsprechende -10 in zweierkomplementdarstellung ist, allerdings gleichzeitig auch die 246 als unsigned.
    probiers mal im windowstaschenrechner aus, abgesehen vom überlauf ist 10 + (-10) = 0.

    in deinem code hast du in zeile 14 unsigned short stehen, während in dem anderen code in zeile 9 int steht.



  • Whitedragon276 schrieb:

    "zweierkomplement" sagt mir so nichts.... aber während ich mir das noch mal durchlese macht das vielleicht doch Sinn...Überlauf kenn ich - dürfte ähnlich sein...Gott ist das alles kompliziert...

    Ist es nicht. Ist eigentlich ganz einfach.

    Stell dir mal naiv vor, wie du die Bitpräsentation verschiedener Werte durchführen würdest. Da würdest du ja auch erstmal das so machen:

    0000 0000 = 0
    0000 0001 = 1
    0000 0010 = 2
    0000 0011 = 3
    ...
    

    Und so weiter. So lang, wie du bei 1111 1111 (255) angekommen bist.

    Jetzt willst du da aber auch negative Werte reinpacken können. Und der negative und der positive Bereich sollen möglichst groß sein. Deswegen sagt man sich, gut, wenn das most significant bit (MSB) gesetzt ist, dann handelt es sich um eine negative Zahl, ansonsten eine positive Zahl. Das ist das Einerkomplement.

    Und das funktioniert ja auch ganz gut:

    1111 1111 = -127
    1111 1110 = -126
    ...
    1000 0010 = -2
    1000 0001 = -1
    0000 0000 = 0
    0000 0001 = 1
    0000 0010 = 2
    ....
    0111 1110 = 126
    0111 1111 = 127
    

    Wie du siehst, sind der negative und der positive Bereich gleichermaßen verteilt.
    Aber x86 verwendet das Zweierkomplement. Was ist denn das nun wieder?

    Nun, was ist 1000 0000? Die Zahl habe ich oben bewusst weggelassen, aber es handelt sich hier um eine vorzeichenbehaftete 0. Dem gegenüber steht eine vorzeichenlose 0. 0 ist aber immer 0, egal ob vorzeichenbehaftet oder nicht. Deswegen sagt man beim Zweierkomplement: gut, die vorzeichenbehaftete 0 kommt weg, an deren Stelle tritt die -1. Und alle Zahlen im negativen Bereich rücken eins auf:

    1111 1110 = -127
    1111 1101 = -126
    ...
    1000 0001 = -2
    1000 0000 = -1
    0000 0000 = 0
    

    Aber am Ende bleibt noch 1111 1111. Im Zweierkomplement gibt es dann eine Zahl im negativen Bereich, für die es keine positive Entsprechung gibt - -128, -32768, -2147483648 usw. Oder hexadezimal 0xFF, 0xFFFF, 0xFFFF FFFF usw.

    Beim Einerkomplement kriegt man also die positive/negative Zahl raus, indem man das MSB toggelt, dann trägt man -0 mit sich rum. Aber hier gibt es keine negative Zahl, die nicht auch positiv dargestellt werden kann. Beim Zweierkomplement toggelt man das MSB, und bei der Umwandlung negativ => positiv subtrahiert man 1, bei der Umwandlung positiv => negativ addiert man. Klar soweit?

    Es gibt noch andere Negativzahlendarstellungen, aber die beiden sollte jeder kennen.

    EDIT: "Kompliment" durch "Komplement" ersetzt.



  • Komplement 👍



  • dachschaden schrieb:

    Nun, was ist 1000 0000? Die Zahl habe ich oben bewusst weggelassen, aber es handelt sich hier um eine vorzeichenbehaftete 0. Dem gegenüber steht eine vorzeichenlose 0. 0 ist aber immer 0, egal ob vorzeichenbehaftet oder nicht. Deswegen sagt man beim Zweierkomplement: gut, die vorzeichenbehaftete 0 kommt weg, an deren Stelle tritt die -1. Und alle Zahlen im negativen Bereich rücken eins auf:

    1111 1110 = -127
    1111 1101 = -126
    ...
    1000 0001 = -2
    1000 0000 = -1
    0000 0000 = 0
    

    Aber am Ende bleibt noch 1111 1111. Im Zweierkomplement gibt es dann eine Zahl im negativen Bereich, für die es keine positive Entsprechung gibt - -128, -32768, -2147483648 usw. Oder hexadezimal 0xFF, 0xFFFF, 0xFFFF FFFF usw.

    Beim Einerkomplement kriegt man also die positive/negative Zahl raus, indem man das MSB toggelt, dann trägt man -0 mit sich rum. Aber hier gibt es keine negative Zahl, die nicht auch positiv dargestellt werden kann. Beim Zweierkomplement toggelt man das MSB, und bei der Umwandlung negativ => positiv subtrahiert man 1, bei der Umwandlung positiv => negativ addiert man. Klar soweit?

    Hast Du dir diesen Unsinn selbst ausgedacht oder irgendwo gelesen?

    Eine korrekte Beschreibung gibts bei Wikipedia



  • Also Klar ist das noch lange nicht bei mir... ich kann mir vorstellen worauf das hinausläuft, aber bis ich das verstehe wird wohl noch etwas Zeit vergehen..... ich werde es aber versuchen 😉

    Und es war tatsächlich der Auslöser für mein Problem.... das "unsigned short" in "int" geändert und alles lief....

    Von daher muss ich mich wohl Zwangsweise noch mit dem Thema beschäftigen.... 😉

    DANKE ! 👍


Anmelden zum Antworten