Помогите решить задачу:
В файле 1.txt задан двумерный массив целых чисел в следующем виде: в первой строке задано количества строк и столбцов массива, а далее в каждой строке файла задается одна строка двумерного массива. Элементы массива задаются через пробелы. Ограничений на количества строк и столбцов в массиве нет. Ввести двумерный массив из файла в массив в подпрограмме, отведя память единым куском. Определить, существуют ли в массиве элементы, равные среднему арифметическому элементов массива из столбца, содержащего данный элемент. Если существуют, то удалить из массива все столбцы с найденными элементами. Ошибки (отсутствие файла, несоответствие количества чисел размерам прямоугольной матрицы, отказ в выделении памяти, некорректные данные и т.д.) обработать. Дополнительные массивы не использовать. Файл открывать один раз.
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file = fopen("1.txt", "r"); // Открываем файл для чтения
if (file == NULL) { // Проверяем успешность открытия файла
printf("Ошибка открытия файла\n");
return 1;
}
int rows = 0, cols = 0;
int **array = NULL;
// Считываем количество строк и столбцов из файла
while (!feof(file)) {
int c = fgetc(file);
if (c == ' ') {
cols++;
} else if (c == '\n') {
rows++;
}
}
// Перемещаем указатель в начало файла
fseek(file, 0, SEEK_SET);
// Выделяем память для массива
array = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
array[i] = (int *)malloc(cols * sizeof(int));
}
// Читаем массив из файла
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
fscanf(file, "%d", &array[i][j]);
}
}
fclose(file); // Закрываем файл
// Находим среднее арифметическое каждого столбца
int *averages = (int *)malloc(cols * sizeof(int));
for (int j = 0; j < cols; j++) {
int sum = 0;
for (int i = 0; i < rows; i++) {
sum += array[i][j];
}
averages[j] = sum / rows; // Используем целочисленное деление для округления вниз
}
// Удаляем столбцы с элементами равными среднему арифметическому
int *columnsToRemove = (int *)calloc(cols, sizeof(int)); // Массив для отслеживания столбцов, которые нужно удалить
for (int j = 0; j < cols; j++) {
for (int i = 0; i < rows; i++) {
if (array[i][j] == averages[j]) {
columnsToRemove[j] = 1; // Отмечаем столбец для удаления
break;
}
}
}
// Удаляем столбцы, отмеченные для удаления
int newCols = cols;
for (int j = 0; j < cols; j++) {
if (columnsToRemove[j]) {
for (int i = 0; i < rows; i++) {
for (int k = j; k < cols - 1; k++) {
array[i][k] = array[i][k + 1];
}
}
newCols--;
}
}
// Обновляем количество столбцов
cols = newCols;
// Выводим массив после удаления столбцов
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}
// Освобождаем память, выделенную для массива
for (int i = 0; i < rows; i++) {
free(array[i]);
}
free(array);
free(averages);
return 0;
}
Ответы (1 шт):
Ладно, чтоб вопрос закрыть...
Обработку ошибок добавьте сами.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int rows, cols;
FILE * f = fopen("1.txt","rt");
if (f == NULL) { /* Обработка ошибки открытия файла */ }
if (fscanf(f,"%d %d",&rows,&cols) != 2) { /* Обработка ошибки содержимого файла */ }
int * a = malloc(sizeof(int)*rows*cols);
if (a == NULL) { /* Обработка ошибки памяти */ }
#define arr(i,j) a[(i)*cols + (j)]
for(int i = 0; i < rows; ++i)
for(int j = 0; j < cols; ++j)
if (fscanf(f,"%d",&(arr(i,j))) != 1)
{ /* Обработка ошибки содержимого файла - мало данных */ }
fclose(f);
for(int i = 0; i < rows; ++i)
{
for(int j = 0; j < cols; ++j) printf("%5d ",arr(i,j));
puts("");
}
puts("----------");
int curCols = cols; // Столбцов в матрице в данный момент
for(int i = 0; i < curCols; ++i)
{
int sum = 0, hasAvg = 0;
for(int j = 0; j < rows; ++j) sum += arr(j,i);
for(int j = 0; j < rows; ++j)
if (sum == arr(j,i)*rows)
{
hasAvg = 1; break;
}
if (hasAvg)
{
for(int j = 0; j < rows; ++j)
{
memmove(&arr(j,i),&arr(j,i+1),sizeof(int)*(curCols-i-1));
}
curCols--;
i--;
}
}
for(int i = 0; i < rows; ++i)
{
for(int j = 0; j < curCols; ++j) printf("%5d ",arr(i,j));
puts("");
}
}
А вот чтоб сдать задание, вам придется самостоятельно разобраться, что и как этот код делает.