Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

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

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

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

int MyMax, Imax, Jmax;

MyMax=A[0][0]; Imax=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 element= %d in %d row, %d column", MyMax,Imax, Jmax);

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

Упражнения.

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

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

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

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

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;

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

Для обработки побочной диагонали, как и при решении некоторых других типов задач, необходимо найти зависимость второго индекса от первого. Легко видеть, что сумма индексов равна n-1. Поэтому второй индекс будет равен n-1-i, и соответствующая часть программы будет такой:

float Sum=0;

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

Sum+=A[i][ n-1-i];

Sum/=n;

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

Для обработки таких треугольников необходимо определить, как изменяются индексы. Анализируя, например, верхний треугольник, можно видеть, что в нулевой строке 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++)…

Упражнение. Эту же задачу решить для нижнего (верхнего) треугольника относительно побочной диагонали.