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 einint
zurück: https://www.c-plusplus.net/forum/viewtopic.php?t=39346getchar()
gibt auch einint
zurück. (Das spielt hier aber keine Rolle)Nutze
tolower()
odertoupper()
ausctype.h
Dann sparst du dir die Groß- oder Kleinbuchstaben.Warum nimmst du beim
if
den ASCII und beimcase
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ürprintf()
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 dasbreak
an jedemcase
um ein sogenanntes fall-through zu verhindern. Wenn Du dasbreak
nicht schreibst werden einfach solange weiter die Anweisungen der einzelnencases
abgearbeitet, bis ein break kommt oder die schließende '}' desswitch
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 demswitch/case
hast Du doch schon eine Fehlerbehandlung (imdefault
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);