Fehler in Programm, wer findet ihn?
-
Hi
Ich habe ein Programm geschrieben, was einem aus einem (Geld-)Betrag sagt, wie man ihn am besten mit möglichst wenig Scheinen bzw. Kleingeld ausgibt. An sich funktioniert es auch.Das Problem ist aber folgendes: wenn es um Centbrträge geht, lässt es teilweise die letzten Cents weg, manchmal aber nicht.
Also als Beispiel: Wenn man 8.06€ eingibt, kommt: 1* 5 Euro
1* 2 Euro
1* 1 Euro
1* 5 Cent
1* 1 Centaber wenn man zum Beispiel 1.06€ eingibt, kommt: 1* 1 Euro
1* 5 Cent
Also er vergisst den letzten Cent und ich finde den Grund einfach nicht. Der Fehler taucht bei verschiedenen Beträgen auf.Wäre super wenn irgendwer den Fehler findet und mir erklären könnte, woran es liegt! Danke im Vorraus!
#include <stdio.h> #include <windows.h> main() { float geld[15], wert; float anzahl[15]; int i=0, x=1, z=0; geld[0] = 500; geld[1] = 200; geld[2] = 100; geld[3] = 50; geld[4] = 20; geld[5] = 10; geld[6] = 5; geld[7] = 2; geld[8] = 1; geld[9] = 0.5; geld[10] = 0.2; geld[11] = 0.1; geld[12] = 0.050; geld[13] = 0.020; geld[14] = 0.010; while(1){ printf("\n\nBitte geben Sie den Wert ein: "); scanf("%f", &wert); for(z=0; z<=14; z++) { anzahl[z] = 0; } printf("\n\nIhr Wechselgeld: "); for(i = 0; i<= 14; i++) { while (wert >= geld[i]) { wert = wert - geld[i]; anzahl[i] = x++; printf("\n"); if(geld[i]>=1.0) { printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]); } else { printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100);}} x=1; } printf("\n\n"); system("PAUSE");} }
-
float ist der flasche tyü. double auch.
nimm int und rechne mit cent.die fließkommazahlen runden mal auf, mal ab, ganz komisch.
Oder mach
scanf("%f", &wert); wert+=0.005;
und füge damit einen halben Cent hinzu, damit Du nicht an der Rundungsgrenze kratzt. Aber das ist nicht die Feine Art eigentlich.
-
Aber dann muss man ja den Betrag am Anfang auch in Cent eingeben. Gibt es da keine andere Möglichkeit?
-
...
-
Auf jeden Fall Danke für den Tip mit wert +=0.005;
Für diesen Zweck tuts das allemal und is wohl die einfachste Lösung
-
Pferdmann schrieb:
Auf jeden Fall Danke für den Tip mit wert +=0.005;
Für diesen Zweck tuts das allemal und is wohl die einfachste Lösungeine lösung ist das nicht.
einer lösung nahe kommt der code von swordfisch
-
Mir is leider gerade noch ein Fehler aufgefallen
Immer wenn am Ende eines Wertes die Zahl 9 steht, gibt er folgendes ergebnis für die 9 raus:
Bsp: 299:
1200;
150;
120;
220;
15;
12;
2*2;also schreibt er immer statt 10 und 1 --> 20 bzw. 2
also rechnet er imm 1*2 +2*2( =1) =4
Ich verstehe das einfach nicht, da er sonst jeden anderen Wert auch richtig rechnet... O.o
-
Ich versteh nicht, was x macht.
-
x ist dafür da, damit der wert von anzahl[i] pro subtraktion um 1 hochgezählt wird.
und bevor ein neuer wert für die subtraktion verwendet wird (also die whileschleife neu beginnt) wird x auf 1 zurückgesetzt.
Ich weis nich ob man das so schreiben muss, ich bin ziemlich neu im programmiere...
-
Ich hab den Code mal einrücken lassen...
#include <stdio.h> #include <windows.h> main() { float geld[15], wert; float anzahl[15]; int i=0, x=1, z=0; geld[0] = 500; geld[1] = 200; geld[2] = 100; geld[3] = 50; geld[4] = 20; geld[5] = 10; geld[6] = 5; geld[7] = 2; geld[8] = 1; geld[9] = 0.5; geld[10] = 0.2; geld[11] = 0.1; geld[12] = 0.050; geld[13] = 0.020; geld[14] = 0.010; while(1) { printf("\n\nBitte geben Sie den Wert ein: "); scanf("%f", &wert); for(z=0; z<=14; z++) { anzahl[z] = 0; } printf("\n\nIhr Wechselgeld: "); for(i = 0; i<= 14; i++) { while (wert >= geld[i]) { wert = wert - geld[i]; anzahl[i] = x++; printf("\n"); if(geld[i]>=1.0) { printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]); } else { printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100); } } x=1; } printf("\n\n"); system("PAUSE"); } }
Aha, jetzt verstehe ich x.
Der Trick macht einfach
anzahl[i] = anzahl[i] + 1;
über einen Umweg.
-
Ok, so sieht das natürlich schöner und übersichtlicher aus
aber auf den fehler, warum er 4 so komisch umformt, hast du auch noch keine antwort, oder?
-
Ok, ich hab den Fehler selbst entdeckt, die ifschleife sitzt ja am falschen Platz xD
-
Er rechnet gar nicht falsch. Er zeigt nur an einer ungeschickten Stelle an.
Ungeschickt.
for(i = 0; i<= 14; i++) { while (wert >= geld[i]) { wert = wert - geld[i]; anzahl[i] = x++; printf("\n"); if(geld[i]>=1.0) { printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]); } else { printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100); } } x=1; }
Besser erst sammeln und dann erst anzeigen.
for(i = 0; i<= 14; i++) { while (wert >= geld[i]) { wert = wert - geld[i]; anzahl[i] = x++; } printf("\n"); if(geld[i]>=1.0) { printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]); } else { printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100); } x=1; }
-
Ja so habe ich es jetzt auch gelöst mit einer weiteren if-schleife davor:
while (wert >= geld[i]) { wert = wert - geld[i]; anzahl[i] = x++; } if(anzahl[i]!=0){ if(geld[i]>=1.0) { printf("\n\t\t%.0f * %.0f Euro\n", anzahl[i], geld[i]); } else { printf("\n\t\t%.0f * %.0f Cent\n", anzahl[i], geld[i]*100); } }
Jetzt zeigt er nur die Werte an, wo er was ausgibt
Danke noch mal
-
Falls Du den Microsoft-Compiler benutzt, drücke gelegentlich
Strg+A (alles markieren)
Alt+F8 (Markierung automatisch einrücken)Bei Code::Blocks wäre es Plugins/SourceCodeFormatter
Und schau http://www.if-schleife.de/ mal vorbei.
-
Ok, danke für die Tipps, ich werds mir für die Zukunft merken