Der Busrechner...
-
hallo..ich habe hier einen code für einen busrechner:
double einwurf, preis, rueckgeld; double zwanzigE=20, zehnE=10, fuenfE=5, zweiE=2, einE=1, fuenfzigC=0.5, zwanzigC=0.2, zehnC=0.1, fuenfC=0.05, zweiC=0.02, einC=0.01; int zw=0, ze=0, fu=0, zwei=0, ein=0, fuenfzig=0, zwanzig=0, zehn=0, fuenf=0, zweic=0, einc=0; preis=StrToFloat(edtPreis->Text); einwurf=StrToFloat(edtEinwurf->Text); rueckgeld=einwurf-preis; edtRueckgeld->Text=FloatToStr(rueckgeld); while(rueckgeld>=zwanzigE) { zw=rueckgeld/zwanzigE; rueckgeld=rueckgeld-(zw*zwanzigE); } lbRueckgeld->Items->Strings[0]=IntToStr(zw)+ " Mal 20 € Schein"; while(rueckgeld>=zehnE) { ze=rueckgeld/zehnE; rueckgeld=rueckgeld-(ze*zehnE); } lbRueckgeld->Items->Strings[1]=IntToStr(ze)+ " Mal 10 € Schein"; while(rueckgeld>=fuenfE) { fu=rueckgeld/fuenfE; rueckgeld=rueckgeld-(fu*fuenfE); } lbRueckgeld->Items->Strings[2]=IntToStr(fu)+ " Mal 5 € Schein"; while(rueckgeld>=zweiE) { zwei=rueckgeld/zweiE; rueckgeld=rueckgeld-(zwei*zweiE); } lbRueckgeld->Items->Strings[3]=IntToStr(zwei)+ " Mal 2 € Münze"; while(rueckgeld>=einE) { ein=rueckgeld/einE; rueckgeld=rueckgeld-(ein*einE); } lbRueckgeld->Items->Strings[4]=IntToStr(ein)+ " Mal 1 € Münze"; while(rueckgeld>=fuenfzigC) { fuenfzig=rueckgeld/fuenfzigC; rueckgeld=rueckgeld-(fuenfzig*fuenfzigC); } lbRueckgeld->Items->Strings[5]=IntToStr(fuenfzig)+ " Mal 0,50 € Münze"; while(rueckgeld>=zwanzigC) { zwanzig=rueckgeld/zwanzigC; rueckgeld=rueckgeld-(zwanzig*zwanzigC); } lbRueckgeld->Items->Strings[6]=IntToStr(zwanzig)+ " Mal 0,20 € Münze"; while(rueckgeld>=zehnC) { zehn=rueckgeld/zehnC; rueckgeld=rueckgeld-(zehn*zehnC); } lbRueckgeld->Items->Strings[7]=IntToStr(zehn)+ " Mal 0,10 € Münze"; while(rueckgeld>=fuenfC) { fuenf=rueckgeld/fuenfC; rueckgeld=rueckgeld-(fuenf*fuenfC); } lbRueckgeld->Items->Strings[8]=IntToStr(fuenf)+ " Mal 0,05 € Münze"; while(rueckgeld>=zweiC) { zweic=rueckgeld/zweiC; rueckgeld=rueckgeld-(zweic*zweiC); } lbRueckgeld->Items->Strings[9]=IntToStr(zweic)+ " Mal 0,02 € Münze"; while(rueckgeld>=einC) { einc=rueckgeld/einC; rueckgeld=rueckgeld-(einc*einC); } lbRueckgeld->Items->Strings[10]=IntToStr(einc)+ " Mal 0,01 € Münze"; }da ist ein fehler bei 10 cents :S
Danke im voraus
-
Vielleicht hättest Du ja die Freundlichkeit den Fehler zu erläutern.
Ich finde es ein wenig unhöflich einen Batzen Quellcode mit der Erklärung hinzuwerfen, dass er nicht funktioniert.
-
ok es tut mir leid...bin noch neu hier weiss net so genau wie man das genau macht...
also das ganze ist ein fahrkartenrechner. man gib den fahkartenpreis (preis), gibt an wie viel geld man eingeworfen hat (einwurf) und kriegt dadurch das rückgeld (rueckgeld=einwurf-preis)!!
durch diesen rueckgeld soll man erfahren wie viel 20; 10; 5; 3; 2; 0,50; 0,20; 0,10; 0,05; 0,02; 0,01; € zurückkriegt...
also wenn ich jetzt 38,8€ rückgeld habe kriege ich da normalerweise:
1*20€; 1*10€; 1*5€; 1*2€; 1*1€; 1*0,50€; 1*0,20€; 1*0,10€;
das programm hat irgendwie einen fehler und ich kriege:
1*20€; 1*10€; 1*5€; 1*2€; 1*1€; 1*0,50€; 1*0,20€; 0*0,10€; 1*0,05€; 2*0,02€ich hoffe, dass ihr das jetzt kapiert habt

Danke
-
Lese Dir folgenden Thread durch und nutze den Debugger.
-
dieses debugging habe ich auch schon gelernt und verwendet...
aber da ist wirklich was komisch.
hier habe ich den breakpoint:while(rueckgeld>=zehnC) { zehn=rueckgeld/zehnC; rueckgeld=rueckgeld-(zehn*zehnC); }rueckgeld ist grad 0,1
zehnC ebenfalls 0,1
jedoch spring er nicht in die schleife rein sondern geht in die nächste schleife :S das verstehe ich nicht...
-
Joe_M. schrieb:
Aber ich vermute, die Ursache liegt an der Ungenauigkeit von Fließkommazahlen. [...]
Fließkommadatentypen verwendet man zum schätzen, Integerdatentypen zum rechnen.Die Lösung steht in dem Thread
-
Darkman89 schrieb:
rueckgeld ist grad 0,1
zehnC ebenfalls 0,1Weder rueckgeld noch zehnC ist 0,1. 0,1 passt nämlich weder in float noch in double genau rein. Beide enthalten vermutlich einen Näherungswert.
jedoch spring er nicht in die schleife rein sondern geht in die nächste schleife :S das verstehe ich nicht...
Willkommen in der Welt der Fließkommatypen und ihrer eingebauten Ungenauigkeit. Tu dir einen Gefallen, und rechne in Cent, dann kannst du mit Ganzzahltypen arbeiten.
-
aso ok...
ich glaube jetzt habe ich kapiert....
ich werde mein bestes geben und mich wieder melden
Vielen Dank
Gruss Darkman
-
Als kleinen Tip würde ich Dir empfehlen für diese Berechnung eine kleine Methode zu schreiben.
Der Methode gibst du dann den Restbetrag sowie den Wert (5€, 2€....) mit.
Damit brauchst Du die Berechnung mit nur einer while-schleife durchzuführen.
Die Methode rufts Du dann für jeden Wert einmal auf.
Als Rückgabewert kannst Du ja dann die Azahl zurückgeben.Viel Erfolg
Gruß
Wes
-
ok das werde ich machen...
also du meinst ja wahrscheinliche eine funktion...so haben wir zumidnest in der schule gelertn...
also einfach:
void Funktionsname (werte..)
{
Code...
}
das meinste doch mit mehtode?
gruss
vielen dank
Darkman
-
Hallo
ja in deinem Fall sollte eine Funktion zur Berechnung ausreichen.
Mit Methode wird eine Funktion bezeichnet, die zu einer Klasse gehört. Aber das bei dir nicht nötwendig.bis bald
akari
-
yep genau Darkman eine Funktion.
jedoch denke ich sollte Deine Funktion nicht void sein,
sondern den Wert zurückgeben den du da berechnest.Würde mich über Deine Lösung freuen
Gruß
Wes