У двовимірному масиві можна виконувати такі види перестановок:
Під час перестановки двох рядків у кожному стовпці міняються місцями два елементи. Це цикл за стовпцями (другий індекс). Щоб поміняти значення двох змінних, потрібно три оператори присвоєння. Тому в цьому циклі буде виконуватись три оператори присвоєння.
Тут нам уже не підійде перший спосіб передавання двовимірного масиву у функцію. Розглянемо другий спосіб, який дозволяє змінювати матрицю.
Починаючи з C++14, ключове слово auto при ініціалізації змінної може використовуватись замість типу змінної, щоб повідомити компілятору, що тип потрібно вивести з ініціалізованого значення. Це називається виведенням типу (або uniform-ініціалізацією, тобто «автоматичним визначенням типу компілятором»).
У onlineGDB.com обирайте C++14 або C++17.
int arr[M][N];
void print(auto p) {
// цикл
cout << p[i][j] << "\t"; // робота з масивом
...
}
int main() {
...
print(arr, M, N); // виклик функції
...
},/code>
У коді використовується uniform-ініціалізація:
int value{5}; Перевага: ви не зможете присвоїти змінній значення, яке її тип не підтримує — компілятор видасть помилку. Наприклад:
int value{4.5}; // помилка: цілочисельна змінна не може містити дробове значення Правило: використовуйте uniform-ініціалізацію.
Дано двовимірний масив цілих чисел. Поміняти місцями парні та непарні рядки.

#include <iostream>
#include <ctime>
using namespace std;
const int maxM = 10;
const int maxN = 10;
void printMatrix(auto, int, int);
void randomizeMatrix(auto, int, int, int, int);
void MySwapRow(auto, int, int);
int main() {
srand(time(0));
int arr[maxM][maxN];
int M = 5, N = 5; // Початкові розміри матриці
cout << "Введіть розміри матриці: " << endl;
cin >> M >> N;
int minRand = 0, maxRand = 9;
cout << "Введіть діапазон значень елементів матриці: " << endl;
cin >> minRand >> maxRand;
randomizeMatrix(arr, M, N, minRand, maxRand);
printMatrix(arr, M, N);
cout << endl;
MySwapRow(arr, M, N);
cout << endl;
printMatrix(arr, M, N);
return 0;
}
Зверніть увагу: у коді оголошено дві константи — максимальну кількість рядків і стовпців у матрицях, з якими працюватимете. Потім оголошено масив, і в пам’яті під нього зарезервовано місце. Вводити розміри матриці можна інші, але не більші за задані. У прикладах — не більше ніж 10?10. Якщо перевищити цей розмір, під час виконання програми станеться збій.
*** stack smashing detected ***: terminated
Це означає, що якась функція в програмі намагалася використати більше пам’яті, ніж було відведено в стеку.

Під час перестановки двох стовпців у кожному рядку міняються місцями два елементи. Тобто це цикл за рядками (перший індекс). Щоб поміняти значення двох змінних, потрібно три оператори присвоєння. Тому в цьому циклі буде три присвоєння.
Дано двовимірний масив цілих чисел. Поміняти місцями x-й та y-й стовпці. Значення x та y вводити з клавіатури.

/***********
Дано двовимірний масив цілих чисел. Поміняти місцями x-й та y-й стовпці.
Значення x та y ввести з клавіатури.
****************************************************/
#include <iostream>
#include <ctime>
using namespace std;
const int maxM = 10;
const int maxN = 10;
void printMatrix(auto, int, int);
void randomizeMatrix(auto, int, int, int, int);
void MySwapCol(auto, int, int, int, int);
int main() {
srand(time(0));
int arr[maxM][maxN];
int M = 5, N = 5; // Початкові розміри матриці
cout << "Введіть розміри матриці: " << endl;
cin >> M >> N;
int minRand = 0, maxRand = 9;
cout << "Введіть діапазон значень елементів матриці: " << endl;
cin >> minRand >> maxRand;
randomizeMatrix(arr, M, N, minRand, maxRand);
printMatrix(arr, M, N);
cout << endl;
int x, y;
cout << endl << "Введіть номери стовпців для обміну: " << endl;
cin >> x >> y;
if ((x >= 0 && x < N) && (y >= 0 && y < N)) {
MySwapCol(arr, M, N, x, y); // Виклик функції обміну
} else {
cout << "Помилка в даних." << endl;
}
cout << endl << "Змінений масив:" << endl;
printMatrix(arr, M, N);
cout << endl;
return 0;
}
// Функція для виведення матриці
void printMatrix(auto p, int M, int N) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cout << p[i][j] << "\t";
}
cout << endl;
}
}
// Функція для заповнення матриці випадковими значеннями
void randomizeMatrix(auto p, int M, int N, int minRand, int maxRand) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
p[i][j] = minRand + rand() % (maxRand - minRand + 1); // Виправлено random() на rand()
}
}
}
// Функція для обміну місцями двох стовпців
void MySwapCol(auto p, int M, int N, int x, int y) {
int temp; // Тимчасова змінна для обміну
for (int i = 0; i < M; i++) {
// Обмін елементів між стовпцями x та y
temp = p[i][x];
p[i][x] = p[i][y];
p[i][y] = temp;
}
}
Дано двовимірний масив із 8 рядків. Переставити у зворотному порядку рядки з k-го по s-й.


| Індекс i (внутрішній цикл) | Перший переставлений елемент | Другий переставлений елемент | ||
|---|---|---|---|---|
| Приклад | Загально | Приклад | Загально | |
| 1 | 1 | k | 6 | s |
| 2 | 2 | k + 1 | 5 | s - 1 |
| 3 | 3 | k + 2 | 4 | s - 2 |
| Висновок | k + i - 1 | s - i + 1 | ||
/***********
Дано двовимірний масив з 8 рядків. Переставити у зворотньому порядку
рядки від k-го до s-го.
***********/
#include <iostream>
#include <ctime>
using namespace std;
const int maxM = 10;
const int maxN = 10;
void printMatrix(auto, int, int);
void randomizeMatrix(auto, int, int, int, int);
void Reverse(auto, int, int, int, int);
int main() {
srand(time(0));
int arr[maxM][maxN];
int M = 8, N = 5; // За умовою - 8 рядків
cout << "Введіть кількість стовпців: " << endl;
cin >> N; // Кількість рядків фіксована (8)
int minRand = 0, maxRand = 9;
cout << "Введіть діапазон значень елементів матриці: " << endl;
cin >> minRand >> maxRand;
randomizeMatrix(arr, M, N, minRand, maxRand);
printMatrix(arr, M, N);
cout << endl;
int k, s;
cout << endl << "Введіть номери рядків для реверсу (k s): " << endl;
cin >> k >> s;
if ((k >= 0 && k < M) && (s < M && s >= 0) && (k < s)) {
Reverse(arr, M, N, k, s);
} else {
cout << "Помилка в даних." << endl;
}
cout << endl;
printMatrix(arr, M, N);
return 0;
}
// Функція для виведення матриці
void printMatrix(auto p, int M, int N) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cout << p[i][j] << "\t";
}
cout << endl;
}
}
// Функція для заповнення матриці випадковими значеннями
void randomizeMatrix(auto p, int M, int N, int minRand, int maxRand) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
p[i][j] = minRand + rand() % (maxRand - minRand + 1); // Виправлено random() на rand()
}
}
}
// Функція для реверсу рядків від k до s
void Reverse(auto p, int M, int N, int k, int s) {
int temp; // Тимчасова змінна для обміну
// Обмін рядків від k до s
for (int i = 0; i < (s - k + 1) / 2; i++) {
for (int j = 0; j < N; j++) {
// Обмін елементів між рядками
temp = p[k + i][j];
p[k + i][j] = p[s - i][j];
p[s - i][j] = temp;
}
}
}