PASCAL Работа с массивами 1. ОПИСАНИЕ ТИПА Массив – структурированный тип данных. Структурированные типы данных определяют упорядоченную совокупность скалярных (простых) переменных и характеризуются типом своих компонентов. В языке PASCAL допускаются следующие структурированные типы данных: строки, массивы, множества, записи, файлы, указатели. Рассмотрим работу со структурированными данными на примере массивов. Массив – это структурированный тип данных, состоящий из фиксированного количества элементов одного типа. Каждый элемент массива определяется своим индексом (номером), по которому к нему осуществляется доступ. PASCAL допускает использование одномерных, двумерных, n-мерных массивов. Тип элементов массива называется базовым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Индексы представляют собой выражения скалярного типа (кроме вещественного). Для описания массива предназначено словосочетание array of. В языке PASCAL существует два способа описания массива. 1-й способ: Type <имя типа> = array[тип индекса] of <тип компонент>; Var <идентификатор, …> : <имя типа> 2-й способ: Var <идентификатор, …> : array[тип индекса] of <тип компонент>; П Р И М Е Р: Type Klass = ( K1, K2, K3, K4 ) ; Znak = array[1..255] of char ; Var M1 : Znak ; {тип Znak предварительно описан в разделе типов} M2 : array[1..60] of integer ; { прямое описание массива М2 } M3 : array[1..4] of Klass ; Это пример описания одномерных массивов. Если в качестве базового типа взят другой массив, образуется структура, которую принято называть многомерным массивом. П Р И М Е Р: Type A = array[1..4] of integer ; 1 Massiv = array[1..4] of A ; Var Matr1 : Massiv ; Получили двумерный массив (матрицу) Matr. Двумерный массив можно получить, используя другую форму записи: Var Matr1 = array[1..4,1..4] of integer ; Если в описании массива задан один индекс, массив называют одномерным, если два индекса – двумерным, если n индексов – n-мерным. Размерность указывается при описании массива в обязательных квадратных скобках через запятую. В диапазоне изменения индекса указывается начальное значение и конечное значение через 2 точки. Одномерные массивы используются для описания векторов, а двумерные – для описания матриц. П Р И М Е Р: {одномерный массив представляет собой вектор из 30 элементов вещественного типа} Matr2 : array[1..6, 1..6] of integer ; {двумерный массив представляет собой матрицу из 6 строк и 6 столбцов с элементами целочисленного типа} Mas3 : array[1..4, 1..5, 1..8] of integer ; {трехмерный массив } Для описания размерности массива можно использовать предварительно определенные константы. П Р И М Е Р: Const K1 = 4; K2 = 6; Var Mas : array[1..K1, 1..K2] of integer ; ЗАМЕЧАНИЕ. Элементы массива располагаются в памяти последовательно по возрастанию адресов, причем в многомерных массивах самый правый индекс возрастает самым первым и т.д. Например, элементы массива M : array[1..5, 1..5] of integer ; в памяти будут размещены следующим образом: M[1,1] M[1,2] M[1,3] M[1,4] M[1,5] M[2,1] M[2,2] … M[2,5] … 2 M[5,1] … M[5,5] 2. ДЕЙСТВИЯ НАД МАССИВАМИ Для работы с массивом как единым целым используется идентификатор (имя) массива без указания индексов. Массивы могут участвовать только в операциях отношения «равно», «не равно» и в операторе присваивания, при этом массивы должны иметь одинаковые типы элементов и одинаковые типы индексов. Например, если массивы А и В описаны, как то к ним допустимы следующие операции: А = В - Результат True, если значение каждого элемента массива А равно соответствующему значению элемента массива В. А<>В - Результат True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В. А:=В - Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны. 3. ДЕЙСТВИЯ НАД ЭЛЕМЕНТАМИ МАССИВА После объявления массива для обращения к его элементу необходимо указать имя массива и индекс элемента в квадратных скобках. Например запись Mas[3] делает доступным третий элемент массива Mas, а запись Matr[4,5] делает доступным элемент массива Matr, находящийся в четвертой строке пятого столбца массива Matr. Элементы массива называют индексированными переменными. Их можно использовать так же, как и простые переменные в различных выражениях. Рассмотрим типичные ситуации, возникающие при работе опишем три массива и четыре вспомогательные переменные: с массивами. Для этого Var А, D : array[1..4] of real ; B : array[1..10,1..15] of ; I, J : integer ; K : integer ; S : real; Инициализация массива заключается в присвоении каждому элементу массива одного и того же значения, соответствующего базовому типу. Например: А[1]: = 0; А[2]: = 0; А[3]: = 0; А[4]: = 0; Однако при большом количестве элементов такой способ нерационален. Гораздо удобнее получить тот же результат, используя оператор цикла for: for I : = 1 to 4 do A[I] : = 0; Для инициализации двумерного массива обычно используются вложенные циклы: for I : = 1 to 10 do for J : = 1 to 15 do B[I,J] : = 0; PASCAL не имеет средств ввода-вывода элементов массива сразу, поэтому ввод и вывод значений производится поэлементно. Чаще всего значения элементов массива вводятся с экрана с помощью операторов read или readln c использованием циклов. Например: 3 for I : = 1 to 4 do readln (A[I] ); Значения элементов двумерного массива можно ввести так: for I : = 1 to 10 do for J : = 1 to 15 do readln (B[I,J] ); Можно ввести значения отдельных элементов, а не всего массива, указывая при этом индекс конкретного элемента: readln (B[5,7] ); Вывод значений элементов массива выполняется аналогично, но с использованием операторов write или writeln. Копирование массива заключается в присвоении значений элементов одного массива всем соответствующим элементам другого массива. При этом оба массива должны быть идентичны по структуре, т.е. иметь одинаковую размерность и один тип элементов. Копирование можно выполнить либо одним оператором присваивания, например: A : = D ; Либо с помощью оператора for, например: for I : = 1 to 4 do A[ I ] : = D[ I ]; В обоих случаях значение элементов массива D не изменится, а значения элементов массива A станут равными значениям соответствующих элементов массива D. Поиск в массиве элементов, удовлетворяющих некоторым условиям организуется с помощью операторов for и if. Например, нужно выяснить сколько элементов массива A имеют нулевое значение. Для этого введем вспомогательную переменную K: K : = 0; for I : = 1 to 4 do if A[I] = 0 then K : = K + 1; После выполнения цикла переменная K будет содержать количество нулевых значений элементов массива A. Перестановка значений элементов массива осуществляется с помощью дополнительной переменной того же типа, что и базовый тип массива. Например, требуется поменять значения первого и третьего элементов массива A: S : = A[3] ; { S - вспомогательная переменная} A[3] : = A[1] ; A[1] : = S; ЗАМЕЧАНИЕ. Кроме массивов пользователей в языке PASCAL существуют стандартные массивы, которые служат для реализации доступа к памяти процессора ( Mem, MemW ), портам данных ( Port, PortW ) и др. 4