Осуществить циклический сдвиг вправо элементов матрицы, находящейся во "внешнем слое" - 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];

Объяснение кода листинга программы

В этом коде выполняется циклический сдвиг элементов матрицы, которая находится во внешнем слое. Вот список действий:

  1. Проверка условия k % 2 == 0, которое определяет, является ли k четным числом.
  2. Если условие истинно, то выполняется цикл for с переменной i от 0 до 4*(N-2*k-1).
  3. В каждой итерации цикла текущий элемент матрицы cur[i] копируется в переменную shift[(i+Step) % (4*(N-2*k-1))].
  4. Если условие в начале цикла не выполняется, то выполняется второй цикл for с переменной i от 0 до 4*(N-2*k-1).
  5. В каждой итерации второго цикла текущий элемент матрицы cur[i] копируется в переменную shift[(i+4*(N-2*k-1)*(Step/(4*(N-2*k-1))+1)-Step) % (4*(N-2*k-1))].
  6. Код завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы