1、select:服务选项 4服务收费:包含服务时间, 5除了输出统计的数据外还需要显示理发馆的状态, 三(测试数据:用户输入椅子数营业时间结合随机数进行测试。四(实现提示:本题设计两个抽象数据类型队列抽象数据类型:登录排队等候理发的顾客情况。每个元素应包括顾客进门时刻、理发所需时间。N把椅子对应N个队列。事件链表抽象数据类型:登录顾客进门事件、出门事件。每个事件应包括事件类型,进门事件类型为0出门事件类型按N把椅子所排队列分为为1、2、.N,和事件发生的时刻occurtime。为便于按事件发生先后顺序逐一处理事件事件表应按“时刻”有序。对理发椅需要进行编号。五(问题讨论:1) 顾客排队前可以在等
2、待该理发师的各个队列中选择最短队列。2, 更进一步,顾客可以选择最快队列,设计选最快的策略,。 3) 可以发挥创造性采用更直观漂亮的图形方式显示理发馆的状态。六(程序代码:#include stdlib.hstdio.hconio.h#define MAX 30000 /宏定义 #define TRUE 1 #define FALSE 0 #define R rand() float wait_length; /等待队列的总长度 int totalnum; /总共顾客数 float totaltime; /顾客理发所需总时间 int curtime; /当前时间 int chairnum; /
3、当前可用的椅子数 int addtime; /扫尾工作时间 typedef struct customer int NO; /编号 int intime; /进入理发店时间 int durtime;int intertime;int starttime; /开始理发时间 int leavetime; /离开理发店的时间 int serve_flag; /是否在理发 customer;customer cusMAX;typedef struct Qnode int num; /理发者的编号 struct Qnode *next;Qnode,*QueuePtr;typedef struct Que
4、uePtr front; /队头指针 QueuePtr rear; /队头指针 LinkQueue;LinkQueue W; /等待队列 void InitQueue(LinkQueue &Q) /队列初始化 Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode);Q.front-next=NULL; void outQueue(LinkQueue &Q) /输出队列中的元素 QueuePtr p;p=Q.front;while(p-next) p=p-next;printf(%d,p-num); );int Queue_Length(LinkQueue &
5、Q) /求等待队列的当前长度 int length=0;+length;return length;void EnQueue(LinkQueue &Q,int e) /将编号为e的顾客插入队尾 p=(QueuePtr)malloc(sizeof(Qnode);p-num=e;Q.rear-next=p;Q.rear=p;int DeQueue(LinkQueue &Q) /队头元素出队并用e返其编号 int e;p=Q.front-e=p-num;next=p-if(Q.rear=p) Q.rear=Q.front;free(p);return e;int QueueEmpty(LinkQue
6、ue &Q)/判断等待队列是否为空若空返回1 return(Q.front=Q.rear? TRUE:FALSE);void customer_serve(int n) /为顾客理发 cusn.starttime=curtime;cusn.leavetime=cusn.durtime+curtime;chairnum-; /当前可用理发椅数减1 cusn.serve_flag=TRUE;void customer_in() /顾客进入理发店 totalnum+;custotalnum.NO=totalnum;custotalnum.intime=curtime; /记录顾客进入时间 custo
7、talnum.durtime=15+R%50;custotalnum.intertime=2+R%10;if(QueueEmpty(W) & chairnum0) customer_serve(totalnum); /有空闲位置并无人参与竞争调用服务函数 else custotalnum.serve_flag=FALSE; /否则入队等待 EnQueue(W,totalnum);wait_length+=Queue_Length(W); /累计队长 void customer_leave(int n) /顾客离开理发店 cusn.serve_flag=FALSE;chairnum+;total
8、time=curtime-cusn.intime+totaltime; void list() /输出 float aver_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);一天内的营业额为:,tota
9、lnum+300);void main() int i,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;i0 & !QueueEmpty(W) /让等待队列中的人去理发customer_serve(DeQueue(W);if(custotalnum.intime+custotalnum.intertime)=curtime) /判断是否有人符合要进的条件 while(!QueueEmpty(W) curtime+;max=cus1.leavetime; /求出最后离开的顾客的离开时间 for(i=2;max = max cusi.leavetime ? cusi.leavetime : max;max) /队列为空继续为正在理发的顾客服务 (cusi.starttime+cusi.durtime=curtime)addtime=max-T;list();getch();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1