Variable wird waehrend Programmablauf auf Ausgngswert zurueckgesetzt
-
Hallo, ich habe folgendes Problem.
Ich soll ein Programm schreiben, welches eine Art Konto simuliert. Ich habe das Grundgerüst soweit fertig.
Mein Problem ist, dass die Variable "guthaben", die das aktuelle Kontoguthaben zwischenspeichern soll, auf den Ausgangswert "0" zurückgesetzt wird, sobald ich ein zweites Mal auf das Konto einzahlen bzw vom Konto auszahlen möchte.
Also Beispiel:Guthaben = 0
Ich zahle 500 ein, neuer Kontostand = 500. Klappt soweit auch.
Zahle Ich jetzt erneut ein, sagen wir mal 200, dann wird allerdings ein Kontostand von 200 angezeigt. Es wird also immer von der "0" ausgegangen.Jetzt weiss ich mittlerweile, dass es daran liegt, dass ich für das Einzahlen, Auszahlen usw. jeweils eine Funktion aufrufe und diese zwar die Variablen mit dem selben Namen beinhalten, die Variablen aber dennoch nicht die selben sind.
Jetzt meine Frage: Wie gehe ich da vor? Ich muss wahrscheinlich mit Zeigern in meinen Funktionen arbeiten und in der main() dann mit den zugehörigen adressen, oder zu mindest so ähnlich.
Ich habe es ausprobiert, aber auch das hat nicht so recht hingehauen. Kann mir da jemand einen Tipp geben?#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> // Funktion zum Einzahlen auf das Konto void einzahlen(float betrag_ein, float guthaben) { printf(" > Sie moechten Geld einzahlen."); printf("\n\n Gewuenschter Betrag: "); scanf_s("%f", &betrag_ein); printf("\n Eingezahlt : %.2f Euro\n", betrag_ein); guthaben += betrag_ein; printf(" Neuer Kontostand : %.2f Euro\n", guthaben); } // Funktion zum Auszahlen vom Konto void auszahlen(float betrag_aus, float guthaben) { printf(" > Sie moechten Geld auszahlen."); printf("\n\n Gewuenschter Betrag: "); scanf_s("%f", &betrag_aus); guthaben -= betrag_aus; if(guthaben < -1000) { printf("\n (!)Ihr Konto ist nicht ausreichend gedeckt!\a"); } else { printf("\n Ausgezahlt : %.2f Euro\n", betrag_aus); printf(" Neuer Kontostand : %.2f Euro\n", guthaben); } } // Funktion zum Abrufen des Kontostands void kontostand(float guthaben) { printf(" > Ihr Kontostand wurde abgefragt."); printf("\n\n Kontostand : %.2f Euro\n", guthaben); } // Hauptfunktion int main() { char wiederholen; float guthaben=0; float betrag_ein=0; float betrag_aus=0; int auswahl; do { puts("\n Was moechten Sie tun?"); puts(" ---------------------"); puts(" 1 - Geld einzahlen"); puts(" 2 - Geld auszahlen"); puts(" 3 - Kontostand abfragen"); puts(" 4 - Verlassen"); printf("\n Waehlen Sie: "); do { scanf_s("%i", &auswahl); switch(auswahl) { case 1: einzahlen(betrag_ein, guthaben); break; case 2: auszahlen(betrag_aus, guthaben); break; case 3: kontostand(guthaben); break; case 4: printf("\n\n > Verlassen mit <ENTER>\n"); _getch(); return 0; break; default:printf("\n (!)Bitte zwischen 1 - 4 waehlen: \a"); } } while(auswahl != 1 && auswahl != 2 && auswahl != 3 && auswahl != 4); // Wird wiederholt bis 1,2,3 oder 4 eingegeben wird printf("\n ______________________________\n"); printf("\n Bearbeitung fortsetzen? <j/n>"); wiederholen=_getch(); printf("\n ------------------------------\n"); }while (wiederholen=='j' || wiederholen=='J'); return 0; }
-
Binganzokay schrieb:
einzahlen(betrag_ein, guthaben);
Hier übergibst du die variable
guthaben
zwar an die Funktion, dies ist aber nur eine Kopie der Variable. Prinzipiell gibt es da zwei Möglichkeiten:a) die Funktion(en) die mit
guthaben
arbeiten geben den neu berechneten Wert auch wieder zurück und du überschreibst den alten Wert mit dem neuen Rückgabewertb) du übergibst einen Zeiger auf
guthaben
, dann kannst duguthaben
auch in der Funktion verändern
-
Ahhh okay, vielen Dank.
Hatte gestern leider keine Zeit mehr zu antworten oder es überhaupt auszuprobieren.
Eine Frage hätte ich aber dennoch.
Wie kann ich denn deine Möglichkeit a) am besten umsetzen?
Oder was wäre denn allgemein eleganter?Ich habe jetzt versucht einen zeiger zu übergeben, allerdings bekam ich bei der Ausführung die Fehlermeldung vom Arbeitsspeicher, es sei keine Zugriffsberechtigung an Position so und so..
Komme da irgendwie nicht weiter
-
Binganzokay schrieb:
Ahhh okay, vielen Dank.
Hatte gestern leider keine Zeit mehr zu antworten oder es überhaupt auszuprobieren.
Eine Frage hätte ich aber dennoch.
Wie kann ich denn deine Möglichkeit a) am besten umsetzen?
Oder was wäre denn allgemein eleganter?Ich habe jetzt versucht einen zeiger zu übergeben, allerdings bekam ich bei der Ausführung die Fehlermeldung vom Arbeitsspeicher, es sei keine Zugriffsberechtigung an Position so und so..
Komme da irgendwie nicht weiterEntweder so:
void einzahlen(float betrag_ein, float *guthaben) { printf(" > Sie moechten Geld einzahlen."); printf("\n\n Gewuenschter Betrag: "); scanf_s("%f", &betrag_ein); printf("\n Eingezahlt : %.2f Euro\n", betrag_ein); *guthaben += betrag_ein; printf(" Neuer Kontostand : %.2f Euro\n", *guthaben); } ... einzahlen(betrag_ein, &guthaben); ...
Oder besser so:
float einzahlen(float betrag_ein, float guthaben) { printf(" > Sie moechten Geld einzahlen."); printf("\n\n Gewuenschter Betrag: "); scanf_s("%f", &betrag_ein); printf("\n Eingezahlt : %.2f Euro\n", betrag_ein); guthaben += betrag_ein; printf(" Neuer Kontostand : %.2f Euro\n", guthaben); return guthaben; } ... guthaben = einzahlen(betrag_ein, guthaben); ...
Übrigens: float benutzt man/frau nur, wenn man Speicher sparen muß. Nimm besser double.
Edit: Ich sehe gerade, daß die Übergabe des Parameters betrag_ein völlig nutzlos ist. Nimm das weg.
mfg Martin
-
mgaeckler schrieb:
Übrigens: float benutzt man/frau nur, wenn man Speicher sparen muß. Nimm besser double.
Für Geld im modernen Sinne ist beides unbrauchbar. Fließkommazahlen wären etwas, wenn man "Wohlstand" tatsächlich noch in einer absoluten Goldmenge (nicht Münzen!) messen würde.
-
Wow okay. Jetzt verstehe ich. Vielen Dank