Чтение онлайн

на главную - закладки

Жанры

Шрифт:

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, а также доступна через меню по цепочке:

Поделиться:
Популярные книги

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Черный Маг Императора 9

Герда Александр
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 9

Офицер империи

Земляной Андрей Борисович
2. Страж [Земляной]
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.50
рейтинг книги
Офицер империи

Отвергнутая невеста генерала драконов

Лунёва Мария
5. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Отвергнутая невеста генерала драконов

Многорукий бог Далайна. Свет в окошке

Логинов Святослав Владимирович
Шедевры отечественной фантастики
Фантастика:
научная фантастика
8.00
рейтинг книги
Многорукий бог Далайна. Свет в окошке

Служанка. Второй шанс для дракона

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Служанка. Второй шанс для дракона

Измена. Право на счастье

Вирго Софи
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на счастье

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Черный дембель. Часть 4

Федин Андрей Анатольевич
4. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 4

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Законы Рода. Том 4

Flow Ascold
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Хозяйка покинутой усадьбы

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка покинутой усадьбы

Надуй щеки! Том 6

Вишневский Сергей Викторович
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 6