- •Тема 12_1 Базові алгоритми роботи з масивами
- •Порядкова обробка
- •Обробка по стовпцях
- •Обробка всієї матриці
- •Обхід по «спіралі» квадратної матриці порядку n
- •Обробка частини матриці Обробка елементів головної або побічної діагоналей квадратної матриці
- •Обробка елементів над (під) головною або побічною діагоналями квадратної матриці
- •Вставка рядка
- •Побудова матриць
- •Приклади «Дзеркальне відображення» матриці відносно вертикальної осі, що проходить через її середину
- •Знаходження мінімального елементу матриці і викреслювання рядка і стовпця, на пересіченні яких він знаходиться
- •Void vyvod_ar(int arra[nrow][ncol], int m, int n) //функция виведення масиву
- •Void vvod_ar(int arra [nrow][ncol], int m, int n) //функция введення масиву
- •Знаходження сум елементів квадратної матриці на головній діагоналі і на діагоналях, паралельних головною
- •Void vyvod_ar(int arra[n][n], int n) //функция виведення масиву
- •Void vvod_ar(int arra [n][n], int n) //функция введення масиву
- •Void sum_diag(int а, int n) //функция знаходження сум елементів
- •Множення матриць
- •Література:
Обробка всієї матриці
До такого типа віднесемо завдання, в яких виконується аналіз всієї матриці в цілому. У таких алгоритмах можна обробляти її як по рядках, так і по стовпцях. Але правильніше організувати зовнішній цикл по номеру рядка, а внутрішній – по номеру стовпця (оскільки елементи матриці розташовуються по рядках).
Як приклад знайдемо в матриці найбільший елемент і номери рядка і стовпця, на пересіченні яких він знаходиться:
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;