1

Тема: Транспортування динамічної матриці

Потрібно написати функцію. Я пробую, але все дуже погано, а саме з самою динамікою. Що не так у void transMatrix(int** m, int rows, int cols)?

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

int** createMatrix(int rows, int cols);
void printMatrix(int** m, int rows, int cols);
void randMatrix(int** m, int rows, int cols);
void transMatrix(int** m, int rows, int cols);

int main()
{ 
    int rows, cols;
    cout << "Enter rows and cols: ";
    cin >> rows >> cols;
    int** matrix = createMatrix(rows, cols);
    randMatrix(matrix, rows, cols);
    cout << endl;
    printMatrix(matrix, rows, cols);
    transMatrix(matrix, rows, cols);
    cout << endl;
    printMatrix(matrix, rows, cols);
}

int** createMatrix(int rows, int cols)
{
    int** m = new int* [rows];
    for (int i = 0; i < rows; i++)
    {
        m[i] = new int [cols] {};
    }
    return m;
}

void printMatrix(int** m, int rows, int cols)
{
    if (m == nullptr)
    {
        cout << "Empty matrix!" << endl;
        return;
    }
    cout << "Matrix: " << endl;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            cout << "\t" << m[i][j];
        }
        cout << endl;
    }
}

void randMatrix(int** m, int rows, int cols)
{
    srand(time(0));

    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            m[i][j] = 1 + rand() % 20;
        }
    }
}

void transMatrix(int** m, int rows, int cols)
{
    int** res = new int* [rows];
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            res[i][j] = m[j][i];
        }
        cout << endl;
    }
    m = res;
    delete[]res;
}

2 Востаннє редагувалося lucas-kane (17.05.2022 20:45:21)

Re: Транспортування динамічної матриці

Gap4ik написав:

Що не так у void transMatrix(int** m, int rows, int cols)?

void transMatrix(int** m, int rows, int cols)
{
    // Транспонована матриця має поміняти місцямти рядки та стовці
    int** res = new int* [rows];
    for (int i = 0; i < rows; i++)
    {
        // Потрібно виділити пам'ять під масив рядків (res = new int[cols])
        for (int j = 0; j < cols; j++)
        {
            res[i][j] = m[j][i];
        }
        cout << endl;
    }
    // Тут знищуємо матрицю m
    m = res;
   // delete[]res; це не є правильно. В попередньому ряду ти m = res, а потім res видаляєш
}

І щоб все це працювалао потрівно визначити, (оголосити) функцію правильно void transMatrix(int*** m, int& rows, int& cols); Має бути якось так. Тоді в майн буде transMatrix(&matrix, rows, cols);

3

Re: Транспортування динамічної матриці

По-перше, не "транспортування", а транспонування. Ну, або це щось таке, про що я не знаю і вам доведеться детальніше розписати завдання.
По-друге, замість "все дуже погано" і "що не так" намагайтеся описати, що саме ви бачите і чим це відрізняється від того, що ви очікуєте. Наприклад, "замість матриці виводиться повідомлення SEGFAULT".
Ну і по-третє, у функції transMatrix для створення матриці res скористайтеся функцією createMatrix, ви ж її саме для того і писали. І повертайте цей res з функції. Зміна значення m не передається з функції назад.