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