Azarien napisał(a)
Kwoty lepiej przechowywać w groszach, i wtedy nie real tylko longint. 457,33 zł to 45733 grosze i na takich liczbach całkowitych powinien program operować.
Na zmiennych rzeczywistych będą się cuda działy.
mi tez sie wydaje, ze lepiej na groszach operowac...
tu kod w Delphi ale mysle ze kazdy sobie poradzi z przerobieniem na pascala:
var moneta:array[1..14] of Word;
doWydania:LongWord;
i:Byte;
x:Word;
begin
moneta[1]:=1; //1gr
moneta[2]:=2; //2gr
moneta[3]:=5; //5gr
moneta[4]:=10; //10gr
moneta[5]:=20; //20gr
moneta[6]:=50; //50gr
moneta[7]:=100; //1zl
moneta[8]:=200; //2zl
moneta[9]:=500; //5zl
moneta[10]:=1000; //10zl ***
moneta[11]:=2000; //20zl ***
moneta[12]:=5000; //50zl ***
moneta[13]:=10000; //100zl ***
moneta[14]:=20000; //200zl ***
{...}
doWydania:=LongWord( trunc(1028.71 * 100)); //tak "na razie"... :)
{...}
for i:=14 downto 1 do
begin
x:=(doWydania div moneta[i]);//ile monet/banknotow sie miesci w kwocie do wydania
if x>0 then
begin
ListBox1.Items.Add(inttostr(x)+'x '+floattostr(moneta[i] / 100)+'zł');
doWydania:=DoWydania-(moneta[i]*x);
end;
end;
end;
dodatkowo mozna dodac kilka linijek kodu:
for i:=14 downto 1 do
begin
x:=(doWydania div moneta[i]);//ile monet/banknotow sie miesci w kwocie do wydania
if liczbaMonet[i]<x
then continue;
if x>0 then
begin
ListBox1.Items.Add(inttostr(x)+'x '+floattostr(moneta[i] / 100)+'zł');
doWydania:=DoWydania-(moneta[i]*x);
liczbaMonet[i]:=liczbaMonet[i]-x;
end;
end;
if doWydania=0
then ListBox1.Items.Add('Wydaj reszte')
else ListBox1.Items.Add('Nie da sie wydac reszty, zwroc pieniadze.');
i mozemy przy wydawaniu reszty uwzglednic, jesli brakuje (np w automacie) jakis monet czy banknotow. jesli brakuje np 20-sto zlotowych banknotow to program "wyda" 2x10zl.