- •Тема 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) //функция знаходження сум елементів
- •Множення матриць
- •Література:
Обробка елементів над (під) головною або побічною діагоналями квадратної матриці
Верхній трикутник квадратної матриці відносно головної діагоналі – це елементи, в яких i<j, якщо головна діагональ не включається, або i <= j, якщо включається. Аналогічно визначається нижній трикутник, відносно головної діагоналі і трикутники відносно побічної діагоналі.
Для обробки таких трикутників необхідно визначити, як змінюються індекси. У довільній i-ой рядку індекс j змінюється від i до n-1. Тому, наприклад, підрахунок кількості нульових елементів верхнього трикутника, включаючи і головну діагональ, виглядатиме таким чином:
const int n=10;
double A[n][n];
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++)
Підрахунок кількості нульових елементів нижнього трикутника відносно побічної діагоналі виглядає так:
const int n=10;
double A[n][n];
int K0=0;
for (int i=0; i<n; i++)
for (int j=n-i-1; j<n; j++)
if (!A[i][j]) K0++; //или (A[i][j]==0)
Перетворення матриць
Перестановка рядків
Перестановка двох рядків, номери яких n1 і n2 задані, виконується таким чином:
const int n=10;
const int m=5;
double A[n][m];
int n1, n2;
cin >> n1>> n2;
int R;
for (int j=0; j<m; j++) //цикл по стовпцях
{R=A[n1][j];
A[n1][j]= A[n2][j];
A[n2][j]=R;
}
Перестановка стовпців
Перестановка двох стовпців, номери яких m1 і m2 задані, виконується таким чином:
const int n=10;
const int m=5;
double A[n][m];
int m1, m2;
cin >> m1>> m2;
int R;
for (int i=0; i<n; i++) //цикл по рядках
{R=A[i][m1];
A[i][m1]= A[i][m2];
A[i][m2]=R;}
Видалення рядка
Видалення k-го рядка виконується так:
const int n=10;
const int m=5;
double A[n][m];
int до;
cin >> до;
for (int i=k; i<n-1; i++)
for (int j=0; j<m; j++)
A[i][j]=A[i+1][j];
Тут на місце k-го рядка поміщаємо кожен елемент (k+1) -го рядка, на місце (k+1) -гої – (k+2) -ий і так далі Таким чином, всі рядки, починаючи з k-го «піднімаємо на один вгору». При цьому об'єм зарезервованої для матриці пам'яті не змінюється. Фізично ми жоден рядок з пам'яті не видалили. Але після видалення одного рядка, кількість оброблюваних рядків на одну зменшується. Останній рядок в обробці вже не повинен брати участь.
Вставка рядка
Для вставки після к-й рядка матриці нового рядка необхідно:
1. оголосити масив int A[n][m] із збільшеним на 1 кількістю рядків;
2. всі рядки від передостанньої до k-го перемістити вниз:
for (int i=n-1; i>k+1; i--)
for (int j=0; j<m; j++)
A[i][j]=A[i-1][j];
3. на місце (k+1) -го рядка помістити рядок, що вставляється, наприклад, одновимірний масив В такій же розмірності m, що і рядок матриці:
for ( int j=0; j<m; j++)
A[k+1][j]=B[j];
Якщо новий рядок треба вставляти відповідно до деякої умови (наприклад, в рядку більше половини нулів) після кожного рядка, то матрицю треба оголосити так: int A[2*n][m]. В цьому випадку резервується максимальний об'єм пам'яті в припущенні, що після кожного рядка треба буде вставляти нову. Вочевидь, що пам'ять в даному випадку використовується неефективно. Це характерно і для випадку видалення рядків. На практиці таке перетворення ефективніше виконувати за допомогою динамічних матриць або списків.