Wertrückgabe fehlerhaft



  • Moin!
    Ich habe mal wieder ein (Anfänger)Problem.
    Ich habe einen Getränkeautomaten programmiert und ihn dann in verschiedene Funktionen aufgeteilt.
    Bei der Funktion "" erhalte ich jedoch immer den Wert 1 zurück.
    Ich bin das ganze mit dem Debugger durchgegangen. Eigentlich sollte er den richtigen Wert bekommen. Aber das tut er nicht.
    Ich habe das ganze Mal mit Kommentaren im Code markiert.
    Ich bitte um eure Hilfe.

    Danke im Voruas.

    Nowaepon

    #include<stdio.h>
    
    int auswahl(float bierp, float limop, float wasserp, int einwurf, char temp);
    float einwurfpruefung(int einwurf, int menge, char temp, float bezahlmet, float bierp, float limop, float wasserp, float bezahlung, float restbetrag);
    int mengenpruefung(int menge, char temp);
    float restbetragpruefung(float restbetrag, float bezahlung, char temp);
    float auswurfpruefung(float restbetrag, int menge, float rueckgeld, int i);
    
    int main() {
    
    	int einwurf = 0, menge = 0, i = 0, schleife = 1;
    	float bierp = 2, limop = 1, wasserp = 0.5, bezahlung = 0, bezahlmet = 0, restbetrag = 1, rueckgeld = 0, restbetrag2 = 1;
    	char temp = 'a';
    
    	while (schleife = 1)
    	{
    		einwurf = auswahl(bierp, limop, wasserp, einwurf, temp);
    		restbetrag, menge = einwurfpruefung(einwurf, menge, temp, bezahlmet, bierp, limop, wasserp, bezahlung, restbetrag, rueckgeld, i);
    		//Hier kommt restbetrag = 1 und menge = 4 an
    		restbetrag2 = auswurfpruefung(restbetrag, menge, rueckgeld, i);
    		restbetrag = restbetrag2;
    	}
    }
    
    int auswahl(float bierp, float limop, float wasserp, int einwurf, char temp) {
    	printf("Getraenke Automat v0.2\n\n\n");
    	printf("Waehlen Sie ein Getraenk:\n\n");
    	printf("1) Bier; %.2f Euro je\n", bierp);
    	printf("2) Limonade; %.2f Euro je\n", limop);
    	printf("3) Wasser; %.2f Euro je\n", wasserp);
    	scanf_s("%d%c", &einwurf, &temp);
    	//Beispielsweise einwurf = 3
    	return einwurf;
    }
    
    float einwurfpruefung(int einwurf, int menge, char temp, float bezahlmet, float bierp, float limop, float wasserp, float bezahlung, float restbetrag) {
    	switch (einwurf) {
    	case 1:
    		menge = mengenpruefung(menge, temp);
    		printf("\n\n\n------- BEZAHLUNG -------");
    		bezahlmet = bierp;
    		restbetrag = menge*bezahlmet;
    		printf("\n%f", restbetrag);
    		do
    		{
    			restbetrag = restbetragpruefung(restbetrag, bezahlung, temp);
    			printf("\n%f", restbetrag);
    		} while (restbetrag > 0);
    		printf("\n%f", restbetrag);
    		return restbetrag, menge;
    		break;
    	case 2:
    		menge = mengenpruefung(menge, temp);
    		printf("\n\n\n------- BEZAHLUNG -------");
    		bezahlmet = limop;
    		restbetrag = menge*bezahlmet;
    		do
    		{
    			restbetrag = restbetragpruefung(restbetrag, bezahlung, temp);
    		} while (restbetrag > 0);
    		return restbetrag, menge;
    		break;
    	case 3:
    		menge = mengenpruefung(menge, temp);
    		//menge = 4 kommt zurück
    		printf("\n\n\n------- BEZAHLUNG -------");
    		bezahlmet = wasserp;
    		//bezahlmet wird auf 0.5 gesetzt
    		restbetrag = menge*bezahlmet;
    		//4*0.5 = 2; restbetrag = 2
    		do
    		{
    			restbetrag = restbetragpruefung(restbetrag, bezahlung, temp);
    			//restbetrag = 0 kommt an
    		} while (restbetrag > 0);
    		//Schleife wird erfolgreich verlassen
    		return restbetrag, menge;
    		//restbetrag = 0 und menge = 4 werden zurückgegeben
    		break;
    	default: printf("\nDieses Getraenk gibt es nicht.\nVersuchen Sie es bitte noch einmal.\n\n\n\n\n"); return 0; break;
    	}
    }
    
    int mengenpruefung(int menge, char temp) {
    	printf("\n\nWaehlen Sie eine Menge: ");
    	scanf_s("%d%c", &menge, &temp);
    	//Beispielsweise 4 Stück
    	return menge;
    }
    
    float restbetragpruefung(float restbetrag, float bezahlung, char temp) {
    	printf("\n\n\nSie muessen noch %.2f Euro zahlen.", restbetrag);
    	printf("\nBitte werfen Sie ein weiteres Geldstueck ein: ");
    	scanf_s("%f%c", &bezahlung, &temp);
    	//Einlesen des Betrags
    	restbetrag = restbetrag - bezahlung;
    	//Restbetrag wird bei Eingabe von 2 auf 0 gesetzt; klappt einwandfrei
    	return restbetrag;
    }
    
    float auswurfpruefung(float restbetrag, int menge, float rueckgeld, int i) {
    	printf("\n%d", menge); //DEBUG
    	printf("\n%f\n", restbetrag); //DEBUG
    	//Hier kommt menge = 4 und restbetrag = 1 an
    	if (restbetrag == 0)
    	{
    		printf("%d", menge);
    		for (i = 1; i <= menge; i++)
    		{
    			printf("\nFlasche %d von %d wird ausgegeben.", i, menge);
    		}
    		printf("\n\nVielen Dank fuer Ihren Einkauf!\nBitte entnehmen Sie Ihr(e) Getraenk(e).\n\n\n\n\n");
    		restbetrag = 1;
    	}
    	else if (restbetrag < 0)
    	{
    		rueckgeld = restbetrag - restbetrag - restbetrag;
    		printf("%d", menge);
    		for (i = 1; i <= menge; i++)
    		{
    			printf("\nFlasche %d von %d wird ausgegeben.", i, menge);
    		}
    		printf("\n\nVielen Dank fuer Ihren Einkauf!\nBitte entnehmen Sie Ihr(e) Getraenk(e).\nZusaetzlich erhalten Sie ein Rueckgeld in Hoehe von %.2f Euro.\n\n\n\n\n", rueckgeld);
    		restbetrag = 1;
    	}
    	return restbetrag;
    	getchar();
    }
    


  • Du kannst bei einer Funktion nur einen Wert direkt zurück geben.
    Weiter musst du über Zeiger und als Funktionsparamter machen.

    Rechne bei Geldbeträgen nicht mit Fließkommazahlen.
    Da kommt es zu Rundungsfehlern und bei Geld hört der Spaß auf.

    Rechne mit Cent, dann kannst du int nehmen.

    Du hast mehrmals Code, de sich nur durch wenige Zeilen unterscheidet.
    Zudem ist die Parameterliste von einwurfpruefung sehr lang.
    Überleg dir eine andere Datenstruktur für deine Bezeichnungen/Preise.
    Array von einer struct, in der dann Bezeichnung und Preis stehen.
    Dann kannst du das ganz leicht erweitern.



  • ...


  • Mod

    Swordfish schrieb:

    DirkB schrieb:

    [...] Weiter musst du über Zeiger Referenzen als Funktionsparamter machen.

    ftfy.

    Du bist im falschem Forum fuer Referenzen.



  • ...



  • Danke für eure Hilfe.

    Ich werde dann mal mein Programm überarbeiten.
    Arrays kommen für mich noch nicht in Frage. Laut Tutorial soll das ganze auch ohne lösbar sein.
    Also werde ich es auch ohne schaffen. 🙂



  • Noch etwas:
    Du benutzt scanf_s falsch. Bei %c wird noch ein weiterer Paramter mit der Größe der Speicherstelle erwartet.
    Den hast du nicht angegeben.

    Aber: erstens brauchst du das %c gar nicht und zweitens macht das scanf auch vernünftig.



  • Für scanf muss ich moch etwas in der IDE umstellen.

    Und leider brauche ich zumindest bei mir %c. Sonst wird bei der nächsten Eingabeaufforferung die Entertaste mit eingelesen. 😕

    Welchen Parameter meinst du denn?



  • ...



  • Nowaepon schrieb:

    Und leider brauche ich zumindest bei mir %c. Sonst wird bei der nächsten Eingabeaufforferung die Entertaste mit eingelesen. 😕

    Schwachfug.
    Du hast da immer nur %d oder %f und die überlesen Whitespace am Anfang.
    Dazu gehört auch \n. (wenn du nach der Zahl mal Leerzeichen eingibst, dann liest das %c ein Leerzeichen ein.)

    Nowaepon schrieb:

    Welchen Parameter meinst du denn?

    scanf_s ist nicht einfach so sicherer. Du musst da schon noch ein paar Angaben machen.
    Allerdings kannst du die bei scanf auch im Formatstring mit angeben.
    Wenn du da Fehler machst, ist beides unsicher.



  • Danke für die Info.
    Ich sorge jetzt erstmal dafür das scanf funktioniert.
    Ich möchte ja nicht dauernd wegen scanf_s gerügt werden. 😃



  • Swordfish schrieb:

    #define _CRT_SECURE_NO_WARNINGS
    

    und gut iss'.

    Leider nicht. Das funktioniert nicht. 😉

    So, ich habe meinen Code jetzt mal verbessert.
    Jetzt habe ich ein letztes, äußerst merkwürdiges Problem.
    Wenn man als Getränk Wasser wählt, wird der zu zahlende Betrag immer auf 0 gesetzt.
    Ich verstehe jedoch nicht wieso. Die Zuweisung des Wasserpreises geschieht genauso wie die der anderen Preise und ich habe den Wasserwert mit

    float wasserp = 0.5;
    

    initialisiert.

    int auswahl(float preis);
    int mengenpruefung(int menge);
    float bezahlvorgang(float preis, float restbetrag, int menge);
    float ausgabe(float restbetrag, int menge);
    
    int main() {
    	float preis = 0, restbetrag = 1;
    	int menge = 0, schleife = 1;
    
    	while (schleife = 1) {
    		preis = auswahl(preis);
    		menge = mengenpruefung(menge);
    		restbetrag = bezahlvorgang(preis, restbetrag, menge);
    		restbetrag = ausgabe(restbetrag, menge);
    	}
    }
    
    int auswahl(float preis) {
    	float bierp = 2, limop = 1, wasserp = 0.5;
    	int einwurf, temp = 1;
    
    	do {
    		printf("Getraenke Automat v0.2\n\n\n");
    		printf("Waehlen Sie ein Getraenk:\n\n");
    		printf("1) Bier; %.2f Euro je\n", bierp);
    		printf("2) Limonade; %.2f Euro je\n", limop);
    		printf("3) Wasser; %.2f Euro je\n", wasserp);
    		scanf_s("%d", &einwurf);
    
    		switch (einwurf) {
    		case 1:
    			preis = bierp;
    			temp = 0;
    			break;
    		case 2:
    			preis = limop;
    			temp = 0;
    			break;
    		case 3:
    			preis = wasserp;
    			temp = 0;
    			break;
    		default: printf("\nDieses Getraenk gibt es nicht.\nVersuchen Sie es bitte noch einmal.\n\n\n\n\n");
    			temp = 1;
    			break;
    		}
    	} while (temp != 0);
    	return preis;
    }
    
    int mengenpruefung(int menge) {
    	printf("\n\nWaehlen Sie eine Menge: ");
    	scanf_s("%d", &menge);
    	return menge;
    }
    
    float bezahlvorgang(float preis, float restbetrag, int menge) {
    	printf("\n\n\n------- BEZAHLUNG -------");
    	restbetrag = preis * menge;
    	float bezahlung;
    
    	do {
    		printf("\n\n\nSie muessen noch %.2f Euro zahlen.", restbetrag);
    		printf("\nBitte werfen Sie ein weiteres Geldstueck ein: ");
    		scanf_s("%f", &bezahlung);
    		restbetrag = restbetrag - bezahlung;
    	} while (restbetrag > 0);
    
    	return restbetrag;
    }
    
    float ausgabe(float restbetrag, int menge) {
    	int i;
    
    	printf("\n%d", menge); //DEBUG
    	printf("\n%f\n", restbetrag); //DEBUG
    
    	if (restbetrag == 0)
    	{
    		for (i = 1; i <= menge; i++)
    		{
    			printf("\nFlasche %d von %d wird ausgegeben.", i, menge);
    		}
    		printf("\n\nVielen Dank fuer Ihren Einkauf!\nBitte entnehmen Sie Ihr(e) Getraenk(e).\n\n\n\n\n");
    		restbetrag = 1;
    	}
    
    	else if (restbetrag < 0)
    	{
    		float rueckgeld;
    		rueckgeld = restbetrag - restbetrag - restbetrag;
    		for (i = 1; i <= menge; i++)
    		{
    			printf("\nFlasche %d von %d wird ausgegeben.", i, menge);
    		}
    		printf("\n\nVielen Dank fuer Ihren Einkauf!\nBitte entnehmen Sie Ihr(e) Getraenk(e).\nZusaetzlich erhalten Sie ein Rueckgeld in Hoehe von %.2f Euro.\n\n\n\n\n", rueckgeld);
    		restbetrag = 1;
    	}
    	return restbetrag;
    	scanf_s("");
    }
    


  • ...



  • int auswahl(float preis) {
    ...
        return preis; // Das passt vom Typ nicht
    }
    

    Bevor du das jetzt änderst, stell den Warnlevel von deinem Compiler so ein, dass er dir da eine Warnung ausgibt.



  • Ok, danke.
    Daran hatte ich nun wirklich nichtmehr gedacht...

    Die Cent kommen als nächstes.
    Erstmal etwas funktionierendes haben. Dann kann man experimentieren. 😃



  • Du brauchst die Cent damit es richtig funktioniert.
    Bei float handelst du dir Rundungs- und Darstellungsfehler ein.


Log in to reply