8.3. Поиск максимального элемента матрицы
Для поиска максимального элемента матрицы и определения его индексов нам потребуются три дополнительные переменные. В первой из них будем хранить значение максимального элемента, а во второй – номер строки, к которой он находится, а в третьей – номер столбца. Поиск максимального элемента в матрице традиционно начинают с элемента, стоящего в нулевой строке и нулевом столбце. Затем организуют вложенные циклы, которые позволят проанализировать все элементы матрицы. Если значение какой-либо элемента матрицы окажется больше ранее найденного максимума, то значение максимума необходимо обновить, сделав равным этому элементу. При этом сразу запоминаются оба его индекса. Рассмотрим особенности программной реализации этого алгоритма.
Объявляем необходимые переменные. Переменная maxпредназначена для хранения значения максимального элемента. Ее тип всегда должен совпадать с типом элементов матрицы. В переменнойimaxмы будем запоминать номер строки, в которой находится максимальный элемент матрицы, а в переменнойjmaxмы будем хранить номер столбца, в котором находится максимальный элемент. Эти две переменные всегда будут иметь целочисленный тип.
Dim max, imax, jmax As Integer
Поиск максимума мы начинаем с элемента, стоящего в нулевой строке и нулевом столбце матрицы.
В переменные imaxиjmaxмы записываем соответственно номера строки и столбца, которые равны нулю.
Организуем цикл по всем строкам матрицы.
Организуем цикл по столбцам матрицы. Он позволит нам перебрать все элементы в пределах i-й строки.
Анализируем очередной элемент матрицы.
If a(i, j) > max Then
Если его значение больше, чем значение ранее найденного максимума, то необходимо обновить значение максимума (переменной max), записав в него значение текущего элемента.
Сразу же запоминаем индексы нового максимума. Номер строки, в которой находится данный элемент матрицы, хранится в переменной i, а номер столбца – в переменнойj.
После завершения вложенных циклов нам остается только вывести полученные результаты в окно списка. Сначала выведем горизонтальную черту, чтобы зрительно отделить исходные данные от полученных результатов.
Заем выведем максимальное значение и его индексы.
Полный текст программы представлен в приложении 38. Пример работы программы приведен на рис. 53.
Рис. 53. Пример работы программы поиска максимального элемента в прямоугольной матрице
8.4. Обработка матрицы по строкам
Обработка прямоугольной матрицы может вестись двумя способами: по строкам и по столбцам. Как правило, способ обработки определяется условием решаемой задачи. При обработке по строкам вложенные циклы организуются таким образом, чтобы за один шаг внешнего цикла полностью обрабатывалась одна строка матрицы. В этом случае внешний цикл будет идти по строкам матрицы, а внутренний – по столбцам. В качестве примера рассмотрим задачу вычисления среднего арифметического четных элементов в каждой строке матрицы.
Для решения этой задачи необходимо в каждой строке матрицы вычислить свою сумму и количество четных элементов. Затем, если это возможно, найти среднее арифметическое. Если же в какой-то строке матрицы нет четных элементов, то вместо среднего арифметического мы будем печатать поясняющее сообщение. Результаты работы программы будем выводить в окно списка.
Начнем с объявления необходимых переменных. Переменные sumиkol, имеющие целочисленный тип данных, предназначены для хранения суммы и количества четных элементов в одной строке матрицы.
Dim sum, kol As Integer
Так как среднее арифметическое получается в результате деления, то соответствующая переменная всегда будет иметь рациональный тип данных.
Dim sred As Single
Для каждой строки матрицы мы будем получать отдельный результат. Поэтому удобно совместить процессы вычисления и вывода в одном цикле. Чтобы результаты вычислений зрительно отделялись от исходных данных, выведем горизонтальную черту.
Результаты вычислений мы будем выводить в две колонки. В первой будет указываться номер обрабатываемой строки матрицы, а во второй – найденное значение среднего арифметического четных элементов. Выводим поясняющий заголовок. Константа vbTabпозволяет организовать вывод в две колонки.
lstMatrix.Items.Add(«Строка» + vbTab + _
Так как по условию задачи требуется, чтобы каждая строка матрицы обрабатывалась отдельно, то обработку матрицы будем вести по строкам. Для этого организуем внешний цикл по строкам, а внутренний – по столбцам.
За один шаг внешнего цикла мы будем полностью обрабатывать одну строку матрицы. Для этого мы будем использовать внутренний цикл. Следовательно, начальные значения для суммы и количества необходимо задать до него.
Организуем внутренний цикл. Нам необходимо обработать все элементы, находящиеся в i-й строке матрицы. Для этого мы должны пройтись по всем столбцам матрицы. Соответственно, внутренний цикл будет по столбцам.
На каждом шаге цикла анализируем элемент матрицы.
If a(i, j) Mod 2 = 0 Then
Если его значение при делении на 2 дает в остатке ноль, значит, оно четное, и данный элемент надо добавить к сумме. При этом количество четных элементов в данной строке матрицы увеличивается на единицу.
После завершения внутреннего цикла можно приступать к вычислению среднего арифметического четных элементов в одной строке матрицы. Сначала анализируем количество четных элементов.
Если количество четных элементов равно нулю, значит, их в рассматриваемой строке нет ни одного четного элемента. Следовательно, вычислить их среднее арифметическое невозможно. Поэтому вместо ответа выводим номер строки и поясняющее сообщение.
lstMatrix.Items.Add(Str(i) + vbTab + _
«В строке нет четных»)
Иначе мы делим сумму четных элементов на их количество и получаем искомое значение.
В окно списка выводим номер строки и найденное значение среднего арифметического четных элементов в этой строке.
lstMatrix.Items.Add(Str(i) + vbTab + _
Полный текст программы представлен в приложении 39. Пример работы программы приведен на рис. 54.

Рис. 54. Пример работы программы поиска среднего арифметического четных элементов в каждой строке прямоугольной матрицы
Как найти максимальный элемент в матрице

| Real | Real | Real | Real | Real | Real | Real | Real | Real | Real | Real | Real |
| jn | fv | mr | ap | ma | iun | iul | av | sn | ok | nb | dk |
type temp=array[1..12]of real;
type mes=(jn, fv, mr, ap, ma, iun, iul, av, sn, ok, nb, dk);
temp=array[mes]of real;
type mes=(jn, fv, mr, ap, ma, iun, iul, av, sn, ok, nb, dk);
temp=array[jn..dk]of real;
type mes=(jn, fv, mr, ap, ma, iun, iul, av, sn, ok, nb, dk);
temp=array[god]of real;

type temp=array[1..12]of real;
var t1993 : temp;



Рис. 18.7. –Правило определения типа многомерный массив


type tx = 1..6;
mas1 = array[tx] of char;
ty = (Ivanov, Petrov, Sidorov);
mas2 = array[ty] of mas1;
tz = (Angl, Inf, Liter, Fizik);
mas3 = array[tz] of mas2;
type tx = 1..6;
ty = (Ivanov, Petrov, Sidorov);
tz = (Angl, Inf, Liter, Fizik);
mas3 = array[tz, ty, tx] of char;

если Ai,j > max
max:= Ai,j
A : array [1..8] of integer;
Const N = 8;
Var A : array [1..N] of integer;
Const N = 8;
Type TA = array [1..N] of integer;
Const N = 8;
Type TA = array [1..N] of integer;
Const N = 8;
Var A : array [1..N] of integer;
Var B : array [1..N] of integer;
Const N = 8;
Var A,B : array [1..N] of integer;
Const M = 5; N = 8;
Var A : array [1..M] of array [1..N] of integer;
Const M = 5;
Var A : array [1..M,1..N] of integer;
for i:=1 to N do A[i]:=0;
for i:=1 to N do
begin
end ;
for i:=1 to N do writeln (‘A[ ‘,i,’]=’,A[i]);
for i:=2 to N do if A[i]>max then max:=A[i]; writeln(‘Maximum=’,max);
Const N = 10;
Var A : array [1..N] of integer;
begin
begin
end ;
for i:=2 to N do
if A[i]>max then max:=A[i];
end.
procedure print (var m : Massiv); .
Program LinerSort;
var z : integer;
begin
end;
var i : integer;
begin
for i:=1 to N do write(m[i]:5);
end ;
var a : Massiv; i,j : integer;
begin
for i:=1 to N do a[i]:=random(100);
end .
Алгоритм решения этой задачи следующий: находим максимальный элемент матрицы ( max ) и его индексы ( imax, jmax ), а также минимальный ( min ) и его индексы ( imin, jmin ). После чего элементы A[imax][jmax] и A[imin][jmin] поменяем местами. Для поиска максимального элемента и его индексов в переменную max запишем A[0][0] , в переменные imax, jmax (номер строки и столбца, где находятся максимальный элемент) запишем 0. Затем в двойном цикле (цикл по переменной
— по строкам, цикл по переменной
— по столбцам) перебираем все элементы, и каждый из них сравниваем с максимальным (со значением переменной max ). Если текущий элемент массива оказывается больше максимального, то его переписываем в переменную max , а в переменную imax — текущее значение индекса
, в переменную jmax — текущее значение
. Поиск минимального элемента матрицы аналогичен и отличается только знаком операции сравнения. Далее представлен текст программы решения задачи 6.5.

Задача 6.7. Поменять местами элементы главной и побочной диагонали матрицы
.
Алгоритм решения задачи следующий: перебираем все строки матрицы (цикл по переменной
от 0 до
в тексте программы), и в каждой строке меняем местами элементы, расположенные на главной и побочной диагоналях (в
-й строке надо поменять местами элементы A[i][i] и А[i][k-i-1] ). Текст программы с комментариями приведён далее.
Задача 6.8. Заполнить матрицу
числами от 1 до 36 следующим образом:
Как найти максимальный элемент в матрице
Ответ:
Условие — Найти максимальный элемент матрицы. Строку, содержащую
максимальный элемент, поменять с последней строкой матрицы.
Нумерация в матрице начинается с 0.
С++ на Code Blocks 16
Объяснение:
using namespace std;
int n = 8; // можно ввести любую размерность квадратной матрицы
int Nmax, Nind, i, j = 0 ;
// Заполним матрицу случайными числами в диапазоне [0 ,100)
// и сразу её выведем
cout << » —- Array in start —- » << endl;
for (int i = 0; i < n; i++) <
for (int j = 0; j < n; j++) <
// Поиск максимального элемента матрицы. Для оптимизации, можно было это произвести на этапе заполнения матрицы
Поиск максимума в матрице(С++)
Условие:
Найти максимальный среди всех элементов тех строк заданной матрицы, каторые упорядочены(либо по возростанию, либо по убыванию).
Прошу прощения, что не привел свой вариант неверного решения задачи, но сегодня я уже не в состоянии(физическом(голова раскалывается)) написать данную программу.
Заранее спасибо.
6 ответов
Т.е. какие-то строки матрицы упорядочены ,а какие то нет ?
Какие требования к решению ? STL можно использовать ?
Как я понял из вышеупомянутого условия сперва нужно упорядочить некоторые, возможно все, строки. А после вычислять среди них максимальный элемент.Т.к. при задании рандомом матрицы наврятли строки будут хоть как то упорядочены.
требования к решению: простота и ясность.
STL использавать увы нельзя.
#include <iostream>
#include <iomanip>
#include <conio>
int ArrayOrdering(int* array, int size);
int main()
<
int matrix[][SZ] = <
2, 9, 7, 1,
1, 3, 5, 8,
5, 2, 1, 4,
6, 4, 2, 1
>;
int i, j;
int ord;
cout << «Source matrix:\n»;
for(i = 0; i < SZ; i++)
<
for(j = 0; j < SZ; j++)
cout << setw(3) << matrix[j];
cout << endl;
>
for(i = 0; i < SZ; i++)
<
ord = ArrayOrdering(matrix, SZ);
if(ord == 1)
cout << «\nLine » << i + 1 << «: max = » << matrix[SZ — 1] << «\t(ascending ordering)»;
else if(ord == -1)
cout << «\nLine » << i + 1 << «: max = » << matrix[0] << «\t(descending ordering)»;
else
cout << «\nLine » << i + 1 << «: \t(not ordered)»;
>
cout << endl << endl;
int ArrayOrdering(int* array, int size)
<
int i;
for(i = 1; i < size && array >= array[i — 1]; i++);
if(i == size)
return 1;
for(i = 1; i < size && array <= array[i — 1]; i++);
if(i == size)
return -1;