
- •8. Интервальный тип данных. Структурированные типы данных. МаСсивы
- •8.1. Интервальный (индексный) тип данных
- •8.2. Структурированные типы данных. Массивы. Их свойства, описание, ввод и вывод
- •8.3. Инициализация массивов
- •8.4. Работа с одномерными (линейными) массивами
- •8.5. Работа с двухмерными массивами (матрицами)
- •8.6. Динамические массивы
- •8.6.1. Двумерные динамические массивы
- •8.7. Передача массивов в качестве параметров в подпрограммы. Открытые массивы
- •Параметры-массивы и параметры-строки
8.5. Работа с двухмерными массивами (матрицами)
Двумерные массивы называют матрицами. У них первый индекс означает номер строки, второй – номер столбца.
Пример 1. Описания типов двумерных массивов:
type quad_matr = array[1..n,1..n] of real;
mas_2d = array[1..n+m,1..10] of integer;
Пример 2. Непосредственные описания переменных как двумерных массивов:
var A,B,C:array[1..5,1..10] of integer;
matr:array[1..m,1..m] of longint;
Графически матрицы изображают в виде таблиц. Например, на рис.8.1 дана матрица с 4 строками и 4 столбцами которую обозначим А. При размещении в памяти и обработке многомерных массивов действует следующее правило адресации элементов в массиве: первым возрастает самый правый индекс, затем второй справа и т.д. Для матриц это означает, что их элементы располагаются по строкам. В математике матрицу А, имеющую n строк и m столбцов обозначают как А(nm).
5 |
-11 |
-23 |
2 |
|
5 |
-11 |
-23 |
2 |
|
-11 |
5 |
-23 |
2 |
-4 |
6 |
12 |
-10 |
67 |
37 |
-68 |
-27 |
6 |
-4 |
12 |
-10 |
||
32 |
-14 |
72 |
-84 |
32 |
-14 |
72 |
-84 |
-14 |
32 |
72 |
-84 |
||
67 |
37 |
-68 |
-27 |
-4 |
6 |
12 |
-10 |
37 |
67 |
-68 |
-27 |
Рис.8.1 Рис. 8.2 Рис. 8.3
Пример 3. Элементы матрицы А[1..4,1..4] (рис.8.1) располагаются в памяти в следующем порядке: А[1,1]; А[1,2]; А[1,3]; А[1,4]; А[2,1]; А[2,2]; А[2,3]; А[2,4]; А[3,1]; А[3,2]; А[3,3]; А[3,4]; А[4,1]; А[4,2]; А[4,3]; А[4,4].
Если рассматривать матрицу А(nm) в виде линейного массива L длины n m, то каждой паре индексов [i,j] в матрице А взаимно однозначно соответствует индекс, равный ((i-1) m + j) в линейном массиве L.
Для инициализации двумерных массивов используют обычные приемы. В примере 1 п.8.3 дано обнуление элементов двумерного массива. При инициализации двумерных массивов с использованием типизированных констант значения компонент каждого из входящих в него одномерных массивов записываются в скобках.
Пример 4. Инициализация матрицы M[1..2,1..3] с использованием типизированной константы: type Matr= Array[1..3,1..2] of Integer;
const M: Matr= ( (2, -8)
(-5, 41)
(53, -26));
Для ввода и вывода двумерных массивов применяют методы, аналогичные одномерным с той разницей, что вместо одного арифметического цикла используют два вложенных.
Пример 5. Ввод в матрицу a размерами 54 случайных чисел, лежащих на отрезке [0;1]:
var a:array[1..5,1..4] of real;
i,j:integer;
begin
for i:=1 to 5 do
for j:=1 to 4 do a[i,j]:=random;
end.
Пример 6. Построчный вывод элементов матрицы a из примера 5 размерами 54: случайных чисел, лежащих на отрезке [0;1]
for i:=1 to 5 do begin
for j:=1 to 4 do write(' a[',i,',',j,']=',a[i,j]:8:6);{вывод строки элементов}
writeln; {переход на очередную строку}
end;
Простейшим видом задач является поиск положения и значения элемента матрицы, обладающего каким-либо свойством.
Пример 7. Ввести с клавиатуры элементы матрицы M[1..2,1..3] с элементами типа integer и вывести матрицу на экран. Определить в ней максимальный отрицательный элемент. Найденный элемент и его номер выдать на экран. Если в матрице нет отрицательных элементов, вывести сообщение “No”.
Решение. Обозначим искомый номер строки элемента через M_str, столбца - через M_stl его значение – через Max. Начальное значение Max примем равным (-32768) – минимально возможному значению типа integer. В качестве начального значения номера M_str примем 0 - номер не существующей строки: M_str=0. Если значение M_str=0 не изменилось до конца расчета, то это означает, что ни одного отрицательного элемента в матрице нет.
var a:array[1..2,1..3] of integer;
i,j,M_str,M_stl,Max:integer;
begin
for i:=1 to 2 do {ввод элементов матрицы с клавиатуры}
for j:=1 to 3 do begin
writeln('vvedite element a[',i,',',j,']=');{запрос на ввод элемента a[i,j]}
read(a[i,j]);{ввод элемента a[i,j]}
end;
for i:=1 to 2 do begin {вывод матрицы на экран}
for j:=1 to 3 do write(' a[',i,',',j,']=',a[i,j]:6);{вывод строки элементов}
writeln; {переход на очередную строку}
end;
Max:=-32768; M_str:=0; {начальные присвоение значения Max и M_str}
for i:=1 to 2 do
for j:=1 to 3 do
if(a[i,j]<0)and(a[i,j]> Max)then {сравнение отрицательных элементов матрицы с Max }
begin Max:=a[i,j]; M_str:=i; M_stl:=j end; {коррекция Max, M_str и M_stl}
if M_str=0 then writeln(' NO!') else {проверка, была ли хоть одна коррекция Max}
writeln(' Max:=',Max,' M_str=',M_str,' M_stl=', M_stl);{вывод результатов}
end.
Для определенности будем рассматривать целочисленную матрицу с названием a, число строк которой обозначено как n, число столбцов – как m. Целочисленные индексы, пробегающие по строкам и столбцам, обозначим i и j. Матрицы, у которых числа строк и столбцов равны (n=m), называют квадратными. Пример квадратной матрицы а(44) дан на рис.8.1. Для квадратных матриц вводят понятия главной диагонали – упорядоченный набор элементов вида {m[1,1], m[2,2], ..., m[n,n]}, у которых совпадают номера строки и столбца. У матрицы на рис.8.1. на главной диагонали стоят элементы: а[1,1]=5, а[2,2]=6, а[3,3]=72, а[4,4]=-27.
Рассмотрим типовые операции, предусматривающие изменение значений элементов матрицы. Для круговой пересылки целых величин используем вспомогательную целую величину t. Фрагменты кода, выполняющие операции, даны для матрицы а(nm) (a[1..n,1..m]).
1. Перестановка строк и столбцов:
а) перестановку строк с номерами r и s:
for j:=1 to m do {перебор всех столбцов матрицы от 1 до m }
begin t:=a[r,j];a[r,j]:=a[s,j];a[s,j]:=t end;{круговая пересылка элементов строк r,s}
б) перестановку столбцов с номерами p и q:
for i:=1 to n do {перебор всех строк матрицы от 1 до n }
begin t:=a[i,p];a[i,p]:=a[i,q];a[i,q]:=t end;{круг. пересылка элементов столбцов p,q}
Для матрицы с рис.8.1 результаты перестановки строк 2 и 4 даны на рис. 8.2, перестановка столбцов 1 и 2 - на рис. 8.3.
2. Умножение строк и столбцов на постоянные множители:
а) умножение строки с номерам r на постоянный множитель c:
for j:=1 to m do a[r,j]:=a[r,j]*c; {проход по всем столбцам от 1-m,умножение элементов }
б) умножение столбца с номером p на постоянный множитель c:
for i:=1 to n do a[i,p]:=a[i,p]*c:={проход по всем строкам от 1-n,умножение элементов }
Для матрицы с рис.8.1 результат умножения ее строки 2 на множитель 1,5 дан на рис. 8.4.
3. Прибавление (вычитание) из одной строки другой, умноженной на постоянный множитель:
а) прибавление к строке с номерам r строки с номером s, умноженной на постоянный множитель c:
for j:=1 to m do a[r,j]:=a[r,j]-a[s,j]*c; {проход по всем столбцам от 1-m,сложение}
б) вычитание выполняется аналогично с заменой “+” на “-”.
Для матрицы на рис.8.1 результат вычитания из строки 1 строки 2, умноженной на 3, дан на рис. 8.5.
4. Транспонирование матриц – операция, при которой ее строки и столбцы меняются местами:
транспонирование матрицы a[1..n,1..m], результат - в матрице b[1.. m,1..n]:
for i:=1 to n do
for j:=1 to m do b[i,j]:= a[j,i];
Для матрицы с рис.8.1 транспонированная матрица дана на рис. 8.6.
5. Сложение (вычитание) матриц – операция, при которой элементы новой матрицы являются суммой (разностью) соответствующих элементов исходных матриц:
определение матрицы с[1.. m,1..n] – суммы матриц a[1..n,1..m] и b[1..m,1..n]:
for i:=1 to n do
for j:=1 to m do с[i,j]:= b[i,j]+a[j,i];
5 |
-11 |
-23 |
2 |
|
17 |
-29 |
-59 |
32 |
|
5 |
-4 |
32 |
67 |
-6 |
9 |
18 |
-15 |
67 |
37 |
-68 |
-27 |
-11 |
6 |
-14 |
37 |
||
32 |
-14 |
72 |
-84 |
32 |
-14 |
72 |
-84 |
-23 |
12 |
72 |
-68 |
||
67 |
37 |
-68 |
-27 |
-4 |
6 |
12 |
-10 |
2 |
-10 |
-84 |
-27 |
Рис.8.4 Рис. 8.5 Рис. 8.6
Пример 8. Ввести с клавиатуры элементы квадратной матрицы A[1..3,1..3] с элементами типа integer. Из A получить матрицу В, в которой вместо столбца, содержащего минимальный элемент матрицы A, вставлена строка, содержащая максимальный элемент A. Номера строки с максимальным элементом, столбца с минимальным элементом и матрицу В выдать на экран.
Решение. Обозначим номер строки с максимальным элементом A через Str_max, номер столбца с минимальным элемента - через Stl_min, текущие значения максимума и минимума – через max, min. Коды операторов для ввода элементов матрицы с клавиатуры и вывода ее на экран совпадают с примером 7 с учетом изменения числа строк, поэтому в решении они не приводятся. После ввода матрицы A и ее исходного вывода на экран вначале определяются номера Str_max и Stl_min. Затем производится пересылка A в В и требуемая коррекция матрицы В.
var a,b:array[1..3,1..3] of integer;
i,j,max,min,Stl_min,Str_max,c:integer;
begin
…/// ввод элементов матрицы с клавиатуры и вывода ее на экран - по примеру 7
Str_max:=1; Stl_min:=1; max:=a[1,1]; min:=a[1,1]; {начальные присвоения значений}
for i:=1 to 3 do {поиск номеров: Str_max-строки с макс.эл. и Stl_min столбца с мин. эл.}
for j:=1 to 3 do begin
if a[i,j]<min then
begin min:=a[i,j];Stl_min:=j end;{поиск столбца с минимальным элементом}
if a[i,j]>max then
begin max:=a[i,j];Str_max:=i end{поиск строки с максимальным элементом}
end;
writeln(' Stl_min=',Stl_min,' Str_max=',Str_max);{вывод номеров столбца и строки}
В:=A; {начальное формирование матрицы В}
for i:=1 to 3 do
b[i,Stl_min]:=a[Str_max,i];{коррекция матрицы В }
for i:=1 to 3 do begin {вывод результирующей матрицы В }
for j:=1 to 3 do write(' b[',i,',',j,']=',b[i,j]:8);{вывод строки элементов}
writeln; {переход на очередную строку}
end;
end.
Наряду с рассмотренными выше в линейной алгебре рассматривается еще целый ряд других операция с матрицами - умножение их на вектор, на матрицу, расчет определителя, определение обратной матрицы и т.д.
Вопросы для проверки знаний.
1. Как располагаются элементы двумерного массива в памяти ?
2. На какое место в памяти, начиная с начала записи массива а(1010), попадет его элемент a[8,5]?
3. Какие матрицы называют квадратными ?
4. Что называют главной диагональю квадратной матрицы ?
5. Как можно перечислить все элементы главной диагонали при помощи одного цикла ?
6. Какое преобразование матрицы называют транспонированием ?
Практические задания.
1. Разработать и отладить код программы, в которой:
а) вводятся с клавиатуры значения элементов целочисленной матрицы A[1..3,1..3],
б) матрица выводится на экран,
в) определяется максимальный элемент матрицы, который затем прибавляется ко всем элементам в нечетных столбцах матрицы,
г) новая матрица выводится на экран.