Песни о Паскале | страница 171




>{ P_41_2 – Пиратская делёжка по справедливости }


>const CSize = 16; { размер массива слитков }

>      { объявление типа для массива слитков }

>type TGolds = array [1..CSize] of integer;

>var Golds : TGolds; { массив кусков золота }

>      { Процедура "пузырьковой" сортировки }

>procedure BubbleSort (var arg: TGolds);

>var i, j, t: Integer;

>begin

>for i:= 1 to CSize-1 do { внешний цикл }

>      for j:= 1 to CSize-i do { внутренний цикл }

>      { если текущий элемент больше следующего …}

>      if arg[j] > arg[j+1] then begin

>      { то меняем местами соседние элементы }

>      t:= arg[j];       { временно запоминаем }

>      arg[j]:= arg[j+1];       { следующий -> в текущий }

>      arg[j+1]:= t;       { текущий -> в следующий }

>      end;

>end;


>var i:integer; { используется в качестве индекса в главной программе }

>begin

>      { заполняем массив случайным образом }

>      Randomize;

>      for i:=1 to CSize do Golds[i]:= 500 + Random(500);

>      { сортируем }

>      BubbleSort(Golds);

>      Writeln('По справедливости:');

>      for i:=1 to (CSize div 2) do begin

>      { два куска по отдельности }

>      Write(i:2, Golds[i]:5,' + ',Golds[CSize+1-i]:3,' = ');

>      { сумма двух кусков }

>      Writeln(Golds[i]+Golds[CSize+1-i] :4);

>      end;

>      Readln;

>end.


Вот результат одной из таких делёжек:


>По справедливости:

>1 506 + 975 = 1481

>2 556 + 967 = 1523

>3 587 + 954 = 1541

>4 629 + 916 = 1545

>5 691 + 876 = 1567

>6 694 + 872 = 1566

>7 749 + 845 = 1594

>8 751 + 800 = 1551


Здесь самый легкий и самый тяжелый слитки отличаются почти вдвое: 506 и 975 граммов. Но пары слитков, доставшихся пиратам, отличаются по весу незначительно.

Возвращение на футбольное поле

Закаленные морскими приключениями, вернемся к сортировке футбольных клубов (задача поставлена в главе 39, помните?). Что мы будем сортировать? Набранные очки? Да, но их надо как-то привязать к названиям команд.

Поступим так. Объявим два массива: один (числовой) – для набранных очков, другой (строковый) – для названий клубов. При вводе данных элементы двух массивов будут соответствовать друг другу, поскольку имена команд и набранные ими очки вводятся одновременно. Затем, в ходе сортировки, переставляя элементы с очками, будем менять местами и соответствующие им элементы с названиями команд. Так имена команд последуют за очками, заработанными командами. Все это потребует небольших переделок в процедуре сортировки.

Впрочем, потребуется ещё одно мелкое изменение. Если при сортировке золотых слитков мы добивались возрастающего порядка, то теперь нужен противоположный, убывающий порядок сортировки. Как его добиться? Очень просто: изменим условие сравнения соседних элементов на противоположное. Вот собственно и все, осталось лишь показать программу «P_41_3».