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