#include <stdio.h>
#include <stdlib.h>
// Функции для работы с матрицей
int **allocate_matrix_dynamic1(int rows, int cols);
int *allocate_matrix_dynamic2(int rows, int cols);
int **allocate_matrix_dynamic3(int rows, int cols);
void free_matrix_dynamic1(int **matrix, int rows);
void free_matrix_dynamic2(int *matrix);
void free_matrix_dynamic3(int **matrix, int rows);
void read_matrix(int **matrix, int rows, int cols);
void print_matrix(int **matrix, int rows, int cols);
void sort_matrix(int **matrix, int rows, int cols);
int sum_row(int *row, int cols);
int main() {
int N, M, choice;
// Ввод размерности матрицы и выбора метода выделения памяти
if (scanf("%d %d %d", &N
, &M
, &choice
) != 3 || N
<= 0 || M
<= 0) { return 1;
}
int **matrix;
// Динамическое выделение памяти в зависимости от выбора
switch (choice) {
case 1:
matrix = allocate_matrix_dynamic1(N, M);
break;
case 2:
matrix
= (int **)malloc(N
* sizeof(int *)); for (int i = 0; i < N; i++) {
matrix[i] = allocate_matrix_dynamic2(i, M);
}
break;
case 3:
matrix = allocate_matrix_dynamic3(N, M);
break;
default:
return 1;
}
// Проверка успешности выделения памяти
if (matrix == NULL) {
return 1;
}
// Ввод элементов матрицы
read_matrix(matrix, N, M);
// Сортировка матрицы
sort_matrix(matrix, N, M);
// Вывод отсортированной матрицы
print_matrix(matrix, N, M);
// Освобождение памяти
switch (choice) {
case 1:
free_matrix_dynamic1(matrix, N);
break;
case 2:
for (int i = 0; i < N; i++) {
free_matrix_dynamic2(matrix[i]);
}
break;
case 3:
free_matrix_dynamic3(matrix, N);
break;
}
return 0;
}
// Сортировка матрицы по сумме строк
void sort_matrix(int **matrix, int rows, int cols) {
// Пузырьковая сортировка
for (int i = 0; i < rows - 1; i++) {
for (int j = 0; j < rows - i - 1; j++) {
if (sum_row(matrix[j], cols) > sum_row(matrix[j + 1], cols)) {
// Меняем местами строки
int *temp = matrix[j];
matrix[j] = matrix[j + 1];
matrix[j + 1] = temp;
}
}
}
}
// Подсчет суммы элементов строки
int sum_row(int *row, int cols) {
int sum = 0;
for (int j = 0; j < cols; j++) {
sum += row[j];
}
return sum;
}
// Выделение памяти: вариант 1 (2D массив указателей)
int **allocate_matrix_dynamic1(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int *)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Освобождение памяти для динамической матрицы 1
void free_matrix_dynamic1(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
// Выделение памяти: вариант 2 (1D массив)
int *allocate_matrix_dynamic2(int rows, int cols) {
return malloc(cols
* sizeof(int)); }
// Освобождение памяти для динамической матрицы 2
void free_matrix_dynamic2(int *matrix) {
}
// Выделение памяти: вариант 3 (массив указателей на строки)
int **allocate_matrix_dynamic3(int rows, int cols) {
int **matrix
= malloc(rows
* sizeof(int *)); if (matrix == NULL) return NULL;
for (int i = 0; i < rows; i++) {
matrix
[i
] = malloc(cols
* sizeof(int)); if (matrix[i] == NULL) {
for (int j = 0; j < i; j++) {
}
return NULL;
}
}
return matrix;
}
// Освобождение памяти для динамической матрицы 3
void free_matrix_dynamic3(int **matrix, int rows) {
for (int i = 0; i < rows; i++) {
}
}
// Ввод элементов матрицы
void read_matrix(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (scanf("%d", &matrix
[i
][j
]) != 1) { exit(1); // Ошибка при считывании данных }
}
}
}
// Вывод элементов матрицы
void print_matrix(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
}
}
}