理发馆列队系统仿真新版Word文件下载.docx
- 文档编号:17407677
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:8
- 大小:74.60KB
理发馆列队系统仿真新版Word文件下载.docx
《理发馆列队系统仿真新版Word文件下载.docx》由会员分享,可在线阅读,更多相关《理发馆列队系统仿真新版Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
select:
服务选项
4>
服务收费:
包含服务时间,
5>
除了输出统计的数据外~还需要显示理发馆的状态,三(测试数据:
用户输入椅子数~营业时间~结合随机数进行测试。
四(实现提示:
本题设计两个抽象数据类型~队列抽象数据类型:
登录排队等候理发的顾客情况。
每个元素应包括顾客进门时刻、理发所需时间。
N把椅子对应N个队列。
事件链表抽象数据类型:
登录顾客进门事件、出门事件。
每个事件应包括事件类型,进门事件类型为0~出门事件类型按N把椅子所排队列分为为1、2、...N,和事件发生的时刻occurtime。
为便于按事件发生先后顺序逐一处理事件~事件表应按“时刻”有序。
对理发椅需要进行编号。
五(问题讨论:
1)顾客排队前~可以在等待该理发师的各个队列中~选择最短队列。
2,更进一步,顾客可以选择最快队列,设计选最快的策略,。
3)可以发挥创造性~采用更直观漂亮的图形方式显示理发馆的状态。
六(程序代码:
#include"
stdlib.h"
stdio.h"
conio.h"
#defineMAX30000//宏定义
#defineTRUE1
#defineFALSE0
#defineRrand()
floatwait_length;
//等待队列的总长度inttotalnum;
//总共顾客数floattotaltime;
//顾客理发所需总时间
intcurtime;
//当前时间intchairnum;
//当前可用的椅子数intaddtime;
//扫尾工作时间typedefstructcustomer
{
intNO;
//编号
intintime;
//进入理发店时间
intdurtime;
intintertime;
intstarttime;
//开始理发时间
intleavetime;
//离开理发店的时间
intserve_flag;
//是否在理发}customer;
customercus[MAX];
typedefstructQnode
intnum;
//理发者的编号
structQnode*next;
}Qnode,*QueuePtr;
typedefstruct
QueuePtrfront;
//队头指针
QueuePtrrear;
//队头指针}LinkQueue;
LinkQueueW;
//等待队列voidInitQueue(LinkQueue&
Q)//队列初始化{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));
Q.front->
next=NULL;
}
voidoutQueue(LinkQueue&
Q)//输出队列中的元素{
QueuePtrp;
p=Q.front;
while(p->
next)
p=p->
next;
printf("
%d"
p->
num);
"
);
intQueue_Length(LinkQueue&
Q)//求等待队列的当前长度
intlength=0;
++length;
returnlength;
voidEnQueue(LinkQueue&
Q,inte)//将编号为e的顾客插入队尾
p=(QueuePtr)malloc(sizeof(Qnode));
p->
num=e;
Q.rear->
next=p;
Q.rear=p;
intDeQueue(LinkQueue&
Q)//队头元素出队~并用e返其编号
inte;
p=Q.front->
e=p->
num;
next=p->
if(Q.rear==p)
Q.rear=Q.front;
free(p);
returne;
intQueueEmpty(LinkQueue&
Q)//判断等待队列是否为空~若空返回1
return(Q.front==Q.rear?
TRUE:
FALSE);
voidcustomer_serve(intn)//为顾客理发
cus[n].starttime=curtime;
cus[n].leavetime=cus[n].durtime+curtime;
chairnum--;
//当前可用理发椅数减1
cus[n].serve_flag=TRUE;
voidcustomer_in()//顾客进入理发店{
totalnum++;
cus[totalnum].NO=totalnum;
cus[totalnum].intime=curtime;
//记录顾客进入时间
cus[totalnum].durtime=15+R%50;
cus[totalnum].intertime=2+R%10;
if(QueueEmpty(W)&
&
chairnum>
0)
customer_serve(totalnum);
//有空闲位置并无人参与竞争~调用服务函数
else
cus[totalnum].serve_flag=FALSE;
//否则入队等待
EnQueue(W,totalnum);
wait_length+=Queue_Length(W);
//累计队长
voidcustomer_leave(intn)//顾客离开理发店{
cus[n].serve_flag=FALSE;
chairnum++;
totaltime=curtime-cus[n].intime+totaltime;
}
voidlist()//输出{
floataver_serve_time,aver_wait_len;
//顾客平均等待时间~顾客平均等待长度
aver_serve_time=totaltime/totalnum;
aver_wait_len=wait_length/totalnum;
一天内顾客在理发馆内的平均逗留时间:
%f\n"
aver_serve_time);
顾客排队等候理发的队列长度平均值:
aver_wait_len);
营业时间到点后仍需完成服务的收尾工作时间:
%d\n"
addtime);
一天内的营业额为:
totalnum+300);
voidmain()
inti,N,T,max;
curtime=0,totaltime=0,totalnum=0,wait_length=0;
理发店的椅子数:
scanf("
&
N);
chairnum=N;
请输入营业时间(分钟):
T);
InitQueue(W);
customer_in();
while(curtime++<
T)//当前时间属于营业时间~允许顾客进入
for(i=1;
i<
=totalnum;
i++)
{//判断有没有人离开
if((cus[i].serve_flag==TRUE)&
(cus[i].leavetime==curtime))
customer_leave(i);
while(chairnum>
0&
!
QueueEmpty(W))//让等待队列中的人去理发
customer_serve(DeQueue(W));
if((cus[totalnum].intime+cus[totalnum].intertime)==curtime)
//判断是否有人符合要进的条件
while(!
QueueEmpty(W))
curtime++;
max=cus[1].leavetime;
//求出最后离开的顾客的离开时间
for(i=2;
max=max<
cus[i].leavetime?
cus[i].leavetime:
max;
max)//队列为空~继续为正在理发的顾客服务
(cus[i].starttime+cus[i].durtime==curtime))
addtime=max-T;
list();
getch();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理发馆 列队 系统 仿真 新版
![提示](https://static.bdocx.com/images/bang_tan.gif)