problem mit if befehl

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • problem mit if befehl

    Hallo,

    ich habe mir einen Zahlenrater programmiert.
    Das Programm errät jede Zahl zwischen 1 und 1023 in höchstens 10 versuchen. Man muss nur angeben, ob die gesuchte zahl größer oder kleiner oder gleich ist.
    Wenn man aber das Programm ver*rschen möchte und man gibt z.B. nur ein Komma ein, dann spinnt das Programm n bissl. Es soll aber die Meldung kommen "Ver*rschen kann ich mich selber" und die Schleife soll verlassen werden. Nur bekomme ich das net richtig hin, er ignoriert es einfach, egal was ich mache. Hier der Quelltext (auf das wesentliche gekürzt)

    wenn man 1 eingibt, ist die gesuchte Zahl kleiner, 2 ist gleich und 3 ist größer und andere zahlen/buchstaben sollen nicht gehen.


    Quellcode

    1. int i = 1;
    2. double a = 512;
    3. double b = 512;
    4. double eingabe;
    5. char nochmal = 'j';
    6. while(nochmal == 'j') // Soll noch mal durchgeführt werden?
    7. {
    8. while(i <= 10)
    9. {
    10. cout << a << '\n'; // Jetztige Zahl wird ausgegeben
    11. cin >> eingabe;
    12. b = (b / 2);
    13. if(eingabe == 1) //if zahl ist kleiner
    14. {
    15. a = a - b;
    16. }
    17. else if(eingabe == 3) //else if zahl ist größer
    18. {
    19. a = a + b;
    20. }
    21. else if(eingabe == 2) //else if zahl ist gleich
    22. {
    23. cout << "Ich habe deine Zahl in " << i << " Versuchen geloest!\n\n";
    24. break;
    25. }
    26. else if(eingabe != 0 && eingabe != 1 && eingabe != 2)
    27. {
    28. cout << "Verarschen kann ich mich selbst!\n\n" << endl;
    29. break;
    30. }
    Alles anzeigen
    wenn man jetzt 3.5 eingegeben hätte, kommt auch die meldung. gibt man aber einen beliebigen buchstaben an, hört die schleife nicht auf, warum weiß ich net. wenn ich ein einfaches else mache, klappt es nicht, wenn ich auch int ein char mache funzt es ebenfalls net :(

    Vllt. kann mir ja jemand helfen.

    ps. ich weiß, dass das net das allerschönste c++ ist, aber der quelltext ist wie gesagt schon gekürzt, daher die unübersichtlichkeit und von inhaltlichen hätte ich auch for statt while nehmen können, aber das ist mir erst mal egal.

    mfg
    Yoda2003
  • mach doch ein switch .. case daraus...

    Quellcode

    1. switch(eingabe){
    2. case 1: a = a - b;break;
    3. case 3: a = a + b;break;
    4. case 2: cout << "Ich habe deine Zahl in " << i << " Versuchen geloest!\n\n";break;
    5. default: cout << "Verarschen kann ich mich selbst!\n\n" << endl;
    6. }


    oder mach aus dem letzten else if ein einfachses else ...
  • Hi,

    mit dem normalen else hab ich es schon erfolglos probiert.

    wenn ich ein einfaches else mache, klappt es nicht, wenn ich auch


    Mit switch (was wirklich viel schöneres c++ ist^^) hab ich genau das gleiche problem. Hier hab ich mal ein Bild gemacht, nachdem ich eine ungültige eingabe wie "1.4" gemacht habe:



    Das was man sehen kann kommt ununterbrochen, ohne das ich eine Taste drücke und das an die 50 (vllt noch mehr) mal in der Sekunde.

    mfg
    Yoda2003
  • wenn du den quelltext oben so wie er ist in die switch-case struktur übernommen hast, heißt das, das für "0" kein ereignis definiert wurde.

    vllt kannste auch einstellen, das alle werte ungleich 1,2,3 von vornherein als 0 interpretiert werden, zB so:

    Quellcode

    1. int i = 1;
    2. double a = 512;
    3. double b = 512;
    4. double eingabe;
    5. char nochmal = 'j';
    6. while(nochmal == 'j')
    7. while(i <= 10)
    8. {
    9. if(eingabe!=1)
    10. {
    11. if(eingabe!=2)
    12. {
    13. if(eingabe!=3)
    14. {
    15. eingabe=0;
    16. }
    17. }
    18. }
    19. switch(eingabe){
    20. case 1: a = a - b;break;
    21. case 3: a = a + b;break;
    22. case 2: cout << "Ich habe deine Zahl in " << i << " Versuchen geloest!\n\n";break;
    23. default: cout << "Verarschen kann ich mich selbst!\n\n" << endl;
    24. }
    Alles anzeigen