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ückgabewert

    b) du übergibst einen Zeiger auf guthaben , dann kannst du guthaben 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 weiter 😕

    Entweder 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


  • Mod

    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 🙂


Anmelden zum Antworten