Перемещение элементов массива по часовой стрелке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет, написал программу, которая должная делить массив, чётной размерности, на 4 части и перемещать по часовой стрелке на 1 шаг. Но она использует дополнительный массив. Как её изменить, чтобы она работала без дополнительного массива?
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main()
{setlocale(0,"rus");
  int **a;
int **b;
  int i, j, n, m,p,k,s;
  printf("Введите порядок массива: ");
  scanf("%d", &n);
 if (n%2==0){m=n;}
  else{printf("Введёная матрица не является чётной, поэтому она была автоматически увеличена на 1\n");
   n++;m=n;
   printf("Порядок матрицы равен %i\n",n);}
  a = (int*)malloc(n*m * sizeof(int));
 for (i = 0; i<n; i++)
  {for (j = 0; j<m; j++)
    {printf("a[%d][%d] = ", i, j);
      scanf("%d", (a + i*m + j));}}
b = (int*)malloc(n*m * sizeof(int));
      printf("До преобразования\n");
 
for (i = 0; i<n; i++)
  {
    for (j = 0; j<m; j++)
    {
      printf("%5d ", *(a + i*m + j));
      }
      printf("\n");}
 
s=n/2;
 
for (i = 0; i<s; i++)
  {
    for (j = 0; j<s; j++)
    {
      *(b + i*m + j)=*(a + (i+s)*m + j);
      }}

for (i = 0; i<s; i++)
  {
    for (j = 0; j<s; j++)
    {
      *(b + i*m + (j+s))=*(a + i*m + j);
      }}

      for (i = 0; i<s; i++)
  {
    for (j = 0; j<s; j++)
    {
      *(b + (i+s)*m + j)=*(a + (i+s)*m + (j+s));
      }}

      for (i = 0; i<s; i++)
  {
    for (j = 0; j<s; j++)
    {
      *(b + (i+s)*m + (j+s))=*(a + i*m + (j+s));
      }}

printf("После преобразования\n");
 
  for (i = 0; i<n; i++)
  {
    for (j = 0; j<m; j++)
    {
      printf("%5d ", *(b + i*m + j));
 
    }
    printf("\n");
  }
getchar();   getchar();
  return 0;
}

Решение задачи: «Перемещение элементов массива по часовой стрелке»

textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main()
{setlocale(0,"rus");
  int **a;
  int i, j, n, m,p,k,s;
  printf("Введите порядок массива: ");
  scanf("%d", &n);
 
 if (n%2==0){m=n;}
  else{printf("Введёная матрица не является чётной, поэтому она была автоматически увеличена на 1\n");
   n++;m=n;
   printf("Порядок матрицы равен %i\n",n);}
 
  a = (int*)malloc(n*m * sizeof(int));
 for (i = 0; i<n; i++)
  {for (j = 0; j<m; j++)
    {printf("a[%d][%d] = ", i, j);
      scanf("%d", (a + i*m + j));}}
      printf("До преобразования\n");
 
      s=n/2;
 
for (i = 0; i<n; i++)
  {
    for (j = 0; j<m; j++)
    {
      printf("%5d ", *(a + i*m + j));
      }
      printf("\n");}
 
 
printf("После преобразования\n");
 
for (i = 0; i<s; i++) //3
  {printf("\n");
    for (j = 0; j<s; j++)
    {
       printf("%5d ",*(a + (i+s)*m + j));
      }
        for (j = 0; j<s; j++)
         {
       printf("%5d ",*(a + i*m + j));}
 
      }
 
for (i = 0; i<s; i++) //4
  {printf("\n");
    for (j = 0; j<s; j++)
    {
       printf("%5d ",*(a + (i+s)*m + (j+s)));
      }
      for (j = 0; j<s; j++)
    {
       printf("%5d ",*(a + i*m + (j+s)));
 
      }}
 
 
 
getchar();   getchar();
  return 0;
}

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

  1. Ввод размера массива (n) и сохранение его в переменную n.
  2. Проверка на чётность размера массива. Если чётный, то присваиваем значение n, иначе увеличиваем на 1 и выводим новое значение n.
  3. Выделение памяти под массив a размером n*m.
  4. Ввод элементов массива a с помощью двух вложенных циклов.
  5. Вывод элементов массива a в формате 5d5 для наглядности.
  6. Вычисление значения s, равного n/2.
  7. Вывод элементов массива a, начиная с индекса (i+s), в формате 5d5.
  8. Дополнительно для чётности размера массива (n) выводится строка с элементами, начиная с индекса (i).
  9. Дополнительно для нечётности размера массива (n) выводится строка с элементами, начиная с индекса (i+s).
  10. Ввод не читается в этой части кода, поэтому используется функция getchar() для считывания введённых символов.
  11. Возврат значения 0 для завершения программы.

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


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

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

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