Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / 3_кол / Лекції / лекция_С++(12_1)_у.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
202.75 Кб
Скачать

Обробка всієї матриці

До такого типа віднесемо завдання, в яких виконується аналіз всієї матриці в цілому. У таких алгоритмах можна обробляти її як по рядках, так і по стовпцях. Але правильніше організувати зовнішній цикл по номеру рядка, а внутрішній – по номеру стовпця (оскільки елементи матриці розташовуються по рядках).

Як приклад знайдемо в матриці найбільший елемент і номери рядка і стовпця, на пересіченні яких він знаходиться:

const int n=10, m=5;

int A[n][m];

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;

}

cout << MyMax << " " << Imax <<" "<< Jmax;

Проаналізуйте, якщо найбільший елемент повторюється кілька разів, індекси якого з них ми знайдемо? Що треба змінити, аби найбільший елемент і його номер знаходилися для кожного рядка і виводилися у міру здобуття?

Обхід по «спіралі» квадратної матриці порядку n

Виконати обхід по «спіралі» квадратної матриці порядку n, елементами якої є цілі числа:

#include <iomanip>

#include <conio.h>

int main()

{ int p,j, i;

const int N = 6;

static int arr[N][N]= { { 1, 2, 3, 4, 5, 6},

{20, 21, 22, 23, 24, 7},

{19, 32, 33, 34, 25, 8},

{18, 31, 36, 35, 26, 9},

{17, 30, 29, 28, 27, 10},

{16, 15, 14, 13, 12, 11} };

for (p=0; p<N/2; p++) //количество витків спіралі

{for (j=p; j<=N-p-1; j++) //верхняя рядок витка p

cout << setw(4) << arr[p][j];

for (i=p+1; i<N-p; i++) //правый стовпець витка p

cout << setw (4) << arr[i][N-p-1];

for (j=N-p-2; j>=p; j--) //нижняя рядок витка p

cout << setw (4) << arr[N-p-1][j];

for (i=N-p-2; i>=p+1; i--) //левый стовпець витка p

cout << setw (4) << arr[i][p];

}

_getch();

return 0;

}

Обробка частини матриці Обробка елементів головної або побічної діагоналей квадратної матриці

До такого типа віднесемо завдання, в яких виконується обробка елементів головної або побічної діагоналі квадратної матриці, оголошеної, наприклад, так: const n=10; int A[n][n];

Структура циклів залишиться такій же, як при рішенні аналогічної задачі для одновимірного масиву. Наприклад, для знаходження середнього значення головної діагоналі необов'язково писати два вкладені цикли:

const int n=10;

double Sum=0, A[n][n];

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

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

if (i==j) Sum +=A[i][j];

Sum /=n;

Оскільки для елементів головної діагоналі обоє індексу однакові, то це можна виконати компактнее за допомогою одного циклу:

const int n=10;

double Sum=0, A[n][n];

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

Sum +=A[i][i];

Sum /=n;

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

const int n=10;

double Sum=0, A[n][n];

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

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

Sum /=n;

Соседние файлы в папке Лекції