![]() |
Delphi-Version: 5
Geldautomat
Liste der Anhänge anzeigen (Anzahl: 1)
Hey Leute,
Im Anhang findet ihr einen von mir programmierten kleinen "Geldautomat". (Hausaufgabe) Man gibt einen Preis ein und einen Schein, mit dem man bezahlt. Mit Hilfe von While-Do-Schleifen soll dann der "Automat" Kleingeld in einer Listbox ausgeben, mit möglichst wenig Münzen. Dies klappt auch soweit, aber wenn man z.B. den Preis von 4,98€ eingibt (10-Euroschein) vergisst er einen cent. Und bei 4,99 ebenfalls. Bei 4.97 stimmts allerdings wieder. Woran könnte das liegen? Hier mein Quelltext:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var S:integer; Preis:real; R:real; begin Preis:=strtofloat(edit1.text); S:=strtoint(edit2.text); listbox1.clear; R:=S-Preis; if (R<9.99) then begin While R>=2 Do begin listbox1.Items.add('2-Euro-Stück'); R:=R-2; end; While R>=1 Do begin listbox1.Items.add('1-Euro-Stück'); R:=R-1; end; While R>=0.5 Do begin listbox1.Items.add('50-cent-Stück'); R:=R-0.5; end; While R>=0.2 Do begin listbox1.Items.add('20-cent-Stück'); R:=R-0.2; end; While R>=0.1 Do begin listbox1.Items.add('10-cent-Stück'); R:=R-0.1; end; While R>=0.05 Do begin listbox1.Items.add('5-cent-Stück'); R:=R-0.05; end; While R>=0.02 Do begin listbox1.Items.add('2-cent-Stück'); R:=R-0.02; end; While R>=0.01 Do begin listbox1.Items.add('1-cent-Stück'); R:=R-0.01; end; end else application.messagebox('Der Automat gibt ausschließlich Kleingeld und nur bis 9,99€.','Stop!',mb_ok) end; end. p.s. R = Rückgeld S = Schein |
AW: Geldautomat
Bei 4,97 stimmt es, weil dabei keinerlei Ein-Cent-Stück ausbezahlt werden. War schon ein Wink mit dem Zaunpfahl, wo das Problem liegt, oder? ;)
--EDIT Noch ein Tipp: Gleitkommazahlen sollte man nie mit "=" vergleichen (also z.B. [delphi]a = 0.01[/delphi)), ![]() Wenn du dennoch mit Real-Werten arbeiten willst, dann schau dir mal die CompareValue-Methoden an. Vielleicht musst du dazu die Math-Unit einbinden. |
AW: Geldautomat
Oder halt Currency als Datentyp nutzen?! :-D
PS: Man könnte die fast immer gleiche Schleife auch in eine Funktion auslagern ... macht's vlt. übersichtlicher. |
AW: Geldautomat
|
AW: Geldautomat
Und bei 4,96 stimmts auch? - Wenn nicht liegts an der Genauigkeit deiner Zahlen.
Bernhard |
AW: Geldautomat
Ok danke für die schnellen Antworten...
aber @s.h.a.r.k: Ich meinte mit 4.97 den Preis d.h. das Rückgeld beträgt 5.03 und da wird ein cent ausgezahlt... Es klappt wirklich alles wies klappen soll außer das er manchmal n cent verschluckt... Ich glaube kaum das das was mit Real und Currency zutun hat...aber danke für den Hinweis ;) Frage mich immer noch woran das hängen könnte... Gruß Edit: Wie ich sehe hat noch niemand das Programm sich angeschaut, ich würds empfelen vll. kommt ihr dann drauf... |
AW: Geldautomat
Zitat:
EDIT: Wenn du das gemacht hast, können wir evtl. nochmal über Genauigkeit diskutieren. |
AW: Geldautomat
Ok ich muss mich entschuldigen :D
Ihr hattet recht...unglaublich das das DARAN jetzt was geändert hat...ich versteh allerdings immer noch nicht warum ?! gruß |
AW: Geldautomat
Einige Zahlen die im Dezimalsystem ohne nicht periodisch sind, sind periodisch in der Binärdarstellung (genau wie 1/3 = 0,3 im Dezimalsystem):
0,1d = 0,0000110b Da man aber nur einen bestimmten Platz hat, kann man nicht alle Stellen speichern. Deshalb gibt es Ungenauigkeiten. ![]() Currency vermeidet diese Ungenauigkeit, indem es die Nachkommastellen ![]() |
AW: Geldautomat
ahh ok danke ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz