Forum: Compiler & IDEs Problem in Code


von Simon N. (ardi)


Lesenswert?

Hi,
ich wollte ein einfaches Getränkeautomatenprogramm machen.
Wenn nicht der Betrag eingegeben wird wie erwünscht soll kommen:
Bitte geben sie den passenden Betrag ein oder.
Das tut es auch. Aber wenn ich den richtigen Wert eingeben kommt das 
auch und wenn ich dann da nochmal den richtigen Wert eingeben dann erst 
ist das Programm erfolgreich:
1
.
2
.
3
.
4
if(wahl==3){
5
    printf("Bitte geben sie 1.50 Euro ein:");
6
    scanf("%f", &summe);
7
    do{
8
        printf("Bitte geben sie den vollen Betrag ein:");
9
        scanf("%f", &summe);
10
    }while(summe!=1.50);
11
        if(summe==1.50){
12
            printf("Bitte entnehmen Sie Ihr Getreank");
13
        }
14
15
}
16
.
17
.
18
.
Ich möchte wenn ich als erstes den Betrag richtig eingegeben habe gleich 
zum Ende.
Danke und Gruß?

von Helfer (Gast)


Lesenswert?

Hallo Simon,
dann darfst du keine do-while Schleife benutzen. Diese wird nämlich erst 
einmal durchlaufen, bevor das Abbruchkriterium geprüft wird.
Ersetzt du sie durch eine While-Schleife, dann sollte dein Code laufen.

von Simon N. (ardi)


Lesenswert?

Jetzt jetzt kommt nach jedem richtigen eingeben ich solle den passenden 
Preis eingeben:
1
if(wahl==2){
2
    printf("Bitte geben sie 2 Euro ein:");
3
    scanf("%d", &summe);
4
    while(summe!=2){
5
        printf("Bitte geben sie den vollen Betrag ein:");
6
        scanf("%d", &summe);
7
    }
8
        if(summe==2){
9
            printf("Bitte entnehmen Sie Ihr Getreank");
10
        }
11
12
}

von Dr. Sommer (Gast)


Lesenswert?

Mit diesen kleinen "einfachen" Werten funktioniert das vermutlich noch, 
aber generell ist es eine schlechte Idee float's so zu benutzen, denn 
wenn man zwei floats summiert kommt nicht unbedingt die mathematisch 
Summe heraus, sondern z.B. etwas das um 0.00001 abweicht. Und wenn man 
dann auf exakt 1.5 prüft, wäre 1.4999999 schon falsch... Daher prüft 
man entweder einen Bereich ala 1.4<x<1.6, oder verwendet doch lieber 
Integer (und rechnet komplett in Cent), denn dort hat man dieses Problem 
nicht...

von Simon N. (ardi)


Lesenswert?

Ok ich habe jetzt mal alle Werte auf Integer gestellt, also ohne Komma, 
und es funktioniert.
Aber was ist wenn ich jetzt Kommas haben möchte?

von Peter II (Gast)


Lesenswert?

Simon Name schrieb:
> Aber was ist wenn ich jetzt Kommas haben möchte?

dann musst du etwas unscharf abfragen:

if( abs(summe-2) < 0.001 ) {

von Simon N. (ardi)


Lesenswert?

Ok Danke mal

von Dr. Sommer (Gast)


Lesenswert?

Simon Name schrieb:
> Aber was ist wenn ich jetzt Kommas haben möchte?
Einfach komplett in Cent rechnen (also ohne Komma) und dann einfach nur 
die Anzeige mit Komma machen:
1
printf ("%d,%d€\n", cents/100, cents%100);
Und die Eingabe auch:
1
int euros, cents;
2
scanf("%d,%d\n", &euros, &cents);
3
cents += euros * 100;
Und dann mit nur mit "cents" weiterrechnen.

So vermeidest du alle Probleme mit "float" komplett, vor allem eben die 
Ungenauigkeit in Peter II's Antwort. float sollte grundsätzlich nur 
benutzt werden wenn man ganz genau weiß wie das funktioniert und wie die 
Probleme entstehen... Integer funktionieren hier ja wunderbar da man 
alles in Cents rechnen kann, das Komma ist nur eine Frage der 
Ein/Ausgabe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.