Лабы / 2
.docxЗадание:
3. |
Используя перечень номиналов ассигнаций: Const Nominal: array[0..5] of currency= (5000, 1000, 500, 100, 50, 10); , запрограммировать "жадный" алгоритм формирования выдачи заданной суммы в банкомате. Организовать сервис- диалог с заказчиком суммы и учесть в программе возможность отсутствия ассигнаций того или иного номинала. |
Код:
var
Form3: TForm3;
Razmen:array of integer;
i,k,a,sum:integer;
const
Nominal:array[0..5] of integer=(5000, 1000, 500, 100, 50, 10);
kol:array [0..5] of integer=(1,2,4,5,10,20);
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
k:=strtoint(edit1.text); //сумма
sum:=0;
if k<10 then
showmessage('Сумма для выдачи слишком мала');
for i:=0 to 5 do
sum:=sum+nominal[i]*kol[i]; //считаем сумму
edit2.Text:=(inttostr(sum));
for i:=0 to 5 do
memo2.lines.add(inttostr(kol[i])+'*'+inttostr(Nominal[i])); //выводим
if sum<k then
showmessage('Сумма не может быть выдана')
else
for i:=0 to 5 do begin //от 0 до 5
a:=k div Nominal[i]; //a присваиваем сумму деленное на 5000,1000...
if a=0 then begin
memo3.lines.add(inttostr(kol[i])+'*'+inttostr(Nominal[i])); //если не делится, но 0
continue
end else begin //иначе
if a>kol[i] then begin //если больше заданного количества
a:=kol[i];
k:=k-a*nominal[i];
memo3.lines.add('0'+'*'+inttostr(Nominal[i]));
end
else begin
k:=k-a*nominal[i];
memo3.lines.add(inttostr(kol[i]-a)+'*'+inttostr(Nominal[i]));
end;
end;
memo1.lines.add(inttostr(a)+'*'+inttostr(Nominal[i])); //выводим
end;
end;
end.
Результат
Блок схема:
Начало
Ввод
k
sum:=0; sum:=0;
k<10
Вывод
'Сумма
для выдачи слишком мала'
I=n
to (R+i)
down to
ii:=0
to 5 Вывод
sum
I=n
to (R+i)
down to
sum:=sum+nominal[i]*kol[i];
i=1
tо
(k+1)
А
ii:=0
to 5 sum<k Вывод
'Сумма
не может быть выдана'
Вывод
kol[i]+'*'+Nominal[i]
ii:=0
to 5 a:=k
div Nominal[i];
a=0 Вывод
kol[i]+'*'+Nominal[i]
А
end А
- +
a>kol[i] a:=kol[i]; k:=k-a*nominal[i];
Вывод
'0'+'*'+Nominal[i]
-
k:=k-a*nominal[i];
Вывод
kol[i]-a
+'*'+Nominal[i]
Вывод
a+'*'+Nominal[i]