Пример 1. Вычислить первую норму прямоугольной матрицы
,
Обозначим сумму модулей элементов первой строки , второй строки - и т.д.
. . . ;
Тогда
Порядок вычислений:
1. Для каждой строки матрицы сформировать элемент одномерного массива B как сумму модулей ее элементов.
2. В массиве B найти наибольший элемент и присвоить его значение переменной, определяющей первую норму матрицы.
ProgramNorma1;
Const Mmax = 20; Nmax = 15;
Type Matrix = array[1..Mmax,1..Nmax] of real;
Vector = array[1..Mmax] of real;
Var i,j,m,n : byte;
A1 : real;
A : Matrix;
B : Vector;
Begin
Ввод и печать m, n, A
For i:=1 tom do{ Формирование }
Begin{ массива B }
b[i]:=0;
Forj:=1 ton do
b[i]:=b[i]+abs(a[i,j]);
End;
A1:=b[1]; { Определение }
Fori:=2 tom do{ максимального }
Ifb[i]>A1 then{ элемента }
A1:=b[i]; { в массиве B }
Writeln('A1= ',A1:7:2);
End.
Пример 2. Транспонировать квадратную матрицу.
При транспонировании меняются местами строки и столбцы матрицы, т.е. происходит обмен значений элементов и (i, j = 1 .. n).
Program Trans;
ConstNmax = 25;
TypeMatrix = array[1..Nmax,1..Nmax] of real;
Var i,j,n : byte;
R : real;
A : Matrix;
Begin
Ввод и печать n, A
For i:=1 to n do
Forj:=1 ton do
Begin
R:=a[i,j]; a[i,j]:=a[j,i]; a[j,i]:=R
End;
Печать A
End.
В этой программе дважды производится обмен каждой пары элементов (например, при i = 1, j = 5 обмениваются элементы и , при i = 5, j = 1 - элементы и ). Следовательно, после отработки программы матрица A сохраняет исходный вид.
В программе Trans наряду с другими элементами обмениваются также элементы главной диагонали: при i = 1, j = 1 - элементы и , при i = 2, j = 2 - элементы и и т.д. Последнее не влияет на корректность работы программы, но приводит к ненужным затратам машинного времени.
Однократный обмен пары элементов при транспонировании матрицы можно обеспечить, если выполнять перебор лишь тех элементов, которые расположены выше главной диагонали, и обменивать их значения с соответствующими элементами, расположенными ниже главной диагонали.
Выпишем отдельно индексы элементов над главной диагональю:
1,2 1,3 1,4 1,5 ... 1,n
2,3 2,4 2,5 ... 2,n
3,4 3,5 ... 3,n
.................................
(n-1),n
Первый индекс элемента изменяется от 1 до n-1, второй индекс - от i+1 до n, т.е.
i = 1 .. (n-1); j = (i+1) .. n .
Программа транспонирования после ее коррекции (фрагмент):
Fori:=1 ton-1do
Forj:=i+1 ton do
Begin
R:=a[i,j]; a[i,j]:=a[j,i]; a[j,i]:=R
End;
Закономерность изменения индексов, использованная в примере 2, может быть такой же и некоторых задачах по обработке одномерных массивов, что иллюстрирует приведенный ниже приер..
Пример 3. Закономерность изменения индексов, использованная в примере 2, может быть такой же и в некоторых задачах по обработке одномерных массивов.
Условие задачи. На плоскости заданы точек своими координатами. Определить номера точек, наиболее удаленных друг от друга, после чего удалить их из массива точек.
Для отбора пары максимально удаленных точек необходимо сравнивать расстояния для следующих пар точек:
1 - 2 1 - 3 1 - 4 1 - 5 ... 1 - n
2 - 3 2 - 4 2 - 5 ... 2 - n
3 - 4 3 - 5 ... 3 - n
............................
(n-1) - n
Если обозначить номера пары точек через ( - ), то
= 1 .. ( -1); = ( +1) .. .
Вполне очевидно, что работа программы не изменится, если вместо расстояний рассматривать квадраты расстояний, но количество операций при этом заметно сокращается (не нужно вычислять в каждом цикле корень квадратный sqrt(d)).
ProgramDistance;
Const Nmax = 400;
TypeAr = array[1..Nmax] of real;
Var i,j,n,imax,jmax : integer;
d,dmax : real;
X,Y : Ar;
Begin
Ввод и печать n,X,Y
dmax:=0;
For i:=1 to n-1 do
For j:=i+1 to n do
Begin
d:=sqr(x[i]-x[j])+sqr(y[i]-y[j]);
If d>dmax then
Begin
dmax:=d; imax:=i; jmax:=j
End;
End;
dmax:=sqrt(dmax);
Writeln('imax= ',imax,' jmax= ',jmax,' dmax= ',
dmax:7:2);
Fori:=jmax ton-1 do
Begin
x[i]:=x[i+1]; y[i]:=y[i+1]
End;
Dec(n);
For i:=imax to n-1 do
Begin
x[i]:=x[i+1]; y[i]:=y[i+1]
End;
Dec(n);
Печать n, X, Y
End.
Так как и, следовательно, jmax > imax, то в первую очередь удаляется точка с индексом jmax. Если первой удалить точку imax, то вторая точка смещается влево, при этом во втором цикле была бы удалена точка с индексом jmax+1, что привело бы к неверной работе программы.