Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n*n крест-накрест - C (СИ)
Формулировка задачи:
Здравствуйте, помогите с заданием. Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n*n крест-накрест.
Решение задачи: «Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n*n крест-накрест»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define N 3
- double **initialArray()
- { int i,j;
- double **res = (double **)malloc(2*N*sizeof(double*));
- for(i = 0; i<2*N; i++)
- res[i] = (double*) malloc(2*N*sizeof(double));
- for(i = 0; i<2*N; i++)
- for(j = 0; j<2*N; j++)
- res[i][j] = 0.1*(rand()%50);
- return res;
- }
- double **tearOff(double **a, int row, int col)
- { int i,j;
- double **res = (double **)malloc(N*sizeof(double*));
- for(i = 0; i<N; i++)
- res[i] = (double*) malloc(N*sizeof(double));
- for(i =0; i<N; i++)
- for(j = 0; j<N; j++)
- res[i][j] = a[i+row][j+col];
- return res;
- }
- void putTogether(double **a, double **piece, int row, int col)
- { int i,j;
- for(i = 0; i<N; i++)
- for(j = 0; j<N; j++)
- a[i+row][j+col] = piece[i][j];
- }
- void showResult(double **a)
- { int i,j;
- for(i = 0; i<2*N; i++)
- { for(j = 0; j<2*N; j++)
- printf("%5.1lf", a[i][j]);
- printf("\n");
- }
- }
- int main()
- { double **arr, **ul, **ur, **dl, **dr;
- srand((unsigned int) time (NULL));
- arr = initialArray();
- printf("Initial array:\n");
- showResult(arr);
- //указатели на каждую из четвертей
- ul = tearOff(arr, 0, 0); //верхняя левая четверть
- ur = tearOff(arr, 0, N); //верхняя правая
- dl = tearOff(arr, N, 0); //нижняя левая
- dr = tearOff(arr, N, N); //нижняя правая
- //пересобираем матрицу
- putTogether(arr, dr, 0, 0); //нижняя правая -> верхняя левая
- putTogether(arr, dl, 0, N); //нижняя левая -> верхняя правая
- putTogether(arr, ur, N, 0); //верхняя правая -> нижняя левая
- putTogether(arr, ul, N, N); //верхняя левая -> нижняя правая
- printf("\n\nArray after blocks' replacing\n");
- showResult(arr);
- free(arr);
- free(ul); free(ur); free(dl); free(dr);
- getchar();
- return 0;
- }
Объяснение кода листинга программы
- Объявлены функции:
initialArray()
, которая создает и инициализирует матрицу размером 2n квадратных матриц размером n*n.tearOff(double **a, int row, int col)
, которая разделяет матрицу a на блоки размером n*n по строке и столбцу row и col и возвращает новый указатель на блок.putTogether(double **a, double **piece, int row, int col)
, которая собирает матрицу a из блоков, на которые она была разделена.showResult(double **a)
, которая выводит содержимое матрицы a на экран.
- В функции
main()
создается матрицаarr
размером 2n с помощью функцииinitialArray()
. - С помощью функции
tearOff()
матрицаarr
разделяется на блоки размером n*n по строке и столбцу, которые сохраняются в отдельных матрицахul
,ur
,dl
,dr
. - С помощью функции
putTogether()
блоки собираются в новую матрицуarr
. - Новая матрица
arr
выводится на экран с помощью функцииshowResult()
. - Все динамические переменные освобождаются с помощью функции
free()
. - Программа завершается, ожидая нажатия любой клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д