Циклический сдвиг элементов матрицы против часовой стрелки - C (СИ)

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

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

Задана квадратная матрица символов. Осуществить циклический сдвиг элементов следующим образом: элементы нулевой строки сдвигаются в нулевой столбец сверху вниз, из него - в последнюю строку слева направо, из нее - в последний столбец снизу вверх, из него - в нулевую строку справа налево и далее по кругу против часовой стрелки. Элементы первой сроки сдвигаются аналогично и так далее. Три вечера думаю, но достойно работающего варианта пока не нашел. Может быть, подскажите. Не нужно писать всю программу, небольшой фрагмент с методом (идеей). Заранее спасибо.

Решение задачи: «Циклический сдвиг элементов матрицы против часовой стрелки»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. //-----------------------------------------------------------------------------
  5. int* Rotate(const int* source, int* result, const size_t n)
  6. {
  7.     size_t i, j;
  8.  
  9.     for (i = 0; i < n; ++i)
  10.     {
  11.         for (j = 0; j < n; ++j)
  12.         {
  13.             result[i * n + j] = source[j * n + (n - i - 1)];
  14.         }
  15.     }
  16.  
  17.     return result;
  18. }
  19. //-----------------------------------------------------------------------------
  20. void Print(const int* array, const size_t n)
  21. {
  22.     size_t i, j;
  23.  
  24.     for (i = 0; i < n; ++i)
  25.     {
  26.         for (j = 0; j < n; ++j)
  27.         {
  28.             printf("%d ", array[i * n + j]);
  29.         }
  30.  
  31.         printf("\n");
  32.     }
  33.     printf("\n");
  34. }
  35. //-----------------------------------------------------------------------------
  36.  
  37. int main()
  38. {
  39.     int source[] = {11, 12, 13, 14, 15,
  40.                     21, 22, 23, 24, 25,
  41.                     31, 32, 33, 34, 35,
  42.                     41, 42, 43, 44, 45,
  43.                     51, 52, 53, 54, 55};
  44.     size_t len = sizeof(source) / sizeof(*source);
  45.     int result[len];
  46.     size_t n = sqrt(len);
  47.  
  48.     Print(source, n);
  49.  
  50.     Rotate(source, result, n);
  51.  
  52.     Print(result, n);
  53.  
  54.     return 0;
  55. }

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

  1. В функции Rotate происходит циклический сдвиг элементов матрицы против часовой стрелки.
  2. В функции Print происходит вывод элементов матрицы построчно с помощью цикла for.
  3. В функции main определен исходный массив source размером 5x5 и вычислен его размер len.
  4. Результат циклического сдвига сохраняется в массиве result.
  5. Вычисляется размерность матрицы n как квадратный корень из общего количества элементов.
  6. Выводится исходный массив source с помощью функции Print.
  7. Результат циклического сдвига выводится с помощью функции Print.

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


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

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

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы