Операции с матрицами. Изменение порядка строк. Run-time error
Задача состоит в том, чтобы преобразовать двумерную матрицу следующим образом. Строки с четными номерами должны поменяться местами с нечетными. При этом нужно использовать динамические массивы. Я создал 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;
}
Ответы (2 шт):
Строки с четными номерами должны поменяться местами с нечетными.
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" : ""));
}
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];