Найти среднее арифметическое всех чисел, кроме заданного - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Даны натуральные числа i, n (i <= n), вещественные числа a1, a2, …,an. Найти среднее арифметическое всех чисел, кроме ai. __Читаем из in.txt 3 7 1.4 5.0 4 3 3.3 6 7 __Записываем out.txt например 3.9
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
        
        int i, k, n;
        double * a;     //Указатель на массив(последовательность чисел).
        double srArifm; //Будет содержать в себе среднее арифмет. последовательности.
        time_t t;
        srand(time(&t));//Нужно,чтобы серии случайных чисел не повторялись.
        while(1)        //Бесконечный ввод.
        {
                a       = NULL;
                srArifm = 0;
                //Вводим число элементов массива и индекс элемента который считать не будем.
                printf("Enter n(number of elements) : ");scanf("%d",&n);
                if(n < 2)
                printf("Input number of elements is too small\n");
                else
                //В случае если ввели число элементов большее чем 1
                //пытаемся выделить память под массив
                if((a = (double *)malloc(n*sizeof(double))))
                {
                        printf("Enter i(index  of excluding): ");scanf("%d",&i);
                        for(k = 0; k < n; k++)
                        {
                                a[k] = (rand()%100 - 50)/10.0;//Генерируем случайное число в диапазоне -5..5 .
                                if(k != i)                    //Исключаем i-ый элемент из среднего арифметического.
                                srArifm = srArifm + a[k];     //Найдём сумму элементов .
                                //поделим на их число после цикла
                                printf("%.1f ",a[k]);
                        }
                        printf("\nsrArifm : %lf\n", (srArifm = srArifm / (n - 1)));
                        free((void *)a);//Чистка памяти .
                }
                else//В случае ошибки выделения памяти , извещаем об этом.
                        printf("allocation memory error maby num of elements is too large\n");
        }
        return 0;
}

Решение задачи: «Найти среднее арифметическое всех чисел, кроме заданного»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int i, j, n;
    FILE   * f = NULL;//Казатель на наш файловый поток
    double * a = NULL;//Указатель на наш массив
    double srArfm = 0;//Значение нашего среднего арифметического
    if(!(f = fopen("in.txt","r")))//Открываем файловый поток для чтения
        printf("Error open in.txt\n");
    else
    {
        //Мы должны считать ровно два значения
        //если возврат от fscanf не 2 значит произошла ошибка чтения
        if(fscanf(f,"%d %d",&i,&n) != 2)
            printf("Error read i and n in.txt\n");
        else
        //Выделяем память под элементы
        //ПРОВЕРКА ОБЯЗАТЕЛЬНА! :
        //у нас n может иметь большое значение
        //и память может и не выделиться
        //не гнушаемся двумя строками проверки!!!
        if(!(a = (double *)malloc(n*sizeof(double))))
            printf("Allocation memory error\n");
        else
        {
            //Красивей всего пойти через for
            //он очень удобен для организации счётчика
            //и проверки даже по другому параметру нежели
            //величина счётчика
            //Проверяем не привысило ли значение j n
            //и одновременно смотрим не достигнт конец файла
            //не забываем что n может быть не совсем корректным
            //а программа не должна обламываться даже 
            //в случае некорректного значения либо ввода
            for(j = 0; !feof(f) && j < n; j = j + 1)
            {
                if(!fscanf(f,"%lf",&a[j]))
                    printf("Error read in.txt : iteration %d\n", i + 1);
                else
                if(i != j)//Наше условие все кроме a[i]
                    srArfm = srArfm + a[j];
            }
            if(a != NULL)
                free((void *)a);//Чистим память
            srArfm = srArfm/(n - 1);//Если кроме a[i] то и элементов не n а на 1 меньше
            //Вообще по хорошему там надо вместо n поставить j
        }
        fclose(f);//Закрываем файловый поток
        if(!(f = fopen("out.txt","w")))//Открываем файловый поток для записи
            printf("Error open out.txt\n");
        else
        {
            //В случае успешного открытия файла 
            //пробуем записать в него результат
            if(!fprintf(f, "%lf",srArfm))
                printf("Error write out.txt\n");
            else
                printf("Data saved: result = %lf\n",srArfm);
            fclose(f);//Закрываем файловый поток
        }
    }
    system("pause");
    return 0;
}

Объяснение кода листинга программы

  1. Объявление переменных и инициализация:
    • i, j, n (счетчики)
    • f (указатель на файловый поток)
    • a (указатель на массив)
    • srArfm (хранит среднее арифметическое)
  2. Открытие файла in.txt для чтения или вывод сообщения об ошибке.
  3. Чтение двух значений (i и n) из файла или вывод сообщения об ошибке.
  4. Выделение памяти под массив n элементов или вывод сообщения об ошибке.
  5. Организация цикла для чтения всех элементов массива, кроме a[i], и расчета их суммы.
  6. Закрытие файлового потока после чтения всех элементов.
  7. Открытие файла out.txt для записи или вывод сообщения об ошибке.
  8. Запись значения srArfm в файл out.txt или вывод сообщения об ошибке.
  9. Сохранение значения srArfm в файл out.txt или вывод сообщения об ошибке.
  10. Закрытие файлового потока после записи данных.
  11. Ввод команды system(pause) для приостановки работы программы до нажатия клавиши.
  12. Возврат 0, указывающий на успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы