Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delphi / песни о паскале.pdf
Скачиваний:
63
Добавлен:
26.03.2016
Размер:
5.16 Mб
Скачать

Глава 41 По порядку, становись!

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

1506 + 975 = 1481

2556 + 967 = 1523

3587 + 954 = 1541

4629 + 916 = 1545

5691 + 876 = 1567

6694 + 872 = 1566

7749 + 845 = 1594

8751 + 800 = 1551

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

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

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

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

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

299

Глава 41 По порядку, становись!

{P_41_3 – Футбольный чемпионат }

 

 

const CSize = 16; { количество команд }

 

 

 

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

 

 

type

TAces = array [1..CSize] of integer;

{ тип для очков }

 

TNames = array [1..CSize] of string;

{ тип для названий }

var

Aces : TAces;

{ набранные очки }

 

 

 

Names: TNames; { названия команд }

 

 

 

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

procedure BubbleSort2(var arg1: TAces; var arg2: TNames);

var

i, j, t: Integer;

 

 

 

begin

s: string;

 

 

 

 

 

 

 

 

 

for i:= 1 to CSize-1 do

{ внешний цикл }

 

for j:= 1 to CSize-i do

{ внутренний цикл }

 

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

 

if arg1[j] < arg1[j+1] then begin

 

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

 

t:= arg1[j];

{ временно запоминаем }

 

arg1[j]:= arg1[j+1];

{ следующий -> в текущий }

 

arg1[j+1]:= t;

{ текущий -> в следующий }

 

{ меняем местами и названия команд }

 

s:= arg2[j];

{ временно запоминаем }

 

arg2[j]:= arg2[j+1];

{ следующий -> в текущий }

 

arg2[j+1]:= s;

{ текущий -> в следующий }

end;

end;

 

 

 

 

 

 

 

 

 

var i: integer;

 

 

 

 

begin

{ главная программа }

 

 

{ Вводим названия команд и набранные очки }

for i:=1 to CSize do begin

 

 

 

 

Write('Название команды: '); Readln(Names[i]);

 

Write('Набранные очки:

'); Readln(Aces[i]);

end;

 

 

 

 

BubbleSort2(Aces, Names);

{ сортируем }

 

Writeln('Итоги чемпионата:');

 

 

Writeln('Место

Команда

 

Очки');

for i:=1 to CSize do

 

 

 

 

Writeln(i:3,' ':3, Names[i], Aces[i]:20-Length(Names[i]));

Readln;

 

 

 

 

end.

 

 

 

 

 

 

 

 

 

 

 

300

Глава 41 По порядку, становись!

Спецификатор ширины поля в операторе печати задан выражением

20 – Length(Names[i])

Здесь перед колонкой с очками будет тем больше пробелов, чем короче название команды, — так выравниваются колонки таблицы.

Для проверки программы я ввел наобум имена четырех команд нашего чемпионата и очки, якобы заработанные ими (количество команд CSize установил равным 4), и вот что у меня вышло:

Итоги

чемпионата:

 

Место

Команда

Очки

1

Локомотив

55

2

Крылья Советов

54

3

Спартак

47

4

Зенит

43

 

 

 

Болельщики вправе оспорить результат, но я им доволен.

Итоги

Расположение данных в порядке возрастания или убывания называется

сортировкой.

Простейший алгоритм сортировки массива – «пузырьковая» сортировка. Она состоит в сравнении и перестановке соседних элементов массива, при этом организуются два вложенных цикла.

Аслабо?

А) Напишите программу для сортировки фамилий учеников в алфавитном порядке (фамилии берутся из файла). Программа должна сортировать их как по возрастанию, так и по убыванию фамилий, — на выбор пользователя.

Б) Придумайте самый несправедливый способ пиратской дележки по два слитка и напишите программу для неё.

В) Напишите программу для дележки случайным образом (как это собирались сделать пираты). Насколько отличаются ваши результаты от справедливого способа?

Г) Напишите функцию, проверяющую, упорядочен ли числовой массив. Функция должна вернуть TRUE, если массив упорядочен по возрастанию. Массив внутрь функции передайте параметром по ссылке.

301

Соседние файлы в папке delphi