
Массивы
Массивы
Массив представляет собой структуру данных, позволяющую хранить под одним именем совокупность данных любого, но только одного какого-то типа. Массив характеризуется своим именем, типом хранимых элементов, размером (числом хранимых элементов), нумерацией элементов и размерностью.
Различают массивы статические, размеры которых устанавливаются в момент их объявления, и динамические, размеры которых могут изменяться во время выполнения. В функции или процедуры можно передавать в качестве параметров как массивы фиксированного размера, так и открытые массивы, размер которых неизвестен. Кроме того можно передавать открытые массивы констант, содержащие значения различных типов.
Одномерные массивы
Объявление переменной как одномерного массива имеет вид:
var
<имя массива>: array [<ограниченный тип>] of <тип элементов>;
Например:
var
A: array [1..10] of integer;
объявляет массив с именем А, содержащий 10 целых чисел. Доступ к элементам этого массива осуществляется выражением A[i], где i — индекс, являющийся в данном примере, как видно из объявления, целым числом в диапазоне от 1 до 10.
Например, А[1] — значение первого элемента, А[2] — второго, А[10] — последнего.
Приведем примеры использования этого массива. Код
А[1] := 1;
А[2] := 1;
for i:=3 to 10 do A[i] := A[i-2]+A[i-l] ;
заполняет массив так называемыми числами Фибоначчи, первые 2 из которых равны 1, а каждое последующее равно сумме двух предыдущих.
Диапазон индексов совершенно не обязательно должен начинаться с 1. Например, можно объявить массив следующим образом:
var B: array [0..10] of integer;
Надо только не запутаться в количестве элементов такого массива. Поскольку индексы изменяются от 0 до 10, то в таком массиве 11 чисел.
Элементы массива могут иметь любой тип. Например, предложение
var S: array [0..10] of char;
определяет массив символов. Массив символов — это фактически строка. И с ним можно во многом обращаться как со строкой. Например, если вы определили массив S, как показано выше, то в дальнейшем допускается оператор вида
S := 'abcdefghijk’;
хотя можно обращаться с S и как с массивом. При использовании массива символов как строки надо только иметь в виду, что это строка фиксированной допустимой длины. И приведенный выше оператор не будет вызывать ошибок, только если число символов в строке не превышает объявленного размера массива.
В рассмотренных выше примерах индексы были определены ограниченным целым типом. Так чаще всего и бывает, но это не обязательно. Для индексации массива могут использоваться любые ограниченные типы. Например, вы можете определить массив следующим образом:
Type
color=(red,yellow,green) ;
var
ACol: array [color] of integer;
В качестве типа индекса вы задали введенный вами перечислимый тип. И тогда, например, ко второму элементу массива вы можете обратиться как ACol[yellow].
Приведем еще несколько примеров определений массивов:
Var
Ch: array [ ' a ' . . ' z ' ] of char;
объявляет массив символов, индексами которого являются все символы латинского алфавита в нижнем регистре. Подобный массив можно использовать, например, для шифрования символов. Сначала загрузить в него символы:
Var i: char;
. . .
for i:='a' to ' z ' do Ch[i] := i;
Затем символы в массиве можно случайным образом перемешать, используя функцию генерации случайных чисел Random или каким-то другим образом, а затем заменять символы, пользуясь этим массивом как ключом. Например, если полученный от пользователя символ присвоен переменной Ch1, то он заменяется на символ Ch2:=Ch[Ch1] и в таком измененном виде пишется в зашифрованный текст. Расшифровка может осуществляться следующим образом. Если Ch2 — символ зашифрованного текста, то исходный символ Ch1 можно найти, например, оператором:
Ch1 := Decode (Ch2) ;
где Decode — функция, определенная следующим образом:
Function Decode (Ch2 :char) :char;
begin
for Result:='a' to 'z' do
if Ch [Result] =Ch2 then exit;
end.
Она возвращает индекс элемента массива, значение которого совпадает с заданным зашифрованным символом.
Во всех приведенных примерах объявлялись непосредственно переменные, являющиеся массивами. Можно объявить и тип массива, а затем объявлять переменные этого типа. Например, операторы
Type
Arr = array [0..10] of integer;
Var
А, B: Аrr;
объявляют тип Аrr как массив целых чисел размером 11 и объявляют две переменные А и В этого типа.
Объявление переменной типа массива можно совмещать с заданием элементам массива начальных значений. Эти значения перечисляются после знака равенства, разделяются запятыми и заключаются в круглые скобки. Например:
Var
Al: array[0..10] of integer = ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11) ;
или аналогичное объявление типизированной константы:
Const
Al: array[0..10] of integer = (1,2,3,4,5,6,7,8,9,10,11);
Для массивов символов можно использовать задание начальных значений как по элементам, так и сразу всей строке. Например, объявления
Const
S:array[0. .3] of char = ( 'A' , 'В‘ , 'С' , 'D' ) ;
и
Const
S: array[0..3] of char = 'ABCD';
эквивалентны друг другу.
Имеется одно оговоренное в документации ограничение для массивов: константы — массивы не могут содержать значений типа файлов.