如何计算最后100个数字池数量增加的平均值

时间:2014-01-09 07:16:48

标签: c algorithm math data-structures average

我有一个数据源。它每分钟给出一个数字。我想计算最后100个数字的平均值。我怎么用C做这个?

例如,输入为1,2,3,4, ... 150,然后我想获得50 . . . 150的平均值。

一分钟后,号码池变为1,2,3,4.....150,151,然后我需要得到51. . . 151的平均值,因为概念相同,得到最后100个数字来计算平均值。

我尝试使用列表结构,首先获取所有数字的总和,然后将第一个数字的总和减去count-100以获得最后100个数字。

这是我尝试过的代码:

#include <stdio.h>
#include <malloc.h>
#define N 5

int i,sum;

int main(void)
{
struct node //定义一个链表
{
    float num;  //链表的元素
    struct node *next;//下一个元素的指针
};
struct node *first=NULL;//第一个数据
struct node *current=NULL;//当前的数据
struct node *previous=NULL;//上一个数据

struct node *currentT=NULL;//
//    char temp='\0';

while (1==1)//循环输入数据,相当于每秒往链表中添加一个数据
{
    // printf("continue ?Y/N:  ");
    // scanf(" %c",&temp);

    // if (tolower(temp)=='n')
    //  break;
    current=(struct node*) malloc(sizeof(struct node));//获取链表的首地址
    if (first==NULL)//如果第一个数据为空就把当前的地址赋值给first
        first=current;
    if (previous!=NULL)//把当前的地址赋值给上一个数据的next指针
        previous->next=current;
    printf("please enter the num:");
    scanf("%f",&current->num);//输入数据
    current->next=NULL;//移动指针
    previous=current;

    currentT=first;//指针指向第一个数据
    float avg=0,sum=0,count=0;
    while (currentT!=NULL)//循环链表中所有的数据
    {
        printf("node's num is:%f \n",currentT->num);
        count=count+1;
        sum= sum+currentT->num;//求总和
        currentT=currentT->next;//指针下移

    }
    avg=sum/count;//求平均

    if(count>N)//如果链表长度大于N则减去链表前端的数据
    {
        currentT=first;//指针指向第一个数据
        int remove_count=0;
        while (currentT!=NULL)//循环链表中所有的数据
        {
            remove_count=remove_count+1;
            sum= sum-currentT->num;//求总和
            if(remove_count==count-N){//减到链表长度等于N时停止
                break;
            }
            currentT=currentT->next;//指针下移
        }
         avg=sum/N;//求平均
    }

    printf("sum is:%f \n",sum);

    printf("avg is:%f \n",avg);

}

return 0;
}

2 个答案:

答案 0 :(得分:2)

算法看起来很简单。保留在某个队列中输入的最后100个数字。 该队列在任何时刻都将包含100个元素。此外,您随时保留其总和S.当有新号码进入时,从队列中删除第一个号码,然后添加进入队列的新号码。然后通过减去第一个数字并添加新数字,重新计算这100个数字的和S.

S = S - aOldFirst + aNewLast;

我会使用动态结构(例如链表)来实现队列。

答案 1 :(得分:0)

下面是使用数组的循环队列的实现,以及在添加新元素时返回元素平均值的函数。当队列已满时,该函数将删除第一个元素。因此,您可以为每个输入调用此函数,它将返回当前元素的平均值。

//declarations
#define MAXSIZE 5
int cq[MAXSIZE]={0};
int front=-1,rear=-1;
float AverageForNewElement(int);

//function definition 
float AverageForNewElement(int item)
{
    static int Sum=0;
    if(front ==(rear+1)%MAXSIZE)
    {
        if(front==rear)
            front=rear=-1;
        else
            front = (front+1)%MAXSIZE;
        Sum=Sum-cq[front];
    }
    if(front==-1)
        front=rear=0;
    else
        rear=(rear+1)%MAXSIZE;
    cq[rear]=item;
    Sum=Sum+cq[rear];
    return ((float)Sum/MAXSIZE);
}