Базовими операціями обробки двовимірних масивів є:
- введення та виведення елементів
- пошук елементів матриці за певним критерієм
- обчислення сум та підрахунок кількості елементів матриць(рядків, стовпців, діагоналей) за певним критерієм
- знаходження найбільших та найменших елементів матриць (рядків, стовпців)
- формування одновимірних масивів з елементів двовимірних за певним критерієм та ін.
Ініціалізація елементів двовимірного масиву
- Під час оголошення:
1 2 3 4 5 6 7 |
const int N = 4, M = 3; int mas[N][M] = { {1, 2, 3}, // 0 рядок {4, 5, 6}, // 1 рядок {7, 8, 9}, // 2 рядок {10, 11, 12} // 3 рядок }; |
Якщо пропустити деякі елементи, то вони будуть проініціалізовані нулем:
1 2 3 4 5 6 |
int mas[4][3] = { {1, 2}, // 1 2 0 {4, 5, 6}, // 4 5 6 {7}, // 7 0 0 {10, 11, 12} // 10 11 12 }; |
Наступний запис ініціалізує всі елементи масиву значенням 0:
1 2 |
const int N = 4, M = 3; int mas[N][M] = { 0 } |
Компілятор сам може обчислити кількість рядків в масиві, але вказувати кількість стовпців обов’язково:
1 2 3 4 5 6 |
int mas[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} }; |
2. З клавіатури:
Введення та обробку всіх елементів двовимірного масиву найлегше здійснити шляхом її обходу за рядками або стовпцями. Тобто, спочатку обробляються всі елементи першого рядка (або стовпця), потім – другого і т.д. Найпростішим методом реалізації такого обходу є використання вкладених циклів for:
1 2 3 4 5 6 7 |
const int N = 4, M = 3; int mas[N][M]; for (int i = 0; i < N; i++) { // зовнішній цикл по рядках for (int j = 0; j < M; j++) { // внутрішній цикл по стовпцях cin >> mas[i][j]; // введення елементів з клавіатури } } |
1 2 3 4 5 6 |
for (int i = 0; i < N; i++) { // зовнішній цикл по рядках for (int j = 0; j < M; j++) { // внутрішній цикл по стовпцях cout << mas[i][j] << "\t";// виведення елементів через табуляцію } cout << endl; // переведення курсору на новий рядок } |
Інші базові алгоритмів обробки двовимірних масивів наведемо у вигляді функцій. З особливостями передачі двовимірного масиву у функцію можна ознайомитися за посиланням.
Для наступних прикладів будемо вважати, що програма вже має наступну структуру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <iostream> using namespace std; const int N = 4, M = 3; void fillMatrix(int array[N][M]); void printMatrix(int array[N][M]); int main() { int mas[N][M]; fillMatrix(mas); // викликаємо функцію заповнення масиву випадковими числами в діапазоні від -10 до 10 printMatrix(mas); // виводимо елементи на екран system("pause"); return 0; } void fillMatrix(int array[N][M]) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { array[i][j] = rand() % 21 - 10; } } } void printMatrix(int array[N][M]) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cout << array[i][j] << "\t"; } cout << endl; } } |
Пошук елементів матриці за певним критерієм
Приклад 1. Замінити всі від’ємні елементи матриці на 0.
1 2 3 4 5 6 7 8 |
void findNegative(int array[N][M]) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (array[i][j] < 0) array[i][j] = 0; } } } |
Результат роботи функції:
Обчислення суми елементів матриці
Приклад 2. Знайти суму всіх елементів матриці.
1 2 3 4 5 6 7 8 9 |
int matrixSum(int array[N][M]) { int Sum = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { Sum += array[i][j]; } } return Sum; } |
Результат роботи функції:
Підрахунок кількості елементів за певним критерієм
Приклад 3. Підрахувати кількість парних чисел в кожному стовпці.
1 2 3 4 5 6 7 8 9 10 11 12 |
void countEvenNumbers(int array[N][M]) { int count; for (int j = 0; j < M; j++) { // зовнішній цикл по стовпцям count = 0; // лічильник парних елементів в стовпці for (int i = 0; i < N; i++) { // внутрішній цикл по рядкам if (array[i][j] % 2 == 0) { count++; } } cout << "Кількість парних чисел в " << j + 1 << " cтовпці: " << count << endl; } } |
Результат роботи функції:
Знаходження найбільших та найменших значень
Приклад 4. Вивести найбільший елемент матриці та його індекси.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void maxElement(int array[N][M]) { int max, max_i, max_j; max = array[0][0]; // приймемо за найбільший перший елемент масиву max_i = 0; // індекси максимального елементу max_j = 0; for (int i = 0; i < N; i++) { // зовнішній цикл по рядкам for (int j = 0; j < M; j++) { // внутрішній цикл по стовпцям if (array[i][j] > max) { // якщо елемент більше максимуму, то max = array[i][j]; // він стає найбільшим max_i = i; // запам'ятовуємо його індекси max_j = j; } } } cout << " Максимальний елемент: " <<max << endl; cout << " Він знаходиться у " << max_i+1 <<" рядку та "<< max_j+1 << " стовпці" << endl; } |
Результат роботи функції:
Алгоритм знаходження мінімального елемента аналогічний, достатньо замінити знак більше, на знак менше. Для підрахунку найбільшого та найменшого елементів рядка (стовпця) необхідно здійснювати виведення результату після кожної ітерації зовнішнього циклу, а також занулення змінної, яка зберігає результат. Наприклад, функція, яка знаходить найменший елемент у рядку може виглядати наступним чином:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void minElement(int array[N][M]) { int min, min_i, min_j; for (int i = 0; i < N; i++) { // зовнішній цикл по рядкам min = array[i][0]; // приймемо за найбільший перший елемент i-го рядку min_i = i; // індекси мінімального елементу min_j = 0; for (int j = 1; j < M; j++) { // внутрішній цикл по стовпцям if (array[i][j] < min) { // якщо елемент менше мінімального, то min = array[i][j]; // він стає мінімальним min_i = i; // запам'ятовуємо його індекси min_j = j; } } // виводимо мінімальний елемент рядка та його індекс: cout << " Мінімальний елемент " << i + 1 << " рядка дорівнює " << min << endl; cout << " Він знаходиться у " << min_j + 1 << " стовпці\n\n"; } } |
Результат роботи функції:
Формування одновимірних масивів з елементів двовимірних
Приклад 5. Утворити одновимірний масив з сум елементів кожного рядка.
1 2 3 4 5 6 7 8 9 10 11 |
void masSum(int array[N][M], int mas[N]) { int Sum; for (int i = 0; i < N; i++) { // зовнішній цикл по рядкам Sum = 0; for (int j = 0; j < M; j++) { // внутрішній цикл по стовпцям Sum += array[i][j]; // шукаємо суму елементів рядка } mas[i] = Sum; // додаємо в одновимірний масив суму відповідного рядка cout << mas[i] << " "; } } |
Результат роботи функції: