Вы ощущаете причину трудностей? В моих решениях нет циклов, способных выполнять огромное количество однообразных действий. Так, например, одним оператором цикла печатается хоть тысяча, хоть миллион чисел. Увы! Применить цикл к переменным с именами T1, T2 и T3 не получится. Хотя цифры в этих именах означают для нас порядковые номера команд, для компилятора они – всего лишь часть имени переменной, и не более. Как же втолковать компилятору то, чего мы добиваемся нумерацией переменных?
Для этого есть особый тип данных – массив переменных или, проще – массив. Вот она, спасительная волшебная палочка!
Массив объединяет несколько однотипных переменных под одним общим именем. Отдельные переменные в массиве называют его элементами, и доступ к ним возможен по их номерам. Массивы придумали отнюдь не программисты. Возьмите любую спортивную команду – футбольную или хоккейную. Здесь, кроме фамилии, игрок снабжен номером, который лучше виден на поле. И это не единственный пример массива. Если отдельную переменную уподобить ящику с хранящейся в нём информацией, то массив переменных будет комодом с пронумерованными ящиками (рис. 88).
Итак, массив – это собранные в одну команду переменные. Они получают общее на всех имя – имя своей команды. А внутри команды каждая переменная – элемент массива – обладает своим номером. Ну, чем не игроки?
Прежде, чем пользоваться массивом, его надо объявить: либо в секции VAR, либо через объявление пользовательского типа в секции TYPE.
Рассмотрим сначала первый способ, – объявим массив в секции VAR.
VAR Имя_Массива :
Здесь использована пара ключевых слов ARRAY… OF…, что переводится как «массив… из…». Имя массива – это обычный идентификатор, его программист придумывает сам; будем считать это имя названием команды переменных.
Справа, после двоеточия, указывают две характеристики массива: 1) диапазон для индексов и 2) тип элементов массива. Рассмотрим эти атрибуты массива подробней.
Диапазон для индексов определяет допустимые номера элементов внутри массива. Диапазон указывают в квадратных скобках после слова ARRAY, – это два выражения порядкового типа, условно обозначенные мною как MIN и MAX, они разделяются двумя точками. Говоря спортивным языком, здесь назначается диапазон номеров для «игроков команды».
После ключевого слова 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. Увы, компилятор увидит здесь ошибку несовместимости типов. В чем дело? А в том, что он считает разнотипными массивы, объявленные в разных операторах. Даже если массивы совершенно одинаковы! Скажете, компилятор недостаточно умен? Может быть, но нам придётся как-то выкручиваться, и для этого есть два пути.
Во-первых, переменные A и B можно объявить в одном операторе.
var A, B : array [1..5] of integer;
Это устраняет проблему несовместимости типов.
Но есть и лучший способ – сначала объявить для массива пользовательский тип данных. Это делается в секции TYPE так:
TYPE Имя_Типа =