first_one_dot_com

Matrix

Nov 26th, 2020
499
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. int** create_matrix(int n, int m);
  7. void rand_matrix(int **matr, int n, int m);
  8. void print_matrix(int **matr, int n, int m);
  9. void free_matrix(int **matr, int n, int m);
  10. void cut_matrix (int **matr, int n, int m);
  11.  
  12. int main()
  13. {
  14.     int n = 0;
  15.     int m = 0;
  16.    
  17.     printf("Матрица NxM: ");
  18.     scanf("%d", &n);
  19.     scanf("%d", &m);
  20.  
  21.     int **matr = create_matrix(n, m);
  22.     rand_matrix(matr, n, m);
  23.     print_matrix(matr, n, m);
  24.     cut_matrix(matr, n, m);
  25.     free_matrix(matr, n, m);
  26.  
  27.     return 0;
  28. }
  29.  
  30.  
  31. int** create_matrix(int n, int m)
  32. {
  33.     int **matr = calloc(n, sizeof(int*));   // первое измерение
  34.     if (matr == NULL)
  35.         perror("Ошибка выделения памяти\n");
  36.    
  37.     for (int i = 0; i < n; i++)
  38.     {
  39.         matr[i] = calloc(m, sizeof(int));   // второе измерение
  40.         if (matr[i] == NULL)
  41.             perror("Ошибка выделения памяти\n");
  42.     }
  43.  
  44.     return matr;
  45. }
  46.  
  47. void rand_matrix(int **matr, int n, int m)
  48. {  
  49.  srand(time(NULL));
  50.     for (int i = 0; i < n; i++)
  51.     {
  52.         for (int j = 0; j < m; j++)
  53.         {
  54.             matr[i][j] =-30 + rand() %60;
  55.         }
  56.     }
  57. }
  58.  
  59. void print_matrix(int **matr, int n, int m)
  60. {
  61.     for (int i = 0; i < n; i++)
  62.     {
  63.         for (int j = 0; j < m; j++)
  64.         {
  65.             printf("%3d ", matr[i][j]);
  66.         }
  67.     puts("");
  68.     }
  69. }
  70.  
  71. void free_matrix(int **matr, int n, int m)
  72. {
  73.     for(int i = 0; i < n; ++i)
  74.         free(matr[i]);
  75.     free(matr);
  76. }
  77.  
  78. void cut_matrix(int **matr, int n, int m)
  79. {
  80.     // максимум, минимум и их индексы
  81.     int max = matr[0][0];
  82.     int max_i = 0;
  83.     int max_j = 0;
  84.     int min = matr[0][0];
  85.     int min_i = 0;
  86.     int min_j = 0;
  87.  
  88.     // поиск макисмума и минимума
  89.     for (int i = 0; i < n; i++)        // пробежка по "строкам"
  90.     {
  91.         for (int j = 0; j < m; j++)    // пробежка по "столбцам"
  92.         {  
  93.             if (max < matr[i][j])
  94.             {
  95.                 max = matr[i][j];
  96.                 max_i = i;
  97.                 max_j = j;
  98.             }
  99.             if (min > matr[i][j])
  100.             {
  101.                 min = matr[i][j];
  102.                 min_i = i;
  103.                 min_j = j;
  104.             }
  105.         }
  106.     }
  107.    
  108.     printf("\nmin = %d\nmax = %d\n\n", min, max);
  109.  
  110.     int amount_str;
  111.     int amount_clm;
  112.     int count_i;
  113.     int count_j;
  114.     amount_str = max_i - min_i;
  115.     if(amount_str < 0)
  116.         amount_str *= -1;               //Когда min_i правее, чем max_i
  117.  
  118.     amount_clm = max_j - min_j;
  119.     if(amount_clm < 0)
  120.         amount_clm *= -1;
  121.  
  122.     if(max_i < min_i)
  123.         count_i = max_i;
  124.     else
  125.         count_i = min_i;
  126.        
  127.     if(max_j < min_j)
  128.         count_j = max_j;
  129.     else
  130.         count_j = min_j;
  131.        
  132.      
  133.     for (int i = count_i; i <= count_i + amount_str; i++) //откуда; границы (столбцы), i++
  134.     {
  135.         for (int j = count_j; j <= count_j + amount_clm; j++) //откуда; границы(строки), j++
  136.         {
  137.             printf("%3d", matr[i][j]);
  138.         }
  139.         puts("");
  140.     }
  141.     puts("");
  142. }
RAW Paste Data