理发馆列队系统仿真新版Word文件下载.docx

上传人:b****5 文档编号:17407677 上传时间:2022-12-01 格式:DOCX 页数:8 大小:74.60KB
下载 相关 举报
理发馆列队系统仿真新版Word文件下载.docx_第1页
第1页 / 共8页
理发馆列队系统仿真新版Word文件下载.docx_第2页
第2页 / 共8页
理发馆列队系统仿真新版Word文件下载.docx_第3页
第3页 / 共8页
理发馆列队系统仿真新版Word文件下载.docx_第4页
第4页 / 共8页
理发馆列队系统仿真新版Word文件下载.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

理发馆列队系统仿真新版Word文件下载.docx

《理发馆列队系统仿真新版Word文件下载.docx》由会员分享,可在线阅读,更多相关《理发馆列队系统仿真新版Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。

理发馆列队系统仿真新版Word文件下载.docx

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();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1