Перемещение элементов массива по часовой стрелке - 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 для завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д