Wertrückgabe fehlerhaft



  • 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.


Anmelden zum Antworten