Problem mit einer Schleife



  • Hallo ich habe ein Problem mit meiner Schleife.
    Man soll eine Eingabe betätigen und die Schleife soll sich
    wiederhohlen, wenn die Eingabe nicht den Bedingungen entspricht.

    Hier mein Code:

    do{
      cin >> c;
      //Irgend ein Code
    }while(c >= 1 && c <= 4);
    

    Also sie soll überprüfen, ob die Zahl zwischen 1 und 4 liegt, wenn nicht,
    soll die Schleife bzw. die Eingabe neu starten.

    Aber bei diesem Code wiederholt sie die Schleife bei jeder Eingabe,
    egal ob die Bedingung wahr, oder falsch ist.

    Danke für die Hilfe.



  • Was ist c?


  • Mod

    Bei nicht nachvollziehbaren Laufzeitfehlern bitte ein lauffähiges Programm angeben, damit man den Fehler, nun ja, nachvollziehen kann 🙂 . Siehe auch den dritten Link in meiner Signatur.



  • #include <iostream>
    #include <windows.h>
    using namespace std;
    
    int main(void) {
    
    cout << "#################################################\n"
         << "# Taschenrechner                 | Menueauswahl #\n"
         << "#################################################\n";
    
    //Datentypen deklanation:
    char c = 0;
    long long llzif1 = 0;
    long long llzif2 = 0;
    long long llrest = 0;
    
    cout << "\n1) Addition zweier Zahlen"
         << "\n2) Subtration zweier Zahlen"
         << "\n3) Multiplikation zweier Zahlen"
         << "\n4) Division zweier Zahlen mit Rest";
    
    do{
    cout << "\n\nIhre Eingabe: ";
    cin >> c;
    
    switch(c) {
      case '1':
          //code
        break;
      case '2':
          //code
        break;
      case '3':
          //code
        break;
      case '4':
          //code
        break;
      default: cout << "Flasche Eingabe!";
    
     }
    
    }while(c >= 1 && <= 4);
    
    }
    

  • Mod

    Dieser Code compiliert nicht einmal, weil du nicht Copy&Paste benutzt hast. Vermutlich verschwendest du gerade unsere Zeit, weil du den Fehler beim Abtippen unabsichtlich behoben oder unabsichtlich andere Fehler eingebaut hast. Meinst du, den Link hätte ich nur zum Spaß angegeben? hier sind viele Leute die dir (freiwillig und unentgeltlich!) helfen wollen, aber wenn du dir nicht einmal richtig Zeit nehmen möchtest, deine Frage sauber zu stellen, ist das echt demotivierend 👎 . Selbst wenn man den offensichtlichen Fehler korrigiert, bricht das Programm jedes Mal ab, anstatt niemals.

    Was jedenfalls auffällt:

    switch(c) {
      case '1':
    

    und

    c >= 1
    

    Fällt dir da nichts auf, wie du einmal das Symbol für "Eins" codiert hast und beim anderen Mal anders? Entsprechend ist auch die Bedeutung im Computerprogramm eine ganz andere:

    1
    

    Eine Zahl mit Wert Eins

    '1'
    

    Die Ziffer Eins

    "1"
    

    Eine Zeichenkette die aus der Ziffer '1' (und einem Nullterminator) besteht.



  • Du behandelst in der do-while Schleife ein char wie ein int. Der Compiler unterscheidet aber zwischen einem Zeichen und einer Zahl.
    Probier doch bitte mal aus dem char ein int zu machen & bei der switch-case Abfrage die '' wegzunehmen. Dann sollte es funktionieren



  • #include <iostream>
    #include <windows.h>
    using namespace std;
    
    int main(void) {
    
    cout << "#################################################\n"
         << "# Taschenrechner                 | Menueauswahl #\n"
         << "#################################################\n";
    
    //Datentypen deklanation:
    char c = 0; 
    long long llzif1 = 0;
    long long llzif2 = 0;
    long long llrest = 0;
    
    cout << "\n1) Addition zweier Zahlen"
         << "\n2) Subtration zweier Zahlen"
         << "\n3) Multiplikation zweier Zahlen"
         << "\n4) Division zweier Zahlen mit Rest";
    
    do{
    cout << "\n\nIhre Eingabe: ";
    cin >> c; // du liest einen character ein
    
    switch(c) { // du prüfst einen character
      case '1':
          //code
        break;
      case '2':
          //code
        break;
      case '3':
          //code
        break;
      case '4':
          //code
        break;
      default: cout << "Flasche Eingabe!";
    
     }
    
    }while(c >= 1 && <= 4); // Du prüfst ob der char zwischen 1 und 4 liegt aber 1 != '1' ;)
    
    }
    

    Edit: Viel viel zu spät 😞



  • Nimm einfach eine

    for(bool con = false;con;)
    

    Schleife.
    Im default -Block setzt du con auf true ; Damit wird die Schleife nochmal durchlaufen.

    for(bool con = false;con;)
    {
        con = false;//Bei jedem Start auf false setzen
        cout << "\n\nIhre Eingabe: ";
        cin >> c;
    
        switch(c) {
          case '1':
              //code
            break;
          case '2':
              //code
            break;
          case '3':
              //code
            break;
          case '4':
              //code
            break;
          default:
              cout << "Flasche Eingabe!";
              con = true;
         }
    }
    

    (Ungetestet)

    Am besten leerst du noch den Puffer, damit falls der User aus Versehen mehreres eingibt, das ignoriert wird.


  • Mod

    Sone, dein Vorschlag ist der Grund, warum strukturierte Programmierung bei manchen Leuten so einen schlechten Ruf hat.



  • SeppJ schrieb:

    Sone, dein Vorschlag ist der Grund, warum strukturierte Programmierung bei manchen Leuten so einen schlechten Ruf hat.

    Ok, mach einen eleganteren Vorschlag. 🙂



  • int eingabe = 0;
    
    do
    { 
     cout << "\n\nIhre Eingabe: "; 
     cin >> eingabe ; 
     switch(eingabe ) 
     { 
      case 1: 
          //code 
        break; 
      case 2: 
          //code 
        break; 
      case 3: 
          //code 
        break; 
      case 4: 
          //code 
        break; 
      default: 
        cout << "Flasche Eingabe!"; 
        eingabe = 0;
     } 
    
    }while(!eingabe);
    

    wäre schon besser gewesen.


  • Mod

    Sone schrieb:

    SeppJ schrieb:

    Sone, dein Vorschlag ist der Grund, warum strukturierte Programmierung bei manchen Leuten so einen schlechten Ruf hat.

    Ok, mach einen eleganteren Vorschlag. 🙂

    So wie es war, bloß mit korrekter Prüfung.



  • SeppJ schrieb:

    Sone schrieb:

    SeppJ schrieb:

    Sone, dein Vorschlag ist der Grund, warum strukturierte Programmierung bei manchen Leuten so einen schlechten Ruf hat.

    Ok, mach einen eleganteren Vorschlag. 🙂

    So wie es war, bloß mit korrekter Prüfung.

    😮
    Oh mein Gott! Sry! 😃

    while(true)
    {
        cout << "\n\nIhre Eingabe: ";
        cin >> c;
    
        switch(c) {
          case '1':
              //code
            break;
          case '2':
              //code
            break;
          case '3':
              //code
            break;
          case '4':
              //code
            break;
          default:
              cout << "Flasche Eingabe!";
              continue;
         }
         break;
    }
    

    Dürfte so gehen: Check


Log in to reply