Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AlgStr / Библиотека / Разные источники / СД - двумерный массив (метод ук-ия) Ростов на Дону

.pdf
Скачиваний:
40
Добавлен:
23.03.2015
Размер:
378.88 Кб
Скачать

полните задачу для случая, когда матрица содержит положительный элемент и когда положительный элемент в матрице отсутствует.

Упражнение 8. Опишите в виде процедуры алгоритм решения задачи 3, используя неявный цикл, как это представлено в процедуре Poisk_matr.

Задача 4. Определить след вещественной матрицы a[1..n,1.. n] (сум-

му элементов главной диагонали).

Постановка задачи

Входные данные: n N (множеству натуральных чисел); a[1..n,1..n] R (множеству вещественных чисел).

Выходные данные: s R (множеству вещественных чисел).

Метод решения.

Элементы, находящиеся на главной диагонали, имеют одинаковые индексы и обозначаются как a[i,i].

Выпишем рекуррентные соотношения для вычисления суммы: s0=0;

si=si-1+ai,i , i=1, 2, …, n

Опишем алгоритм в виде функции Summa_D.

function Summa_D (const a:matr;n,m:inteqer):T_el; var i,j:integer;

s:T_el;

begin s:=0;

for i:=1 to n do s:=s+a[i,i];

Summa_D:=s end;

13

Упражнение 9. Определить сумму элементов побочной диагонали вещественной матрицы А[1..n,1.. n].

Задача 5. Построить массив, каждый элемент которого равен сумме элементов каждой строки вещественной матрицы a[1..n,1..m].

Постановка задачи

Входные данные: n, m N (множеству натуральных чисел);

a[1..n,1..m] R .

Выходные данные: s[1..n] R (множеству вещественных чисел).

Метод решения

Математическая формулировка задачи:

( i:1 i n : s[i]=∑a[i,j] при j=1, 2, …, m)

Опишем алгоритм в виде процедуры Sum_Str.

procedure Sum_Str( const a:matr;n,m:inteqer; var s:vect);

var i,j:integer; sum : real;

begin

for i:=1 to n do begin

sum:=0;

for j:=1 to m do sum:= sum+a[i,j];

s[i]:=sum

end end;

Упражнение 10. Построить массив, каждый элемент которого равен сумме элементов каждого столбца вещественной матрицы a[1..n,1..m].

14

1.4 Построение матрицы

Задача 6. Построить таблицу Пифагора (таблицу умножения) для заданного количества строк (таблица должна быть квадратной).

Постановка задачи.

Входные данные: n N (множеству натуральных чисел);

Выходные данные: a[1..n,1..n] Z.

Метод решения

Полученная матрица должна быть симметричной, то есть a[i,j]=a[j,i].

Вычисление a[i,j] выполняется по формуле

i, j:1 i n ,j: i jn: a[i,j]=i*j

Опишем алгоритм в виде процедуры

procedure Tab_Umn( n:integer; var a:matr); var i,j:integer;

begin

for i:=2 to n do for j:=i to n do begin

a[i,j]:=i*j;

a[j,i]:=i*j

end

end;

Замечание: для того чтобы увидеть таблицу умножения на экране или в текстовом файле, значение n не должно превышать 19.

Упражнение 11. Напишите и выполните программу для проверки результатов вызова процедуры Tab_Umn.

15

Задача 7. Дан вектор x {x1, x2 . . ., xm}. Построить матрицу (опре-

делитель Вандермондо) по правилу: i ─ тая строка содержит вектор

{xi1, xi2, . . ., xim}.

Постановка задачи

Входные данные: m,n N (множеству натуральных чисел);

x {x1, x2, . . ., xm} R.

Выходные данные: a[1..n,1..m] R.

Метод решения

Первая строка имеет значения вектора x, то есть a[1]:=x. Эта операция синтаксически определена в алгоритмическом языке Pascal. Далее необходимо получить

i,j:2 i n and 1 j m : a[i,j]= a[i-1,j]*x[j]

Опишем алгоритм в виде процедуры Matr_Vand.

Procedure Matr_Vand(const x:vect; n,m: integer; var a:matr);

var i,j:integer; begin

a[1]:=x;

for i:=2 to n do

for j:=1 to m do

a[i,j]= a[i-1,j]*x[j]

end;

Упражнение 12. Напишите и выполните программу для проверки результатов вызова процедуры Matr_Vand .

16

1.5 Операции, изменяющие состояние матрицы

К операциям, изменяющим состояние матрицы, относятся следующие: изменить (элемент или элементы), вставить (строку или столбец), добавить (строку или столбец), удалить (строку или столбец). Рассмотрим задачи, когда операции проводятся со строками. В этом случае матрица определяется как вектор векторов и алгоритмы операций значительно упрощаются.

Операция изменить Задача 8. Каждую строку матрицы разделить на произведение отличных от

нуля элементов этой же строки.

Постановка задачи

Входные данные: n,m N (множеству натуральных чисел);

a[1..n,1.. m] R;

Выходные данные: a[1..n,1..m] R.

Метод решения

Определим, что нужно найти, используя математический язык:

( i,j:1 i n and 1 j m :

if a[i,j]≠0 then a[i,j]:=a[i,j]/ Pi),

где Pi определяется так:

j: 1 j m : Pi = П a[i,j] при a[i,j]≠0

Опишем алгоритм решения задачи в виде процедуры Izm_Matr.

procedure Izm_Matr(n,m:int;var a:matr); var i,j:int;

p:T_el;

begin

for i:=1 to n do begin

p:=1;

for j:=1 to m do

17

if abs(a[i,j])>eps then p:=p*a[i,j]; for j:=1 to m do

a[i,j]:=a[i,j]/p

end end;

Замечание. Обратите внимание на проверку: равно ли нулю вещественное значение. Для сравнения с нулем элемента матрицы нельзя пользоваться отношением a[i,j]=0. Его необходимо заменить отношением

Abs(a[i,j])<eps.

Операция добавить

Задача 9. Добавить вектор x к матрице a[1..n,1..m].

При выполнении операции добавить осуществляется изменение количества строк матрицы и n+1ая строка получает значение вектора x.

Описание алгоритма

n:=n+1;

a[n]:=x;

Операция вставить

Задача 10 . Вставить в матрицу на k─тую позицию заданную строку.

Постановка задачи

Входные данные: n,m N (множеству натуральных чисел);

k ─ номер строки; a[1..n,1.. m] R;

x {x1, x2, . . ., xm} R.

Выходные данные: a[1..n+1,1..m] R.

Метод решения

Метод вставки вектора в матрицу аналогичен методу вставки элемента (элементом в нашем случае является строка) в одномерный массив ([1]):

1) сдвинуть все строки вниз, начиная с n до k;

2) a[k]:=x;

18

Учтем, что количество строк в матрице изменится. Опишем алгоритм в виде процедуры Insert.

procedure Insert(var n:integer; const x:vect;k:integer; var a:matr);

var b:vect; i:integer;

begin

for i:=n downto k do a[i+1]:=a[i];

a[k]:=x;

n:=n+1

end;

Операция удалить

Задача 11. Удалить строки матрицы, содержащие нулевой элемент.

Постановка задачи

Входные данные: n,m N (множеству натуральных чисел);

a[1..n,1.. m] Z;

Выходные данные: a[1..n,1..m] Z .

Метод решения

Предположим, что есть логическая функция Not_Null_El, устанавли-

вающая отсутствие нулевого элемента в одномерном массиве. Заголовок этой функции имеет вид:

function Not_Null_El(const b:vect;k:integer):Boolean;

Эта функция устанавливает, что в одномерном массиве нет нулевых элементов, то есть

( i:1 i n:a[i]≠0);

19

Тогда удаление строк, содержащих нулевые элементы (один или больше) можно свести к удалению элемента в одномерном массиве.

Опишем алгоритм в виде процедуры Delet_0.

procedure Delet_0(var n:integer;m:integer; var a:matr);

var i,k:integer; begin

k:=0;

for i:=1 to n do

if Not_Null_El(a[i],m) then begin

k:=k+1; a[k]:=a[i] end;

n:=k

end;

Упражнение 13. Опишите функцию Not_Null_El и проверьте работу процедуры Delet_0.

20

2. УПРАЖНЕНИЯ

2.1 Поиск в матрице

1.Дана матрица. Найти максимальный элемент в каждой строке матрицы и

вкаждом столбце матрицы.

2.Дана матрица. Найти минимальный элемент в каждой строке матрицы и

вкаждом столбце матрицы.

3.Дана матрица. Найти минимальный элемент среди элементов главной диагонали матрицы и среди элементов побочной диагонали матрицы.

6.Дана матрица. Найти максимальный элемент среди элементов, расположенных ниже главной диагонали.

8.Дана матрица. Найти минимальный элемент среди элементов, расположенных выше главной диагонали.

10.Дана матрица. Найти максимальный элемент среди элементов, расположенных ниже побочной диагонали.

11.Дана матрица. Найти максимальный элемент среди элементов, расположенных выше побочной диагонали.

12.Определить в матрице количество повторений минимального элемента.

13.Проверить, содержит ли матрица строку, совпадающую с заданным вектором поэлементно (размер вектора совпадает с количеством элементов в строках матрицы).

14.Найти в матрице столбец с наибольшей суммой элементов.

15.Проверить, содержит ли матрица строку, в которой ее минимальный и максимальный элементы расположены рядом.

16.Проверить, есть ли в матрице строка, состоящая из одних нулей.

17.В матрице найти строку с наибольшим количеством нулевых элементов.

18.Проверить, равны ли две заданные матрицы.

21

19.Проверить, содержит ли матрица хотя бы одну строку, имеющую все одинаковые элементы.

20.Проверить, содержит ли матрица две одинаковые между собой строки.

21.Проверить, содержит ли матрица все одинаковые строки.

22.Найти в матрице элемент (и его координаты), который является наибольшим в строке и наименьшим в столбце.

23.Найти сумму элементов матрицы, расположенных по её периметру.

2.2 Построение вектора по матрице

1.По матрице построить вектор, каждый элемент которого равен среднему арифметическому ненулевых элементов соответствующей строки.

2.По матрице построить вектор, каждый элемент которого равен количеству положительных элементов в соответствующей строке.

3.По матрице построить вектор, каждый элемент которого равен true или false в зависимости от того, упорядочена ли соответствующая строка по не убыванию или нет.

. 4. По матрице построить вектор, каждый элемент которого равен 0 или 1 в зависимости от того, состоит ли соответствующая строка только из нулевых элементов или в строке есть элементы отличные от нуля.

5.По матрице построить вектор, каждый элемент которого равен НОД всех элементов соответствующей строки.

6.В каждой строке матрицы определить количество повторений её минимального элемента.

22