如何在滚动平均程序中输出第一个滚动平均值?

时间:2016-02-26 21:28:52

标签: c moving-average

所以说我给出了一个数字列表:8,4,5,3,2,1。
该列表的滚动平均值为:8,6,5.7,5,4.4,3.8。

我的程序使用此算法:
new average =(((旧的平均值*第一次迭代)+下一个数字/(下一次迭代))。

问题是:我的程序输出所有的运行平均值除了第一个(技术上只是第一个数字,因为数字除以1就是那个数字)。它还在最后输出一个随机数。如何修复我的算法以将第一个平均值与所有其他运行平均值相结合?旁注:在算法中,第一个“旧平均值”是第一个数字本身。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
    int i,n, input_cases, x;
    double numbers[100]; double previous[100];
    double mean[100]; double old_average[100]; double new_average[100];
    double *results = malloc(input_cases*sizeof(double));

    printf("Total amount of numbers: ");
        if (scanf("%d", &n) != 1) {  /* validates input */
        fprintf (stderr, "error: invalid input.\n");
        return 1;
    }
        for (i=0; i<n; i++){
            scanf("%lf", &numbers[i]);
            }
            old_average[0] = numbers[0];
        for (i=0; i<n; i++){

            new_average[i] = (((old_average[i] * (i+1)) + numbers[i+1]) / (i+2));
            old_average[i+1]=new_average[i];
            printf("%lf\n", new_average[i]);
        }


    return 0;
}

这是我的程序使用上面的示例输入/输出的内容:

Input:
8
4
5
3
2
1
Output:
6.0 (This is the SECOND running average, not the first)
5.666667
5.000000
4.400000
3.830000
3.2857514 (This is the random number that doesn't belong)

1 个答案:

答案 0 :(得分:1)

这是一个应该做你想要的简化版本。它使用运行总和而不是之前的平均值,无需保持乘法和除法,因此结果将更准确:

#include <stdio.h>

int main() {
    int i, n;
    double numbers[100];
    double sum, avg;

    printf("Total amount of numbers: ");
    if (scanf("%d", &n) != 1) {  /* validates input */
        fprintf(stderr, "error: invalid input.\n");
        return 1;
    }

    for (i=0; i<n; i++) {
        scanf("%lf", &numbers[i]);
    }

    sum = 0.0;
    for (i=0; i<n; i++) {
        sum += numbers[i];
        avg = sum / (i+1);
        printf("%lf\n", avg);
    }

    return 0;
}