Hallo, ich fange gerade mit dem Programmieren an und versuche gerade einen Getränkeautomaten zu programmieren, der auch Wechselgeld geben kann. Nun tritt das folgende Problem auf: Wenn ich erst 1.30 einwerfe und danach 0.20 dann gibt mir der Editor aus: "Bitte werfen Sie noch 0.00 EUR ein." Hat jemand einen Tipp wie ich dieses Problem lösen kann? int cola () { float cola; float einwurf; cola=1.5; if (einwurf<cola) { do { printf("\nBitte werfen Sie %0.2f Euro ein\n\n", cola); scanf("%f", &einwurf); cola = cola + einwurf;} while (cola>0);} if (cola<0) printf("\nBitte entnehmen Sie die Cola und das Rueckgeld von %0.2f EUR\n\n", -cola); if (cola==0) printf("\nBitte entnehmen Sie die Cola.\n\n"); return 0; } Danke schonmal für eure Hilfe!
Das Problem wirst du bei Float immer haben und manuell lösen müssen. Gib die Werte als iInteger an und rechne in Cent statt in Euro!
Alex schrieb: > Hat jemand einen Tipp wie ich > dieses Problem lösen kann? ja. 1. Rechnen in Cent - dann gibt es keine Rundungsprobleme 2. float kann man nicht sinnvoll auf "gleich" vergleichen. Es gibt nur größer und kleiner.
was sind denn deine Eingaben für scanf, die du im Einwurf speicherst? -1,3 und -0.2? dann ist klar, warum (einwurf<cola) stets erfüllt ist.
Alex schrieb: > cola = cola + einwurf; Wieso wird die Cola immer teurer, je mehr Geld eingeworfen wird? awsxdde
Wo wird float einwurf initialisiert und wo wird float einwurf der aktuelle Wert uebergeben?
Mike schrieb: > was sind denn deine Eingaben für scanf, die du im Einwurf speicherst? > -1,3 und -0.2? dann ist klar, warum (einwurf<cola) stets erfüllt ist. erst denken, dann posten. Sry.
Erstmal vielen Danke für eure schnellen Antworten!
Sorry wegen des Fehlers in der Zeile:
> cola = cola + einwurf;
Da hatte ich etwas rumgespielt und vergessen das + durch ein - zu
ersetzen.
Ich werde nun versuchen das Problem durch Integer zu lösen.
Das Problem wurde von einem Kollege gerade wie folgt umgangen XD: int cola () { float cola; float einwurf; cola=1.5; if (einwurf<cola) { do { printf("\nBitte werfen Sie %0.2f Euro ein\n\n", cola); scanf("%f", &einwurf); cola = cola - einwurf;} while (cola>0.005);} if (cola<-0.005) printf("\nBitte entnehmen Sie die Cola und das Rueckgeld von %0.2f EUR\n\n", -cola); if (cola>=-0.005) printf("\nBitte entnehmen Sie die Cola.\n\n"); return 0; } Grüße
Du kannst schon bei float bleiben, ... cola = cola - einwurf; } while (cola >= 0.005); darfst aber nicht auf exakt 0.0 vergleichen. Alex schrieb: > if (cola==0) printf("\nBitte entnehmen Sie die Cola.\n\n"); Entweder >= oder <= verwenden.
Alex schrieb: > Das Problem wurde von einem Kollege gerade wie folgt umgangen XD: schön ist das aber nicht.
1 | while (cola>0.005); |
der wert kann auch negativ sein. Dann sollte man es wenigsten so machen:
1 | while (abs(Cola)<0.005)) { |
m.n. schrieb: > Du kannst schon bei float bleiben, > > ... > cola = cola - einwurf; > } while (cola >= 0.005); > > darfst aber nicht auf exakt 0.0 vergleichen. > Alex schrieb: >> if (cola==0) printf("\nBitte entnehmen Sie die Cola.\n\n"); > > Entweder >= oder <= verwenden. Naja, nicht wirklich. Wenn herauskommt, dass noch 0.000004 einzuwerfen sind, reicht es eben immer noch nicht. awsxdde
awsxdde schrieb: >> Entweder >= oder <= verwenden. > > Naja, nicht wirklich. Das war ein allgemeiner Rat und nicht auf die spezielle Rundung bezogen, wie ich es zuvor gezeigt hatte.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.