В сравнении с объявлением переменной разница мизерная: вместо двоеточия видим знак равенства, а вместо имени переменной – имя типа. Но каковы последствия! Объявите лишь однажды нужный вам тип, и тогда применяйте его, где угодно. Вот объявления типов для указанных выше переменных.
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 :
procedure ABC (var arg:
var A, B, C :
begin
...
end;
Здесь тип TRatings служит для объявления переменных и параметров в трех местах программы. В будущем мы всегда будем объявлять типы – как для массивов, так и для других сложных наборов данных.
Переменной-массивом можно ворочать как единым целым, например, при копировании одного массива в другой. Но чаще приходится работать с отдельными его элементами, как «выдернуть» их из массива?
Очень просто: воспользуйтесь индексацией, – она знакома вам по работе со строками. Как и для доступа к отдельному символу строки, для доступа к элементу массива надо указать его индекс, то есть порядковый номер в массиве. Индекс указывают в квадратных скобках, стоящих после имени массива, он представляет собой выражение порядкового типа. Кстати, сходство со строками не случайно, ведь строка – это особый род массива, составленного из отдельных символов.
Рассмотрим примеры доступа к элементам объявленных выше массивов.
Пример 1. Трем элементам массива Names присваиваем фамилии хоккеистов.
Names[1]:= ’Петров’;
Names[2]:= ’Михайлов’;
Names[3]:= ’Харламов’;
Пример 2. Сравниваем третий и четвертый элементы массива Ratings. Здесь индексы заданы через целочисленную переменную n.
…
Ratings[3]:= 12;
Ratings[4]:= 8;
n:=3;
if Ratings[n] > Ratings [n+1] then … else …;
Как видите, индекс в массиве можно вычислять, а это открывает дорогу к циклам. И мы двинемся ею немедленно!
Ввод и вывод – это те задачи, не решив которые, не стоит помышлять о применении массивов. Ни то, ни другое не сделать одним махом. Здесь, как и для множеств, нужны циклы, обрабатывающие отдельные элементы массива.
Взять, к примеру, массив Names, ввести который можно так:
for i:=1 to 30 do Readln(F, Names[i]);
Здесь F – это открытый для чтения текстовый файл, каждая строка которого содержит фамилию.
На первый взгляд все просто. Просто, да не гладко, – это будет работать лишь с файлом, в котором не менее 30 строк (по числу циклов). А иначе случится ошибка: противозаконное чтение за пределами файла. Как избежать её? Внимательней присматривайте за концом файла, вот так:
i:=1;
{ пока не конец файла и не введены все элементы }
while not Eof(F) and (i<=30) do begin
Readln(F, Names[i]);
i:= i+1;
end;
А вот ещё один хороший вариант.
for i:=1 to 30 do begin
if Eof(F) then break; { если конец файла, прервать цикл }
Readln(F, Names[i]);
end;
Вывод массива в файл не представляет труда, вот пример.
for i:=1 to 30 do Writeln(F, Names[i]);
Разумеется, что файловая переменная F должна быть открыта для записи.