- •1 Основные определения. Размерность и описание массивов, индексирование их элементов
- •2 Ввод и вывод массивов
- •2.1 Ввод массивов
- •2.2 Создание пробных, отладочных массивов
- •2.3 Вывод одномерных массивов
- •2.4 Вывод матриц
- •3 Вычисление массива значений функции
- •4 Суммирование и перемножение элементов массивов
- •5.1 Задачи выборок
- •5.2 Преобразование одних массивов в другие
- •5 Типовые задачи обработки массивов
- •5.3 Выбор наименьших и наибольших элементов в массивах
- •5.4 Вычисление статистических характеристик массивов
- •6 Некоторые задачи работы с матрицами
- •7 Контрольные вопросы и упражнения
- •8 Задания для самостоятельной работы
- •9 Список рекомендуемой литературы
6 Некоторые задачи работы с матрицами
При всех операциях с матрицами необходимо внимательно следить за индексами элементов, над которыми выполняются те или иные действия, а для этого всегда следует составлять схему индексирования элементов матриц, аналогичную приведенной в разделе 2.4. Рассмотрим несколько соответствующих примеров.
Пример 6.1. В матрице A размером 10 8, вычислить суммы элементов всех строк с четными номерами и произведения элементов всех столбцов с нечетными номерами.
Для уяснения смысла задачи составим схему индексирования элементов матрицы:
Из приведенной схемы легко усматривается, что индексы строк i изменяются в пределах от 1 до 10, индексы столбцов j – от 1 до 8. Очевидно также, что если искомые строковые суммы обозначить S то они образуют одномерный массив (вектор) Si , где i=2,4,6,8,10. Аналогично столбцовые произведения P образуют вектор Pj , где j=1,3,5,7. С учетом этих обозначений решение задачи может быть выполнено следующей программой (в которой пробный вариант исходной матрицы А формируется с помощью функции Random и выводится):
program Matr1;
Type mat=array[1..10,1..8] of real;
vec=[1..10] of real;
Var a:mat; s,p:vec; i,j:integer;
begin
writeln('Исходная матрица');
for i:=1 to 10 do
begin
for j:=1 to 8 do
begin
a[i,j]:=19.9*Random;
write(a[i,j]:6:2);
end;
writeln;
end;
writeln('Строчные суммы');
i:=2;
while(i<=10) do
begin
s[i]:=0;
for j:=1 to 8 do s[i]:=s[i]+a[i,j];
write(s[i]:10:3); i:=i+2;
end;
writeln('Столбцовые произведения');
j:=1;
while(j<=7) do
begin
p[j]:=1;
for i:=1 to 10 do p[j]:=p[j]*a[i,j];
writeln(p[j]:15:3); j:=j+2;
end;
end.
Пример 6.2. В некоторых задачах математики приходится вычислять сумму элементов квадратной матрицы, стоящих на ее главной диагонали. Главной называется диагональ, идущая из левого верхнего в правый нижний угол. Такая сумма носит название следа матрицы. Пусть заданная матрица А является квадратной с размером 8 8. Тогда если обозначить искомую сумму Sled и обратить внимание на то, что у элементов главной диагонали оба индекса одинаковы, т.е. i=j, задача вычисления указанной суммы решится двумя строками :
writeln('След матрицы');
sled:=0;
for i:=1 to 8 do Sled:=Sled+a[i,i];
writeln('Sled=',Sled);
Пример 6.3. В матрице А произвольного размера m n найти и вывести (строкой) строку с наибольшим произведением, а также (вывести столбцом) столбец с наименьшей суммой всех своих элементов. Обозначим строковые произведения pi (i=1..m), наибольшее из них Pmax, а его порядковый номер k. Аналогично : столбцовые суммы sj (j=1..n), наименьшая из них Smin, а ее индекс l. Задача, очевидно, сводится к вычислению элементов массивов p и s , нахождению в первом из них наибольшего элемента, а во втором наименьшего с одновременными определениями их индексов k и l, после чего k–я строка должна быть выведена в строку, а l–й столбец столбцом. Эта задача в предположении, что массивы A, P, S надлежащим образом описаны и первый из них введен, а два других сформированы (как это делается, см. пример 6.1), может быть реализована следующим фрагментом (при m=8, n=10) :
k:=1; Pmax:=p[k];
for i:=1 to 8 do
begin
if p[i]>=Pmax then
begin
Pmax:=p[i]; k:=i;
end;
end;
writeln('Строка с Pmax');
for j:=1 to 10 do write(a[k,j]); writeln;
l:=1; Smin:=s[l];
writeln('Столбец с Smin');
for j:=1 to 10 do
begin
if s[j]<=Smin then
begin
Smin:=s[j]; l:=j;
end;
end;
for i:=1 to 8 do writeln(a[i,l]);
Пример 6.4. Дана матрица А(m n). Составить вектор B из наибольших элементов каждой строки и вектор С из наименьших элементов каждого столбца. Алгоритм решения данной задачи состоит, очевидно, в том, чтобы в каждой i–й строке (i=1..m) найти ее наибольший элемент и присвоить его значение элементу bi вектора B. Аналогично, в каждом j–м столбце (j=1..n) требуется найти его наименьший элемент и присвоить его значение элементу cj вектора С. Соответствующий фрагмент программы (при m=8, n=10) с выводом полученных векторов :
for i:=1 to 8 do
begin
max:=a[i,1];
for j:=1 to 10 do
begin
if a[i,j]>max then max:=a[i,j];
end;
b[i]:=max;
end;
for j:=1 to 10 do
begin
min:=a[1,j];
for i:=1 to 8 do
begin
if a[i,j]<min then min:=a[i,j];
end;
c[j]:=min;
end;
writeln('Вектор В');
for i:=1 to 8 do write(b[i]:6:2); writeln;
writeln('Вектор C');
for j:=1 to 10 do write(c[j]:6:2);
Задачи, аналогичные рассмотренным выше, в разных комбинациях могут встречаться и в других более сложных случаях работы с матрицами. В таких ситуациях соответствующие программы с точностью до обозначений могут комбинироваться из фрагментов разобранных в данном разделе.
