Під час розв’язання багатьох практичних задач досить часто доводиться мати справу з різними таблицями, які в математиці називають матрицями.
Двовимірним масивом або таблицею називається такий спосіб організації даних одного типу, за якого кожен елемент визначається двома числами: номером рядка і номером стовпця, на перетині яких він розміщений.
У цій таблиці 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 елементів у кожному. Ми представимо наш масив у такому вигляді, як одномірний масив вказівників на рядки, і будемо з ним працювати. Початкова матриця не змінюється.



Тому для роботи окремо з кожним рядком необхідно сформувати масив вказівників на ці рядки, тобто:
|
Заповнити масив розміру 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];
}
}
}
#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;
}
