Mysteriös vertauschte Ausgaben ...
-
Die folgende kleine Konsolenanwendung funktioniert leider ned so wie sie soll.
Es werden nämlich die Ausgaben vertauscht. Z.B. wenn Wetter==1,Geld==0,Zeit==1 wird Freizeitpark anstatt Spazieren gehen angezeigt und ich kann mir ned erklären warum! Aber seht selbst/*Freizeitprogramm 21.10.03 Programm zur Freizeitgestaltung */ #include <stdio.h> #include <conio.h> void Anzeige(void); void Eingabe(void); void Wetter(void); void Ausgabe(void); //-----------------------------Hauptprogramm------------------------------------------- void main(void) { clrscr(); Anzeige(); Eingabe(); Ausgabe(); getch(); } //-----------------------------Überschrift---------------------------------------------- void Anzeige(void) { gotoxy(30,2); printf("Freizeitberatung"); gotoxy(5,4); printf("Dieses Programm wird eine Hilfe bei der Gestaltung ihrer Freizeit sein!"); getch(); } //-----------------------------------Input------------------------------------------ void Eingabe(void) { int Wetter,Geld,Zeit; gotoxy(18,6); printf("Ist das Wetter gut? Nein = 0, Ja = 1 : "); scanf("%i",&Wetter); gotoxy(18,7); printf("Haben sie Geld? Nein = 0, Ja = 1 : "); scanf("%i",&Geld); gotoxy(18,8); printf("Haben sie Zeit? Nein = 0, Ja = 1 : "); scanf("%i",&Zeit); } //----------------------------Ausgabe----------------------------------------------- void Ausgabe(void) { int Wetter,Geld,Zeit; gotoxy(8,10); printf("Aufgrund ihrer Eingaben haben wir folgenden Freizeittip erstellt:"); if (Wetter==1,Geld==1,Zeit==1) { gotoxy(18,12); printf("Machen sie einen Besuch im Freizeitpark!"); } else if (Wetter==1,Geld==1,Zeit==0) { gotoxy(25,12); printf("Gehen sie ein Eis essen!"); } else if (Wetter==1,Geld==0,Zeit==1) { gotoxy(22,12); printf("Machen sie einen Spaziergang im Park!"); } else if (Wetter==1,Geld==0,Zeit==0) { gotoxy(23,12); printf("Setzen sie sich in den Garten!"); } else if (Wetter==0,Geld==1,Zeit==1) { gotoxy(18,12); printf("Laden sie ein paar Freunde zum Essen ein!"); } else if (Wetter==0,Geld==1,Zeit==0) { gotoxy(20,12); printf("Lasssen sie sich eine Pizza kommen!"); } else if (Wetter==0,Geld==0,Zeit==1) { gotoxy(22,12); printf("Lesen sie ein gutes Buch"); } else if (Wetter==0,Geld==0,Zeit==0) { gotoxy(21,12); printf("Schauen sie was im Fernsehen kommt!"); } }
-
Hi..
Müsstest du nicht Wetter, Geld und Zeit irgendwie global deklarieren??
MfG Aoeke
-
Nö, warum denn? Die Variablen werden ja nur bei "Ausgabe" und "Eingabe" benötigt. Habs aber trotzdem grad mal getestet.
Bringt auch nichts.
-
Du musst die einzelnen Ausdrücke in den if-Anweisungen mit && verbinden, nicht mit Komma.
-
In der Funktion Eingabe sind deine Variablen lokal. Lokale Variablen werden beim Verlassen ihres Gültigkeitsbereiches, in dem Fall also beim Verlassen der Funktion, zerstört. In der Ausgabe-Funktion dann werden die Variablen zwar erstellt, aber nicht initialisiert (= kein Anfangswert zugewiesen). Dadurch enthalten sie "zufällige" Werte, was letztlich dazu führt, dass dein Programm Mist ausgibt.
Ein Ausweg sind globale Variablen. Du hast bei deinem Versuch, das umzusetzen, wahrscheinlich vergessen, die lokalen Variablen zu entfernen, so dass auf die globalen überhaupt nicht zugegriffen wurde. Globale Variablen sind aber verpönt und werden nur in begründeten Ausnahmefällen genutzt (das hier ist keiner.)
Normalerweise kommunizieren Funktionen über Argumente und Rückgabewerte. Damit würde das ganze etwa so aussehen:
int main() { int wetter, zeit, geld; wetter = EingabeWetter(); zeit = EingabeZeit(); geld = EingabeGeld(); Ausgabe(wetter, zeit, geld); return 0; } int EingabeWetter() { int hilfsvariable; printf("Ist das Wetter gut? Nein = 0, Ja = 1 : "); scanf("%i", &hilfsvariable); return hilfsvariable; } /* analog die anderen Eingabefunktionen */ void Ausgabe(int wetter, int zeit, int geld) { /* Ausgabefunktion wie bei dir, nur ohne lokale Variablen */ }
Man kann das auch noch besser mit struct und/oder Zeigern machen, aber ich unterstell mal, dass du soweit noch nicht bist. BTW: Willst du wirklich C lernen, nicht C++?
-
Recht hast du. Das hat geklappt. Der Junge hat Ahnung...
-
Das klappt trotzdem nur zufällig. Deklarier mal aus Spaß in Ausgabe noch eine andere Variable vor den dreien oder übersetze das ganze mit aktivierten Optimierungen.
-
Anfänger01 schrieb:
Nö, warum denn? Die Variablen werden ja nur bei "Ausgabe" und "Eingabe" benötigt. Habs aber trotzdem grad mal getestet.
Bringt auch nichts.Anfänger01 schrieb:
Recht hast du. Das hat geklappt. Der Junge hat Ahnung...
Jaja... Aber mir nicht glauben wollen....