PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : switch-case-Abfrage beim Minitaschenrechner



Enomis
10.08.2010, 08:39
Hallo an alle,
ich habe ein Problem mit meinem Programm das als Minitaschenrechner eingesetzt werden soll. Bei der switch-case-Abfrage meckert mein Compiler und sagt, ich solle a, m, d, s und b deklarieren, obwohl die nur verglichen werden sollen. Weiß jemand von euch, was ich falsch gemacht habe?



#include <stdio.h>

void main(void)
{
double zahl1, zahl2;
char auswahl;
printf("\nMini-Taschenrechner\n");
printf("-----------\n\n");
do
{
printf("\nBitte geben Sie die erste Zahl ein: ");
scanf("%lf", &zahl1);
printf("Bitte geben Sie die zweite Zahl ein: ");
scanf("%lf", &zahl2);
printf("\nZahl (a) addieren, (s) subtrahieren, (d) dividieren oder (m) multiplizieren?");
printf("\nZum Beenden wählen Sie (b)");
scanf("%c",&auswahl);
switch(auswahl)
{
case a:
printf("Ergebnis: %lf", zahl1 + zahl2);
break;
case s:
printf("Ergebnis: %lf", zahl1 - zahl2);
break;
case d:
if(zahl2 == 0)
printf("Division durch 0 nicht möglich!");
else
printf("Ergebnis: %lf", zahl1 / zahl2);
break;
case m:
printf("Ergebnis: %lf", zahl1 * zahl2);
break;
case b:
break;
default:
printf("Fehler: Diese Eingabe ist nicht möglich!");
break;
}
}
while(auswahl != b && auswahl != b);
getchar();
}

Jaecko
10.08.2010, 08:46
Naja, die Compilerwarnung stimmt schon. Es gibt nirgendwo Variablen, die sich a, s, d. ... nennen.
Wenn du den Inhalt von "auswahl" willst, brauchst du ' ' aussenrum ('a').

Wobei mich das wundert, dass vom Compiler hier nicht mehr kommt; Case mit variablen Werten... wäre mir neu, dass das geht. Aber ich glaub, die Warnung/Error kommt dann, wenn es a, s, d, ... tatsächlich geben würde.

Enomis
10.08.2010, 10:02
Vielen Dank, damit wird das Programm schon mal ausgeführt. Ich hatte schon mehrere Varianten ausprobiert, aber die ist mir wohl durch die Lappen gegangen. Jetzt wird das Programm ausgeführt, aber nach der Buchstabeneingabe bekomme ich jedesmal die Meldung "Fehler: Diese Eingabe ist nicht möglich", also die default-Anweisung, egal was ich eingebe. Noch eine Idee woran das liegen könnte?

Jaecko
10.08.2010, 10:17
Lass dir mal im default-Zweig anzeigen, was der da empfangen hat.
Also sowas wie
printf("Fehler: Diese Eingabe ist nicht möglich! Eingabe war: %c (0x%2X)", auswahl, auswahl);

Dann sieht man, was der da tatsächlich kriegt.

Enomis
10.08.2010, 10:22
Dann kommt "Eingabe war: (0x A)"
Hilft das?

Jaecko
10.08.2010, 10:33
0xA (bzw. 0x0A) ist der Line Feed; also irgendwer scheint hier ne Enter-Taster o.ä. reinzuschieben.
Ich kenn die Funktion scanf jetzt nicht so gut (eigentlich nie verwendet), aber wartet die hier bei der Eingabe auf ein Enter oder springt die gleich weiter, wenn a, m, s gedrückt wird?

Enomis
10.08.2010, 10:38
Nach der Eingabe des Buchstabens muss ich Enter drücken, damit etwas passiert. Das heißt also dass der Buchstabe gar nicht eingelesen wird oder wie?

Jaecko
10.08.2010, 10:46
Das heisst dann, dass das letzte gedrückte Char (In dem Fall der Line Feed vom CRLF beim Druck auf Enter) ausgewertet wird.
Kann sein, dass das so ne Eigenart von scanf ist.

Mit "auswahl = getchar();" müsste das dann aber eigentlich klappen. getchar wartet ja auch auf nen Tastendruck, sollte aber die davor gedrückten Zeichen zurückgeben.

Enomis
10.08.2010, 10:53
Entschuldigung... aber wo muss ich auswahl = getchar eintragen?

Jaecko
10.08.2010, 11:06
An die Stelle, wo du eigentlich mit scanf den Buchstaben abfragst.

Enomis
10.08.2010, 11:51
Super, es funktioniert! 8) Vielen Dank!
Enomis