Перемещение элементов массива по часовой стрелке - 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;
}
Объяснение кода листинга программы
- Ввод размера массива (n) и сохранение его в переменную n.
- Проверка на чётность размера массива. Если чётный, то присваиваем значение n, иначе увеличиваем на 1 и выводим новое значение n.
- Выделение памяти под массив a размером n*m.
- Ввод элементов массива a с помощью двух вложенных циклов.
- Вывод элементов массива a в формате 5d5 для наглядности.
- Вычисление значения s, равного n/2.
- Вывод элементов массива a, начиная с индекса (i+s), в формате 5d5.
- Дополнительно для чётности размера массива (n) выводится строка с элементами, начиная с индекса (i).
- Дополнительно для нечётности размера массива (n) выводится строка с элементами, начиная с индекса (i+s).
- Ввод не читается в этой части кода, поэтому используется функция getchar() для считывания введённых символов.
- Возврат значения 0 для завершения программы.