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


Що таке двовимірний масив

Під час розв’язання багатьох практичних задач досить часто доводиться мати справу з різними таблицями, які в математиці називають матрицями.

Двовимірним масивом або таблицею називається такий спосіб організації даних одного типу, за якого кожен елемент визначається двома числами: номером рядка і номером стовпця, на перетині яких він розміщений.

У цій таблиці 3 рядки та 4 стовпці. Як описується така сукупність даних?

Опис масиву

Опис двовимірного масиву виконується так: вказується тип даних, до яких належать елементи масиву, ім’я масиву, а потім дві пари квадратних дужок.

У першій парі квадратних дужок зазначається кількість рядків масиву. У другій парі — кількість стовпців (кількість елементів у рядку).

Наприклад, зазначений вище цілочисельний масив описується командою: int a[3][4]. У масиві 3 рядки і 4 стовпці.

Звернення до елемента масиву

Звернення до елемента масиву здійснюється через ім’я масиву з двома індексами, кожен — в окремих квадратних дужках.

Спочатку вказується номер рядка, а потім номер стовпця (номер елемента в рядку).

При цьому слід пам’ятати, що нумерація і рядків, і стовпців починається з нуля. Рядки масиву, який було описано вище, мають номери: 0,1,2. Стовпці мають номери: 0,1,2,3.

Таким чином, першим елементом зазначеного вище масиву є a[0][0], а останнім — елемент a[2][3].

Ініціалізація масиву

Щоб використовувати масив, недостатньо його описати. Його потрібно ініціалізувати, тобто заповнити, тобто надати значення його елементам.

Перший спосіб передавання двовимірного масиву у функцію

Розміщення двовимірного масиву в пам’яті

Якщо потрібно передавати двовимірні масиви за допомогою вказівників, треба враховувати те, що в пам’яті такі масиви зберігаються як одномірні. Таким чином, при використанні, наприклад, масиву А [m][n] у пам’яті послідовно розміщуються m рядків по n елементів у кожному. Ми представимо наш масив у такому вигляді, як одномірний масив вказівників на рядки, і будемо з ним працювати. Початкова матриця не змінюється.

Тому для роботи окремо з кожним рядком необхідно сформувати масив вказівників на ці рядки, тобто:


int matrix[m][n]={0};
int *stroki[m]; // масив вказівників на рядки двовимірного масиву
for (int i=0; i<m; i++) stroki[i]=&matrix[i][0];

Приклад 1

Заповнити масив розміру 5х8 випадковими цілими числами з інтервалу [1; 100] і вивести ці значення на екран.

Обробка

Програма

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

// Функція для заповнення масиву випадковими числами
void fillRandom(int**, int, int, int, int);
// Функція для виведення масиву
void Printmass(int**, int, int);

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

Опис функцій


// Функція для заповнення двовимірного масиву випадковими числами
// Параметри:
// arr - вказівник на масив
// m - кількість рядків
// n - кількість стовпців
// a - нижня межа діапазону
// b - верхня межа діапазону
void fillRandom(int** arr, int m, int n, int a, int b) {
    // Ініціалізація генератора випадкових чисел
    srand(time(NULL));
    
    // Цикл по рядкам масиву
    for (int i = 0; i < m; i++) {
        // Цикл по стовпцям масиву
        for (int j = 0; j < n; j++) {
            // Генерація випадкового числа у заданому діапазоні
            arr[i][j] = a + rand() % (b - a + 1);
        }
    }
}

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

Приклад 2

З бібліотекою random

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

// Прототипи функцій
void randIntmatr(int**, int, int, int, int); // Функція заповнення матриці
void outmatr(int**, int, int);               // Функція виведення матриці

int main() {
    const int n = 10;
    int kstrok, kstolbcov, first_value, last_value;
    int  a[n][n]; // Виправлено помилку у оголошенні змінних
    int* b[n];
    // Введення параметрів матриці
    cout << "Введіть кількість рядків матриці: ";
    cin >> kstrok;
    cout << "Введіть кількість стовпців матриці: ";
    cin >> kstolbcov;
    cout << "Введіть діапазон значень масиву:" << endl;
    cin >> first_value >> last_value;

    // Формування масиву вказівників на кожен рядок матриці
    for(int i = 0; i < kstrok; i++) 
        b[i] = &a[i][0]; 

    // Виклик функцій для роботи з матрицею
    randIntmatr((int**)b, kstrok, kstolbcov, first_value, last_value);
    cout << "Вихідна матриця: \n";
    outmatr((int**)b, kstrok, kstolbcov);

    return 0;
}

void randIntmatr(int** x, int kstrok, int kstolbcov, int first_value, int last_value) {
    cout << "Заповнюємо матрицю випадковими числами: \n";
    random_device random_device;         // Джерело ентропії
    mt19937 generator(random_device()); // Генератор випадкових чисел
    // Рівномірний розподіл [first_value, last_value]
    uniform_int_distribution<int> distribution(first_value, last_value);

    for(int i = 0; i < kstrok; i++) {
        for(int j = 0; j < kstolbcov; j++) {
            x[i][j] = distribution(generator); // Генерація випадкового числа
        }
    }
}

void outmatr(int** x, int kstrok, int kstolbcov) {
    for(int i = 0; i < kstrok; i++) {
        cout << endl;
        for(int j = 0; j < kstolbcov; j++) {
            cout << x[i][j] << " ";
        }
    }
    cout << endl;
}

Обробка


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