Дана действительная квадратная матрица порядка 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;
}

Объяснение кода листинга программы

  1. Объявлены функции:
    • 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 на экран.
  2. В функции main() создается матрица arr размером 2n с помощью функции initialArray().
  3. С помощью функции tearOff() матрица arr разделяется на блоки размером n*n по строке и столбцу, которые сохраняются в отдельных матрицах ul, ur, dl, dr.
  4. С помощью функции putTogether() блоки собираются в новую матрицу arr.
  5. Новая матрица arr выводится на экран с помощью функции showResult().
  6. Все динамические переменные освобождаются с помощью функции free().
  7. Программа завершается, ожидая нажатия любой клавиши.

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы