Anfängerprobleme (Do-While Schleife)



  • Hallo Liebes Forum,

    nach einigem Knobeln bin ich drauf und dran vor meiner Hausaufgabe zu kapitulieren. Die Aufgabe ist es ein "Telefonmenue" zu schreiben, das bei einer ungültigen Eingabe zu einer erneuten Eingabe auffordert und bei einer richtigen eingabe einen entsprechenden Text präsentiert. (Hinter dem Text steht keine wirkliche Funktion). Ich habe bisher folgendes verzapft:

    #include <stdio.h>

    void main()
    {
    char auswahl;
    printf("**********Telefonverzeichnis****************\n\nE = neuer Eintrag einfuegen\nL = Eintrag loeschen\nS = Telefonnummer suchen\nA = alle Eintraege anzeigen\nB = Programm beenden\n\nIhre Wahl:\n");
    do {
    auswahl = getchar();
    if (auswahl != 65 && auswahl != 66 && auswahl != 69 && auswahl != 76 && auswahl != 83 && auswahl != 97 && auswahl != 101 && auswahl != 108 && auswahl != 115 && auswahl != 98) { printf_s("Muell"); };
    } while (auswahl != 65 && auswahl != 66 && auswahl != 69 && auswahl != 76 && auswahl != 83 && auswahl!=97 && auswahl != 101 && auswahl != 108 && auswahl != 115 && auswahl != 98);
    switch (auswahl) {
    case 'E': printf("Sie haben gewaehlt: Neuer Eintrag einfuegen\n"); break;
    case 'e': printf("Sie haben gewaehlt: Neuer Eintrag einfuegen\n"); break;
    case 'L': printf("Sie haben gewaehlt: Eintrag loeschen\n"); break;
    case 'l': printf("Sie haben gewaehlt: Eintrag loeschen\n"); break;
    case 'S': printf("Sie haben gewaehlt: Telefonnummer suchen\n"); break;
    case 's': printf("Sie haben gewaehlt: Telefonnummer suchen\n"); break;
    case 'A': printf("Sie haben gewaehlt: Alle Eintraege anzeigen\n"); break;
    case 'a': printf("Sie haben gewaehlt: Alle Eintraege anzeigen\n"); break;
    case 'B': printf("Sie haben gewaehlt: Programm beenden\n"); break;
    case 'b': printf("Sie haben gewaehlt: Programm beenden\n"); break;
    default: printf("Die Eingabe war nicht Korrekt"); break;
    }

    system("pause");
    }
    Wenn mir jemand sagen kann warum nach einer falschen EIngabe zweimal der Fehlertext (in diesem Fall "Muell") ausgegeben wird würde ich mich sehr freuen.
    Darüber hinaus wäre es cool wenn mir jemand sagen kann wie ich die Bedingungen besser und übersichtlicher definieren kann, das muss doch einfacher gehen, leider komm ich nicht drauf wie.
    Vielen dank im schonmal,
    beste Grüße vom Grünschnabel



  • Bitte nutzte die Code-Tags (Code mit der Maus markieren und auf den C-Button unter dem 😡 klicken)
    Als registriertes Mitglied kannst du das noch nachträglich machen.

    main() gibt immer ein int zurück: https://www.c-plusplus.net/forum/viewtopic.php?t=39346

    getchar() gibt auch ein int zurück. (Das spielt hier aber keine Rolle)

    Nutze tolower() oder toupper() aus ctype.h
    Dann sparst du dir die Groß- oder Kleinbuchstaben.

    Warum nimmst du beim if den ASCII und beim case das Zeichen?
    Das Zeichen ist lesbarer,! In beiden Fällen.

    Nutze printf_s() nur, wenn du dich mit der Funktion auskennst und nicht nur, weil der Compiler da meckert.
    printf_s() ist kein 1:1 Ersatz für printf()

    Es ist immer ganz gut, mal die Eingabe zu überprüfen:

    printf("Muell: Ihre Eingabe war %d\n", auswahl);
    

    Du kannst statt der langen Bedingung bei if, bzw while auch die Standardfunktion strchr() benutzen.



  • Moin! Und willkommen.

    Erstmal würde ich Dir raten, Dein Programm in Funktionen aufzuteilen.
    Insbesondere die Aktionen würden wohl ihre eigenen Funktionen bekommen, z.B.

    void einfuegen() { puts("einfuegen"); }
    void loeschen() { puts("loeschen"); }
    

    Die Anzeige des Menues koennte z.B. so aussehen:

    puts("**********Telefonverzeichnis****************\n"
         "\n"
         "E = neuer Eintrag einfuegen\n"
         "L = Eintrag loeschen\n"
         "S = Telefonnummer suchen\n"
         "A = alle Eintraege anzeigen\n"
         "B = Programm beenden\n"
         "\n"
         "Ihre Wahl:");
    }
    

    Bei switch/case benutzt du das break an jedem case um ein sogenanntes fall-through zu verhindern. Wenn Du das break nicht schreibst werden einfach solange weiter die Anweisungen der einzelnen cases abgearbeitet, bis ein break kommt oder die schließende '}' des switch statements.

    Ein fehlendes break ist daher sehr ärgerlich, anderseits eröffnet es die Möglichkeit für mehrere cases die gleiche Anweisung auszuführen:

    switch (auswahl) {
      case 'E': /* fallthrough */
      case 'e': einfuegen(); break;
      case 'L': 
      case 'l': loeschen(); break;
        ...
      }
    

    Zuguterletzt noch die Überprüfung auf eine gültige Eingabe:
    Kannst Du Die nicht ganz weglassen? in dem switch/case hast Du doch schon eine Fehlerbehandlung (im default Zweig). Du müsstest dann evtl. noch eine neue Variable einführen, die im default Zweig auf einen bestimmten Wert setzen und dann die Laufbedingung in Deiner Schleife entsprechend schreiben.

    PS: Zu Deinem Problem mit der doppelten Ausgabe von 'Muell': getchar() liest als zweites Zeichen das newline-Zeichen aus, das Du beim drücken der Returntaste eingegeben hast. Lass Dir das Zeichen zur Kontrolle mitausgeben:

    printf("\'%d\'\n", auswahl);
    

Log in to reply