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

Глава 39 Командная игра (массивы)

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

Снежная лавина

Вот задача для болельщика: отсортировать команды в турнирной таблице чемпионата по убыванию набранных ими очков. Команд немного, всего 16. После каждого тура количество очков меняется, и таблица сортируется заново. Корпеть над этим вручную? — это не для нас! Итак, будущая программа должна принимать с клавиатуры очки, набранные командами, и распечатывать команды в порядке убывания этих чисел. При этом набранные очки мы будем вводить всегда в одном и том же порядке.

Сделаем это сначала для двух команд, пусть ими будут «Динамо» и «Спартак». Сортировка двух команд — что может быть проще?

{ ввод и сортировка двух команд (в программе 14 строк) } var T1, T2 : integer;

begin

Readln (T1, T2);

{ Ввод очков для «Динамо» и «Спартак» }

if T1>T2

 

then

begin

 

 

Writeln('1.Динамо');

 

Writeln('2.Спартак');

 

end

 

else

begin

 

 

Writeln('1.Спартак');

Writeln('2.Динамо'); end;

Readln;

end.

Здесь для каждой из команд отведена переменная, хранящая набранные очки: T1 — для «Динамо» и T2 — для «Спартака». Вариантов расстановки всего два, поэтому и программа очень проста — всего 14 строк, не считая комментария.

Теперь добавим в чемпионат команду «Зенит». Вариантов расстановки стало втрое больше — шесть, и программа заметно усложнилась, вот она.

278

Глава 39 Командная игра (массивы)

{ сортировка трех команд (в этой программе 45 строк) } var T1, T2, T3 : integer;

begin

Readln (T1, T2, T3); { «Динамо», «Спартак», «Зенит» } if (T1>T2) and (T1>T3)

then begin Writeln('1.Динамо'); if T2>T3

then begin Writeln('2.Спартак'); Writeln('3.Зенит'); end

else begin Writeln('2.Зенит'); Writeln('3.Спартак'); end

end else begin

if (T2>T1) and (T2>T3) then begin

Writeln('1.Спартак'); if T1>T3

then begin Writeln('2.Динамо'); Writeln('3.Зенит'); end

else begin Writeln('2.Зенит'); Writeln('3.Динамо'); end

end else begin

Writeln('1.Зенит'); if T1>T2

then begin Writeln('2.Динамо'); Writeln('3.Спартак'); end

else begin Writeln('2.Спартак'); Writeln('3.Динамо');

279

Глава 39 Командная игра (массивы)

end

end

end;

Readln;

end.

Здесь уже 45 строк, что втрое больше, чем для двух команд. С добавлением последующих команд программа продолжит разбухать, как снежный ком. Для четырех команд она станет длиннее ещё в 4 раза (180 строк), для пяти — ещё в 5 раз (900 строк) и так далее. Дойдя до шестнадцати команд, мы насчитаем в программе триллионы строк. А ведь триллион — это «всего лишь» миллион миллионов! Скорей свернем с этой гибельной тропы, пока снежная лавина не накрыла нас с головой!

А где же волшебная палочка?

Вы ощущаете причину трудностей? В моих решениях нет циклов, способных выполнять огромное количество однообразных действий. Так, например, одним оператором цикла печатается хоть тысяча, хоть миллион чисел. Увы! Применить цикл к переменным с именами T1, T2 и T3 не получится. Хотя цифры в этих именах означают для нас порядковые номера команд, для компилятора они — всего лишь часть имени переменной, и не более. Как же втолковать компилятору то, чего мы добиваемся нумерацией переменных?

Для этого есть особый тип данных — массив переменных или, проще — массив. Вот она, спасительная волшебная палочка!

Массивы вокруг нас

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

280

Глава 39 Командная игра (массивы)

Простые переменные

Массивы переменных

Рис. 88 – Примеры простых переменных (слева) и массивов (справа)

Итак, массив — это собранные в одну команду переменные. Они получают общее на всех имя — имя своей команды. А внутри команды каждая переменная — элемент массива — обладает своим номером. Ну, чем не игроки?

Объявление массивов

Прежде, чем пользоваться массивом, его надо объявить: либо в секции VAR, либо через объявление пользовательского типа в секции TYPE.

Рассмотрим сначала первый способ, — объявим массив в секции VAR:

VAR Имя_Массива : ARRAY [<MIN>..<MAX>] OF <Тип элемента>

Здесь использована пара ключевых слов ARRAY… OF…, что переводится как «массив… из…». Имя массива — это обычный идентификатор, его программист придумывает сам; будем считать это имя названием команды переменных.

Справа, после двоеточия, указывают две характеристики массива: 1) диапазон для индексов и 2) тип элементов массива. Рассмотрим эти атрибуты массива подробней.

Диапазон для индексов определяет допустимые номера элементов внутри массива. Диапазон указывают в квадратных скобках после слова ARRAY, — это два выражения порядкового типа, условно обозначенные мною как MIN и MAX, они

281

Глава 39 Командная игра (массивы)

разделяются двумя точками. Говоря спортивным языком, здесь назначается диапазон номеров для «игроков команды».

После ключевого слова OF следует второй атрибут массива — тип данных для всех его элементов. Прибегнув вновь к спортивному языку, скажем, что здесь объявляют «вид спорта» для команды.

Вот пример объявления трех массивов: Names (фамилии), Ratings (оценки) и ChampShip (чемпионат):

VAR { объявления переменных-массивов }

{30 строковых переменных с фамилиями учеников класса } Names : ARRAY [1..30] OF string;

{30 байтовых переменных с оценками учеников этого класса } Ratings : ARRAY [1..30] OF byte;

{16 чисел с очками, набранными командами в чемпионате } ChampShip : ARRAY [1..16] OF integer;

Как видите, массив можно составить из элементов любого типа. Так, массив Names содержит внутри себя 30 переменных строкового типа: Names[1], Names[2] и так далее (номера переменных указывают в квадратных скобках).

Объявление массивов в секции VAR не слишком удобно. Почему? Рассмотрим следующий пример:

var A : array [1..5] of integer; B : array [1..5] of integer;

begin

A:= B; { здесь компилятор видит ошибку несовместимости типов}

end.

Мы объявили массивы A и B; на первый взгляд, это массивы одного типа, поскольку каждый из них содержит по пять целых чисел. Для однотипных переменных, включая массивы, Паскаль допускает операцию копирования. Например, оператором

A:=B

все элементы массива B копируются в элементы массива A. Увы, компилятор увидит здесь ошибку несовместимости типов. В чем дело? А в том, что он считает разнотипными массивы, объявленные в разных операторах. Даже если массивы

282

Глава 39 Командная игра (массивы)

совершенно одинаковы! Скажете, компилятор недостаточно умен? Может быть, но нам придётся как-то выкручиваться, и для этого есть два пути.

Во-первых, переменные A и B можно объявить в одном операторе:

var A, B : array [1..5] of integer;

Это устраняет проблему несовместимости типов.

Но есть и лучший способ — сначала объявить для массива пользовательский тип данных. Это делается в секции TYPE так.

TYPE Имя_Типа = ARRAY [<MIN>..<MAX>] OF <Тип элемента>

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

TYPE { примеры объявления типов-массивов }

{тип для 30 строковых переменных с фамилиями учеников класса } TNames = ARRAY [1..30] OF string;

{тип для 30 байтовых переменных с оценками учеников } TRatings = ARRAY [1..30] OF byte;

{тип для 16 целых переменных с очками, набранными в чемпионате } TChampionShip = ARRAY [1..16] OF integer;

Здесь буква «T» в имени типа напоминает о назначении этого идентификатора (помните наше добровольное соглашение об именах?). Теперь учрежденные типы данных можно употребить для объявления переменных и параметров в любом месте программы, вот пример:

TYPE { тип для 30 байтовых переменных с оценками учеников } TRatings = ARRAY [1..30] OF byte;

VAR { 30 байтовых переменных с оценками учеников }

Ratings : TRatings;

283

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