理发馆模拟系统实验报告.docx
《理发馆模拟系统实验报告.docx》由会员分享,可在线阅读,更多相关《理发馆模拟系统实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
![理发馆模拟系统实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/97de3585-9340-4e5e-badd-60fbce78dd09/97de3585-9340-4e5e-badd-60fbce78dd091.gif)
软件工程2012-3班
程大川 201201051002
韩 笑 201201051009
2014年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文件,即理发馆经营状况的文件
六、源程序
##include
#include
#include
#include
usingnamespacestd;
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.time>b.time;
}
priority_queueelist;
queuebarber[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(tprintf("正在营业,欢迎光临!
\n");
else
printf("已经打烊,欢迎明天光临!
\n");
printf("今日已经接待顾客%d位,当前顾客数共%d位\n",answer.customNum,cusnum[1]+cusnum[2]+cusnum[3]);
if(type==0)
printf("\n顾客%s,服务等级:
%d级,进店理发\n",name,kk);
else
printf("\n顾客%s,服务等级:
%d级,离开店铺\n",name,kk);
printf("\n当前店内状态\n");
printf("**************************************\n");
printf("一级服务区理发师共%d位,顾客共%d位\n",setting.numBaber[1],cusnum[1]);
for(inti=0;i{
printf("理发师%8s 等待人数%3d",barberName[1][i],(int)barber[1][i].size());
if(kk==1&&i==ii)
if(type==0)
printf("<--%s",name);
else
printf("%s-->",name);
printf("\n");
}
printf("**************************************\n");
printf("\n**************************************\n");
printf("二级服务区理发师共%d位,顾客共%d位\n",setting.numBaber[2],cusnum[2]);
for(inti=0;i{
printf("理发师%8s 等待人数%3d",barberName[2][i],(int)barber[2][i].size());
if(kk==2&&i==ii)
if(type==0)
printf("<--%s",name);
else
printf("%s-->",name);
printf("\n");
}
printf("**************************************\n");
printf("\n**************************************\n");
printf("三级服务区理发师共%d位,顾客共%d位\n",setting.numBaber[3],cusnum[3]);
for(inti=0;i{
printf("理发师%8s 等待人数%3d",barberName[3][i],(int)barber[3][i].size());
if(kk==3&&i==ii)
if(type==0)
printf("<--%s",name);
else
printf("%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;ianswer.totalEarn+=answer.baberEarn[k][i];
fprintf(fp,"今天的营业额为%d元\n",answer.totalEarn);
fprintf(fp,"**************************************\n");
fprintf(fp,"一级服务区理发师共%d位\n",setting.numBaber[1]);
for(inti=0;ifprintf(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;ifprintf(fp,"理发师%8s 创收 %d元\n",barberName[2][i],answer.baberEarn[2][i]);
fprintf(fp,"**************************************\n");
fprintf(fp,"\n**************************************\n");
fprintf(fp,"三级服务区理发师共%d位\n",setting.numBaber[3]);
for(inti=0;ifprintf(fp,"理发师%8s 创收 %d元\n",barberName[3][i],answer.baberEarn[3][i]);
fprintf(fp,"**************************************\n\n");
fclose(fp);
system("statistics.txt");
printf("感谢使用!
\n");
system("pause");
}
voidgetConfig()
{
intu,v;
answer.customNum=0;
FILE*fp;
fp=fopen("config.csv","r");
fscanf(fp,"%*s");
fscanf(fp,"%*s,%d:
%d",&u,&v);
setting.openTime=u*3600+v*60;
fscanf(fp,"%*s,%d:
%d",&u,&v);
setting.endTime=u*3600+v*60;
for(inti=1;i<=3;i++)
fscanf(fp,"%*s,%d",&setting.numBaber[i]);
for(inti=1;i<=3;i++)
{
fscanf(fp,"%*s,%d",&setting.fee[i]);
fscanf(fp,"%*s,%d",&setting.addFee[i]);
}
fscanf(fp,"%*s,%d",&u);
setting.interTimeMo=2*u;
fscanf(fp,"%*s,%d",&u);
setting.durTimeMo=2*u;
fclose(fp);
}
voidgetname(char*s)
{
intn=rand()%5+3;
s[0]='A'+rand()%26;
for(inti=1;is[i]=rand()%26+'a';
s[n]=0;
}
voidinit()
{
getConfig();
while(!
elist.empty())elist.pop();
srand(time(NULL));
nowTime=setting.openTime;
answer.customNum
=answer.closeTime
=answer.totalEarn
=answer.totalLenth
=answer.totalTime=0;
for(inti=0;i<4;i++)cusnum[i];
for(intk=1;k<=3;k++)
for(inti=0;i{
answer.baberEarn[k][i]=0;
getname(barberName[k][i]);
}
}
intcharge(intlevel,inttime)
{
if(time<=1800)
returnsetting.fee[level];
else
returnsetting.fee[level]+(time-1800)/600*setting.addFee[level];
}
voidmakeEvent()
{
eventtem;
tem.time=nowTime+rand()%setting.interTimeMo+1;
tem.level=rand()%3+1;
tem.durTime=rand()%setting.durTimeMo+1;
nowTime=tem.time;
if(nowTime<=setting.endTime)
{
answer.customNum++;
answer.customNum++;
elist.push(tem);
cusnum[tem.level]++;
}
}
voidchoose(eventnow)
{
intminlen=0;
for(inti=0;i{
if(barber[now.level][i].size()minlen=i;
}
queue&q=barber[now.level][minlen];
customtem;
tem.inTime=now.time;
tem.durTime=now.durTime;
getname(tem.name);
if(q.empty())
tem.outTime=tem.inTime+tem.durTime;
else
tem.outTime=q.back().outTime+tem.durTime;
answer.totalLenth+=(int)q.size();
showStatus(tem.inTime,0,now.level,minlen,tem.name);
q.push(tem);
}
voidcustomOut(event&now)
{
for(intk=1;k<=3;k++)
for(inti=0;i{
queue&q=barber[k][i];
while(!
q.empty()&&q.front().outTime<=now.time)
{
answer.totalTime+=q.front().outTime-q.front().inTime;
answer.baberEarn[k][i]+=charge(k,q.front().durTime);
cusnum[k]--;
showStatus(q.front().outTime,1,k,i,q.front().name);
q.pop();
}
}
}
voidclose()
{
for(intk=1;k<=3;k++)
for(inti=0;i{
queue&q=barber[k][i];
while(!
q.empty())
{
answer.totalTime+=q.front().outTime-q.front().inTime;
answer.baberEarn[k][i]+=charge(k,q.front().durTime);
answer.closeTime=max(answer.closeTime,q.front().outTime);
cusnum[k]--;
showStatus(q.front().outTime,1,k,i,q.front().name);
q.pop();
}
}
}
voiddeal()
{
makeEvent();
while(!
elist.empty())
{
eventnow=elist.top();
elist.pop();
customOut(now);
choose(now);
makeEvent();
}
close();
showCount();
}
intmain()
{
show();
init();
deal();
return0;
}
七、测试结果
1、配置理发馆模拟系统参数
打开用excel打开config.csv文件,按照要求填写参数并保存
2、打开主文件,按任意键继续
3、理发店经营状况模拟开始,开门后7分39秒,第一位顾客Dtvvgu进店,需要的服务等级为1级,选择了等待人数最少的理发师之一Vldabo
4、08:
11:
46,顾客Devvgu理完发后离开店铺
5、陆陆续续的来往之后,在中午12:
56分,已经接待了32名顾客,当前店铺共4名顾客
6、忙碌一天后,晚上21:
13分,店铺已经不再接纳新客人,但店里仍然有2位顾客在理发
7、晚上21:
16分,最后一名顾客Kpwptc的离开,意味着终于可以放松放松了,按回车查看今天的营业状况吧。
8、为了方便查看,统计信息写到了文本文件里,并调用了系统函数打开,营业时间,逗留时间,等待长度,营业额,都很清楚地显示着,今天营业额达到了6130元,顾客均没有过多的等待,是生意兴隆但有服务到位的一天啊
9、关闭txt后,显示感谢使用,按任意键结束程序,模拟的理发馆经营状况,已经记录在了statistics.txt中,关闭程序后依然可以打开.
10、程序结束
红了么,网红 http:
//hongle.me/ c1m1mX5iUCa7