Код не может достичь желаемой точности, так как он использует float
вместо double
. @ Какой-то программист, чувак
Типично float
с точностью до 1 части в 2 23 . Для печати до 0.0000000001
лучше использовать double
, что обычно с точностью до 1 части в 2 53 .
#include<stdio.h>
int main(void) {
//float arr[n + 1], resarr[n + 1];
//float sum = 0;
double arr[n + 1], resarr[n + 1];
double sum = 0;
...
// scanf("%f", &arr[i]);
scanf("%lf", &arr[i]);
...
// float res = sum / (float) i;
double res = sum / i; // cast not needed as `sum` is `double`
...
}
Итерация с 1 не является идиоматической в C. Более распространенная итерация, начиная с 0.
size_t
лучше всего подходит для определения размера и индексации массива. int
может быть слишком узким. Конечно, с небольшими массивами это мало что меняет.
#include<stdio.h>
int main(void) {
printf("set:");
size_t n;
scanf("%zu", &n);
double arr[n], resarr[n];
double sum = 0;
for (size_t i = 0; i < n; i++) {
scanf("%lf", &arr[i]);
sum = arr[i] + sum;
double res = sum / (i+1);
resarr[i] = res;
}
for (size_t i = 0; i < n; i++) {
printf("%0.10f\n", resarr[i]);
}
return 0;
}
Более надежный код будет проверять ввод от пользователя, который гарантирует, что он действителен, распределять, а не использовать VLA, если n
разрешено иметь большой размер, сбрасывать вывод перед чтением и т. Д.
Обратите внимание, что массив arr[]
не нужен, просто один double
для ввода и sum
.