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

Глава 50 Неспортивные рекорды (записи)

Процедура сортировки заметно упростилась. Ещё бы! Ведь теперь мы работаем с одним массивом, а не с двумя. Для временного хранения элемента массива (при обмене) в процедуре объявлена переменная типа TTeam. А в прежнем решении для этого нужны были две переменные. Прочие изменения в программе невелики, хотя и существенны: вместо обращений к элементам массива мы обращаемся к полям этих элементов (эти места подчеркнуты).

Напомню смысл выражения для ширины поля при печати набранных очков.

20-Length(Champ[i].mName)

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

Дополнительное время

Надеюсь, вы оценили приятный вкус структурных данных. Так продлим удовольствие, назначив после второго тайма дополнительное время. Соорудим третью версию программы, способную воспринимать и другие данные о командах, например, количество выигрышей и проигрышей. Для хранения этих новых сведений, очевидно, нужна память, то есть переменные. Но теперь обойдёмся без дополнительных массивов: объявим внутри записи TTeam ещё пару полей.

type TTeam = record

 

mAces : integer;

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

mName : string;

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

mWins : integer;

{ количество выигрышей }

mFails: integer;

{ количество проигрышей }

end;

 

 

 

Внутрь каждого элемента массива Champ подселены ещё два поля, осталось лишь организовать ввод и вывод этих данных. Но к процедуре сортировки BubbleSort прикасаться уже не надо, — она не изменится! Поэтому в показанной ниже программе P_50_2 я не стал её повторять. Не стал я заниматься и обработкой поля mFails — количество проигрышей. Уверен, что вы и без меня справитесь с этим.

394

Глава 50 Неспортивные рекорды (записи)

{ P_59_2 – Футбольный чемпионат (версия 3) } const CSize = 4; { количество команд }

 

{ объявление типов }

 

type

TTeam = record

 

 

mAces : integer;

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

 

mName : string;

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

 

mWins : integer;

{ количество выигрышей }

 

mFails: integer;

{ количество проигрышей }

 

end;

 

 

TChamp = array [1..CSize] of TTeam; { тип для массива команд }

var

Champ : TChamp; { массив команд }

{ Процедура пузырьковой сортировки не изменилась } procedure BubbleSort(var arg: TChamp);

. . .

end;

var i: integer;

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

{ Вводим названия команд, набранные очки и прочие данные } for i:=1 to CSize do begin

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

Write('Набранные очки: '); Readln(Champ[i].mAces);

Write('Выигрышей: '); Readln(Champ[i].mWins);

end;

{сортируем } BubbleSort(Champ);

{Выводим результаты } Writeln('Итоги чемпионата:');

Writeln('Место Команда Очки Выигрышей');

for i:=1 to CSize do begin Write(i:3,' ':3, Champ[i].mName,

Champ[i].mAces:(20-Length(Champ[i].mName) ));

Writeln(Champ[i].mWins:8);

end;

Readln;

end.

Напоследок отвечу на один вероятный вопрос. Поля записи объявлены мною в некотором порядке, существенно ли это? Ничуть! Поля могут объявляться в любой последовательности, — это не влияет на их обработку.

395

Глава 50 Неспортивные рекорды (записи)

Итоги

Для соединения разнородных, но связанных общим смыслом данных используют записи.

Запись заключается в пару ключевых слов RECORD-END, между которыми перечисляются имена и типы полей, входящих в запись.

На основе записей могут быть построены как одиночные переменные, так и массивы.

Доступ к полям записей выполняется через имя переменной и имя поля, разделяемые точкой.

Аслабо?

А) Дополните программу P_50_2 с тем, чтобы обработать все поля записи.

Б) Предложите структуру записи для полицейской базы данных. Какие данные следует, по вашему мнению, включить в неё?

В) Напишите программу для полицейской базы данных с применением записей. Обеспечьте ввод данных из файла, поиск по номеру и распечатку полей найденной записи.

Г) В текстовом файле тремя колонками представлены сведения о школьниках: фамилия, рост и вес. Ваша программа должна преобразовать его в три других файла, где эти же сведения отсортированы соответственно: 1) по фамилиям, 2) по росту и 3) по весу учеников.

Д) Домино. В этой игре используют 28 костяшек, каждая из которых содержит пару чисел от 0 до 6. Например: 0:0, 1:5, 6:6. Представьте костяшку записью, а игральный набор — массивом этих записей. Заполните массив костяшек и распечатайте его. «Смешайте» костяшки случайным образом и вновь распечатайте массив. Для удобства направьте распечатку в текстовый файл.

Е) Карты. Колода содержит 36 карт четырех мастей: трефы и пики — черные, а бубны и червы — красные. Относительная сила карты определяется числом от 6 до 14. Представьте карту записью, содержащей её масть, цвет и силу. Представьте колоду массивом записей, сформируйте полную колоду и распечатайте в текстовый файл. «Перетасуйте» колоду и вновь распечатайте в файл. При распечатке силу карт от 11 до 14 напечатайте их названиями: валет, дама, король, туз.

396

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