Помогите решить задачу:

В файле 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 шт):

Автор решения: Harry

Ладно, чтоб вопрос закрыть...
Обработку ошибок добавьте сами.

#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("");
    }
}

А вот чтоб сдать задание, вам придется самостоятельно разобраться, что и как этот код делает.

→ Ссылка