Указатель: Сдвинуть числа в матрице заданного размер n * n на k позиций вправо - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int z, i, j, functs;
int *p;
void matrix_shift_right(int mat[][N], int n, int k) {
for (functs = 1; functs <= k; functs++) {
for (i = 0; i < n; i++) {
for (j = 1; j < n; j++) {
z = mat[i][j];
mat[i][j] = mat[i][0];
mat[i][0] = z;
}
}
}
}
int main(void) {
int mat[N][N], i, j, k, n;
printf("Enter size of matrix ");
scanf("%d", &n);
printf("\n");
srand(time(NULL));
for (i = 0; i<n; ++i) {
for (j = 0; j<n; ++j)
{
mat[i][j] = 0 + rand() %100;
printf("%d\t", mat[i][j]);
}
printf("\n");
}
printf("Enter nuber of stift ");
scanf("%d", &k);
matrix_shift_right(mat, n, k);
printf("\n");
for (i = 0; i<n; ++i)
{
for (j = 0; j<n; ++j)
printf("%d\t", mat[i][j]);
printf("\n");
}
return 0;
}Решение задачи: «Указатель: Сдвинуть числа в матрице заданного размер n * n на k позиций вправо»
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
void matrix_shift_right(int *mat, int n, int k) {
int z, i, j, functs;
for (functs = 1; functs <= k; functs++)
for (i = 0; i < n; i++)
for (j = 1; j < n; j++)
{
z = *(mat + i*n + j);
*(mat + i*n + j) = *(mat + i*n);
*(mat + i*n) = z;
}
}
int main(void) {
int i, j, k, n;
int *mat = (int*)malloc(N*N*sizeof(int));
printf("Enter size of matrix ");
scanf("%d", &n);
printf("\n");
srand(time(NULL));
for (i = 0; i<n; ++i) {
for (j = 0; j<n; ++j)
{
mat[i*n + j] = rand() % 100;
printf("%d\t", mat[i*n + j]);
}
printf("\n");
}
printf("Enter number of shift ");
scanf("%d", &k);
matrix_shift_right(mat, n, k);
printf("\n");
for (i = 0; i<n; ++i)
{
for (j = 0; j<n; ++j)
printf("%d\t", mat[i*n + j]);
printf("\n");
}
free(mat);
return 0;
}
Объяснение кода листинга программы
В данном коде реализована функция matrix_shift_right(), которая сдвигает элементы матрицы на k позиций вправо. Алгоритм сдвига элементов матрицы реализован с помощью трёх вложенных циклов. Внешний цикл выполняется k раз, благодаря чему обеспечивается сдвиг элементов на указанное количество позиций. Два внутренних цикла необходимы для работы с элементами матрицы. В ходе работы алгоритма используется временная переменная z, которая хранит значение элемента, с которым осуществляется сдвиг. В процессе сдвига элемента на одну позицию вправо, элемент, стоящий на этой позиции, перемещается влево, а элемент, стоящий на позиции, которая была последней, перемещается на первую позицию. В функции main() сначала пользователю предлагается ввести размер матрицы, затем на экране выводится исходная матрица, после чего пользователю предлагается ввести число сдвига. Затем вызывается функция matrix_shift_right(), которая сдвигает элементы матрицы на указанное количество позиций вправо. После сдвига на экране выводится изменённая матрица.