If (ik<is) or (jk<js) then
Пример 1.
В прямоугольной матрице поменять местами строки, содержащие максимальный и минимальный ее элементы.
По условию задачи не требуется определять положение максимального и минимального элементов в строке. Поэтому в программе используются лишь переменные и , отмечающие номера строк, содержащих эти элементы. Если , обмен строк не производится (нет смысла менять строку саму с собой).
Program Task201;
Const Mmax = 20; Nmax = 15;
TypeMatrix = array[1..Mmax,1..Nmax] of real;
Var i,j,m,n,imax,imin : byte;
Amax,Amin,R : real;
A : Matrix;
Begin
В в о д m, n, A
Amax:=a[1,1]; imax:=1;
Amin:=a[1,1]; imin:=1;
For i:=1 tom do{ Поиск в матрице }
Forj:=1 ton do{ максимального и }
If a[i,j]>Amax then{ минимального }
Begin{ элементов }
Amax:=a[i,j]; imax:=i;
End
Else
Ifa[i,j]<Amin then
Begin
Amin:=a[i,j]; imin:=i;
End;
If imax<>imin then
Forj:=1 ton do{ Обмен строк матрицы }
Begin
R:=a[imin,j]; a[imin,j]:=a[imax,j]; a[imax,j]:=R
End;
Печать A
End.
Пример 2.
Найти максимальный элемент среди элементов квадратной матрицы, расположенных выше главной диагонали, и минимальный элемент среди тех элементов, которые расположены ниже главной диагонали, после чего найденные элементы обменять местами.
Выпишем в явном виде элементы, расположенные выше главной диагонали (верхний треугольник квадратной матрицы):
a[1,2] a[1,3] a[1,4] ... a[1,n-1] a[1,n]
a[2,3] a[2,4] ... a[2,n-1] a[2,n]
a[3,4] ... a[3,n-1] a[3,n]
...............................
a[n-2,n-1] a[n-2,n]
a[n-1,n]
Для общего элемента номер строки изменяется от 1 до n-1, т.е. i = 1 .. (n-1); номер столбца - от i+1 до n, т.е. j = (i+1) .. n .
Аналогично для элементов нижнего треугольника:
a[2,1]
a[3,1] a[3,2]
a[4,1] a[4,2] a[4,3]
.......................
a[n,1] a[n,2] a[n,3] ... a[n,n-2] a[n,n-1]
Здесь i = 2 .. n , j = 1 .. (i-1) .
Program Task202;
ConstNmax = 20;
Type Matrix = array[1..Nmax,1..Nmax] of real;
Var i,j,n,imax,imin,jmax,jmin : byte;
Amax,Amin : real;
A : Matrix;
Begin
В в о д n, A
Amax:=a[1,2]; imax:=1; jmax:=2;
For i:=1 ton-1 do{ Поиск максимального }
For j:=i+1 to n do { элемента выше }
If a[i,j]>Amax then{ главной диагонали }
Begin
Amax:=a[i,j]; imax:=i; jmax:=j
End;
Amin:=a[2,1]; imin:=2; jmin:=1;
For i:=2 to n do{ Поиск минимального }
For j:=1 to i-1 do{ элемента ниже }
Ifa[i,j]<Amin then{ главной диагонали }
Begin
Amin:=a[i,j]; imin:=i; jmin:=j
End;
a[imin,jmin]:=Amax; a[imax,jmax]:=Amin;
Печать A
End.
Пример 3.
Среди диагоналей квадратной матрицы, параллельных главной и расположенных выше нее (включая главную диагональ), найти такую, сумма модулей элементов которой максимальная.
Индексы элементов, входящих в рассматриваемые диагонали:
1,1 2,2 3,3 4,4 ... n-2,n-2 n-1,n-1 n,n
1,2 2,3 3,4 4,5 ... n-2,n-1 n-1,n
1,3 2,4 3,5 4,6 ... n-2,n
.......................................
1,n-1 2,n
1,n
Будем считать номер диагонали k равным номеру столбца ее начального элемента: . Тогда индексы элементов, входящих в k-ую диагональ, равны j = k .. n ; i = j - k +1.
Program Task203;
Const Nmax = 20;
TypeMatrix = array[1..Nmax,1..Nmax] of real;
SumType = array[1..Nmax] ofreal;
Var i,j,k,kmax,n : byte;
SumMax : real;
A : Matrix;
S : SumType;
Begin
В в о д n, A
For k:=1 to n do{ Формирование массива S, }
Begin{ содержащего суммы }
S[k]:=0; { элементов диагоналей }
For j:=k ton do
Begin
i:=j-k+1; S[k]:=S[k]+abs(a[i,j]);
End;
End;
SumMax:=S[1]; kmax:=1;
For k:=2 to n do{ Определение максимального }
If S[k]>SumMax then { значения в массиве S }
Begin
SumMax:=S[k]; kmax:=k
End;
П е ч а т ь SumMax, kmax
End.
Примечание. Нетрудно заметить, что для диагоналей, параллельных главной, соблюдается следующая закономерность между индексами их элементов: j - i = k - 1, где k - номер диагонали.
Используя эту закономерность, программу можно организовать следующим образом:
- обнулить элементы массива S;
- перебирая все элементы матрицы, расположенные выше главной диагонали и на главной диагонали (по циклу i = 1 .. n, j = i .. n), модуль очередного элемента добавлять к сумме ;
- определить порядковый номер максимального элемента в одномерном массиве S.
Пример 4.
Побочной диагональю квадратной матрицы называют диагональ, соединяющую левый нижний угол матрицы с ее верхним правым углом. Среди диагоналей, параллельных побочной и расположенных ниже нее, найти такую, среднее арифметическое значение элементов которой максимальное.
Индексы элементов, входящих в рассматриваемые диагонали:
n,2 n-1,3 n-2,4 ... 4,n-2 3,n-1 2,n
n,3 n-1,4 n-2,5 ... 4,n-1 3,n
n,4 n-1,5 n-2,6 ... 4,n
.......................................
n,n-1 n-1,n
n,n
Будем считать номер диагонали k равным номеру столбца ее начального элемента: . Тогда индексы элементов, входящих в k-ую диагональ, равны i = n .. k ; j = n - i+k. Количество элементов в диагонали равно n-k+1 .
Program Task204;
Const Nmax = 20;
Type Matrix = array[1..Nmax,1..Nmax] of real;
Ar = array[2..Nmax] of real;
Vari,j,k,kmax,n : byte;
ArMax : real;
A : Matrix;
Sar : Ar;
Begin
В в о д n,A
For k:=2 to n do { Формирование массива Sar, }
Begin { содержащего средние }
Sar[k]:=0; { арифметические значения }
Fori:=n downto k do { элементов диагоналей }
Begin
j:=n-i+k; Sar[k]:=Sar[k]+a[i,j];
End;
Sar[k]:=Sar[k]/(n-k+1);
End;
ArMax:=Sar[2]; kmax:=2;
For k:=3 ton do{ Определение }
If Sar[k]>ArMax then{ максимального }
Begin { значения в массиве Sar }
ArMax:=Sar[k]; kmax:=k
End;
П е ч а т ь ArMax, kmax
End.
Примечание. Для диагоналей, параллельных побочной, соблюдается следующая закономерность между индексами их элементов: i + j = n + k, где k - номер диагонали. Используя эту закономерность, программу можно организовать аналогично рекомендациям, отраженным в примечании к задаче 3.
Пример 5.
Расположить элементы прямоугольной матрицы в обратном порядке.
В программе Task205 сначала переставляются в обратном порядке строки матрицы, а затем - ее столбцы.
ProgramTask205;
Const Mmax = 20; Nmax = 15;
Type Matrix = array[1..Mmax,1..Nmax] of real;
Var i,j,k,m,n : byte;
R : real;
A : Matrix;
Begin
В в о д m, n, A
i:=1; k:=m; { Перестановка строк матрицы }
Whilei<k do{ в обратном порядке }
Begin
Forj:=1 to n do
Begin
R:=a[i,j]; a[i,j]:=a[k,j]; a[k,j]:=R;
End;
Inc(i); Dec(k);
End;
j:=1; k:=n; { Перестановка столбцов матрицы }
While j<k do{ в обратном порядке }
Begin
For i:=1 to m do
Begin
R:=a[i,j]; a[i,j]:=a[i,k]; a[i,k]:=R;
End;
Inc(j); Dec(k);
End;
Печать A
End.
Пример 6.
Найти максимальное из чисел, встречающихся в целочисленной прямоугольной матрице более одного раза.
Функция RepElem в программе Task206 определяет, является ли элемент с индексами i и j повторяющимся в матрице A. Если RepElem(i, j) = true и Cond = true (повторяющийся элемент встретился впервые), то переменные запоминают индексы, а переменная - значение этого элемента. При Cond = false изменение значений переменных , , производится, если новый повторяющийся элемент превышает значение .
Program Task206;
ConstMmax = 30; Nmax = 50;
TypeMatrix = array[1..Mmax,1..Nmax] of integer;
Var m,n, { размер матрицы }
imax,jmax, { позиция макс.элемента }
i,j,is,js : byte;
Amax : integer; { значение макс.элемента }
Cond : boolean;
A : Matrix; { исходная матрица }
{ -------------------------------------------- }
Function RepElem(ik,jk:byte):boolean;
{ RepElem=true, если элемент a[ik,jk] повторяющийся }
Var i,j,is,js : byte;
R : integer;
Begin
R:=a[ik,jk]; RepElem:=false;
For i:=1 to m do
For j:=1 to n do
If (R=a[i,j]) and(i<>ik) and(j<>jk) then
Begin
RepElem:=true; Exit
End;
End { RepElem };
{ -------------------------------------------- }
Begin
imax:=0; jmax:=0; Amax:=0; Cond:=true;
For i:=1 tom do
For j:=1 to n do
Begin
IfRepElem(i,j) then
IfCond then
Begin
imax:=i; jmax:=j;
Amax:=a[i,j]; Сond:=false
End
Else
Ifa[i,j]>Amax then
Begin
imax:=i; jmax:=j; Amax:=a[i,j];
End
End;
Writeln('imax = ',imax,' jmax = ',jmax,' Amax = ',Amax);
End.
Пример 7.
Элементам целочисленной квадратной матрицы присвоить значения натурального ряда чисел в порядке прохождения правосторонней спирали, начиная с заданного углового элемента.
Например, для матрицы 6-го порядка с начальным элементом (1,6) имеем:
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6
ProgramTask207;
{ Нумерация углов матрицы: 1 - левый верхний; 2 - правый }
{ верхний; 3 - правый нижний; 4 - левый нижний }
Const Nmax = 30;
TypeMatrix = array[1..Nmax,1..Nmax] of word;
Var n, { размер матрицы А }
i,j,
k, { условный номер угла матрицы }
is, { индекс нач.эл-та формируемой части строки }
ik, { то же для конечного элемента строки }
js, { индекс нач.эл-та формируемой части столбца }
jk : byte; { то же для конечного элемента столбца }
Number : word; { заполняемое значение }
Cond : boolean;
A : Matrix;
{ ---------------------------------------------- }
Procedure ToRight;
{ Движение вправо по строке }
Var j : byte;
Begin
For j:=js to jk do
Begin
a[is,j]:=Number; Inc(Number);
End;
End{ ToRight };
{ ---------------------------------------------- }
ProcedureToDown;
{ Движение вниз по столбцу }
Var i : byte;
Begin
For i:=is to ik do
Begin
a[i,jk]:=Number; Inc(Number);
End;
End { ToDown };
{ ---------------------------------------------- }
ProcedureToLeft;
{ Движение влево по строке }
Var j : byte;
Begin
For j:=jk downtojs do
Begin
a[ik,j]:=Number; Inc(Number);
End;
End { ToLeft };
{ ---------------------------------------------- }
Procedure ToUp;
{ Движение вверх по столбцу }
Vari : byte;
Begin
For i:=ik downto is do
Begin
a[i,js]:=Number; Inc(Number);
End;
End{ ToUp };
{ ---------------------------------------------- }
Begin
Ввод размера матрицы n и номера начального угла k
Number:=1; Cond:=true;
is:=1; js:=1; ik:=n; jk:=n;
While Cond do
Begin
Case k of
1 : Begin
ToRight; Inc(is);
End;
2 : Begin
ToDown; Dec(jk);
End;
3 : Begin
ToLeft; Dec(ik);
End;
4 : Begin
ToUp; Inc(js);
End;
end;
Inc(k);
If k>4 then k:=1;
If (ik<is) or (jk<js) then
Cond:=false;
End;
End.
Пример 8.
Элементы целочисленной прямоугольной матрицы A строго упорядочены по возрастанию:
a[1,1] < a[1,2] < a[1,3] < ... < a[1,n] < a[2,1] < ...
... < a[2,n] < a[3,1] < ... < a[m,n]
Найти элемент, равный заданному числу , и отпечатать его индексы. Число действий в решении должно быть порядка , а не .
Последнее ограничение означает, что последовательный перебор всех элементов матрицы не допускается.
Вариант 1.
Если или , то матрица не содержит элемента, равного значению . В противном случае будем сравнивать переменную с первым элементом каждой строки матрицы. Если , = 2 .. , то элемент, равный , может находиться в строке -1. Тогда производится последовательный просмотр элементов ( -1)-ой строки. Если условие ни разу не было выполнено, то просматриваются элементы m-ой строки.
Общее количество сравнений в варианте 1 не превышает .
Program Task208a;
Label10;
Const Mmax = 30; Nmax = 50;
Type Matrix = array[1..Mmax,1..Nmax] ofinteger;
Var m,n, { размер матрицы }
is,js, { позиция эл-та, равного b }
i,j : byte;
b : integer;
Cond : boolean;
A : Matrix; { исходная матрица }
Begin
В в о д m, n, A, b
is:=0; js:=0;