Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

323

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Советник

278

Россия, Санкт-Петербург


ID: 400669

epimkin

Профессионал

254


ID: 137394

Megaloman

Мастер-Эксперт

122

Беларусь, Гомель


ID: 405239

al4293189

1-й класс

93


ID: 325460

CradleA

Мастер-Эксперт

76

Беларусь, Минск


ID: 226425

Konstantin Shvetski

Модератор

49

Россия, Северодвинск


8.9.8

01.08.2021

JS: 2.9.16
CSS: 4.5.14
jQuery: 3.6.0
DataForLocalStorage: 2021-08-02 12:16:01-standard


Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 196713

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: IvanDorohov (Посетитель)
Дата: 18.10.2019, 17:36 Консультация закрыта
Поступило ответов: 1

Уважаемые эксперты! Пожалуйста, ответьте на вопрос, помогите решить или дайте совет: Имеется каталог на 15 видов с/х машин, где указаны: номер, цена и название. Десять фермерских хозяйств составили приоритетные списки, где указаны по 5 названий машин, которые хотели бы приобрести. Зная количество денег для этих целей в каждом хозяйстве, надо напечатать список номеров машин, которых может приобрести каждое хозяйство (предположить, что хозяйство будет покупать по одной машине каждого типа).
написать нужно на паскале

Здравствуйте, IvanDorohov!

Смотрите приложение:
Код [Pascal]
const
  k=5;
  n=15;
  m=10;
type
  {}
  tMas=array[1..k]of integer;
  {описание сельхоз машин}
  tVM=record{vilage mashin}
    name:string;{название}
    cost:integer;{стоимость}
    indx:string;{индекс ???}
    end;
  {описание хозяйств}
  tVA=record{vilage account}
    name:string;{название}
    summ:longint;{счет хозяйства}
    want:tMas;{массив желаний}
    end;
{генерация названий}
function gen(a:integer):string;
  var
    b:string;
  begin
    b:='';
    while a>0 do
      begin
        b:=b+chr(ord('0')+random(10));
        dec(a);
      end;
    gen:=b;
  end;
{перебор вариантов}
function check(var a:tMas;b:integer):boolean;
  var
    c,d,e,f:integer;
  begin
    for c:=1 to k do a[c]:=0;
    c:=0;
    e:=1;
    f:=1;
    while(b>0)and(c<6)do
      begin
        d:=b and 1;
        inc(c,d);
        b:=b shr 1;
        d:=d*e;
        inc(e);
        if(d in [1..n])and(f in [1..k])then
          begin
            a[f]:=d;
            inc(f);
          end;
      end;
    dec(f);
    check:=(c=k)and(f=k);
  end;
var
  a:array[1..n]of tVM;
  b:array[1..m]of tVA;
  d:set of byte;
  e:longint;
  f,i,j:integer;
  what:tMas;
begin
  {ввод - генерация сельхоз машин}
  for i:=1 to n do
    begin{create vm}
      write('name machine:');{readln(a[i].name)}a[i].name:='VM'+gen(6);write(a[i].name);
      write('cost mashine:':15);{readln(a[i].cost)}a[i].cost:=6000+270*random(n);write(a[i].cost:6);
      write('index mashine:':15);{readln(a[i].indx)}a[i].indx:='index:'+gen(8);writeln(a[i].indx);
    end;{ /create vm}
  writeln;
  {ввод - генерация хозяйств}
  for i:=1 to m do
    begin{create VA}
      write('name vilage:');{readln(b[i].name)}b[i].name:='vilage'+gen(4);writeln(b[i].name);
      write('account vilage:');{readln(b[i].account)}b[i].summ:=39000+250*random(n);writeln(b[i].summ);
      d:=[];
      for j:=1 to k do
        begin
          repeat
            e:=random(n)+1
          until  not (e in d);
          d:=d+[e];
          b[i].want[j]:=e;
        end;
      {вывод желаемого}
      write('want:');
      for j:=1 to k do
        begin
          write(a[b[i].want[j]].name:12);
          e:=e+a[b[i].want[j]].cost;
        end;
      writeln;
      if(e<=b[i].summ)and(e>0) then writeln(true){желаемое получилось}
        else
        begin{find variants}
          writeln('find variants:');{начинаем поиск вариантов}
          for j:=1 to 32000 do
            begin
              if check(what,j)then
                begin
                  e:=0;
                  for f:=1 to k do e:=e+a[what[f]].cost;
                  if e<=b[i].summ then
                    begin
                      write('variant:');
                      for f:=1 to k do write(a[what[f]].name:9);{вывод варианта}
                      writeln('summa:=':8,e);
{                      break;{если убрать коммент, будет выводить только один вариант}
                    end;
                end;
            end;
        end;{/find variants}
      writeln;
    end;{/create VA}
end.


Выводится следующая информация :
Цитата: список сельхоз машин

name machine:VM008226 cost mashine: 7080 index mashine:index:13404080
name machine:VM293736 cost mashine: 9240 index mashine:index:73134282
name machine:VM418279 cost mashine: 7890 index mashine:index:88011505
name machine:VM076775 cost mashine: 6810 index mashine:index:65969262
name machine:VM074855 cost mashine: 9780 index mashine:index:63079771
name machine:VM197586 cost mashine: 7080 index mashine:index:06281259
name machine:VM112154 cost mashine: 7080 index mashine:index:16770001
name machine:VM783647 cost mashine: 7890 index mashine:index:38810001
name machine:VM625238 cost mashine: 7080 index mashine:index:36693427
name machine:VM757455 cost mashine: 9510 index mashine:index:61441056
name machine:VM098692 cost mashine: 8700 index mashine:index:74612931
name machine:VM930185 cost mashine: 8700 index mashine:index:16039534
name machine:VM933408 cost mashine: 8970 index mashine:index:19418428
name machine:VM516953 cost mashine: 7620 index mashine:index:21696650
name machine:VM712874 cost mashine: 9780 index mashine:index:10103330



Цитата: желание совпало с возможностями

name vilage:vilage4546
account vilage:42000
want: VM625238 VM076775 VM197586 VM516953 VM757455
TRUE



Цитата: перебор возможных вариантов

name vilage:vilage6879
account vilage:39500
want: VM930185 VM074855 VM098692 VM112154 VM712874
find variants:
variat: VM008226 VM293736 VM418279 VM076775 VM197586 summa:=38100
variat: VM008226 VM418279 VM076775 VM074855 VM197586 summa:=38640
variat: VM008226 VM293736 VM418279 VM076775 VM112154 summa:=38100
variat: VM008226 VM418279 VM076775 VM074855 VM112154 summa:=38640
variat: VM008226 VM293736 VM418279 VM197586 VM112154 summa:=38370



Если захотите руками вводить информацию, в строках, аналогичных этой:
Код [Pascal]
write('name machine:');{readln(a[i].name)}a[i].name:='VM'+gen(6);write(a[i].name);

Уберите комментарий с readln, а все, что за ним закомментируйте.
Удачи!

Зенченко Константин Николаевич

Старший модератор
25.10.2019, 12:02
5


Большое спасибо, Константин Николаевич

Мини-форум консультации # 196713

Нет сообщений в мини-форуме

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 119

puporev

Профессор

Рейтинг: 48

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0

Орловский Дмитрий

Мастер-Эксперт

Рейтинг: 0

lamed

Академик

Рейтинг: 0