switch case erlaubt keine Komma zahlen [GELÖST]



  • ettlFlorian schrieb:

    314159265358979 schrieb:

    Ich bezweifle, dass es in deinem Programm einen Grund gibt, printf und scanf zu verwenden. Benutze dafür die C++ IO Streams.

    das ist nich das Problem, das Problem ist das mir einf Fehler angezeigt wird ds der Preis nicht deklariert ist.

    Das ist schon ein Problem. "funktionieren" ist ungleich funktionieren. Nur weil es mit printf und scanf auch funktioniert, heißt das nicht, dass es egal ist. printf und scanf sind aus C übernommen worden und haben einige Problem, die C++ IO Streams nicht haben. Darunter die Ellipse und damit verbunden keine Typsicherheit. Und ich wette mit dir, dass du daurch mal auf die Nase fällst. 😉

    Anders sähe es dann wieder mit einem print() mit Variadic Templates aus. Aber das geht jetzt zu weit für diesen Thread.



  • ###############################
    #So vielen Dank an alle Helfer#
    ###############################

    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    int main () {	
    
    	float einwurf = 0; 
    	float bisheinwurf = 0; //Summe des bisherigen Einwurfs
    	int einwurfint;
    	float preis = 0;
    	int auswahl, menge = 0;
    	float wechselgeld = 0;
    
    	printf("\n\nGETRAENKEAUTOMAT V2\n");
    	printf("Waehlen sie ein Getraenk aus\n\t1 => Bier 2,3 Euro\n\t2 => Mineral 0,5 Euro\n\t3 => Apfelsaft 1,5 Euro\n");
    
    	do{//------------------------------prüfung der Auswahl
    		printf("Auswahl: ");
    		scanf("%d", &auswahl);
    		switch(auswahl) { //Zuordnung des Preises
    			case 1:
    				preis = 2.30;
    				break;
    			case 2:
    				preis = 0.50;
    				break;
    			case 3:
    				preis = 1.50;
    				break;		
    			default :
    				printf("Die Eingabe ist falsch");
    				break;
    		}
    	}while(auswahl >=3 && auswahl <= 1);
    
    	printf("Geben sie an wieviel Stueck sie benötigen.\nMenge: ");
    	scanf("%d", &menge);
    	preis = menge * preis; //Gesampreis
    
    	printf("\Geben sie %.2f ein.\nes werden keine Scheine ueber 5 Euro und 1 und 2 Centstuecke akzeptiert", preis);
    	do {//-------------------------Einwurfschleife
    		printf("\nEingabe :");
    		scanf("%f", &einwurf);
    		einwurfint = einwurf * 100;
    		switch (einwurfint) {					
    		case 10:							
    			break;//do nothing					
    		case 20://					   
    			break;//do nothing		
    		case 50://					   
    			break;//do nothing	
    		case 100://					    
    			break;//do nothing			
    		case 200:  //					     
    			break;//do nothing			
    		case 5:  //					    
    			break;//do nothing
    		case 500:  //					    
    			break;//do nothing
    		default : 
    			if (einwurfint < 500){
    				printf("Es darf keine Ein- bzw. Zweicentmünze eingeworfen werden");
    			}
    			else{
    				printf("Es darf nur ein 5 Euroschein verwenet werden");
    			};
    			continue;
    			break;
    		}
    		einwurf = einwurfint ;
    		einwurf = einwurf / 100;
    
    		bisheinwurf = bisheinwurf + einwurf;
    
    		if (bisheinwurf < preis){
    			printf("\nSie haben noch %.2f zu zahlen", preis-bisheinwurf);
    		}
    	}while(bisheinwurf < preis);
    
    	wechselgeld = (preis-bisheinwurf) *(-1);
    	if (wechselgeld != 0){
    
    		printf("Ihr Wechselgeld betraegt %.2f Euro", wechselgeld); 
    	}
    	printf("\nBitte entnehmen sie sich ihr Getraenk");
    
    	printf("\n\n  ");
    
    	system("pause");
    	return 0;
    }
    

    Das ist mein Automat



  • Man sollte zum Rechnen mit Währungen keine Fließkommazahltypen benutzen (und in 'echten' Anwendungen darf man das keinesfalls tun), die sind ungenau. Besser: alles mit int - Typen (in Cent) rechnen, und nur bei den Ausgabefunktionen ein Komma an die richtige Stelle bringen.



  • 314159265358979 schrieb:

    ettlFlorian schrieb:

    314159265358979 schrieb:

    Ich bezweifle, dass es in deinem Programm einen Grund gibt, printf und scanf zu verwenden. Benutze dafür die C++ IO Streams.

    das ist nich das Problem, das Problem ist das mir einf Fehler angezeigt wird ds der Preis nicht deklariert ist.

    Das ist schon ein Problem. "funktionieren" ist ungleich funktionieren. Nur weil es mit printf und scanf auch funktioniert, heißt das nicht, dass es egal ist.

    Nur dass es nicht egal ist, heisst aber auch nicht dass es ein Problem ist.



  • hustbaer schrieb:

    314159265358979 schrieb:

    ettlFlorian schrieb:

    314159265358979 schrieb:

    Ich bezweifle, dass es in deinem Programm einen Grund gibt, printf und scanf zu verwenden. Benutze dafür die C++ IO Streams.

    das ist nich das Problem, das Problem ist das mir einf Fehler angezeigt wird ds der Preis nicht deklariert ist.

    Das ist schon ein Problem. "funktionieren" ist ungleich funktionieren. Nur weil es mit printf und scanf auch funktioniert, heißt das nicht, dass es egal ist.

    Nur dass es nicht egal ist, heisst aber auch nicht dass es ein Problem ist.

    Für dieses Programm nicht - Für seine zukünftigen vielleicht schon 😉



  • Was sagt ihr sonst os zu meinen 1. "richtigen" Programm sozusagen.



  • ettlFlorian schrieb:

    Was sagt ihr sonst os zu meinen 1. "richtigen" Programm sozusagen.

    Ein häßliches Stück C-Code mit C++-Fetzen drin.
    Und Du rechnest doch auf Fließkommazahlen. Da kommen Fehler raus.


  • Mod

    ettlFlorian schrieb:

    Was sagt ihr sonst os zu meinen 1. "richtigen" Programm sozusagen.

    Pi hat da durchaus Recht. Mit deiner C und C++-Mischung bewegst du dich in eine Richtung in der du nicht glücklich werden wirst. Falls dein Lehrwerk dir das so beibringt, ist es schlecht.

    Weiterhin:
    - Geld sind keine Fließkommazahlen, wurde schon genannt
    - Zeile 46 bis 74 ist ja wohl ultra umständlich um zu prüfen, ob der Einwurf zu einem gültigen Geldstück passt.
    - Variablen deklariert man eigentlich erst da wo man sie braucht und dann so lokal wie möglich. Aber sie haben immerhin gute, sprechende Namen 👍 .

    Alles weitere sind Folgefehler aus den vier genannten Punkten.

    Ansonsten: Typisches Programm für jemandem mit deinem Erfahrungsstand: Bisschen umständlich, bisschen unleserlich. Da man sich aber nicht die Mühe geben wird so ein Übungsprogrämmchen toll zu planen ist das normal.



  • ettlFlorian schrieb:

    Was sagt ihr sonst os zu meinen 1. "richtigen" Programm sozusagen.

    Hast du mal probiert was passiert, wenn jemand ein 17-Cent Stück einwerfen will 😉



  • SeppJ schrieb:

    Zeile 7: main muss int zurückgeben
    Zeile 10: Semikolon statt Komma
    Zeile 13: CENT wird nirgends benutzt
    Zeile 25ff: In C++ ist das Dezimaltrennzeichen ein Punkt, kein Komma.
    Zeile 42: Es gibt keine Escapesequenz \G
    Zeile 78: Du hast den Header cstdlib für system vergessen

    Und das ist nur das was mir mein Compiler gesagt hat! Liest du nicht, was dir deiner sagt? Compiliere immer mit allen Warnoptionen und behandle Warnungen wie Fehler. Versuche zu Lernen, die Fehlermeldungen zu verstehen. Nimm das ernst! Dies ist wichtig!

    Ist wahrscheinlich wegen Google translate drin... ?


Anmelden zum Antworten