Второй из объявляемых типов данных – TChamp (Champ – «чемпионат») – представляет собой массив футбольных команд.
TChamp = array [1..CSize] of TTeam; { тип для массива команд }
Стало быть, каждый элемент этого типа содержит внутри себя два поля: число mAces и строку mName. Теперь можно объявить и переменную типа TChamp, то есть, массив команд.
var Champ : TChamp; { массив команд }
Доступ к элементам массива Champ осуществляется так:
Champ[i] – i–й элемент массива, то есть i–я команда (тип TTeam)
Champ[i].mAces – количество набранных очков i–й командой
Champ[i].mName – название i–й команды
После всего сказанного рассмотрим программу «P_50_1» в целом.
{ P_50_1 – Футбольный чемпионат (версия 2) }
const CSize = 4; { количество команд }
{ объявление типов }
type TTeam = record
mAces : integer; { набранные очки }
mName : string; { названия команд }
end;
TChamp = array [1..CSize] of TTeam; { тип для массива команд }
var Champ : TChamp; { массив команд }
{ Процедура "пузырьковой" сортировки команд }
procedure BubbleSort(var arg: TChamp);
var i, j : Integer;
begin
for i:= 1 to CSize-1 do { внешний цикл }
for j:= 1 to CSize-i do { внутренний цикл }
{ если текущий элемент меньше следующего …}
if
{ то меняем местами соседние элементы }
t:= arg[j]; { временно запоминаем }
arg[j]:= arg[j+1]; { следующий -> в текущий }
arg[j+1]:= t; { текущий -> в следующий }
end;
end;
var i: integer;
begin {--- Главная программа ---}
{ Вводим названия команд и набранные очки }
for i:=1 to CSize do begin
Write('Название команды: ');
Write('Набранные очки: ');
end;
BubbleSort(Champ); { сортируем }
{ Выводим результаты }
Writeln('Итоги чемпионата:');
Writeln('Место Команда Очки');
for i:=1 to CSize do begin
Writeln(i:3,' ':3, Champ[i].mName, Champ[i].mAces:
end;
Readln;
end.
Процедура сортировки заметно упростилась. Ещё бы! Ведь теперь мы работаем с одним массивом, а не с двумя. Для временного хранения элемента массива (при обмене) в процедуре объявлена переменная типа TTeam. А в прежнем решении для этого нужны были две переменные. Прочие изменения в программе невелики, хотя и существенны: вместо обращений к элементам массива мы обращаемся к полям этих элементов (эти места выделены).
Напомню смысл выражения для ширины поля при печати набранных очков.
20-Length(Champ[i].mName)
Здесь учет длины названия команды обеспечивает ровную печать столбцов, стоящих правее.
Надеюсь, вы оценили приятный вкус структурных данных. Так продлим удовольствие, назначив после второго тайма дополнительное время. Соорудим третью версию программы, способную воспринимать и другие данные о командах, например, количество выигрышей и проигрышей. Для хранения этих новых сведений, очевидно, нужна память, то есть переменные. Но теперь обойдёмся без дополнительных массивов: объявим внутри записи TTeam ещё пару полей.
type TTeam = record
mAces : integer; { набранные очки }
mName : string; { названия команд }
mWins : integer; { количество выигрышей }
mFails: integer; { количество проигрышей }
end;