Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n*n крест-накрест - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите с заданием. Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n*n крест-накрест.

Решение задачи: «Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n*n крест-накрест»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define N 3
  5.  
  6. double **initialArray()
  7. {   int i,j;
  8.     double **res = (double **)malloc(2*N*sizeof(double*));
  9.     for(i = 0; i<2*N; i++)
  10.         res[i] = (double*) malloc(2*N*sizeof(double));
  11.  
  12.     for(i = 0; i<2*N; i++)
  13.         for(j = 0; j<2*N; j++)
  14.             res[i][j] = 0.1*(rand()%50);
  15.  
  16.     return res;
  17. }
  18.  
  19. double **tearOff(double **a, int row, int col)
  20. {   int i,j;
  21.     double **res = (double **)malloc(N*sizeof(double*));
  22.     for(i = 0; i<N; i++)
  23.         res[i] = (double*) malloc(N*sizeof(double));
  24.  
  25.     for(i =0; i<N; i++)
  26.         for(j = 0; j<N; j++)
  27.             res[i][j] = a[i+row][j+col];
  28.  
  29.     return res;
  30. }
  31.  
  32. void putTogether(double **a, double **piece, int row, int col)
  33. {   int i,j;
  34.    
  35.     for(i = 0; i<N; i++)
  36.         for(j = 0; j<N; j++)
  37.             a[i+row][j+col] = piece[i][j];
  38. }
  39.  
  40. void showResult(double **a)
  41. {   int i,j;
  42.    
  43.     for(i = 0; i<2*N; i++)
  44.     {   for(j = 0; j<2*N; j++)
  45.             printf("%5.1lf", a[i][j]);
  46.         printf("\n");
  47.     }
  48. }
  49.  
  50.  
  51. int main()
  52. {   double **arr, **ul, **ur, **dl, **dr;
  53.     srand((unsigned int) time (NULL));
  54.    
  55.     arr = initialArray();
  56.     printf("Initial array:\n");
  57.     showResult(arr);
  58.    
  59.     //указатели на каждую из четвертей
  60.     ul = tearOff(arr, 0, 0);    //верхняя левая четверть
  61.     ur = tearOff(arr, 0, N);    //верхняя правая
  62.     dl = tearOff(arr, N, 0);    //нижняя левая
  63.     dr = tearOff(arr, N, N);    //нижняя правая
  64.  
  65.     //пересобираем матрицу
  66.     putTogether(arr, dr, 0, 0); //нижняя правая -> верхняя левая
  67.     putTogether(arr, dl, 0, N); //нижняя левая -> верхняя правая
  68.     putTogether(arr, ur, N, 0); //верхняя правая -> нижняя левая
  69.     putTogether(arr, ul, N, N); //верхняя левая -> нижняя правая
  70.  
  71.     printf("\n\nArray after blocks' replacing\n");
  72.     showResult(arr);
  73.  
  74.     free(arr);
  75.     free(ul); free(ur); free(dl); free(dr);
  76.  
  77.     getchar();
  78.     return 0;
  79. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы