理发馆模拟系统实验报告.docx

上传人:b****9 文档编号:4590711 上传时间:2022-12-07 格式:DOCX 页数:26 大小:403.10KB
下载 相关 举报
理发馆模拟系统实验报告.docx_第1页
第1页 / 共26页
理发馆模拟系统实验报告.docx_第2页
第2页 / 共26页
理发馆模拟系统实验报告.docx_第3页
第3页 / 共26页
理发馆模拟系统实验报告.docx_第4页
第4页 / 共26页
理发馆模拟系统实验报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

理发馆模拟系统实验报告.docx

《理发馆模拟系统实验报告.docx》由会员分享,可在线阅读,更多相关《理发馆模拟系统实验报告.docx(26页珍藏版)》请在冰豆网上搜索。

理发馆模拟系统实验报告.docx

软件工程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(t

printf("正在营业,欢迎光临!

\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;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;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;i

fprintf(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;i

fprintf(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;i

s[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

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

当前位置:首页 > 初中教育 > 语文

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

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