Песни о Паскале - [80]

Шрифт
Интервал

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


>TYPE Имя_Типа = ARRAY [..] 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;


>procedure ABC (var arg: TRatings); { параметр процедуры }

>var A, B, C : TRatings;       { локальные переменные }

>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 должна быть открыта для записи.

Ошибки индексации

Объявление массива, как сказано, содержит границы для индексов: MIN – номер первого элемента, и MAX – номер последнего. А что случится при попытке обратиться к элементу с меньшим, чем MIN номером? Или наоборот – с большим, чем MAX? Иначе говоря, что случится при попытке доступа к несуществующему элементу массива? Такие ошибки преследуют даже опытных программистов, а последствия зависят от способа, которым вы совершите сей проступок.

Предположим, в программу вкрался такой оператор:


>      Names[200]:= ’Синичкин’;


Поскольку в массиве Names нет элемента с индексом 200, здесь вас остановит компилятор, – ошибка слишком явна, чтобы он промолчал. Вам не останется ничего иного, как исправить индекс, иначе программа не откомпилируется.

Но, когда индекс вычисляется при исполнении программы, нарушение границ проявляется и обрабатывается иначе, например:


>      Readln(N);

>      Writeln(Names[N]);


Нам не угадать, что введет пользователь в переменную N, – здесь ошибка нарушения границ может возникнуть при выполнении программы. В главе 27 мы рассматривали ошибки времени исполнения, – это как раз такой случай. Если указать индекс, выходящий за границы массива, то реакция программы будет зависеть от настройки компилятора, точнее, от опции контроля диапазонов. Напомню, что эта опция управляется директивой $R, а также доступна через меню по цепочке:


Рекомендуем почитать
Маргаритка под снегом

Вы бывали в Калининграде? Город мистический и старый. Но не это главное. То что происходит с главной героиней не объясняется древними стенами. За ней гоняется призрак погибшего мотоциклиста. Зачем? Почему?. Рита узнает все и будет счастлива.


«Ад» для студентов

Я смотрела на бесплатный цирк с мученическим выражением лица, подперев голову рукой. В другой момент можно было бы посмеяться, но не тогда, когда вернувшись с очередной вылазки в опасное место, проспала всего час. А ещё через час мне нужно быть уже на защите по поводу окончания двухмесячного обучения целителей в моём персональном Аду.Так косолапый ещё и жопой ко мне повернулся, тряся больше. Это намёк? Закатив глаза к потолку, думала заканчивать выступление, как вдруг набедренная повязка мишки упала, а лифчик лопнул, разлетаясь на части.


Проект Королева

Лианка попадает в мир, который не отличался бы от нашего, если бы не драконы. Давняя война разрушила традиционный уклад. Человечество выбрало путь технического прогресса. Драконы одичали настолько, что прямоходящие собратья забыли о прежней дружбе и начали считать ящеров животными, притеснять и отлавливать для опытов и зоопарков. Крылатые обречены. Они отступают все выше в горы, но люди жадные до знаний и земель беспощадны.В первый же день Лианка, угодив в сети ловцов, оказывается в огромной клетке вместе с другими драконами.


Дорога снов

В застывшем воздухе — дымы пожарищ. Бреду по раскисшей дороге. Здесь до меня прошли мириады ног. И после будут идти — литься нескончаемым потоком… Рядом жадно чавкает грязь. — тоже кто-то идет. И кажется не один. Если так, то мне остается только позавидовать счастливому попутчику. Ибо неизбывное одиночество сжигает мою душу и нет сил противостоять этому пламени.Ненависть повисла над дорогой, обнажая гнилые, побуревшие от крови клыки. Безысходность… Я не могу идти дальше, я обессилел. Но… все-таки иду. Ибо в движении — жизнь.


Зверь

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


Он идет за мной

Главная героиня юная карьеристка, Татьяна Лунева, живет в своем неприметном городе, работает на не приметной работе и мечтает об отпуске. В один из июльских вечеров в ее жизнь врывается незнакомец. Он представляется как убийца теней и увозит ее в свой мир, что бы защитить от темных душ, охотившихся за ней. Вскоре Татьяна узнает, что она не просто человек, и что отныне ей придётся бороться за свою жизнь и свободу. Читайте захватывающие приключения юной девушки в мире призраков. И узнайте, каково быть человеком с серебреной душой.