Найти среднее арифметическое всех чисел, кроме заданного - 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;
}
Объяснение кода листинга программы
- Объявление переменных и инициализация:
- i, j, n (счетчики)
- f (указатель на файловый поток)
- a (указатель на массив)
- srArfm (хранит среднее арифметическое)
- Открытие файла
in.txtдля чтения или вывод сообщения об ошибке. - Чтение двух значений (i и n) из файла или вывод сообщения об ошибке.
- Выделение памяти под массив n элементов или вывод сообщения об ошибке.
- Организация цикла для чтения всех элементов массива, кроме a[i], и расчета их суммы.
- Закрытие файлового потока после чтения всех элементов.
- Открытие файла
out.txtдля записи или вывод сообщения об ошибке. - Запись значения srArfm в файл
out.txtили вывод сообщения об ошибке. - Сохранение значения srArfm в файл
out.txtили вывод сообщения об ошибке. - Закрытие файлового потока после записи данных.
- Ввод команды system(
pause) для приостановки работы программы до нажатия клавиши. - Возврат 0, указывающий на успешное выполнение программы.