Лабораторная работа № 5.
Обработка одномерных и двумерных массивов
Теоретические положения
Массив - это упорядоченная совокупность однотипных данных. Каждому элементу массива соответствует один или несколько индексов, определяющих положение элемента в массиве. Индексы образуют упорядоченные последовательности.
Тип индекса определяет его допустимые значения. В качестве типа индекса может быть указан любой порядковый тип (boolean, char, integer, перечисляемый тип, а также диапазоны этих типов), кроме типа longint и его производных.
В зависимости от количества типов индексов различают: одномерные, двумерные, трехмерные и n-мерные массивы. Двумерные массивы обычно называют матрицами, считая первый индекс - номером строки, а второй - номером столбца.
Синтаксическая диаграмма оператора «Объявление массива»
Тип элементов массива - любой допустимый тип в Delphi (в том числе и массив), кроме файла.
Объявление переменных типа массив выполняется двумя способами:
• в операторе объявления переменных, например:
var
a: array [1..5] of integer; {массив из 5 целых чисел}
b: array [byte] of char; {массив из 256 символов, индекс элемента массива изменяется от 0 до 255}
с: аггау ['А'..'C';-5..-3] of byte; {матрица из 9 чисел} d: array ['А'..'C'] of array [-5..-3] of byte; {матрица из 9 чисел, по структуре эквивалентная предыдущей}
одномерный массив из 5 целых чисел
одномерный массив из 256 символов
матрица из 9 чисел
• с предварительным объявлением типа, например:
tуре mas =array[1..10] of integer; {объявляем тип}
var a: mas; {объявляем переменную}
Ограничения на количество индексов в Delphi нет, но суммарная длина массива не должна превышать 65537 байт.
Значения элементов массива в программе можно определить тремя способами.
1. Во-первых, массив может быть инициализирован с использованием типизированных констант или просто присваиванием значений элементам.
2. Во-вторых, элементы массива могут быть введены с клавиатуры или из файла.
3. В-третьих, элементы массива могут быть вычислены, например, сгенерированы с использованием датчика случайных чисел, рассчитаны по заданным формулам и закономерностям, а также скопированы из другого массива.
Инициализация массивов.
Для объявления инициализированных массивов в Delphi используют типизированные константы. При этом соответствующие значения указывают в скобках через запятую. Значения элементов многомерных массивов перечисляют в порядке возрастания индексов справа налево, заключая в скобки каждый подмассив. Для матриц такой порядок соответствует построчному указанию значений.
Const а: array [1..5] of real = (0,-3.6,7.8,3.789,5.0);
b: array [boolean, 1..5] of real = ((0,-3.6,7.8,3.789,5.0),
(6.1,0,-4.56,8.9,3.0));
c: array[1..3,0..1,-2..1] of byte = (((3,6,9,6),(0,4,3,9)),
((5,7,3,1),(45,8,0,2)),
((5,9,2,3),(1,5,8,4)));
Операции над массивами.
Над массивом в целом определена единственная операция - операция присваивания. Присваивание массивов заключается в копировании элементов одного массива в другой. Эту операцию можно выполнять только над массивами одного типа.
Массивы считаются совпадающими по типу, если они объявлены через запятую в одной строке, например:
var а, b: array [boolean] of real;
... a:=b;...
или, если вначале объявлен тип массива, а затем массивы этого типа:
Туре mas = аггау [boolean] of real;
Const a: mas=(3.6, -5.1);
var b: mas;
... b:=a;...
Доступ к элементам массива.
Работа с массивом, как правило, сводится к действиям над его элементами. Для обращения к конкретному элементу массива надо указать имя массива и значения индексов элемента в квадратных скобках через запятую, например:
var a: array[char,boolean] of real; {объявляем матрицу}
... a ['A', true]:=5.1;... {присваиваем значение элементу аA,true}
Значения индексов можно указать непосредственно литералом, например а[3], или косвенно, указав идентификатор переменной, содержащей значение индекса, например a[i].
Прямая и косвенная адресация элементов массива
Косвенное задание индексов позволяет реализовывать последовательную обработку элементов массивов. Причем, т.к. интервал изменения индекса определен при объявлении массива, для этого обычно применяют циклы с заданным количеством повторений. Параметр же цикла используют в качестве переменной косвенной адресации массива, например:
var a: array[1..6] of integer;...
for i:=1 to б do a[i]:=i;... {при i=1 a1 присваивается 1,
при i=2 a2 присваивается 2
при i=3 аз присваивается 3 и т.д.}
Количество переменных, необходимых для косвенной адресации массивов, совпадает с размерностью массива. Так, для работы с матрицами используют две переменные, хранящие индексы: одну - для хранения номеров строк, а вторую - номеров столбцов.
Из многомерных массивов допускается выделять подмассивы, отбрасывая индексы, записанные справа, и оставляя индексы, определяющие данный подмассив. Так, из матрицы можно выделить строку, но нельзя - столбец, например:
Туре mas=array[boolean] of real; {массив из 2 вещественных чисел}
Const a: array[1..2] of mas ((3.6,-5.1),(7.0,-4.2)); {матрица из 4 вещественных чисел}
var b:mas;
... b:=a[1];... {в массив b скопирована первая строка матрицы а}
Ввод-вывод массивов.
Ввод-вывод массивов выполняют поэлементно, используя циклы с заданным числом повторений, например:
Var a: array[1..5] of real;
Begin
for i:=1 to 5 do Read(a[i]); {ввод массива}
ReadLn; {очищаем буфер ввода, чтобы далее значения вводились со следующей строки}
Значения элементов массива вводят в порядке обращения к ним из цикла, например для цикла, показанного выше: а1, а2, аз, а4, а5. Эти значения могут задаваться в одной строке через пробел или с нажатием клавиши Enter после ввода одного или нескольких чисел.
При выполнении операций ввода-вывода матриц и массивов большой размерности целесообразно вводить и выводить значения построчно. Например:
Var a:array[1..5, 1..7] of real; {матрица a из 5 строк по 7 элементов}
Begin
for i:=1 to 5 do {цикл ввода строк массива: а1, а2, аз, а4, а5}
begin
for j:=1 to 7 do {цикл ввода элементов i-й строки: ai1, ai2,..., ai7}
Read(a[i, j]);
ReadLn; {очищаем буфер ввода}
end;...