1

Тема: Допоможіть (С++(двовимірні динамічні масиви))

ось завдання

Прихований текст

Реалізуйте меню.
Написати функцію, яка:
Створює двовимірний динамічний масив(прямокутну матрицю).
Заповнює масив випадковими числами.
Виводить масив на екран.
Добавляє рядок в кінець масиву.
Добавляє рядок напочаток масиву.
Добавляє рядок у вказану позицію.
Добавляє декілька рядків починаючи зі вказаної позиції.
Видаляє рядок зкінця масиву.
Видаляє рядок з початку масиву.
Видаляє двовимірний масив.
Видаляє рядок зі вказаної позиції.
Видаляє блок рядків починаючи зі вказаної позиції.
Добавляє стовпець в кінець масиву.
Добавляє стовпець напочаток масиву.
Добавляє стовпець у вказану позицію.
Добавляє декілька стовпіців починаючи зі вказаної позиції.
Видаляє стовпець зкінця масиву.
Видаляє стовпець з початку масиву.
Видаляє стовпець зі вказаної позиції.
Видаляє блок стовпців починаючи зі вказаної позиції.
Виводить максимальний елемент кожного рядка.
Виводить мінімальний елемент кожного рядка.
Виводить максимальний елемент цілого масиву.
Виводить мінімальний елемент цілого масиву.
Сортує рядок по вказаній позиції по зростанню.
Сортує рядок по вказаній позиції по спаданню.
Сортує кожен рядок масиву по зростанню.
Сортує кожен рядок масиву по спаданню.
Перевертає кожен рядок задом наперед.
Перевертає кожен стовпець задом наперед.
Розширює масив на вказану кількість рядків і стовпців.
Транспонує матрицю.
Виконує циклічний зсув масиву на вказану кількість позицій вліво.
Виконує циклічний зсув масиву на вказану кількість позицій вправо.
Виконує циклічний зсув масиву на вказану кількість позицій вверх.
Виконує циклічний зсув масиву на вказану кількість позицій вниз.

а ось те місце в якому помилка :Транспонує матрицю
ось весь код

Прихований текст
#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void func(int**&ar, int m, int n);
void set(int** ar, int m, int n);
void print(int** ar, int m, int n);
void add_end(int** &ar, int &m, int n);
void add_p(int** &ar, int &m, int n);
void add_pos(int** &ar, int &m, int n, int pos);
void add__pos(int** &ar, int &m, int n, int pos, int num);
void del_end(int** &ar, int &m, int n);
void del_p(int** &ar, int &m, int n);
void delet(int**& ar, int &m);
void del_pos(int** &ar, int &m, int n, int pos);
void del__pos(int** &ar, int &m, int n, int pos, int num);
void add_col_end(int** &ar, int &m, int &n);
void add_end(int*& ar, int n, int num);
void add_col_p(int** &ar, int &m, int &n);
void add_p(int*& ar, int n, int num);
void add_col_pos(int** &ar, int &m, int &n, int pos);
void add_pos(int*&ar, int n, int num, int pos);
void add_col__pos(int** &ar, int &m, int &n, int pos, int num);
void del_col_end(int** &ar, int &m, int &n);
void dele_end(int*& ar, int &n);
void del_col_p(int** &ar, int &m, int &n);
void po_del(int*& ar, int &n);
void del_col_pos(int** &ar, int &m, int &n, int pos);
void delet_pos(int*& ar, int &n, int pos);
void del_col__pos(int** &ar, int &m, int &n, int pos, int num);
void max_rows(int** &ar, int &m, int &n);
int func1(int *ar, int n);
void min_rows(int** &ar, int &m, int &n);
int func2(int *ar, int n);
void max_mas(int** &ar, int &m, int &n);
void min_mas(int** &ar, int &m, int &n);
void sort_max(int**& ar, int m, int n, int pos);
void sort_min(int**& ar, int m, int n, int pos);
void sort_max_mas(int**& ar, int m, int n);
void sort_min_mas(int**& ar, int m, int n);
void rev_rows_mas(int**& ar, int m, int n);
void revers(int*& ar, int m, int n);
void rev_cols_mas(int**& ar, int m, int n);
void straightening_mas(int**& ar, int &m, int &n, int m1, int n1);
void transposed_mas(int**& ar, int &m, int &n);
void main() {
    setlocale(LC_ALL, "ru");
    srand(time(0));
    int m, n, choice, pos, num, m1, n1;
    cout << "Введiть кiлькiсть рядкiв: ";
    cin >> m;
    cout << "Введiть кiлькiсть стовпцiв: ";
    cin >> n;
    int** ar = nullptr;
    func(ar, m, n);
    set(ar, m, n);
    print(ar, m, n);
    cout << "1 - створити двовимiрний масив \n2 - заповнити масив \n3 - вивести масив на екран \n4 - добавити рядок в кiнець масиву \n5 - добавити рядок на початок масиву \n6 - добавити рядок в вибрану позицiю \n7 - добавити декiлька рядкiв в вибрану позицiю \n8 - видалити рядок з кiнця масиву \n9 - видалити рядок з початку масиву \n10 - видалити двовимiрний масив \n11 - видалити рядок з вказаної позицiї \n12 - видалити блок рядкiв починаючи з вказаної позицiї \n13 - добавити стовпець в кiнець масиву \n14 - добавити стовпець напочаток масиву \n15 - добавляє стовпець у вказану позицiю \n16 - добавляє декiлька стовпцiв починаючи з вказаної позицiї \n17 - видаляє стовпець зкiнця масиву \n18 - видаляє стовпець з початку масиву \n19 - видаляє стовпець з вказаної позицiї \n20 - видаляє блок стовпцiв починаючи з вказаної позицiї \n21 - виводить максимальний елемент кожного рядка \n22 - виводить мiнiмальний елемент кожного рядка \n23 - виводить максимальний елемент цiлого масиву \n24 - виводить мiнiмальний елемент цiлого масиву \n25 - сортує рядок по вказанiй позицiї по зростанню \n26 - сортує рядок по вказанiй позицiї по спаданню \n27 - сортує кожен рядок масиву по зростанню \n28 - сортує кожен рядок масиву по спаданню \n29 - перевертає кожен рядок задом наперед \n30 - перевертає кожен стовпець задом наперед \n31 - розширює масив на вказану кiлькiсть рядкiв i стовпцiв \n32 - транспонує матрицю \n33 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй влiво \n34 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй вправо \n35 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй вверх \n36 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй вниз \n0 - вийти \nВведiть вибiр:";
    cin >> choice;
    for (; choice;) {
        switch (choice) {
        case 1:
            func(ar, m, n);
            break;
        case 2:
            set(ar, m, n);
            break;
        case 3:
            print(ar, m, n);
            break;
        case 4:
            add_end(ar, m, n);
            break;
        case 5:
            add_p(ar, m, n);
            break;
        case 6:
            cout << "Введiть позицiю: ";
            cin >> pos;
            add_pos(ar, m, n, pos);
            break;
        case 7:
            cout << "Введiть позицiю: ";
            cin >> pos;
            cout << "Введiть кiлькiсть: ";
            cin >> num;
            add__pos(ar, m, n, pos, num);
            break;
        case 8:
            del_end(ar, m, n);
            break;
        case 9:
            del_p(ar, m, n);
            break;
        case 10:
            delet(ar, m);
            break;
        case 11:
            cout << "Введiть позицiю: ";
            cin >> pos;
            del_pos(ar, m, n, pos);
            break;
        case 12:
            cout << "Введiть позицiю: ";
            cin >> pos;
            cout << "Введiть кiлькiсть: ";
            cin >> num;
            del__pos(ar, m, n, pos, num);
            break;
        case 13:
            add_col_end(ar, m, n);
            break;
        case 14:
            add_col_p(ar, m, n);
            break;
        case 15:
            cout << "Введiть позицiю: ";
            cin >> pos;
            add_col_pos(ar, m, n, pos);
            break;
        case 16:
            cout << "Введiть позицiю: ";
            cin >> pos;
            cout << "Введiть кiлькiсть: ";
            cin >> num;
            add_col__pos(ar, m, n, pos, num);
            break;
        case 17:
            del_col_end(ar, m, n);
            break;
        case 18:
            del_col_p(ar, m, n);
            break;
        case 19:
            cout << "Введiть позицiю: ";
            cin >> pos;
            del_col_pos(ar, m, n, pos);
            break;
        case 20:
            cout << "Введiть позицiю: ";
            cin >> pos;
            cout << "Введiть кiлькiсть: ";
            cin >> num;
            del_col__pos(ar, m, n, pos, num);
            break;
        case 21:
            max_rows(ar, m, n);
            break;
        case 22:
            min_rows(ar, m, n);
            break;
        case 23:
            max_mas(ar, m, n);
            break;
        case 24:
            min_mas(ar, m, n);
            break;
        case 25:
            cout << "Введiть позицiю: ";
            cin >> pos;
            sort_max(ar, m, n, pos);
            break;
        case 26:
            cout << "Введiть позицiю: ";
            cin >> pos;
            sort_min(ar, m, n, pos);
            break;
        case 27:
            sort_max_mas(ar, m, n);
            break;
        case 28:
            sort_min_mas(ar, m, n);
            break;
        case 29:
            rev_rows_mas(ar, m, n);
            break;
        case 30:
            rev_cols_mas(ar, m, n);
            break;
        case 31:
            cout << "Введiть кiлькiсть рядкiв: ";
            cin >> m1;
            cout << "Введiть кiлькiсть стовпцiв: ";
            cin >> n1;
            straightening_mas(ar, m, n, m1, n1);
            break;
        case 32:
            transposed_mas(ar, m, n);
            break;
        }
        cout << "1 - створити двовимiрний масив \n2 - заповнити масив \n3 - вивести масив на екран \n4 - добавити рядок в кiнець масиву \n5 - добавити рядок на початок масиву \n6 - добавити рядок в вибрану позицiю \n7 - добавити декiлька рядкiв в вибрану позицiю \n8 - видалити рядок з кiнця масиву \n9 - видалити рядок з початку масиву \n10 - видалити двовимiрний масив \n11 - видалити рядок з вказаної позицiї \n12 - видалити блок рядкiв починаючи з вказаної позицiї \n13 - добавити стовпець в кiнець масиву \n14 - добавити стовпець напочаток масиву \n15 - добавляє стовпець у вказану позицiю \n16 - добавляє декiлька стовпцiв починаючи з вказаної позицiї \n17 - видаляє стовпець зкiнця масиву \n18 - видаляє стовпець з початку масиву \n19 - видаляє стовпець з вказаної позицiї \n20 - видаляє блок стовпцiв починаючи з вказаної позицiї \n21 - виводить максимальний елемент кожного рядка \n22 - виводить мiнiмальний елемент кожного рядка \n23 - виводить максимальний елемент цiлого масиву \n24 - виводить мiнiмальний елемент цiлого масиву \n25 - сортує рядок по вказанiй позицiї по зростанню \n26 - сортує рядок по вказанiй позицiї по спаданню \n27 - сортує кожен рядок масиву по зростанню \n28 - сортує кожен рядок масиву по спаданню \n29 - перевертає кожен рядок задом наперед \n30 - перевертає кожен стовпець задом наперед \n31 - розширює масив на вказану кiлькiсть рядкiв i стовпцiв \n32 - транспонує матрицю \n33 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй влiво \n34 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй вправо \n35 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй вверх \n36 - виконує циклiчний зсув масиву на вказану кiлькiсть позицiй вниз \n0 - вийти \nВведiть вибiр:";
        cin >> choice;
    }
    system("pause");
}
void transposed_mas(int**& ar, int &m, int &n) {
    int** p = nullptr;
    func(p, n, m);
    for (int a = 0; a < m; a++) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                p[a] = ar[i][j];
            }
        }
    }
    for (int a = 0; a < m; a++) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                p[i][j] = ar[a];
            }
        }
    }
}
void straightening_mas(int**& ar, int &m, int &n, int m1, int n1) {
    int** p = nullptr;
    func(p, m1, n1);
    set(p, m1, n1);
    for (int i = 0; i < m; i++) {
        p[i] = ar[i];
    }
    for (int i = 0; i < m; i++) {
        for (int j = n; j < n1; j++) {
            p[i][j] = rand() % 101 - 50;
        }
    }
    delete[]ar;
    ar = p;
    m = m1;
    n = n1;
}
void rever(int**& ar, int m, int n) {
    int** p = new int*[m];
    for (int i = 0; i < n; i++) {
        p[i] = ar[i];
    }
    int j = n;
    for (int i = 0; i < n; i++) {
        j--;
        ar[i] = p[j];
    }
}
void rev_cols_mas(int**& ar, int m, int n) {
    for (int i = 0; i < m; i++) {
        rever(ar, m, n);
    }
}
void revers(int*& ar, int m, int n) {
    int* p = new int[n];
    for (int i = 0; i < n; i++) {
        p[i] = ar[i];
    }
    int j = n;
    for (int i = 0; i < n; i++) {
        j--;
        ar[i] = p[j];
    }
}
void rev_rows_mas(int**& ar, int m, int n) {
    for (int i = 0; i < m; i++) {
        revers(ar[i], m, n);
    }
}
void sort_min_mas(int**& ar, int m, int n) {
    int tmp = 0;
    for (int a = 0; a < n; a++) {
        for (int i = 0; i < n; i++) {
            for (int j = n - 1; j > 0; j--) {
                if (ar[i][j - 1] < ar[i][j]) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j - 1];
                    ar[i][j - 1] = tmp;
                }
            }
        }
    }
}
void sort_max_mas(int**& ar, int m, int n) {
    int tmp = 0;
    for (int a = 0; a < n; a++) {
        for (int i = 0; i < n; i++) {
            for (int j = n - 1; j > 0; j--) {
                if (ar[i][j - 1] > ar[i][j]) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j - 1];
                    ar[i][j - 1] = tmp;
                }
            }
        }
    }
}
void sort_min(int**& ar, int m, int n, int pos) {
    int tmp = 0;
    for (int a = 0; a < n; a++) {
        for (int i = pos; i < pos + 1; i++) {
            for (int j = n - 1; j > 0; j--) {
                if (ar[i][j - 1] < ar[i][j]) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j - 1];
                    ar[i][j - 1] = tmp;
                }
            }
        }
    }
}
void sort_max(int**& ar, int m, int n, int pos) {
    int tmp = 0;
    for (int a = 0; a < n; a++) {
        for (int i = pos; i < pos + 1; i++) {
            for (int j = n - 1; j > 0; j--) {
                if (ar[i][j - 1] > ar[i][j]) {
                    tmp = ar[i][j];
                    ar[i][j] = ar[i][j - 1];
                    ar[i][j - 1] = tmp;
                }
            }
        }
    }
}
void min_mas(int** &ar, int &m, int &n) {
    int min = ar[0][0], min1 = ar[0][0];
    for (int i = 0; i < m; i++) {
        min = func1(ar[i], n);
        if (min < min1) {
            min1 = min;
        }
    }
    cout << min1 << "\n";
}
void max_mas(int** &ar, int &m, int &n) {
    int max = ar[0][0], max1 = ar[0][0];
    for (int i = 0; i < m; i++) {
        max = func2(ar[i], n);
        if (max > max1) {
            max1 = max;
        }
    }
    cout << max1 << "\n";
}
int func1(int *ar, int n) {
    int min = ar[0];
    for (int i = 0; i < n; i++) {
        ar[i] < min ? (min = ar[i]) : (min = min);
    }
    return min;
}
void min_rows(int** &ar, int &m, int &n) {
    int min = ar[0][0];
    for (int i = 0; i < m; i++) {
        min = func1(ar[i], n);
        cout << min << "\n";
    }
}
int func2(int *ar, int n) {
    int max = ar[0];
    for (int i = 0; i < n; i++) {
        if (max < ar[i]) {
            max = ar[i];
        }
    }
    return max;
}
void max_rows(int** &ar, int &m, int &n) {
    int max = ar[0][0];
    for (int i = 0; i < m; i++) {
        max = func2(ar[i], n);
        cout << max << "\n";
    }
}
void del_col__pos(int** &ar, int &m, int &n, int pos, int num) {
    for (int i = pos; i <= num; i++) {
        del_col_pos(ar, m, n, pos);
    }
}
void delet_pos(int*& ar, int &n, int pos) {
    int* p = new int[n - 1];
    for (int i = 0; i <= n - 1; i++) {
        if (i >= pos) {
            p[i] = ar[i + 1];
        }
        else {
            p[i] = ar[i];
        }
    }
    delete[]ar;
    ar = p;
}
void del_col_pos(int** &ar, int &m, int &n, int pos) {
    for (int i = 0; i < m; i++)
        delet_pos(ar[i], n, pos);
    n--;
}
void po_del(int*& ar, int &n) {
    int* p = new int[n - 1];
    for (int i = 0; i < n - 1; i++) {
        p[i] = ar[i + 1];
    }
    delete[]ar;
    ar = p;
}
void del_col_p(int** &ar, int &m, int &n) {
    for (int i = 0; i < m; i++) {
        po_del(ar[i], n);
    }
    n--;
}
void dele_end(int*& ar, int &n) {
    int* p = new int[n - 1];
    for (int i = 0; i < n - 1; i++) {
        p[i] = ar[i];
    }
    delete[]ar;
    ar = p;
}
void del_col_end(int** &ar, int &m, int &n) {
    for (int i = 0; i < m; i++) {
        dele_end(ar[i], n);
    }
    n--;
}
void add_col__pos(int** &ar, int &m, int &n, int pos, int num) {
    for (int i = pos; i <= num; i++) {
        add_col_pos(ar, m, n, pos);
    }
}
void add_pos(int*&ar, int n, int num, int pos) {
    int* p = new int[n + 1];
    for (int i = 0; i < pos; i++) {
        p[i] = ar[i];
    }
    p[pos] = num;
    for (int i = pos + 1; i < n + 1; i++) {
        p[i] = ar[i - 1];
    }
    delete[]ar;
    ar = p;
}
void add_col_pos(int** &ar, int &m, int &n, int pos) {
    for (int i = 0; i < m; i++)
        add_pos(ar[i], n, rand() % 101 - 50, pos);
    n++;
}
void add_p(int*& ar, int n, int num) {
    int* p = new int[n + 1];
    for (int i = 1; i <= n; i++) {
        p[i] = ar[i - 1];
    }
    p[0] = num;
    delete[]ar;
    ar = p;
}
void add_col_p(int** &ar, int &m, int &n) {
    for (int i = 0; i < m; i++)
        add_p(ar[i], n, rand() % 101 - 50);
    n++;
}
void add_end(int*& ar, int n, int num) {
    int* p = new int[n + 1];
    for (int i = 0; i < n; i++) {
        p[i] = ar[i];
    }
    p[n] = num;
    delete[]ar;
    ar = p;
}
void add_col_end(int** &ar, int &m, int &n) {
    for (int i = 0; i < m; i++)
        add_end(ar[i], n, rand() % 101 - 50);
    n++;
}
void del__pos(int** &ar, int &m, int n, int pos, int num) {
    for (int i = 0; i < num; i++) {
        del_pos(ar, m, n, pos);
    }
}
void del_pos(int** &ar, int &m, int n, int pos) {
    int** p = new int*[m - 1];
    for (int i = 0; i < pos; i++) {
        p[i] = ar[i];
    }
    for (int i = pos; i < m; i++) {
        p[i] = ar[i + 1];
    }
    delete[] ar[pos];
    delete[]ar;
    ar = p;
    m--;
}
void add__pos(int** &ar, int &m, int n, int pos, int num) {
    for (int i = 0; i < num; i++) {
        add_pos(ar, m, n, pos);
    }
}
void add_pos(int** &ar, int &m, int n, int pos) {
    int** p = new int*[m + 1];
    p[pos] = new int[n];
    for (int i = 0; i < n; i++) {
        p[pos][i] = rand() % 101 - 50;
    }
    for (int i = 0; i < pos; i++) {
        p[i] = ar[i];
    }
    for (int i = pos + 1; i <= m; i++) {
        p[i] = ar[i - 1];
    }
    delete[]ar;
    ar = p;
    m++;
}
void del_p(int** &ar, int &m, int n) {
    m--;
    int** p = new int*[m];
    for (int i = 0; i < m; i++) {
        p[i] = ar[i + 1];
    }
    delete[]ar;
    ar = p;
}
void add_p(int** &ar, int &m, int n) {
    int** p = new int*[m + 1];
    p[0] = new int[n];
    for (int i = 0; i < n; i++) {
        p[0][i] = rand() % 101 - 50;
    }
    for (int i = 1; i <= m; i++) {
        p[i] = ar[i - 1];
    }
    delete[]ar;
    ar = p;
    m++;
}
void del_end(int** &ar, int &m, int n) {
    m--;
    int** p = new int*[m];
    for (int i = 0; i < m; i++) {
        p[i] = ar[i];
    }
    delete[]ar;
    ar = p;

}
void add_end(int** &ar, int &m, int n) {
    int** p = new int*[m + 1];
    for (int i = 0; i < m; i++) {
        p[i] = ar[i];
    }
    p[m] = new int[n];
    for (int i = 0; i < n; i++) {
        p[m][i] = rand() % 101 - 50;
    }
    delete[]ar;
    ar = p;
    m++;
}
void delet(int**& ar, int &m) {
    for (int i = 0; i < m; i++) {
        delete[] ar[i];
    }
    delete[] ar;
    m = 0;
    ar = nullptr;
}
void print(int** ar, int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
}
void set(int** ar, int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % 101 - 50;
        }
    }
}
void func(int**&ar, int m, int n) {
    ar = new int*[m];
    for (int i = 0; i < m; i++) {
        ar[i] = new int[n];
    }
}

а ось функція з помилкою

void transposed_mas(int**& ar, int &m, int &n) {
    int** p = nullptr;
    func(p, n, m);
    for (int a = 0; a < m; a++) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                p[a] = ar[i][j];
            }
        }
    }
    for (int a = 0; a < m; a++) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                p[i][j] = ar[a];
            }
        }
    }
}

ось функція func(створює масив(щоб питань зайвих не було що це за функція))

void func(int**&ar, int m, int n) {
    ar = new int*[m];
    for (int i = 0; i < m; i++) {
        ar[i] = new int[n];
    }
}

допоможіть транспонувати матрицю динамічного двовимірного масиву

Подякували: Chemist-i1

2

Re: Допоможіть (С++(двовимірні динамічні масиви))

Транспонувати - означає віддзеркалити всі елементи відносно основної діагоналі, тобто p[ i][ j]=a[ j][ i].
А що таке p[a] = ar[ i][ j] та p[ i][ j] = ar[a]? Там же просто різні типи, про що вам має компілятор писати (чому, до речі, ви не скопіювали сюди повідомлення компілятора? Це зекономило б мені хвилину, яку я просто наступного разу не захочу витрачати на вас).
Ну і результат треба якось вивести з функції - я так розумію, у вашому коді має бути a=p. Ну і видалити стару матрицю.

Подякували: leofun01, Parsifal2

3

Re: Допоможіть (С++(двовимірні динамічні масиви))

Дякую Коало допомогло