main.c #include "func.h" int main(void) { Matrix mat; const char *input_filename = "input.txt"; const char *output_filename = "result.txt"; // Читаем матрицу и M из файла if (!read_matrix_from_file(&mat, input_filename)) { printf("Не удалось прочитать матрицу из файла.\n"); return 1; } // Сортируем столбцы sort_columns(&mat); // Записываем результат в файл if (!write_matrix_to_file(&mat, output_filename)) { printf("Ошибка записи результата в файл.\n"); return 1; } printf("Результат сохранен в %s\n", output_filename); // Освобождаем память for (int i = 0; i < mat.rows; i++) { free(mat.data[i]); } free(mat.data); return 0; } func.c #include "func.h" int is_column_valid(Matrix *mat, int col) { for (int i = 0; i < mat->rows; i++) { if (mat->data[i][col] <= mat->M) { return 0; // если нашли элемент <= M, столбец не подходит } } return 1; } int sum_of_negatives(Matrix *mat, int col) { int sum = 0; for (int i = 0; i < mat->rows; i++) { if (mat->data[i][col] < 0) { sum += abs(mat->data[i][col]); } } return sum; } void sort_columns(Matrix *mat) { int *valid_cols = (int *)malloc(mat->cols * sizeof(int)); int valid_count = 0; // Выбираем столбцы для сортировки for (int col = 0; col < mat->cols; col++) { if (is_column_valid(mat, col)) { valid_cols[valid_count++] = col; } } // Сортируем столбцы по сумме модулей отрицательных чисел for (int i = 0; i < valid_count - 1; i++) { for (int j = i + 1; j < valid_count; j++) { int sum_i = sum_of_negatives(mat, valid_cols[i]); int sum_j = sum_of_negatives(mat, valid_cols[j]); if (sum_i > sum_j) { // Меняем столбцы местами for (int row = 0; row < mat->rows; row++) { int temp = mat->data[row][valid_cols[i]]; mat->data[row][valid_cols[i]] = mat->data[row][valid_cols[j]]; mat->data[row][valid_cols[j]] = temp; } } } } free(valid_cols); } int read_matrix_from_file(Matrix *mat, const char *filename) { FILE *file = fopen(filename, "r"); if (!file) { printf("Ошибка открытия файла\n"); return 0; } // Читаем размеры матрицы if (fscanf(file, "%d %d", &(mat->rows), &(mat->cols)) != 2) { printf("Ошибка чтения размеров матрицы\n"); fclose(file); return 0; } // Выделяем память под матрицу mat->data = (int **)malloc(mat->rows * sizeof(int *)); for (int i = 0; i < mat->rows; i++) { mat->data[i] = (int *)malloc(mat->cols * sizeof(int)); } // Читаем матрицу for (int i = 0; i < mat->rows; i++) { for (int j = 0; j < mat->cols; j++) { if (fscanf(file, "%d", &mat->data[i][j]) != 1) { printf("Ошибка чтения данных матрицы\n"); fclose(file); return 0; } } } // Читаем M if (fscanf(file, "%d", &mat->M) != 1) { printf("Ошибка чтения M\n"); fclose(file); return 0; } fclose(file); return 1; } int write_matrix_to_file(Matrix *mat, const char *filename) { FILE *file = fopen(filename, "w"); if (!file) { printf("Ошибка открытия файла для записи\n"); return 0; } // Записываем размеры матрицы fprintf(file, "%d %d\n", mat->rows, mat->cols); // Записываем матрицу for (int i = 0; i < mat->rows; i++) { for (int j = 0; j < mat->cols; j++) { fprintf(file, "%d ", mat->data[i][j]); } fprintf(file, "\n"); } fclose(file); return 1; } func.h #ifndef FUNC_H #define FUNC_H #include "array.h" #include #include // Проверяем, все ли элементы столбца больше M int is_column_valid(Matrix *mat, int col); // Считаем сумму модулей отрицательных чисел в столбце int sum_of_negatives(Matrix *mat, int col); // Сортируем нужные столбцы матрицы void sort_columns(Matrix *mat); // Читаем исходную матрицу и M из файла int read_matrix_from_file(Matrix *mat, const char *filename); // Записываем матрицу в файл int write_matrix_to_file(Matrix *mat, const char *filename); #endif