模拟服务台前的排队现象问题
【问题描述】
某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围内的随机值。设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。假定模拟数据已按客户到达的先后顺序依次存于某个正文数据文件中。对应每位客户有两个数据,到达时间和需要办理业务的时间。
【数据描述】
typedef struct{
int arrive;
int treat;//客户的信息结构
}QNODE;
typedef struct node{
QNODE data;
Struct node *next;//队列中的元素信息
}LNODE
LNODE *front,*rear;// 队头指针和队尾指针
【算法描述】
{ 设置统计初值;
设置当前时钟时间为0;
打开数据文件,准备读;
读入第一位客户信息于暂存变量中;
do{ //约定每轮循环,处理完一位客户
if(等待队列为空,并且还有客户){ //等待队列为空时
累计业务员总等待时间;
时钟推进到暂存变量中的客户的到达时间;
暂存变量中的客户信息进队;
读取下一位客户信息于暂存变量;
}
累计客户人数;
从等待队列出队一位客户;
将该客户的等待时间累计到客户的总等待时间;
设定当前客户的业务办理结束时间;
while(下一位客户的到达时间在当前客户处理结束之前){
暂存变量中的客户信息进队;
读取下一位客户信息于暂存变量;
}
时钟推进到当前客户办理结束时间;
}while(还有未处理的客户);
计算统计结果,并输出;
【C源程序】
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
typedef struct{
int arrive;
int treat; /*客户的信息结构*/
}QNODE;
typedef struct node{
QNODE data;
struct node *next; /*队列中的元素信息*/
}LNODE;
LNODE *front,*rear;/* 队头指针和队尾指针*/
QNODE curr,temp;
char Fname[120];
FILE *fp;
void EnQueue(LNODE **hpt,LNODE **tpt,QNODE e){
/*队列进队*/
LNODE *p=(LNODE *)malloc(sizeof(LNODE));
if(!p) exit(OVERFLOW); /*存储分配失败*/
p->data=e;
p->next=NULL;
if(*hpt==NULL) *tpt=*hpt=p;
else *tpt=(*tpt)->next=p;
}
int DeQueue(LNODE **hpt,LNODE **tpt,QNODE *cp){
/*链接队列出队*/
LNODE *p=*hpt;
if(*hpt==NULL) return 1;/*队空*/
*cp=(*hpt)->data;
*hpt=(*hpt)->next;
if(*hpt==NULL) *tpt=NULL;
free(p);
return 0;
}
void main()
{ int dwait=0,clock=0,wait=0,count=0,have=0,finish;
printf("/n enter file name:");
scanf("%s",Fname);/*输入装客户模拟数据的文件的文件名*/
if((fp=fopen(Fname, "r"))==NULL){ /*打开数据文件*/
printf("cannot open file %s",Fname);
return;
}
front=NULL;rear=NULL;
have=fscanf(fp, "%d%s",&temp.arrive,&temp.treat);
do{ /*约定每轮循环,处理一位客户*/
if(front==NULL && have==2){ /*等待队列为空,但还有客户*/
dwait+=temp.arrive-clock; /*累计业务员总等待时间*/
clock=temp.arrive; /*时钟推进到暂存变量中的客户的到达时间*/
EnQueue(&front,&rear,temp); /* 暂存变量中的客户信息进队*/
have=fscanf(fp, "%d%d",&temp.arrive,&temp.treat);
}
count++; /*累计客户人数*/
DeQueue(&front,&rear,&curr);/*出队一位客户信息*/
wait+=clock-curr.arrive; /*累计到客户的总等待时间*/
finish=clock+curr.treat;/*设定业务办理结束时间;*/
while(have==2 && temp.arrive<=finish){
/*下一位客户的到达时间在当前客户处理结束之前*/
EnQueue(&front,&rear,temp);/* 暂存变量中的客户信息进队*/
have=fscanf(fp, "%d%d",&temp.arrive,&temp.treat);
}
clock=finish; /* 时钟推进到当前客户办理结束时间*/
}while(have==2 || front!=NULL);
printf("结果:业务员等待时间%d/n客户平均等待时间%f/n",dwait,
(double)wait/count);
printf("模拟总时间:%d,/n客户人数:%d,/n总等待时间:%d/n",clock,
count,wait);
getch();
}/*main_end*/’
【测试数据】
设数据装在一个数据文件data.dat中,内容为:10 6 13 8
显示结果为:enter file name:data.dat
结果:业务员等待时间10
客户平均等待时间1.5
模拟总时间:24,客户人数:2, 总等待时间:3
【问题描述】
某银行有一个客户办理业务站,在单位时间内随机地有客户到达,设每位客户的业务办理时间是某个范围内的随机值。设只有一个窗口,一位业务人员,要求程序模拟统计在设定时间内,业务人员的总空闲时间和客户的平均等待时间。假定模拟数据已按客户到达的先后顺序依次存于某个正文数据文件中。对应每位客户有两个数据,到达时间和需要办理业务的时间。
【数据描述】
typedef struct{
int arrive;
int treat;//客户的信息结构
}QNODE;
typedef struct node{
QNODE data;
Struct node *next;//队列中的元素信息
}LNODE
LNODE *front,*rear;// 队头指针和队尾指针
【算法描述】
{ 设置统计初值;
设置当前时钟时间为0;
打开数据文件,准备读;
读入第一位客户信息于暂存变量中;
do{ //约定每轮循环,处理完一位客户
if(等待队列为空,并且还有客户){ //等待队列为空时
累计业务员总等待时间;
时钟推进到暂存变量中的客户的到达时间;
暂存变量中的客户信息进队;
读取下一位客户信息于暂存变量;
}
累计客户人数;
从等待队列出队一位客户;
将该客户的等待时间累计到客户的总等待时间;
设定当前客户的业务办理结束时间;
while(下一位客户的到达时间在当前客户处理结束之前){
暂存变量中的客户信息进队;
读取下一位客户信息于暂存变量;
}
时钟推进到当前客户办理结束时间;
}while(还有未处理的客户);
计算统计结果,并输出;
【C源程序】
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
typedef struct{
int arrive;
int treat; /*客户的信息结构*/
}QNODE;
typedef struct node{
QNODE data;
struct node *next; /*队列中的元素信息*/
}LNODE;
LNODE *front,*rear;/* 队头指针和队尾指针*/
QNODE curr,temp;
char Fname[120];
FILE *fp;
void EnQueue(LNODE **hpt,LNODE **tpt,QNODE e){
/*队列进队*/
LNODE *p=(LNODE *)malloc(sizeof(LNODE));
if(!p) exit(OVERFLOW); /*存储分配失败*/
p->data=e;
p->next=NULL;
if(*hpt==NULL) *tpt=*hpt=p;
else *tpt=(*tpt)->next=p;
}
int DeQueue(LNODE **hpt,LNODE **tpt,QNODE *cp){
/*链接队列出队*/
LNODE *p=*hpt;
if(*hpt==NULL) return 1;/*队空*/
*cp=(*hpt)->data;
*hpt=(*hpt)->next;
if(*hpt==NULL) *tpt=NULL;
free(p);
return 0;
}
void main()
{ int dwait=0,clock=0,wait=0,count=0,have=0,finish;
printf("/n enter file name:");
scanf("%s",Fname);/*输入装客户模拟数据的文件的文件名*/
if((fp=fopen(Fname, "r"))==NULL){ /*打开数据文件*/
printf("cannot open file %s",Fname);
return;
}
front=NULL;rear=NULL;
have=fscanf(fp, "%d%s",&temp.arrive,&temp.treat);
do{ /*约定每轮循环,处理一位客户*/
if(front==NULL && have==2){ /*等待队列为空,但还有客户*/
dwait+=temp.arrive-clock; /*累计业务员总等待时间*/
clock=temp.arrive; /*时钟推进到暂存变量中的客户的到达时间*/
EnQueue(&front,&rear,temp); /* 暂存变量中的客户信息进队*/
have=fscanf(fp, "%d%d",&temp.arrive,&temp.treat);
}
count++; /*累计客户人数*/
DeQueue(&front,&rear,&curr);/*出队一位客户信息*/
wait+=clock-curr.arrive; /*累计到客户的总等待时间*/
finish=clock+curr.treat;/*设定业务办理结束时间;*/
while(have==2 && temp.arrive<=finish){
/*下一位客户的到达时间在当前客户处理结束之前*/
EnQueue(&front,&rear,temp);/* 暂存变量中的客户信息进队*/
have=fscanf(fp, "%d%d",&temp.arrive,&temp.treat);
}
clock=finish; /* 时钟推进到当前客户办理结束时间*/
}while(have==2 || front!=NULL);
printf("结果:业务员等待时间%d/n客户平均等待时间%f/n",dwait,
(double)wait/count);
printf("模拟总时间:%d,/n客户人数:%d,/n总等待时间:%d/n",clock,
count,wait);
getch();
}/*main_end*/’
【测试数据】
设数据装在一个数据文件data.dat中,内容为:10 6 13 8
显示结果为:enter file name:data.dat
结果:业务员等待时间10
客户平均等待时间1.5
模拟总时间:24,客户人数:2, 总等待时间:3