fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Функции для работы с матрицей
  5. int **allocate_matrix_dynamic1(int rows, int cols);
  6. int *allocate_matrix_dynamic2(int rows, int cols);
  7. int **allocate_matrix_dynamic3(int rows, int cols);
  8. void free_matrix_dynamic1(int **matrix, int rows);
  9. void free_matrix_dynamic2(int *matrix);
  10. void free_matrix_dynamic3(int **matrix, int rows);
  11. void read_matrix(int **matrix, int rows, int cols);
  12. void print_matrix(int **matrix, int rows, int cols);
  13. void sort_matrix(int **matrix, int rows, int cols);
  14. int sum_row(int *row, int cols);
  15.  
  16. int main() {
  17. int N, M, choice;
  18.  
  19. // Ввод размерности матрицы и выбора метода выделения памяти
  20. if (scanf("%d %d %d", &N, &M, &choice) != 3 || N <= 0 || M <= 0) {
  21. printf("n/a\n");
  22. return 1;
  23. }
  24.  
  25. int **matrix;
  26.  
  27. // Динамическое выделение памяти в зависимости от выбора
  28. switch (choice) {
  29. case 1:
  30. matrix = allocate_matrix_dynamic1(N, M);
  31. break;
  32. case 2:
  33. matrix = (int **)malloc(N * sizeof(int *));
  34. for (int i = 0; i < N; i++) {
  35. matrix[i] = allocate_matrix_dynamic2(i, M);
  36. }
  37. break;
  38. case 3:
  39. matrix = allocate_matrix_dynamic3(N, M);
  40. break;
  41. default:
  42. printf("n/a\n");
  43. return 1;
  44. }
  45.  
  46. // Проверка успешности выделения памяти
  47. if (matrix == NULL) {
  48. printf("n/a\n");
  49. return 1;
  50. }
  51.  
  52. // Ввод элементов матрицы
  53. read_matrix(matrix, N, M);
  54.  
  55. // Сортировка матрицы
  56. sort_matrix(matrix, N, M);
  57.  
  58. // Вывод отсортированной матрицы
  59. print_matrix(matrix, N, M);
  60.  
  61. // Освобождение памяти
  62. switch (choice) {
  63. case 1:
  64. free_matrix_dynamic1(matrix, N);
  65. break;
  66. case 2:
  67. for (int i = 0; i < N; i++) {
  68. free_matrix_dynamic2(matrix[i]);
  69. }
  70. free(matrix);
  71. break;
  72. case 3:
  73. free_matrix_dynamic3(matrix, N);
  74. break;
  75. }
  76.  
  77. return 0;
  78. }
  79.  
  80. // Сортировка матрицы по сумме строк
  81. void sort_matrix(int **matrix, int rows, int cols) {
  82. // Пузырьковая сортировка
  83. for (int i = 0; i < rows - 1; i++) {
  84. for (int j = 0; j < rows - i - 1; j++) {
  85. if (sum_row(matrix[j], cols) > sum_row(matrix[j + 1], cols)) {
  86. // Меняем местами строки
  87. int *temp = matrix[j];
  88. matrix[j] = matrix[j + 1];
  89. matrix[j + 1] = temp;
  90. }
  91. }
  92. }
  93. }
  94.  
  95. // Подсчет суммы элементов строки
  96. int sum_row(int *row, int cols) {
  97. int sum = 0;
  98. for (int j = 0; j < cols; j++) {
  99. sum += row[j];
  100. }
  101. return sum;
  102. }
  103.  
  104. // Выделение памяти: вариант 1 (2D массив указателей)
  105. int **allocate_matrix_dynamic1(int rows, int cols) {
  106. int **matrix = malloc(rows * sizeof(int *));
  107. if (matrix == NULL) return NULL;
  108.  
  109. for (int i = 0; i < rows; i++) {
  110. matrix[i] = malloc(cols * sizeof(int));
  111. if (matrix[i] == NULL) {
  112. for (int j = 0; j < i; j++) {
  113. free(matrix[j]);
  114. }
  115. free(matrix);
  116. return NULL;
  117. }
  118. }
  119. return matrix;
  120. }
  121.  
  122. // Освобождение памяти для динамической матрицы 1
  123. void free_matrix_dynamic1(int **matrix, int rows) {
  124. for (int i = 0; i < rows; i++) {
  125. free(matrix[i]);
  126. }
  127. free(matrix);
  128. }
  129.  
  130. // Выделение памяти: вариант 2 (1D массив)
  131. int *allocate_matrix_dynamic2(int rows, int cols) {
  132. return malloc(cols * sizeof(int));
  133. }
  134.  
  135. // Освобождение памяти для динамической матрицы 2
  136. void free_matrix_dynamic2(int *matrix) {
  137. free(matrix);
  138. }
  139.  
  140. // Выделение памяти: вариант 3 (массив указателей на строки)
  141. int **allocate_matrix_dynamic3(int rows, int cols) {
  142. int **matrix = malloc(rows * sizeof(int *));
  143. if (matrix == NULL) return NULL;
  144.  
  145. for (int i = 0; i < rows; i++) {
  146. matrix[i] = malloc(cols * sizeof(int));
  147. if (matrix[i] == NULL) {
  148. for (int j = 0; j < i; j++) {
  149. free(matrix[j]);
  150. }
  151. free(matrix);
  152. return NULL;
  153. }
  154. }
  155. return matrix;
  156. }
  157.  
  158. // Освобождение памяти для динамической матрицы 3
  159. void free_matrix_dynamic3(int **matrix, int rows) {
  160. for (int i = 0; i < rows; i++) {
  161. free(matrix[i]);
  162. }
  163. free(matrix);
  164. }
  165.  
  166. // Ввод элементов матрицы
  167. void read_matrix(int **matrix, int rows, int cols) {
  168. for (int i = 0; i < rows; i++) {
  169. for (int j = 0; j < cols; j++) {
  170. if (scanf("%d", &matrix[i][j]) != 1) {
  171. printf("n/a\n");
  172. exit(1); // Ошибка при считывании данных
  173. }
  174. }
  175. }
  176. }
  177.  
  178. // Вывод элементов матрицы
  179. void print_matrix(int **matrix, int rows, int cols) {
  180. for (int i = 0; i < rows; i++) {
  181. for (int j = 0; j < cols; j++) {
  182. printf("%d ", matrix[i][j]);
  183. }
  184. printf("\n");
  185. }
  186. }
Success #stdin #stdout 0s 5288KB
stdin
1
3 3
4 3 1
9 0 55
-4 7 -10
stdout
4 3 1