2016-02-26 11 views
1

Так сказать, мне дается список чисел: 8,4,5,3,2,1.
Среднее скользящее среднее этого списка: 8, 6, 5.7, 5, 4.4, 3.8.Как вывести первую скользящую среднюю в скользящую среднюю программу?

Моя программа использует этот алгоритм:
новый средний = (((старый средний * первая итерация) + номер следующего/(следующая итерация))

Проблема в том, моя программа выводит все скользящие средние EXCEPT для самого первого (это технически только первое число, потому что число, деленное на 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) 
+0

Попробуйте напечатать old_average вместо new_average ... – cleblanc

ответ

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; 
} 
+0

ничего себе. Я пытался понять это так долго. Большое вам спасибо – user5983028

+0

Правильный ответ. Единственный способ, который вы можете вычислить с использованием текущего среднего, - это умножить его, чтобы получить текущую сумму, поэтому более точно сохранить сумму в первую очередь. То, что делает OP, больше похоже на * фильтр *. –

+0

Можете ли вы помочь мне расширить мою программу? – user5983028