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


Перестановки рядків або стовпців

У двовимірному масиві можна виконувати такі види перестановок:

  1. Перестановка місцями двох конкретних рядків (стовпців). Причому спочатку потрібно знайти індекс одного або обох рядків (стовпців), які потрібно поміняти місцями.
  2. Перестановка всіх рядків (стовпців) у зворотному порядку.
  3. Перестановка всіх рядків (стовпців) у зворотному порядку між двома конкретними рядками (стовпцями).

Перестановка двох рядків

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

Тут нам уже не підійде перший спосіб передавання двовимірного масиву у функцію. Розглянемо другий спосіб, який дозволяє змінювати матрицю.

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

Починаючи з 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-ініціалізацію.

Приклад 1

Дано двовимірний масив цілих чисел. Поміняти місцями парні та непарні рядки.

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

Програма

#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

Це означає, що якась функція в програмі намагалася використати більше пам’яті, ніж було відведено в стеку.

Перестановка двох стовпців

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

Приклад 2

Дано двовимірний масив цілих чисел. Поміняти місцями 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;
    }
}

Приклад 3

Дано двовимірний масив із 8 рядків. Переставити у зворотному порядку рядки з k-го по s-й.

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

Алгоритм

  1. Нехай введено k = 1 та s = 6.
  2. Переставлятимемо рядки, тобто в кожному стовпці виконуватимуться перестановки елементів з k по s у зворотному порядку.
  3. Спочатку обчислюємо кількість рядків, які переставляються: s - k + 1. У нашому випадку це 6.
  4. Кількість ітерацій циклу: (s - k + 1) / 2. У нашому прикладі це 3.
  5. Тобто у кожному стовпці (зовнішній цикл за j) буде внутрішній цикл з трьома ітераціями (за i), у якому мінятимемо місцями два елементи.
  6. Визначаємо індекси елементів, які переставляються, за значенням i, k та s — таблиця:
Індекс i (внутрішній цикл) Перший переставлений елемент Другий переставлений елемент
ПрикладЗагальноПрикладЗагально
11k6s
22k + 15s - 1
33k + 24s - 2
Висновокk + i - 1s - 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;
        }
    }
}

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

Варіант 1

  1. Дано двовимірний масив. Поміняти місцями другий і останній стовпці.
  2. Дано двовимірний масив. Складіть програму, яка міняє місцями 1-й і останній рядки, які складаються лише з парних чисел.

Варіант 2

  1. Дано двовимірний масив. Складіть програму, яка міняє місцями 3-й і 4-й рядки.
  2. Дано двовимірний масив. Поміняти місцями 1-й стовпець і останній стовпець, який складається лише з непарних чисел.

Варіант 3

  1. Дано двовимірний масив. Поміняйте місцями останній стовпець і стовпець, у якому знаходиться останній парний елемент. Якщо таких елементів немає, то нічого не переставляти.
  2. Дано двовимірний масив. Поміняйте місцями перший рядок і рядок, у якому знаходиться перший нуль. Якщо таких елементів немає, то нічого не переставляти.

Варіант 4

  1. Дано двовимірний масив. Поміняйте місцями останній стовпець і стовпець, у якому знаходиться перший парний елемент. Якщо таких елементів немає, то нічого не переставляти.
  2. Дано двовимірний масив. Поміняйте місцями останній рядок і перший рядок, який складається лише з додатних елементів. Якщо таких рядків немає, то нічого не переставляти.

Варіант 5

  1. Дано двовимірний масив. Поміняйте місцями другий рядок і рядок, у якому знаходиться останній додатний елемент. Якщо таких елементів немає, то нічого не переставляти.
  2. Дано двовимірний масив. Поміняйте місцями перший стовпець і перший стовпець, що складається лише з елементів менших за 10. Якщо таких стовпців немає, то нічого не переставляти.

Варіант 6

  1. Дано двовимірний масив. Поміняйте місцями третій стовпець і стовпець, у якому знаходиться перший парний елемент. Якщо таких елементів немає, то нічого не переставляти.
  2. Дано двовимірний масив. Поміняйте місцями другий рядок і рядок, у якому знаходиться останній максимальний елемент. Якщо максимальний елемент знаходиться в другому рядку, то нічого не переставляти.

Варіант 7

  1. Дано двовимірний масив. Поміняйте місцями останній рядок і рядок, у якому знаходиться перший максимальний елемент. Якщо максимальний елемент знаходиться в останньому рядку, то нічого не переставляти.
  2. Дано двовимірний масив із 10 стовпців. Поміняти місцями такі стовпці: 1-й і 9-й та 2-й і 10-й.

Варіант 8

  1. Дано двовимірний масив. Поміняйте місцями два рядки: рядок, у якому знаходиться перший максимальний елемент, і рядок, у якому знаходиться перший мінімальний елемент. Якщо ці елементи знаходяться в одному рядку, то нічого не переставляти.
  2. Дано двовимірний масив із 10 стовпців. Поміняти місцями такі стовпці: 1-й і 8-й, 2-й і 9-й, 3-й і 10-й.

Варіант 9

  1. Дано двовимірний масив. Поміняйте місцями два рядки: 2-й і рядок, у якому знаходиться останній максимальний елемент. Якщо цей елемент знаходиться в другому рядку, то нічого не переставляти.
  2. Дано двовимірний масив із 10 стовпців. Поміняти місцями такі стовпці: 3-й і 4-й, 5-й і 6-й, 7-й і 8-й.

Варіант 10

  1. Дано двовимірний масив. Поміняйте місцями 3-й стовпець і стовпець, у якому знаходиться перший максимальний елемент. Якщо максимальний елемент знаходиться в третьому стовпці, то нічого не переставляти.
  2. Дано двовимірний масив із 10 рядків. Поміняти місцями такі рядки: 2-й і 3-й, 4-й і 5-й, 6-й і 7-й.

Варіант 11

  1. Дано двовимірний масив. Поміняйте місцями два рядки: останній рядок і рядок, у якому знаходиться останній мінімальний елемент.
  2. Дано двовимірний масив із 10 стовпців. Переставити в зворотному порядку стовпці з k-го по s-й.

Варіант 12

  1. Дано двовимірний масив. Поміняйте місцями два рядки: другий рядок і перший рядок з мінімальною кількістю додатних елементів.
  2. Дано двовимірний масив, що складається з парної кількості стовпців. Стовпці лівої половини масиву поміняти місцями зі стовпцями правої половини.

Варіант 13

  1. Дано двовимірний масив. Поміняйте місцями два стовпці: перший стовпець і перший стовпець з максимальною кількістю від’ємних елементів.
  2. Дано двовимірний масив, що складається з парної кількості рядків. Рядки верхньої половини масиву поміняти місцями з рядками нижньої половини.

Варіант 14

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

Варіант 15

  1. Дано двовимірний масив. Поміняйте місцями два стовпці: стовпець, у якому знаходиться перший непарний елемент, і стовпець, у якому знаходиться останній непарний елемент. Якщо ці елементи знаходяться в одному стовпці, то нічого не переставляти.
  2. Дано двовимірний масив із 10 рядків. Переставити в зворотному порядку рядки, які розташовані між рядками, у яких знаходяться останній мінімальний і останній максимальний елементи. Якщо такий елемент один, або вони знаходяться в одному рядку, то нічого не переставляти.

Варіант 16

  1. Дано двовимірний масив. Поміняйте місцями два стовпці: стовпець, у якому знаходиться перший максимальний елемент, і стовпець, у якому знаходиться перший мінімальний елемент. Якщо ці елементи знаходяться в одному стовпці, то нічого не переставляти.
  2. Дано двовимірний масив, що складається з парної кількості рядків. Поміняти місцями перший рядок із другим, третій з четвертим і т.д.

Варіант 17

  1. Дано двовимірний масив. Поміняйте місцями два рядки: рядок, у якому знаходиться останній максимальний елемент, і рядок, у якому знаходиться останній мінімальний елемент. Якщо ці елементи знаходяться в одному рядку, то нічого не переставляти.
  2. Дано двовимірний масив, що складається з парної кількості стовпців. Поміняти місцями перший стовпець із другим, третій з четвертим і т.д.

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