Массивы массивов. Матрицы
Массивы (array) наиболее
часто применяемые структурированные типы в системе программирования Turbo
Pascal. Они обладают рядом свойств, которые позволяют использовать их для
хранения и обработки значительных объёмов различной информации. Данное
занятие посвящено дальнейшему изучению типа данных ARRAY. До сих пор Вы
применяли тип ARRAY только для хранения и обработки линейных массивов
информации. В этом случае массив можно представить как линейную таблицу
содежащую однотипную информацию. Например, объявлен массив a: array [1..9]
of integer, который уже заполнен (определён). Его можно представить
следующим образом.
Имя массива a
Индекс 1 2 3 4 5 6 7 8 9
+--------------------------------------+
Содержимое ¦ 2 ¦ 12 ¦ -9¦ 5 ¦ 2 ¦ 143 ¦ 4 ¦ 7 ¦ -6 ¦
+--------------------------------------+
В этом случае, для того
чтобы обратиться к элементу массива, необходимо указать имя данного массива
с индексом элемента в квадратных скобках. Например: a[4].
Для данного массива базовым
типом является стандартный, простой тип integer. Поэтому содержимое каждой
ячейки массива, это целое число. Но базовым типом для массивов может быть
практически любой тип, в том числе и сам тип массив. То есть в Turbo Pascale
может быть объявлена переменная следующего вида:
Var
a: array [1..3] of array [1..4] of integer;
Для того, чтобы не
возникало переменных с таким длинным описанием, удобно сначала описать
базовый тип массив в разделе описания типов пользователя, а затем объявлять
переменную-массив описанного выше типа. В этом случае сделанное выше
объявление переменной-массива a будет выглядеть следующим образом:
Type
r=array[1..4] of integer;
Var
a: array[1..3] of r;
Описанный способ объявления
массивов относят к объявлению так называемых многомерных массивов. В данном
случае мы объявили двумерный массив для хранения целых чисел. Для того,
чтобы обратиться к элементу такого массива, нам необходимо, после имени
массива указать всего два индекса этого элемента. Хотя существует
возможность работать с более сложными массивами. Например:
Type
c1=array [1..5] of integer;
c2=array [1..4] of c1;
c3=array [1..5] of c2;
c4=array [1..10] of c3;
Var mas: c4;
Для того, чтобы обратиться
к элементу массива mas, необходимо, после имени массива указать четыре
индекса элемента: mas[2][3][5][1].
В системе программирования
Turbo Pascal существует более простой, или более "прямой", а в результате
этого, и чаще применяемый способ объявления многомерных массивов. Начнём
сразу с примера:
Var
matr: array[1..3,1..5] of integer;
Таким способом можно
описывать и более сложные массивы. Например, 5-мерный массив можно объявить
следующим образом:
Var
ex: array [1..10,1..10,1..5,1..15,1..4] of real;
Обращаясь к элементу
данного массива, необходимо указывать пять его индексов: ex[1,1,1,1,1].
Матрицы.
Особый интерес представляют
двумерные массивы, которые ещё называют квадратными и прямоугольными
таблицами. В научной литературе их часто называют матрицами, при этом
элементы матриц изображаются с помощью двух индексов. Как именно это
делается, видно на примере следующих матриц.
¦ a11 a12 a13 ¦ ¦ b11 b12 b13 b14 ¦
¦ a21 a22 a23 ¦ ¦ b21 b22 b23 b24 ¦
¦ a31 a32 a33 ¦
Первый индекс - номер
строки, второй - номер столбца; a13 читает- ся "а один три", а не "а
тринадцать". В программах на Паскале используются соответственно конструкции
а[1,3].
Про матрицу имеющую m строк
и n столбцов, говорят, что она имеет размер mxn ("m на n"). Если m=n, то
матрица называется квадратной.
Для квадратной матрицы
элементы с одинаковыми индексами для строк и столбцов составляют главную
диагональ матрицы. Для изображённой выше матрицы это элементы а11, а22, а33.
Противоположная диагональ называется побочной диагональю. К ней относятся
элементы а13, а22, а31.
Как работать с
матрицами.
Для обработки матриц
наиболее удобно применять вложенные циклы с параметром. Описанный ниже
фрагмент программы предназначен для заполнения матрицы целых чисел размером
4x5 с клавиатуры.
for i:=1 to 4 do
for j:=1 to 5 do
begin
write('Введите элемент ',i,' ',j,' ');
readln a[i,j];
end;
Допустимая
операция присваивания.
В системе программирования
Turbo Pascal, для одинаковых массивов допустима операция присваивания
массива массиву. Например, если описано два массива следующим образом:
VAR
A,B: array[1..50,1..60] of real;
то допустима следующая операция присваивания: A:=B;
Примеры программ.
Дана матрица действительных
чисел размером 3x5. Вычислить сумму элементов матрицы.
PROGRAM EX_1;
CONST
n=3; {Количество строк}
m=5; {Количество столбцов}
TYPE
mas=array[1..n,1..m] of real;
VAR
b: mas; {Массив}
i: integer; {Индекс строки}
j: integer; {Индекс столбца}
s: real; {Сумма}
BEGIN
{Ввод значений матрицы---------------------}
Writeln('Введите значения элементов матрицы:');
for i:=1 to n do
for j:=1 to m do
readln(b[i,j]);
{Вычисление суммы ----------------}
s:=0;
for i:=1 to n do
for j:=1 to m do
s:=s+b[i,j];
writeln('Сумма = ',s);
END.
Дана матрица целых чисел
размером 4x4. Заменить все элементы главной диагонали на нули. Вывести на
экран монитора содержимое матрицы до обработки и после обработки.
PROGRAM EX_2;
VAR
matr: array[1..4,1..4] of integer; {Матрица}
i: integer; {Индекс строки}
j: integer; {Индекс столбца}
BEGIN
{Ввод значений матрицы
---------------------}
for i:=1 to 4 do
for j:=1 to 4 do
begin
write('Введите элемент ',i,' ',j,' ');
readln matr[i,j];
end;
{Вывод содержимого матрицы до обработки
--------------------------------------}
Writeln('Содержимое матрицы до обработки');
for i:=1 to 4 do begin
for j:=1 to 4 do
write(matr[i,j]:4);
writeln;
end;
{Обработка матрицы
------------------}
for i:=1 to 4 do matr[i,i]:=0;
{Вывод содержимого матрицы после обработки
-----------------------------------------}
Writeln('Содержимое обработанной матрицы ');
for i:=1 t0 4 do begin
for j:=1 to 4 do
write(matr[i,j]:4);
writeln;
end;
END.
Контрольные
вопросы
- Какие способы объявления многомерных массивов
вы знаете?
- Как обратиться к элементу многомерного массива?
- В каких случаях допускается обращение к
многомерному массиву целиком?
- Какая конструкция применяется для обработки
n-мерного массива.
Задания для
самостоятельного выполнения.
- Дана матрица целых чисел размером 4x3.
Определите сумму каждой строки этой матрицы. Результат вывести на экран
монитора.
- Дана матрица целых чисел размером 3x4.
Определите сумму каждого столбца этой матрицы. Результат вывести на
экран монитора.
- Дана матрица целых чисел размером 4x4.
Определите сумму элементов расположенных выше главной диагонали.
Результат вывести на экран монитора.
- Дана матрица целых чисел размером 4x3.
Отсортировать каждую строку матрицы по возрастанию. Вывести содержимое
матрицы до обработки и после обработки.
- Дана матрица целых чисел размером 3x4.
Отсортировать каждый столбец матрицы по убыванию. Вывести содержимое
матрицы до обработки и после обработки.
- Дана матрица целых чисел размером 5x3. Заменить
все отрицательные элементы матрицы на нули. Вывести содержимое матрицы
до обработки и после обработки.
- Дана матрица целых чисел размером 4x4. поменять
местами строки и столбцы этой матрицы. Вывести содержимое матрицы до
обработки и после обработки.
- Дана матрица целых чисел размером 5x3.
Определить максимальный и минимальный элемент матрицы. Результат вывести
на экран монитора.
- Дана матрица A символов размером 4x3.
Организовать и вывести на экран матрицу Б состоящую из целых чисел,
полученных преобразованием чисел матрицы А.
- Дана матрица целых чисел размером 4x4.
Увеличить все чётные элементы на 16, а нечётные элементы увеличить
втрое. Вывести на экран содержимое обработанной матрицы.
- Дана матрица целых чисел размером 4x4.
Повернуть матрицу на 90 градусов и вывести содержимое матрицы на экран.
НАЗАД
ДАЛЕЕ