Найти среднее арифметическое всех чисел, кроме заданного - 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, указывающий на успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д