Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatika_Lektsia_8.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
465.92 Кб
Скачать

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 столбцов обозначают как А(nm).

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 длины nm, то каждой паре индексов [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 размерами 54 случайных чисел, лежащих на отрезке [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 размерами 54: случайных чисел, лежащих на отрезке [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],

б) матрица выводится на экран,

в) определяется максимальный элемент матрицы, который затем прибавляется ко всем элементам в нечетных столбцах матрицы,

г) новая матрица выводится на экран.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]