Операции с матрицами. Изменение порядка строк. Run-time error

Рейтинг: 0Ответов: 2Опубликовано: 23.05.2023

Задача состоит в том, чтобы преобразовать двумерную матрицу следующим образом. Строки с четными номерами должны поменяться местами с нечетными. При этом нужно использовать динамические массивы. Я создал 2 массива: один заполняется в ручную, второй - по условию задачи. После они выводятся. При четном количестве строк всё работает, как только меняю на нечеткое кол-во, выдает ошибку из заголовка в дебаге. Если строк нечетное кол-во, то последнюю надо оставить как она есть. Точная формулировка задачи: "Реализуйте следующее преобразование двумерной матрицы: при передаче в выходную матрицу строки с четными номерами меняются местами с нечетными.(использовать динамические массивы)"

Unhandled exception at 0x00007FF754382696 in task_4.exe:
0xC0000005: Access violation reading location 0x00000000FDFDFDFD
#include <stdio.h>
#include <iostream>
using namespace std;
int main() 
{
    unsigned rows = 5;       
    unsigned columns = 2;

    int** arr1{ new int* [rows] {} }; //создаем первый массив
    for (unsigned i{}; i < rows; i++){
        arr1[i] = new int[columns] {};
    }
    int** arr2{ new int* [rows] {} }; //создаем второй массив
    for (unsigned i{}; i < rows; i++) {
        arr2[i] = new int[columns] {};
    }

    for (unsigned i{}; i < rows; i++) //заполняем первый массив
    {
        cout << "Enter data for " << (i + 1) << " row" << endl;
        for (unsigned j{}; j < columns; j++)
        {
            cout << (j + 1) << " column: ";
            cin >> arr1[i][j];
        }
    }         
    cout << endl;
    for (unsigned i{}; i < rows; i++) //выводим первый массив
    {
        for (unsigned j{}; j < columns; j++)
        {
            cout << arr1[i][j] << "\t";
        }
        cout << endl;
    }
    for (unsigned i{}; i < rows; i++) //заполняем второй массив
    {
        for (unsigned j{}; j < columns; j++) 
        {
            if (i % 2 == 0) {
                arr2[i][j] = *&arr1[i + 1][j];
            }                                                                                   
            if (i % 2 != 0) {
                arr2[i][j] = *&arr1[i-1][j];
            }
        }
    }
    cout << endl;
    for (unsigned i{}; i < rows; i++) //выводим второй массив
    {
        for (unsigned j{}; j < columns; j++)
        {
            cout << arr2[i][j] << "\t";
        }
        cout << endl;
    }

    for (unsigned i{}; i < rows; i++)
    {
        delete[] arr1[i];
    }
    delete[] arr1;
    for (unsigned i{}; i < rows; i++)
    {
        delete[] arr2[i];
    }
    delete[] arr2;

    system("pause");
    return 0;
}

Ответы

▲ 1Принят
 for (int i=0; i<rows-1; i+=2) //заполняем второй массив
    {
        for (int j = 0; j < columns; j++) 
        {
                arr2[i][j] = arr1[i + 1][j];
                arr2[i+1][j] = arr1[i][j];
        }
    } 
 //     и скопировать последнюю строку, если `rows%2`
 if (rows%2) 
        for (int j = 0; j < columns; j++) 
                arr2[rows-1][j] = arr1[rows-1][j];
▲ 0

Строки с четными номерами должны поменяться местами с нечетными.

int** array;
for (int row = 0; row < rows; row += 2)
    std::swap(array[row],array[row+1]);

Но на самом деле поменять местами строки поэлементно гораздо дешевле, чем тот overhead, который даёт [де]аллокация памяти в куче со сложностью O(n^2):

int main() {
    constexpr rows = 5;
    constexpr cols = 7;

    // allocating
    auto array = new int[rows*cols];

    // random filling
    std::srand(std::time(nullptr));
    for (int row = 0; row < rows; ++row)
        for (int col = 0; col < cols; ++col)
            array[row*cols+col] = std::rand();

    // swap of even and odd rows
    for (int row = 0; row < rows; row += 2)
        for (int col = 0; col < cols; ++col)
            std::swap(array[row*cols+col],array[(row+1)*cols+col]);

    delete[] array; // deallocating

    return 0;
}

PS

void swap_rows(int** array, const int rows) {
    for (int row = 0; row < rows; row += 2)
        std::swap(array[row],array[row+1]);
}

void print_matrix(int** array, const int rows, const int cols) {
    for (int row = 0; row < rows; ++row)
        for (int col = 0; col < cols; ++col)
            std::printf("%10d%s",array[row][col],(col == cols-1 ? "\n" : ""));
}