Задача 21 Урок 15

Урок 15

Задача про банкомат:
Пользователь вводит целое число - сумму в некоторой валюте, требуется выдать
эту сумму купюрами наибольшего достоинства.
Напишите программу, которая в качестве результата скажет как именно надо
разменять указанную сумму купюрами наибольшего достоинства (
укажет количество для купюры каждого типа)

Например, пусть у нас набор купюр 1000, 500, 100 и 50 рублей:

Сумму 350 рублей: по задаче следует выдать как: 3 по 100 и 1 по 50
Сумму 520 рублей: таким набором разменять нельзя.
Указания по возможному оформлению (можно оформлять и иначе):

Напишите процедуру, которая:

принимает на вход число (сумму) по значению
массив "достоинств" купюр отсортированный по убыванию
(предположим, что видов купюр не может быть больше 10) по значению
массив для "количеств купюр" по ссылке
булевский параметр успешности подбора купюр
(некоторые суммы вообще разменять нельзя)
После выполнения процедуры в четвертом параметре должен быть true или
false, а в массиве "количеств" должены находится находится значения, на
основании которых банкомант мог бы выдать купюры.

type ArrOfInt = array[1..10] of integer;

var a{номинал купюр в банкомате}: ArrOfInt = (5000, 1000, 500, 200, 100, 50, 0, 0, 0, 0);
var b{по сколько каждой}: ArrOfInt = (50, 3, 7, 2, 50, 100, 50, 20, 4, 100);
    c1{успех обмена}: boolean;
    s{какую сумму разменять}: integer;

procedure printArray(a1: ArrOfInt); //п-а печати массива
  var i1: integer;

  begin
    writeln('Купюры в банкомате, всего номиналов: ', length(a1));
    for i1 := low(a1) to high(a1) do
      write(a1[i1], ' ');
  end;


procedure atm(s1: integer; a1: ArrOfInt; var b1: ArrOfInt);//п-а расчета размена
  var i1, j1, k1: integer;

begin
  c1 := false;
  k1 := 0;
  for i1 := low(a) to high(a) do
  begin
    j1 := 1;
    if (s1 > 0) and (s1 >= a1[i1]) and (a1[i1] > 0) then
    begin
      k1 := s1 div a1[i1];
      if k1 <= b1[i1] then
        b1[i1] := k1;
      s1 := s1 - (a1[i1]*b1[i1]);
      inc(j1);
      if s1 = 0 then
        c1 := true;
    end
    else
      b1[i1] := 0;
  end;
end;

procedure printResult(s1: integer; a1, b1: ArrOfInt); //п-а печати результата
  var i1: integer;

  begin
    writeln();
    writeln('Сумму ', s1, ' следует выдать:');
    for i1 := low(a1) to high(a1) do
    begin
      if (a1[i1] > 0) and (b1[i1] > 0) then
        writeln(b1[i1], ' по ', a1[i1]);
    end;
    writeln();
  end;

begin
    writeln('Введите сумму');
    readln(s);
    printArray(a);
    writeln();
    atm(s, a, b);
    if c1 then
      printResult(s, a, b)
   else
      writeln('Выдача не возможна');
   readln();
end.

КОНСОЛЬ

Введите сумму
7500
Купюры в банкомате, всего номиналов: 10
5000 1000 500 200 100 50 0 0 0 0

Сумму 7500 следует выдать:
1 по 5000
2 по 1000
1 по 500
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)