模拟理发馆的经营状况数据结构课程设计报告软件工程2012-3班程大川201201051002韩笑2012010510092014年1月2日一、问题描述理发馆一天的工作过程如下:1)理发馆有N把理发椅,可同时为N位顾客进行理发。2)理发师分三个等级(一级、二级、三级),对应不同的服务收费。3)当顾客进门时,需选择某级别理发师,只要该级别的理发师有空椅,则可立即坐下理发,否则需排队等候。4)一旦该级别的理发师有顾客理发完离去,排在队头的顾客便可开始理发。5)若理发馆每天连续营业T分钟,求(1)一天内顾客在理发馆内的平均逗留时间;(2)顾客排队等候理发的队列长度平均值;(3)营业时间到点后仍需完成服务的收尾工作时间;(4)统计每天的营业额;(5)统计每天不同级别理发师的创收。[基本要求]:1)模拟理发馆一天的工作过程:必须采用事件驱动的离散模型(参考教科书3.5节离散事件模拟p65);2)每个顾客到达和下一顾客到达时间的间隔应是随机的;3)理发师编号、理发师级别和每天的营业时间由用户输入;4)某顾客挑选某一个级别的理发师而不得时,选第一个队列排队等待;5)每个顾客进门时将生成三个随机数:durtime:进门顾客理发所需服务时间(简称:理发时间);intertime:下一顾客将到达的时间间隔(简称:间隔时间);select:服务选项。6)服务收费:应包含服务时间和理发师级别两个因素。7)除了输出统计的数据外,还需要显示理发馆的状态,可以采用文本方式(横向显示每张椅编号、理发师级别。纵向表示等待该理发师理发的排队长度)。[测试数据]:用户输入每位理发师编号、级别号和营业的时间,结合随机数进行测试。[实现提示]1)顾客进门和出门这两个时刻发生的事情称“事件”,按事件的先后次序逐个处理事件的工作方式称“事件驱动模拟”。离散事件驱动模型的特点是只关注和刻画事物的状态变化(即事件),不关心变化的过渡过程。模型靠每一个事件引发其它事件的方式来维持运转。每个事件都有发生时间,模型的运转实际就是按事件发生时间顺序逐个处理事件,'处理'将产生新的事件。因此,建模的关键就是全面分析事物的主要特点,抽象出几种能反映本质的事件和它们之间的驱动关系。系统时间就是当前事件的事件发生时间,它不是等间隔变化而是跳跃变化的。2)数据结构:本题设计两个抽象数据类型队列抽象数据类型:登录排队等候理发的顾客情况。每个元素应包括顾客进门时刻、理发师级别、理发所需时间。N把椅子对应N个队列。事件链表抽象数据类型:登录顾客进门事件、出门事件。每个事件应包括事件类型(进门事件类型为0,出门事件类型按N把椅子所排队列分为为1、2、...N)和事件发生的时刻occurtime。为便于按事件发生先后顺序逐一处理事件,事件表应按“时刻”有序。3)对理发椅需要进行编号,使不同级别的理发师与编号的理发椅相对应。二、系统简介2.1开发环境:Codeblocks12.11;2.2利用基础数据结构来完成对理发馆经营状况的模拟2.3整个系统共分为3个文件,分别为主文件BarberShop.exe、配置文件config.csv以及程序运行后产生的统计信息文件statistics.txt三、总体设计(模块框架图)五、使用说明使用前请先使用excel表格配置config.csv,根据每个参数的填写要求填写填写完成后,打开主文件BarberShop.exe,即可开始模拟理发馆经营状况模拟完成后,系统会生成statistics.txt文件,即理发馆经营状况的文件理发馆经营状况模拟系统生成进店事件显示店铺状态统计等待时间统计队列长度统计营业额模拟理发馆经营状况读取参数getConfig)统计信息showCount()退出开始六、源程序##includecstdio#includecstdlib#includectime#includequeueusingnamespacestd;intnowTime,cusnum[4];charbarberName[4][100][10];structsettings{intopenTime;intendTime;intcloseTime;intnumBaber[4];intfee[4];intaddFee[4];intinterTimeMo;intdurTimeMo;intcustomNum;}setting;structanswers{inttotalTime;inttotalLenth;intcustomNum;inttotalEarn;intcloseTime;intbaberEarn[4][100];}answer;typedefstruct{inttime;intdurTime;intlevel;}event;typedefstruct{charname[10];intinTime,outTime,durTime;}custom;booloperator(constevent&a,constevent&b){returna.timeb.time;}priority_queueeventelist;queuecustombarber[4][100];voidshow(){system(cls);printf(欢迎使用理发馆经营状况模拟系统\n);printf(使用此系统前请先配置config.csv文件,注意不要更改预设字段\n);printf(即将导入配置文件,);system(pause);}voidshowStatus(intt,inttype,intkk,intii,char*name){system(cls);printf(当前时间:%.2d:%.2d:%.2d当前状态:,t/3600,t%3600/60,t%60);if(tsetting.endTime)printf(正在营业,欢迎光临!\n);elseprintf(已经打烊,欢迎明天光临!\n);printf(今日已经接待顾客%d位,当前顾客数共%d位\n,answer.customNum,cusnum[1]+cusnum[2]+cusnum[3]);if(type==0)printf(\n顾客%s,服务等级:%d级,进店理发\n,name,kk);elseprintf(\n顾客%s,服务等级:%d级,离开店铺\n,name,kk);printf(\n当前店内状态\n);printf(**************************************\n);printf(一级服务区理发师共%d位,顾客共%d位\n,setting.numBaber[1],cusnum[1]);for(inti=0;isetting.numBaber[1];i++){printf(理发师%8s等待人数%3d,barberName[1][i],(int)barber[1][i].size());if(kk==1&&i==ii)if(type==0)printf(--%s,name);elseprintf(%s--,name);printf(\n);}printf(**************************************\n);printf(\n**************************************\n);printf(二级服务区理发师共%d位,顾客共%d位\n,setting.numBaber[2],cusnum[2]);for(inti=0;isetting.numBaber[2];i++){printf(理发师%8s等待人数%3d,barberName[2][i],(int)barber[2][i].size());if(kk==2&&i==ii)if(type==0)printf(--%s,name);elseprintf(%s--,name);printf(\n);}printf(**************************************\n);printf(\n**************************************\n);printf(三级服务区理发师共%d位,顾客共%d位\n,setting.numBaber[3],cusnum[3]);for(inti=0;isetting.numBaber[3];i++){printf(理发师%8s等待人数%3d,barberName[3][i],(int)barber[3][i].size());if(kk==3&&i==ii)if(type==0)printf(--%s,name);elseprintf(%s--,name);printf(\n);}printf(**************************************\n\n);system(pause);}voidshowCount(){system(cls);FILE*fp;fp=fopen(statistics.txt,w);fprintf(fp,忙碌的一天了,看看今天的经营状况吧\n\n);intu=setting.openTime,v=setting.endTime;fprintf(fp,今天的营业时间为%.2d:%.2d:%.2d--%.2d:%.2d:%.2d\n,u/3600,u%3600/60,u%60,v/3600,v%3600/60,v%60);v=answer.closeTime;fprintf(fp,关门时间为%.2d:%.2d:%.2d\n,v/3600,v%3600/60,v%60);intbabernum=setting.numBaber[1]+setting.numBaber[2]+setting.numBaber[3];fprintf(fp,今天理发是共%d位,共接待顾客%d位\n,babernum,answer.customNum);v=answer.totalTime/answer.customNum;fprintf(fp,每位顾客的平均逗留时间为00:%.2d:%.2d,平均等待人数为%d位,v/60,v%60,answer.totalLenth/answer.customNum);for(intk=1;k=3;k++)for(inti=0;isetting.numBaber[k];i++)answer.totalEarn+=answer.baberEarn[k][i];fprintf(fp,今天的营业额为%d元\n,answer.totalEarn);fprintf(fp,**************************************\n);fprintf(fp,一级服务区理发师共%d位\n,setting.numBaber[1]);for(inti=0;isetting.numBaber[1];i++)fprintf(fp,理发师%8s创收%d元\n,barberName[1][i],answer.baberEarn[1][i]);fprintf(fp,**************************************\n);fprintf(fp,\n**************************************\n);fprintf(fp,二级服务区理发师共%d位\n,setting.numBaber[2]);for(inti=0;isetting.numBaber[2];i++)fprintf(fp,理发师%8s创收%d元\n,barberName[2][i],answer.baberEarn[2][i]);fprintf(fp,**************************************\n);fprintf(fp,\n**************************************\n);fprintf(fp,三级服务