Осуществить циклический сдвиг вправо элементов матрицы, находящейся во "внешнем слое" - C (СИ)
Формулировка задачи:
Задача: Осуществить циклический сдвиг вправо элементов матрицы, находящейся во "внешнем слое" матрицы. Затем элементы "второго слоя" сдвинуть влево и т.д.
С горем пополам сдвинул только внешний слой, а вот как переключится на "второй слой" понять не могу. Вот что есть :
#include <stdio.h> #include <stdlib.h> #include <conio.h> #define a 0 #define b 99 void form (int *X,int n,int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { *(X+i*20+j)=a+random(b-a); printf("%4d",*(X+i*20+j)); } printf("\n"); } printf("\n"); } void obrabotka (int *X,int n,int m) { int i,j,buf; buf=*(X+0*20+0); for(i=0;i<1;i++) { for(j=0;j<m-1;j++) { *(X+i*20+j)=*(X+i*20+(j+1)); } } for(j=m-1;j<m;j++) { for(i=0;i<n;i++) { *(X+i*20+j)=*(X+(i+1)*20+j); } } for(i=n-1;i<n;i++) { for(j=m-1;j>0;j--) { *(X+i*20+j)=*(X+i*20+(j-1)); } } for(j=0;j<1;j++) { for(i=n-1;i>0;i--) { *(X+i*20+j)=*(X+(i-1)*20+j); } } *(X+1*20+0)=buf; } void vivod(int *X,int n,int m) { int i,j; for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("%4d", *(X+i*20+j)); } printf("\n"); } } void main() { int X[20][20],n,m; clrscr(); printf("Vvedite razmernost' matricu = "); scanf("%d %d",&n,&m); form(&X[0][0],n,m); obrabotka(&X[0][0],n,m); vivod(&X[0][0],n,m); getch(); }
Решение задачи: «Осуществить циклический сдвиг вправо элементов матрицы, находящейся во "внешнем слое"»
textual
Листинг программы
if(k%2==0) for(i=0;i<4*(N-2*k-1);i++) shift[(i+Step)%(4*(N-2*k-1))]=cur[i]; else for(i=0;i<4*(N-2*k-1);i++) shift[(i+4*(N-2*k-1)*(Step/(4*(N-2*k-1))+1)-Step)%(4*(N-2*k-1))]=cur[i];
Объяснение кода листинга программы
В этом коде выполняется циклический сдвиг элементов матрицы, которая находится во внешнем слое
. Вот список действий:
- Проверка условия
k % 2 == 0
, которое определяет, является лиk
четным числом. - Если условие истинно, то выполняется цикл
for
с переменнойi
от 0 до4*(N-2*k-1)
. - В каждой итерации цикла текущий элемент матрицы
cur[i]
копируется в переменнуюshift[(i+Step) % (4*(N-2*k-1))]
. - Если условие в начале цикла не выполняется, то выполняется второй цикл
for
с переменнойi
от 0 до4*(N-2*k-1)
. - В каждой итерации второго цикла текущий элемент матрицы
cur[i]
копируется в переменнуюshift[(i+4*(N-2*k-1)*(Step/(4*(N-2*k-1))+1)-Step) % (4*(N-2*k-1))]
. - Код завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д