Циклически сдвинуть строки матрицы на 2 вверх - C (СИ)
Формулировка задачи:
Ввести прямоугольную матрицу целых чисел. Циклически сдвинуть ее строки на 2 вверх. Подсказка: циклическое смещение предусматривает, что элементы двух первых строк матрицы заносятся в соответствующие места сдвинутых элементов двух последних строк.
Решение задачи: «Циклически сдвинуть строки матрицы на 2 вверх»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS (6)
#define COLUMNS (9)
#define ROLLOUTS (2)
int main(void) {
int ** matrix, * tmp, i, j;
if ( ! ( matrix = malloc(sizeof(int*) * ROWS) ) ) {
perror("malloc");
exit(1);
}
for ( i = 0; i < ROWS; ++i ) {
if ( ! ( matrix[i] = malloc(sizeof(int) * COLUMNS) ) ) {
perror("malloc");
exit(1);
}
for ( j = 0; j < COLUMNS; ++j )
matrix[i][j] = (i + 1) * 10 + j + 1;
}
printf("Before:\n");
for ( i = 0; i < ROWS; ++i )
for ( j = 0; j < COLUMNS; ++j )
printf("%d%c", matrix[i][j], ( j < COLUMNS - 1 ) ? ' ' : '\n');
for ( i = 0; i < ROLLOUTS; ++i ) {
tmp = *matrix;
memmove(matrix, matrix + 1, sizeof(int*) * ( ROWS - 1));
matrix[ROWS - 1] = tmp;
}
printf("After:\n");
for ( i = 0; i < ROWS; ++i )
for ( j = 0; j < COLUMNS; ++j )
printf("%d%c", matrix[i][j], ( j < COLUMNS - 1 ) ? ' ' : '\n');
for ( i = 0; i < ROWS; ++i )
free(matrix[i]);
free(matrix);
exit(0);
}
Объяснение кода листинга программы
- Объявлены переменные:
- ROWS (6) - количество строк в матрице
- COLUMNS (9) - количество столбцов в матрице
- ROLLOUTS (2) - количество циклов сдвига
- Выделена память под матрицу и временную переменную tmp:
- int ** matrix - указатель на указатель целых чисел, будет содержать адреса строк матрицы
- int * tmp - указатель на целое число, будет использоваться как временная переменная
- Проверка выделения памяти под матрицу, если память не удалось выделить, то выводится сообщение об ошибке и программа завершается.
- В каждой строке матрицы выделена память под столбцы и заполнены значениями от (i+1)10 до (i+1)10+9.
- Выводится исходная матрица.
- В цикле ROLLOUTS происходит сдвиг строк матрицы вверх на 2 позиции.
- Выводится измененная матрица.
- Освобождается память, выделенная под матрицу и временную переменную tmp.
- Программа завершается.