fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_SIZE 100
  5.  
  6. // Прототипы функций
  7. int **allocate_matrix_dynamic1(int rows, int cols);
  8. void read_matrix_dynamic1(int **matrix, int rows, int cols);
  9. void print_matrix_dynamic1(int **matrix, int rows, int cols);
  10. void free_matrix_dynamic1(int **matrix, int rows);
  11. int calculate_row_sum(int *row, int cols);
  12. void sort_matrix_by_row_sum(int **matrix, int rows, int cols);
  13.  
  14. int main() {
  15. int choice, rows, cols;
  16.  
  17. // Выбор метода выделения памяти
  18. printf("Выберите метод выделения памяти:\n1. Динамически (2D массив указателей)\n2. Динамически (1D массив)\n3. Динамически (массив указателей на строки)\n");
  19. if (scanf("%d", &choice) != 1 || choice < 1 || choice > 3) {
  20. printf("n/a\\n");
  21. return 1; // Ошибка выбора
  22. }
  23.  
  24. // Чтение размеров матрицы
  25. if (scanf("%d %d", &rows, &cols) != 2 || rows < 1 || cols < 1 || rows > MAX_SIZE || cols > MAX_SIZE) {
  26. printf("n/a\\n");
  27. return 1; // Ошибка при считывании размеров матрицы
  28. }
  29.  
  30. int **matrix = NULL;
  31.  
  32. switch (choice) {
  33. case 1:
  34. matrix = allocate_matrix_dynamic1(rows, cols);
  35. break;
  36. case 2:
  37. printf("Динамическое выделение 1D массива не поддерживается в этой версии.\\n");
  38. return 1; // Ошибка, так как 1D не реализовано
  39. case 3:
  40. printf("Динамическое выделение массив указателей на строки не поддерживается в этой версии.\\n");
  41. return 1; // Ошибка, так как указатели не реализованы
  42. }
  43.  
  44. if (matrix == NULL) {
  45. printf("n/a\\n");
  46. return 1; // Ошибка при выделении памяти
  47. }
  48.  
  49. read_matrix_dynamic1(matrix, rows, cols);
  50. sort_matrix_by_row_sum(matrix, rows, cols);
  51. print_matrix_dynamic1(matrix, rows, cols);
  52. free_matrix_dynamic1(matrix, rows);
  53.  
  54. return 0;
  55. }
  56.  
  57. // Динамическое выделение: 2D массив указателей
  58. int **allocate_matrix_dynamic1(int rows, int cols) {
  59. int **matrix = malloc(rows * sizeof(int *));
  60. if (matrix == NULL) return NULL;
  61.  
  62. for (int i = 0; i < rows; i++) {
  63. matrix[i] = malloc(cols * sizeof(int));
  64. if (matrix[i] == NULL) {
  65. for (int j = 0; j < i; j++) {
  66. free(matrix[j]);
  67. }
  68. free(matrix);
  69. return NULL;
  70. }
  71. }
  72. return matrix;
  73. }
  74.  
  75. // Чтение динамической матрицы
  76. void read_matrix_dynamic1(int **matrix, int rows, int cols) {
  77. for (int i = 0; i < rows; i++) {
  78. for (int j = 0; j < cols; j++) {
  79. if (scanf("%d", &matrix[i][j]) != 1) {
  80. printf("n/a\\n");
  81. exit(1); // Ошибка при считывании
  82. }
  83. }
  84. }
  85. }
  86.  
  87. // Печать динамической матрицы
  88. void print_matrix_dynamic1(int **matrix, int rows, int cols) {
  89. for (int i = 0; i < rows; i++) {
  90. for (int j = 0; j < cols; j++) {
  91. printf("%d", matrix[i][j]);
  92. if (j < cols - 1) {
  93. printf(" ");
  94. }
  95. }
  96. if (i < rows - 1) {
  97. printf("\n");
  98. }
  99. }
  100. }
  101.  
  102. // Освобождение памяти для динамической матрицы
  103. void free_matrix_dynamic1(int **matrix, int rows) {
  104. for (int i = 0; i < rows; i++) {
  105. free(matrix[i]);
  106. }
  107. free(matrix);
  108. }
  109.  
  110. // Функция для вычисления суммы строки
  111. int calculate_row_sum(int *row, int cols) {
  112. int sum = 0;
  113. for (int j = 0; j < cols; j++) {
  114. sum += row[j];
  115. }
  116. return sum;
  117. }
  118.  
  119. // Функция для сортировки матрицы по сумме строк
  120. void sort_matrix_by_row_sum(int **matrix, int rows, int cols) {
  121. for (int i = 0; i < rows - 1; i++) {
  122. for (int j = i + 1; j < rows; j++) {
  123. if (calculate_row_sum(matrix[i], cols) > calculate_row_sum(matrix[j], cols)) {
  124. // Обмен строк
  125. int *temp = matrix[i];
  126. matrix[i] = matrix[j];
  127. matrix[j] = temp;
  128. }
  129. }
  130. }
  131. }
Success #stdin #stdout 0.01s 5288KB
stdin
1
3 3
4 3 1
9 0 55
-4 7 -10
stdout
Выберите метод выделения памяти:
1. Динамически (2D массив указателей)
2. Динамически (1D массив)
3. Динамически (массив указателей на строки)
-4 7 -10
4 3 1
9 0 55