我有一个数据源。它每分钟给出一个数字。我想计算最后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",¤t->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;
}
答案 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);
}