- •Часть V. Проектирование программ в o Pascal.
- •19. Составные типы данных в o Pascal.
- •19.1. Массивы.
- •Design Part 1
- •19.1.1. Синтаксис и семантика для массивов.
- •19.1.2. Параметры-массивы.
- •19.2. Реализация абстрактных типов данных с помощью массивов.
- •19.2.1. Текстовые файлы ограниченного размера.
- •19.2.1. Стек ограниченного размера.
19.1. Массивы.
Массив образуется из двух типов: его компонентов и индексов. Значения индексов используются для выбора значений компонентов. Мощь массивов в возможности вычисления значения индекса и использования его для получения значения компонента за время, которое не зависит от значения индекса или истории предыдущего использования массива.
В Паскале тип данных массив описывается следующим оператором.
TYPE
ArrType = ARRAY [IndexType] OF ComponentType;
Область определения для данного массива это IndexType, а область значений – это подмножество ComponentType. В Паскале IndexType ограничен порядковыми типами иными, исключая INTEGER, так что количество значений в области определения ограничено объявлением. Переменная массива, скажем ArrVar1 или ArrVar2 может быть объявлена с данным типом, и также будет полезна переменная с типом индекса.
VAR
Index: IndexType;
ArrVar1, ArrVar2: ArrType;
Переменные массивов ставят в соответствие значениям типа IndexType значения типа ComponentType. Это соответствие достигается указанием индекса для переменной массива. Операция указания индекса в Паскале обозначается квадратными скобками, например:
ArrVar1[Index]
Соответствие, представленное массивом ограниченное и явное; каждому элементу области определения с помощью присваивания ставится в соответствие элемент области значений. Присваивание обычно выполняется для одного индекса, но также и целый массив может быть присвоен другому массиву. Оператор:
ArrVar1[Index] := CTypeValue
изменяет значение соответствия, представленного ArrVar1 в точке области определения, заданной Index на значение CTypeValue, но оставляет соответствие в остальном неизменным.
Оператор:
ArrVar1 := ArrVar2
изменяет все соответствие присваиванием всех компонентов ArrVar2 соответствующим компонентам ArrVar1.
В следующем примере, и тип и индексы массива Arr являются поддиапазоном INTEGER и оператор FOR присваивает каждому элементу в массиве значение равное его позиции. То есть этому массиву присваивается функция эквивалентности (identity function) на области определения {1, 2, 3, 4, 5}.
TYPE
Both = 1 .. 5;
VAR
I: Both;
Arr: ARRAY [Both] OF Both;
BEGIN
FOR I := 1 TO 5
DO
Arr[I] := I
END
Шифрование – идеально подходящий способ применения для массивов. Простейший способ зашифровать сообщение – использовать замещающий шифр, который заменяет символы в сообщении символами из кода. Сообщение может быть представлено как массив символов с целыми индексами, которые указывают позицию каждого символа в сообщении. Предположим, что сообщения длиной до Len будут состоять только из заглавных букв.
CONST
Len = 20;
TYPE
Str = ARRAY [1 .. Len] OF ‘A’ .. ‘Z’;
VAR
Msg: Str;
Другой массив символов может хранить символы шифра (не только буквы) значениями индексов которого являются буквы, которые встречаются в исходном сообщении.
TYPE
Chiper = ARRAY [‘A’ .. ‘Z’] OF CHAR;
VAR
Code: Chiper;
Символы в сообщении, которые не являются большими буквами, воспроизводятся без замен.
Следующий раздел проекта читает и шифрует определенное количество входных строк в соответствии с выше описанной схемой. Поскольку каждая входная строка сохраняется в Msg перед шифровкой, MSG дополняется пробелами после чтения каждой строки таким образом, что символы более длинной ранее считанной строки не появлялись в зашифрованном выводе следующей, более короткой.
