Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_2_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
816.64 Кб
Скачать

3.3. Обработка всей матрицы

К такому типу отнесём задачи, в которых выполняется анализ всей матрицы, а не отдельно каждой строки или столбца. В таких алгоритмах можно обрабатывать её как по строкам, так и по столбцам. Но так как элементы матрицы располагаются в памяти по строкам, то лучше внешний цикл по номеру строки, а внутренний — по номеру столбца.

Пример 9. Найдём наибольший элемент во всей матрице и номер строки и столбца, на пересечении которых он находится.

int MyMax= A[0][0], Imax=0, Jmax=0;

for (int i=0; i<n; i++)

for (int j=0; j<m; j++)

if ( A[i][j]>MyMax) { MyMax= A[i][j]; Imax=i; Jmax=j; }

textcolor(10); cprintf (" \n\r Max = %d in %d row, %d column", MyMax, Imax, Jmax );

Обратим внимание, что операторы MyMax=A[0][0]; Imax=Jmax=0; располагаются вне всех циклов, так как мы находим общий наибольший элемент, т. е. одно число, а не для каждой строки или столбца отдельно. По этой же причине сprintf выполняется тоже один раз. Поэтому фигурные скобки расставлены по–другому, не так, как в задачах первых двух типов.

Упражнения.

  1. Если наибольший элемент повторяется несколько раз, индексы какого из них мы найдём? Как найти индексы каждого наибольшего элемента?

  2. Как наибольший элемент и его номер найти для каждой строки и выводить по мере получения без формирования массивов?

  3. Что надо изменить, чтобы наибольший элемент и его номер находились для каждого столбца?

3.4. Обработка части матрицы

Рассмотрим алгоритм обработки элементов главной или побочной диагонали квадратной матрицы const n=5; int A[n][n]; которая одним из ранее рассмотренных способов определена. Структуру циклов можно оставить такой же, как при решении аналогичной задачи для одномерного массива.

Пример 10. Найдём среднее значение главной диагонали квадратной матрицы .

Для этого необязательно писать два вложенных цикла:

float Sum=0; for (int i=0; i<n; i++)

for (int j=0; j< n; j++) if ( i==j)Sum+=A[i][j];

Sum/=n;

Так как для элементов главной диагонали оба индекса одинаковы, и диагональ матрицы можно рассматривать как одномерный массив, то это можно выполнить компактнее с помощью одного цикла:

float Sum=0; for (int i=0; i<n; i++) Sum+=A[i][i];

Sum/=n;

Сравните с задачей нахождения этого же параметра в одномерном массиве.

Пример 11. Найдём среднее значение побочной диагонали.

Для обработки побочной диагонали, как и при решении некоторых других типов задач, необходимо найти зависимость второго индекса от первого. Так как сумма индексов равна n-1, то второй индекс будет равен n-1-i, где i— номер строки. float Sum=0;

for (int i=0; i<n; i++) Sum+=A[i][ n-1-i];

Sum/=n;

Верхний треугольник квадратной матрицы относительно главной диагонали — это те элементы, у которых i<j, если главная диагональ не включается, или i<=j, если включается. Аналогично определяется нижний треугольник относительно главной диагонали и треугольники относительно побочной диагонали. Для обработки таких треугольников необходимо определить, как изменяются индексы.

Пример 12. Найти количество нулевых элементов верхнего треугольника относительно главной диагонали, включая и её.

В нулевой строке j изменяется от 0 до n-1, в первой строке — от 1 до n-1, во второй строке — от 2 до n-1 и так далее. Значит, в произвольной i-й строке индекс j изменяется от i до n-1. Получим

int K0=0; for (int i=0; i<n; i++)

for (int j=i; j< n; j++) if (A[i][j] ==0) K0++;

Если диагональные элементы не надо анализировать, то заголовок внутреннего цикла будет таким: for (int j=i+1; j< n; j++)…

Упражнения. Эту же задачу решить для

a) нижнего треугольника относительно главной диагонали;

b) нижнего треугольника относительно побочной диагонали;

c) верхнего треугольника относительно побочной диагонали;