C/C++

Двумерный массив C++

1 Используя функции, сформировать с помощью ДСЧ двумерный массив и
вывести его на печать.
2 Выполнить обработку двумерного массива - все нечетные строки матрицы сдвинуть циклически на К элементов влево используя функции, результат вывести на печать
#include <iostream>
#include <iomanip>
#include <random>
using namespace std;
size_t length(const char* msg) {
cout << msg;
size_t value;
cin >> value;
return value;
}
int** create_matrix(const size_t rows, const size_t cols) {
auto matrix = new int*[rows];
for (size_t i = 0; i < rows; ++i) matrix[i] = new int[cols];
return matrix;
}
int** destroy_matrix(int** matrix, const size_t rows) {
if (matrix != nullptr) {
for (size_t i = 0; i < rows; ++i) delete[] matrix[i];
delete[] matrix;
matrix = nullptr;
}
return matrix;
}
void fill_random_matrix(int** matrix, const size_t rows, const size_t cols, int a, int b) {
if (a > b) swap(a, b);
uniform_int_distribution<> uid(a, b);
mt19937 gen{ random_device()() };
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
matrix[i][j] = uid(gen);
}
}
}
void show_matrix(int** matrix, const size_t rows, const size_t cols, const streamsize width) {
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) cout << setw(width) << matrix[i][j];
puts("");
}
}
void shift_left(int* row, const size_t length) {
auto tmp = row[0];
size_t i = 1;
while (i < length) {
row[i - 1] = row[i];
++i;
}
row[length - 1] = tmp;
}
void shift_left(int* row, const size_t length, const size_t k) {
for (size_t i = 0; i < k; ++i) shift_left(row, length);
}
void shift_odd_rows(int** matrix, const size_t rows, const size_t cols, const size_t k) {
for (size_t i = 0; i < rows; i += 2) {
shift_left(matrix[i], cols, k);
}
}
int main() {
auto rows = length("Введите число строк: ");
auto cols = length("Введите число столбцов: ");
auto matrix = create_matrix(rows, cols);
fill_random_matrix(matrix, rows, cols, 10, 99);
show_matrix(matrix, rows, cols, 4);
auto k = length("Введите K: ");
shift_odd_rows(matrix, rows, cols, k);
show_matrix(matrix, rows, cols, 4);
matrix = destroy_matrix(matrix, rows);
}
ЮМ
Юрий Мендель
84 045
Лучший ответ
#include <iostream>
using namespace std;

void shift(int* arr, size_t size, int direct)
{
int* temp = new int[size];
copy(arr, arr + size, temp);
for (int i = 0; i < size; i++)
arr[i] = temp[(i-direct<0?size+i-direct:i-direct)%size];
delete[] temp;
}
void print(int* arr, size_t x, size_t y)
{
for (size_t i = 0; i < x; i++)
for (size_t j = 0; j < y; j++)
cout << (!j ? "\n" : " ") << arr[i * x + j];
}
void fill(int* arr, size_t x, size_t y)
{
srand(time(nullptr));
for (size_t i = 0; i < x*y; i++)
arr[i] = rand()%10;
}

int main()
{
const size_t sizex = 10, sizey = 10;
int vol = -1; //смещение 1 влево
int a[sizex][sizey];
cout << "Initial array:";
fill(a[0], sizex, sizey);
print(a[0], sizex, sizey);
cout << "\nAfter shifting:";
for (size_t i = 0; i < sizex; i++) i & 1 ? shift(a[i], sizey, vol):void();
print(a[0], sizex, sizey);
}
//shift третий параметр - смещение. Положительный - вправо, отрицательный - влево.
Рамиль Мамедов
Рамиль Мамедов
51 411