
- •Программирование на языках высокого уровня
- •1. Основные понятия
- •1.1. Алфавит и словарь языка
- •1.2. Скалярные, стандартные типы данных
- •1.3. Встроенные функции
- •1.4. Структура программы
- •2. Программирование вычислительных процессов
- •2.1. Линейные процессы вычислений
- •2.2. Разветвляющийся вычислительный процесс
- •2.3. Программирование циклов
- •3. Программирование данных
- •3.1. Конструирование простых пользовательских типов
- •3.2. Массивы. Регулярные типы
- •3.3. Сортировка одномерного массива
- •3.4. Многомерные массивы
3.4. Многомерные массивы
Индексы имеют еще одно свойство — чем больше объем массива, тем менее эффективна с ним работа, поэтому часто используют массивы массивов, то есть с двумя, тремя и более индексами для идентификации элементов. Конструирование многомерных массивов в общем виде выглядит следующим образом:
< имя типа > = ARRAY [тип индекса] OF < тип элементов массива >,
где тип элемента массива в свою очередь — массив, содержащий N-1 индекс. Допустима запись:
< имя типа > = ARRAY[ тип индекса N ] OF ARRAY[ тип индекса N-1 ] OF ARRAY [тип индекса N-2] OF ... ARRAY [тип индекса 1]
OF < тип элементов массива >;
Так определен массив от N индексов, то есть N-мерный массив. Это же определение массива может быть сделано в сокращенной форме:
<имя типа > = ARRAY [тип индекса N, тип индекса N-1,..., тип индекса 1 ] OF < тип элементов массива >.
Можно использовать и другие формы определения массива:
< имя типа > = ARRAY [тип индекса N, тип индекса N-1] OF ARRAY [тип индекса N-2,..., тип индекса 1] OF <тип элементов массива>;
Все указанные формы описания типов могут быть приведены как в явном виде в разделе TYPE, так и в неявном в разделе VAR. Обращение к многомерному массиву осуществляется с помощью индексированной переменной вида Х[I1, I2,…, IN], где X — имя массива, а I1, I2,..., IN константы, переменные или выражения, типы которых должны соответствовать типам индексов в определении массива. Указанная форма записи индексированной переменной называется сокращенной и наиболее часто используется. Хорошим стилем программирования считается использование в программе либо сокращенной, либо полной формы описания массивов.
Опишем многомерные массивы, содержащие два индекса. Правила работы с такими массивами полностью распространяются на массивы, имеющие три и более индексов.
Двумерные массивы. Матрицы
Массивы массивов, содержащие два индекса (N = 2), называют двумерными. Если элементами таких массивов являются простые числовые данные, то эти массивы часто называют матрицами.
Обращение к элементам двумерного массива осуществляется с помощью индексированных переменных, например A[I, J]. Здесь А имя массива, а I и J константы, переменные или выражения того же типа, что и типы индексов в объявлении массива. Двумерный массив обычно используют для представления в памяти компьютера матриц:
Связь между элементами матрицы Ajj; I= 1…m; J = 1…n и соответствующими компонентами двумерного массива простая и очевидная Ajj <=> A[I, J].
Объявление и инициализация матрицы
Объявление и инициализация матрицы аналогичны описанным выше способам работы с векторами. То есть в разделе VAR переменным отводится место, а начальное значение этих величин специально не устанавливается. Поэтому после объявления массива необходимо его элементам задать необходимые значения. Используется три способа инициализации двумерного массива.
• Если значения элементов массива определены до начала работы программы, то есть известны на этапе формулировки задания на программирование, то можно использовать следующий способ:
CONST
A: ARRAY [1..5, 1..2] OF REAL = ((0.1, -15.3), (7, 0), (-11.89,4), (-78,11.2), (1,0.01));
При таком объявлении массива в разделе констант, вы заносите в двумерный массив А по порядку А[1,1] = 0.1, А[1,2] = -15.3, А[2, 1] = 7, А[2, 2] = 0,... А[5, 2] - 0.01 вещественные числа, перечисленные в круглых скобках. При этом массив является массивом переменных, то есть в процессе работы программы можно менять содержимое любого элемента матрицы.
• Второй способ применяется в том случае, если исходные данные необходимо внести с клавиатуры в процессе выполнения программы. Так как матрица представляет собой конечный набор однотипных элементов, пронумерованных с помощью двух индексов I и J, то удобно использовать вложенный арифметический цикл (операторы FOR) для ввода значений непосредственно с клавиатуры. При этом можно предложить два приема. Предположим, в вашей программе сделаны объявления:
CONST
M = 3;
N = 4;
VAR
A: ARRAY[ 1.. М, 1.. N] OF REAL;
где M — количество строк, а N — количество столбцов в матрице. Первый способ ввода будет иметь инструкцию:
WRITELN('Введите массив А, из 12 вещественных чисел');
FOR I := 1 ТО М
DO FOR J:= 1 TO N
DO READ(A[I,J]);
При таком способе оператор может ввести все 12 чисел в форме матрицы.
Через пробел в одну строку вводится четыре числа первой строки и затем нажимается на клавишу Enter. Вторая и третья строки матрицы А вводятся аналогично. На экране монитора остается изображение матрицы в удобочитаемом виде, близком к оригиналу.
Второй способ ввода имеет вид:
FOR I := 1 ТО М
DO FOR J:=l TO N
DO BEGIN
WRITE('A[', I:1, J:1 ']= ');
READLN(A[I, J])
END;
Этот фрагмент программы позволяет вам вводить число непосредственно за подсказкой компьютера, курсор для ввода стоит через пробел за знаком равенства.
• Третий способ заполнения заключается в прямом присвоении в теле программы значений элементам массива. Например, следующие операторы вложенного арифметического цикла в совокупности с оператором присваивания обеспечивают обнуление всех 12 компонентов массива:
FOR I := 1 ТО М
DO FOR J:=l TO N
DO A[I,J]:=0;
Отображение на экране значений двумерного массива
Если в результате работы вашей программы необходимо значения каждого элемента двумерного массива отобразить на экране монитора, то можно воспользоваться любым из двух способов, описанных ниже. Предположим, в вашей программе сделаны объявления:
CONST
M = 3;
N = 4;
VAR
A: ARRAY[ 1.. М, 1.. N] OF REAL;
Тогда первый способ вывода элементов массива в виде матрицы будет иметь инструкцию:
WRITELN(' Элементы матрицы А имеют значения:');
FOR I := 1 ТО М
DO BEGIN
FOR J := 1 ТО N
DO WRITE(A[I, J]: С: D,' '); {Вывод строки}
WRITELN {Переход к новой строке}
END;
В этой инструкции первый оператор WRITELN сообщает пользователю, какую информацию он увидит на экране. Второй оператор WRITE сформирует цепочку (строку) вещественных чисел, разделенных пробелами в формате :С:D. Третий оператор WRITELN переведет курсор на новую строку.
Второй способ обеспечивает вывод значений элементов двумерного массива в столбец, причем каждый из элементов будет идентифицирован парой индексов I и J:
FOR I := 1 ТО М
DO FOR J :=1 TO N
DO WRITELN('A[', I:1, ',' , J :1, '] = ', A[I,J]: C: D);
Пример 35.
Найти сумму двух матриц С = А + В размерностью m х n. Элементы Сi,j искомой матрицы С вычисляются по формулам: Сi,j=Аi,j+Bi,j; i = 1...m; j = 1...n.
Эта задача отличается от предыдущего примера тем, что не известна размерность матриц. Поэтому значения тип необходимо ограничить сверху константами GM = Sup m, GN = Sup n.
Структурограмма:
Ввод размерностей М и N матриц А и В; | ||
Формирование массивов A[l..GM, I..GN] и B[I..GM, 1..GN]; | ||
|
Для I от 1 до М с шагом 1 делать: | |
|
|
Для J от I до N с шагом 1 делать: |
|
|
C[I, J] = A[I, J] + B[I, J]; |
Вывод массива C на экран |
PROGRAM PR35;
CONST
GM = 8;
GN = 8;
VAR
А, В, C: ARRAY [1 .. GM, 1 .. GN] OF REAL;
M, N, I, J: INTEGER;
BEGIN
WRITELN('Bвeдите количество строк M и столбцов N матриц A и B');
READLN(M, N);
WRITELN('Введите матрицу А');
FOR I := 1 ТО М DO FOR J := 1 ТО N DO READ(A[I, J]);
WRITELN('Введите матрицу В');
FOR I := 1 TO M DO FOR J := 1 TO N DO READ(B[I, J]);
FOR I := 1 TO M { Вычисление матрицы С }
DO FOR J := 1 TO N
DO C[I,J]:=A[I,J] + B[I,J];
WRITELN('Матрица С имеет вид:');
FOR I := 1 ТО М
DO BEGIN
FOR J := 1 TO N DO WRITE(A[I, J]: 5: 2,' ');
WRITELN
END
END.
Сортировка двумерного массива
Пример 36.
Задан двумерный массив X из 6 строк и 4 столбцов. Упорядочить массив X по возрастанию элементов дробной части столбца с номером N. Отсортированный массив X вывести на экран монитора.
За основу алгоритма возьмем алгоритм сортировки одномерного массива методом пузырька. Отличие этой задачи в том, что переставлять местами нужно не два соседних элемента одномерного массива, а две соседние строки двумерного массива. Перестановка двух строк реализована с помощью арифметического цикла, третьего уровня вложения, с параметром цикла К.
Структурограмма
Формирование массива X[l..6, 1 ..4]; Ввод номера столбца N; | |||
|
Для I от 2 до 6 с шагом 1 делать: | ||
|
Для J от 6 с шагом -1 до I делать: | ||
|
|
FRAC(X[J-1,N]) > FRAC(X[J, N]) True | |
|
|
|
Для К от 1 до 4 с шагом 1 делать: { Перестановка строк } |
|
|
|
R = Х[J-1, К]; Х[J-1, K] = Х[J, К]; X[J, К] = R; |
Вывод массива X на экран монитора. |
PROGRAM PR36;
VAR
X: ARRAY [1..6, 1..4] OF REAL;
N, К, I, J: INTEGER;
R: REAL;
BEGIN
WRITELN('Введите матрицу X');
FOR I := 1 ТО 6
DO FORJ := 1 TO 4
DO READ(X[I, J]);
WRITELN('Укажите номер столбца N матрицы X');
READLN(N);
FOR I:=2 TO 6
DO FOR J:=6 DOWNTO I
DO IF FRAC(X[J-1,N])>FRAC(X[J,N])
THEN FOR К := 1 TO 4 { Перестановка строк}
DO BEGIN
R := X[J-1, К];
Х[J-1, K] := X[J, К];
Х[J, K]:- R;
END;
{ Вывод на экран отсортированного массива X }
WRITELN('Матрица X имеет вид:');
FOR I := 1 ТО 6
DO BEGIN
FOR J := 1 ТО 4
DO WRITE(X[I, J]: 6: 3,' ');
WRITELN
END
END.