数据结构课程设计-理发馆仿真模拟(基于队列)_第1页
数据结构课程设计-理发馆仿真模拟(基于队列)_第2页
数据结构课程设计-理发馆仿真模拟(基于队列)_第3页
数据结构课程设计-理发馆仿真模拟(基于队列)_第4页
数据结构课程设计-理发馆仿真模拟(基于队列)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构课程设计理发馆仿真模拟(基于队列)问题描述(或者需求分析)理发馆一天的工作过程如下:

1)理发馆有N把理发椅,可同时为N位顾客进行理发。

2)理发师分三个等级(一级、二级、三级),对应不同的服务收费。

3)当顾客进门时,需选择某级别理发师,只要该级别的理发师有空椅,则可立即坐下理发,否则需排队等候。

4)一旦该级别的理发师有顾客理发完离去,排在队头的顾客便可开始理发。

5)若理发馆每天连续营业T分钟,求

(1)一天内顾客在理发馆内的平均逗留时间;

(2)顾客排队等候理发的队列长度平均值;

(3)营业时间到点后仍需完成服务的收尾工作时间;

(4)统计每天的营业额;

(5)统计每天不同级别理发师的创收。基本要求:1)模拟理发馆一天的工作过程:必须采用事件驱动的离散模型(参考教科书3.5节离散事件模拟p65);

2)每个顾客到达和下一顾客到达时间的间隔应是随机的;

3)理发师编号、理发师级别和每天的营业时间由用户输入;

4)某顾客挑选某一个级别的理发师而不得时,选第一个队列排队等待;

5)每个顾客进门时将生成三个随机数:

(1)durtime:进门顾客理发所需服务时间(简称:理发时间);

(2)intertime:下一顾客将到达的时间间隔(简称:间隔时间);

(3)select:服务选项。

6)服务收费:应包含服务时间和理发师级别两个因素。

7)除了输出统计的数据外,还需要显示理发馆的状态,可以采用文本方式(横向显示每张椅编号、理发师级别。纵向表示等待该理发师理发的排队长度)。算法设计思想:在实现技术上,假设当前temp每次将它加一表示过了一分钟,然后判断在这个时间单位中判断是否有人理发完毕,如果有将此座位上的num置为-1。然后判断是否有人可以接受服务,如果有判断是否有空椅子,如果有,则进入理发,否则将他入队。重复执行上面的过程,直到temp加到了其关门时间。顾客进门和出门这两个时刻发生的事情称“事件”,按事件的先后次序逐个处理事件的工作方式称“事件驱动模拟”。离散事件驱动模型的特点是只关注和刻画事物的状态变化(即事件),不关心变化的过渡过程。模型靠每一个事件引发其它事件的方式来维持运转。每个事件都有发生时间,模型的运转实际就是按事件发生时间顺序逐个处理事件,'处理'将产生新的事件。因此,建模的关键就是全面分析事物的主要特点,抽象出几种能反映本质的事件和它们之间的驱动关系。系统时间就是当前事件的事件发生时间,它不是等间隔变化而是跳跃变化的。程序中的数据结构及存储结构说明:顾客结构:typedefstruct{intnum;intcometime;intdurtime;intwaittime;}cutpeople;理发椅结构体:typedefstructcutnode{intnum;/*顾客编号*/intcometime;/*顾客到达时间*/structcutnode*next;}cutnode;/*队列的结点定义*/队列结构体:typedefstruct{cutnode*front;cutnode*rear;}cutqueue;/*队列的链式定义*/流程图:部分图示(程序运行截图)程序代码:#defineNUM100#defineERROR0#defineKONG-1#include<stdio.h>#include<math.h>#include<conio.h>typedefstruct{intnum;intcometime;intdurtime;intwaittime;}cutpeople;/*顾客信息结点的定义*/typedefstructcutnode{intnum;/*顾客编号*/intcometime;/*顾客到达时间*/structcutnode*next;}cutnode;/*队列的结点定义*/typedefstruct{cutnode*front;cutnode*rear;}cutqueue;/*队列的链式定义*/intinitqueue(cutqueue*d1){d1->front=(cutnode*)malloc(sizeof(cutnode));if(d1->front){d1->front->next=NULL;d1->rear=d1->front;}elsereturn(OVERFLOW);}/*初始化队列*/intenterqueue(cutqueue*d2,intcometime,intnum){cutnode*q;q=(cutnode*)malloc(sizeof(cutnode));if(q){q->cometime=cometime;q->num=num;q->next=NULL;d2->rear->next=q;d2->rear=q;}elsereturn(OVERFLOW);}/*入队列*/cutnodedeleted(cutqueue*d3){cutnode*a;cutnodep;a=d3->front->next;d3->front->next=a->next;etime=a->cometime;p.num=a->num;if(d3->rear==a)d3->rear=d3->front;free(a);return(p);}/*出队列*/intpdkong1(cutqueue*d4)/*判断队列是否为空*/{if(d4->front!=d4->rear)return(1);elsereturn(0);}voidinitundercut(cutpeople*undercut,intd5)/*数组undercut指的是理发店内的位子*/{inti;for(i=0;i<d5;i++){undercut[i].num=-1;/*若位子上没有人,则其num取值为-1*/undercut[i].cometime=-1;undercut[i].durtime=-1;undercut[i].waittime=-1;}}/*初始化理发店内的位子情况*/intpdkong2(cutpeople*undercut,intd6){intk=0;while(k<d6){if(undercut[k].num==-1)break;elsek++;}if(k>=d6)return(-1);elsereturn(k);}/*判断店内是否有空位子,若有,返回位置,否则返回0*/intpdtime(cutpeople*undercut,intd7,inttime,intv[20]){intb=0,i=0,j;for(j=0;j<20;j++)v[j]=-1;/*数组v装的是在此时刻同时理发完毕的人*/while(b<d7){if(undercut[b].cometime+undercut[b].waittime+undercut[b].durtime==time)v[i++]=b;b++;}}/*判断在time时刻是否有人已经理发完毕*/main(){intN,T,R;/*椅子数.总时间.随机数*/cutqueues;/*等待队列*/inttemp=0;/*时间计数器*/intnumber_custeromer=1;/*顾客总数*/intintertime;/*记录下一个顾客来的时间间隔*/intu[20],r,i,a;inttotallenth=0;cutnodez;cutpeople*undercut;floataverage_time,average_queuelength;undercut=(cutpeople*)malloc(N*sizeof(cutpeople));initundercut(undercut,N);initqueue(&s);printf("Pleaseshuruthechairs:");scanf("%d",&N);printf("Pleaseshuruyingyeshijian:");scanf("%d",&T);undercut[0].num=number_custeromer++;undercut[0].cometime=0;undercut[0].waittime=0;R=fabs(srand((unsigned)time(NULL)));/*产生随机数*/undercut[0].durtime=15+R%50;intertime=2+R%10;clrscr();/*清屏*/printf("numcometimedurtime\n");while(temp<=T||pdkong1(&s)){intertime--;temp++;pdtime(undercut,N,temp,u);if(u[0]!=-1)/*判断是否有理发完毕的人*/{for(r=0;r<20&&u[r]!=-1;r++){printf("%4d%4d%4d\n",undercut[u[r]].num,undercut[u[r]].cometime+undercut[u[r]].waittime,undercut[u[r]].durtime);undercut[u[r]].num=-1;if(pdkong1(&s)){z=deleted(&s);R=fabs(srand((unsigned)time(NULL)+temp));undercut[u[r]].durtime=15+R%50;undercut[u[r]].num=z.num;undercut[u[r]].cometime=etime;undercut[u[r]].waittime=etime;intertime=2+R%10;}}/*如果有理发完毕的人,并且队列不空,就出队*/}if(intertime==0)/*如果有人来理发了*/{R=fabs(srand((unsigned)time(NULL)+temp));intertime=2+R%10;if(T-temp>=intertime){i=pdkong2(undercut,N);/*判断是否有空位子*/if(i>=0){undercut[i].durtime=15+R%50;if(T-temp>=undercut[i].durtime)/*判断是否符合进入条件*/{undercut[i].num=number_custeromer++;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论