Назад Зміст Вперед

Квадратні масиви. Матриці

У пам'яті комп'ютера двовимірний масив зберігається порядково.

Квадратним називається масив, у якому кількість рядків дорівнює кількості стовпців.

n — кількість рядків, стовпців;

i — номер рядка;

j — номер стовпця.

Головною та побічною діагоналями квадратний масив ділиться на чотири частини (наведено властивості індексів з урахуванням того, що в С++ елементи нумеруються з 0):

Розташування елементів Властивість індексів Ілюстрація
Головна діагональ i == j Головна діагональ
Над головною діагоналлю i < j Над головною діагоналлю
Під головною діагоналлю i > j Під головною діагоналлю
Побічна діагональ i + j == n - 1 Побічна діагональ
Над побічною діагоналлю i + j < n - 1 Над побічною діагоналлю
Під побічною діагоналлю i + j > n - 1 Під побічною діагоналлю
Верхня чверть (i < j) and (i + j < n - 1) Верхня чверть
Нижня чверть (i > j) and (i + j > n - 1) Нижня чверть
Права чверть (i < j) and (i + j > n - 1) Права чверть
Ліва чверть (i > j) and (i + j < n - 1) Ліва чверть

Приклад 1

Сформувати квадратний двовимірний масив символів розміру n*n так, щоб:

  1. на головній діагоналі цього масиву стояв символ "#",
  2. на побічній — "*",
  3. верхня чверть заповнена "1",
  4. нижня чверть заповнена "2",
  5. права чверть заповнена "3",
  6. ліва чверть заповнена "4".

Результат роботи програми

Програма

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    char A[20][20];

    // Initialize diagonal with '#'
    for (int i = 0; i < n; i++) {
        A[i][i] = '#';
    }

    // Initialize other elements
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i + j == n - 1) A[i][j] = '*';
            else if ((i < j) && (i + j < n - 1)) A[i][j] = '1';
            else if ((i > j) && (i + j > n - 1)) A[i][j] = '2';
            else if ((i < j) && (i + j > n - 1)) A[i][j] = '3';
            else if ((i > j) && (i + j < n - 1)) A[i][j] = '4';
        }
    }

    // Print the matrix
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << A[i][j];
        }
        cout << endl;
    }

    return 0;
}

Приклад 2

Дано квадратний двовимірний масив цілих чисел розміром 5х5. Знайдіть найбільший елемент головної діагоналі цього масиву.

Результат роботи програми

Програма

/***********
 Дано квадратну матрицю цілих чисел розміром 5×5.
 Знайти найбільший елемент головної діагоналі цієї матриці.
***********/
#include <iostream>
#include <cstdlib>  // Виправлено <stdlib> на <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;

const int SIZE = 5;  // Фіксований розмір матриці

void Randmass(int**, int, int, int);  // Заповнення масиву випадковими числами
void Printmass(int**, int);           // Виведення масиву на екран
int MaxDiag(int**, int);              // Максимум серед елементів головної діагоналі

int main() {
    int first_value, last_value;
    setlocale(0, "UKR");  // Українська локаль
    
    cout << "Введіть діапазон значень масиву: " << endl;
    cin >> first_value >> last_value;
    
    srand(time(0));  // Ініціалізація генератора випадкових чисел
    
    // Виділення пам'яті для матриці 5x5
    int** matrix = new int*[SIZE];
    for (int i = 0; i < SIZE; i++) {
        matrix[i] = new int[SIZE];
    }
    
    Randmass(matrix, SIZE, first_value, last_value);
    cout << endl;
    Printmass(matrix, SIZE);
    
    int max = MaxDiag(matrix, SIZE);
    cout << endl << "Максимум серед елементів головної діагоналі матриці: " << max << endl;
    
    // Звільнення пам'яті
    for (int i = 0; i < SIZE; i++) {
        delete[] matrix[i];
    }
    delete[] matrix;
    
    return 0;
}

Останній цикл програми можна спростити наступним чином:

// Функція для заповнення масиву випадковими значеннями
void Randmass(int** mass, int sizematrix, int first_value, int last_value) {
    cout << "Ініціалізація масиву розміру " << sizematrix << "x" << sizematrix << endl;
    
    for (int i = 0; i < sizematrix; i++) {
        for (int j = 0; j < sizematrix; j++) {
            mass[i][j] = first_value + rand() % (last_value - first_value + 1);
        }
    }
}

// Функція для виведення масиву
void Printmass(int** mass, int sizematrix) {
    cout << "Друк масиву:" << endl;
    for (int i = 0; i < sizematrix; i++) {
        cout << endl;
        for (int j = 0; j < sizematrix; j++) {
            cout << "\t" << mass[i][j];
        }
    }
}

// Функція для знаходження максимального елемента на головній діагоналі
int MaxDiag(int** x, int n) {
    int max = x[0][0];  // Починаємо з першого елементу діагоналі
    
    for (int i = 1; i < n; i++) {  // Починаємо з 1, оскільки x[0][0] вже перевірено
        if (x[i][i] > max) {
            max = x[i][i];
        }
    }
    return max;
}

Приклад 3

Складіть програму на С++ , яка визначає, чи є послідовність елементів побічної діагоналі відсортованою за спаданням. Якщо ні — надрукувати координати першого елемента, що порушує спадання.

Результат роботи програми

Програма

/***********
 Складіть програму на С++ , яка визначає, чи є послідовність елементів побічної діагоналі,
 відсортованою за спаданням. Якщо ні — надрукувати координати першого елемента, що порушує спадання.
***********/
#include <iostream>
using namespace std;

int main() {
    const int MAX = 100;
    int n;
    int matrix[MAX][MAX];

    cout << "Введіть розмір квадратної матриці (n x n): ";
    cin >> n;

    cout << "Введіть елементи матриці:\n";
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin >> matrix[i][j];
        }
    }

    // Перевірка побічної діагоналі на спадання
    bool isDescending = true;
    int row = -1, col = -1;

    for (int i = 0; i < n - 1; ++i) {
        int current = matrix[i][n - 1 - i];
        int next = matrix[i + 1][n - 2 - i];
        if (current <= next) {
            isDescending = false;
            row = i + 1;
            col = n - 2 - i;
            break;
        }
    }

    if (isDescending) {
        cout << "Елементи побічної діагоналі відсортовані за спаданням." << endl;
    } else {
        cout << "Порушення спадання на позиції: рядок = " <<row
             << ", стовпець = " << col << endl;
    }

    return 0;
}

З використовуванням vector :

#include <iostream>
#include <vector>
using namespace std;

// Функція для введення матриці
 vector<vector<int>>inputMatrix(int n) {
     vector<vector<int>> matrix(n, vector(n));
    cout << "Введіть елементи матриці (" << n << " x " << n << "):\n";
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            cin >> matrix[i][j];
    return matrix;
}
// Функція перевірки спадання побічної діагоналі
bool isSecondaryDiagonalDescending(const vector<vector<int>>& matrix, int& row, int& col) {
    int n = matrix.size();
    for (int i = 0; i < n - 1; ++i) {
        int current = matrix[i][n - 1 - i];
        int next = matrix[i + 1][n - 2 - i];
        if (current <= next) {
            row = i + 1;
            col = n - 2 - i;
            return false;
        }
    }
    return true;
}
// Основна функція
int main() {
    int n;
    cout << "Введіть розмір квадратної матриці: ";
    cin >> n;
    vector<vector<int>> matrix = inputMatrix(n);
    int row, col;
    if (isSecondaryDiagonalDescending(matrix, row, col)) {
        cout << "Елементи побічної діагоналі впорядковані за спаданням." <<endl;
    } else {
        cout << "Порушення спадання на позиції: рядок = " << row
             << ", стовпець = " << col << endl;
    }
    return 0;
}

Варіанти задач

У всіх програмах заповнити двовимірний масив цілих чисел розміром 5×5 і вивести його на екран.

  1. Знайдіть суму елементів головної діагоналі цього масиву.
  2. Знайдіть кількість непарних елементів побічної діагоналі цього масиву.
  3. Знайдіть суму від’ємних елементів побічної діагоналі цього масиву.
  4. Знайдіть суму непарних елементів головної діагоналі цього масиву.
  5. Знайдіть середнє арифметичне всіх елементів головної діагоналі цього масиву.
  6. Знайдіть середнє арифметичне всіх елементів побічної діагоналі цього масиву.
  7. Знайдіть мінімальний елемент побічної діагоналі цього масиву.
  8. Знайдіть середнє арифметичне всіх непарних елементів побічної діагоналі цього масиву.
  9. Знайдіть максимальний елемент побічної діагоналі цього масиву.
  10. Знайдіть добуток усіх елементів побічної діагоналі, що менші за 10.
  11. Знайдіть добуток елементів верхньої чверті.
  12. Знайдіть найбільший елемент серед елементів нижньої чверті.
  13. Знайдіть середнє арифметичне елементів лівої чверті.
  14. Знайдіть мінімальний елемент серед елементів правої чверті.
  15. Знайдіть кількість нулів у побічній діагоналі масиву.
  16. Складіть програму, яка визначає, чи є хоча б один елемент на побічній діагоналі, що дорівнює заданому числу X. Якщо так — надрукувати його координати; якщо ні — вивести повідомлення.
  17. Складіть програму, яка визначає, чи є послідовність елементів головної діагоналі відсортованою за зростанням. Якщо ні — надрукувати координати першого елемента, що порушує зростання.

Назад Зміст Вперед