实现简单银行叫号模拟系统附代码(C版).docx
- 文档编号:5901311
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:15
- 大小:138.59KB
实现简单银行叫号模拟系统附代码(C版).docx
《实现简单银行叫号模拟系统附代码(C版).docx》由会员分享,可在线阅读,更多相关《实现简单银行叫号模拟系统附代码(C版).docx(15页珍藏版)》请在冰豆网上搜索。
实现简单银行叫号模拟系统(C++版)
一,问题描述
实现一个简单银行叫号模拟系统。
银行有三个窗口可以同时办理业务,当有用户到达银行时,首先选择则既要办理的业务,可以选择一种或多种。
系统计算办理此业务所需的时间并显示给用户,然后系统查看有无空闲的窗口,如果有,通知用户到一个空闲窗口办理,如果没有空闲窗口,则需安排用户到某个窗口等候,系统先计算每个队列中用户办理业务的总时间,经用户安排到时间最短的队列等候。
模拟输出多个用户办理业务的过程。
[实验目的]
1,深入理解队列的特性;
2,掌握使用队列实现某些问题
[实验内容及要求]
1,建立三个队列存放在三个窗口等待的用户。
2,建立业务表,描述银行能够办理的各项业务,以及办理业务所需时间
3,建立用户表,描述用户办理的业务,用户的状态等
4,可以随机产生用户进入银行的时间,让用户输入所需办理的业务
5,由于输入的数据量较大,可以采用文本文件存放需要输入的数据。
二,问题分析
要实现符合要求的银行模拟叫号系统,需要以下几个模块:
(1)业务模块,用来存放银行能够办理的各项业务;
(2)用户模块,用来存放用户信息,如:
用户名,到达银行时间,办理的业务及办理业务所需时间;(3)窗口模块,实现用户排队操作;(4)最佳窗口模块,实现选择出用户等候的用时最短窗口;(5)顶层的模拟模块,实现在一天的工作时间内工作状态的显示。
三,算法分析(假设银行一天工作的总时间为50)
四,实验结果
1,建立了两个dat文件,分别用来存储银行业务和顾客信息
(1)BankBusiness.dat(第一行表示业务名,第二行表示用时)
个人存取款
2
企业贷款
5
证券投资
6
结算业务
4
信用证业务
5
信托业务
3
信用卡业务
6
(2)Customer.dat(第一行表示顾客名,第二行表示进行的业务名,第三行表示顾客到达银行的时间)
顾客1
个人存取款
0
顾客2
企业贷款
5
顾客3
证券投资
10
顾客4
结算业务
15
顾客5
信用证业务
20
顾客6
信托业务
2
顾客7
信用卡业务
1
顾客10
个人存取款
3
顾客14
企业贷款
25
顾客13
证券投资
11
顾客8
结算业务
30
顾客9
信用证业务
35
顾客11
信托业务
49
顾客12
信用卡业务
23
顾客13
信用卡业务
27
顾客14
证券投资
32
顾客15
结算业务
46
2,实验结果截图
程序附录
#include
usingnamespacestd;
#include
#include
#include
#definemaxsize1024
#defineTotaltime50
template
classQueue//队列类
{
public:
TSequeue[maxsize];
intrear,front;
Queue(){rear=front=0;}
~Queue(){}
voidQuelen();//队列长度
voidSetNULL();//队列置空
intEmpty();//判断队列是否非空
intEnQueue(T);//入队
intDeQueue();//出队
};
template
voidQueue
:
SetNULL()//队列置空操作
{
rear=front=0;
}
template
intQueue
:
Empty()
{
if(rear==front)
return1;//空队列
elsereturn0;//非空队列
}
template
intQueue
:
EnQueue(Te)//入队操作
{
if(front==(rear+1)%maxsize)
{
cout<<"队列上溢";
return0;//插入失败
}
else{
rear=(rear+1)%maxsize;
Sequeue[rear]=e;
return1;//插入成功
}
}
template
intQueue
:
DeQueue()//出队操作,无需返回值带回队首元素
{
if(rear==front)
{
cout<<"队列下溢";
return0;//出队失败
}
else{
front=(front+1)%maxsize;
return1;//出队成功
}
}
//银行服务模拟
//建立银行业务类
classBusiness
{
public:
charOperation[50];
inttime;
Business()
{time=0;
}
};
classCustomer
{//顾客类
public:
charName[50];//顾客姓名
charBusi[50];//需要办理的业务
inttimeD;//到达银行的时间点
intwindow;//所属窗口队列
unsignedinttime;//服务时长
voidCalculating(Business[]);//计算所需服务时长
};
//字符串朴素模式识别算法
intIndex(charT1[],charT2[])
{
inti=1,j=1;//目标串从第一个字符开始与模式串的第一个字符开始进行比较
while(i<=50&&j<=8)
if(T1[i-1]==T2[j-1])
{
i++;j++;
}//继续比较后面的字符
else
{
i=i-j+2;j=1;
}//本趟不匹配,设置下一趟匹配的起始次序
if(j>8)
return1;//匹配成功
elsereturn(0);
}
voidCustomer:
:
Calculating(BusinessList[])//计算所需服务时长
{
time=0;
for(inti=0;i<50;i++)
if(Index(Busi,List[i].Operation))//字符串匹配,利用顺序串朴素匹配识别思想
time=time+List[i].time;
}
//寻找最短时间窗口
intbestwindow(Queue
{//为新到顾客确定最佳队列
inttimer[maxsize];
for(inti=0;i { timer[i]=0; for(intj=0;j<(windows[i].rear-windows[i].front+maxsize)%maxsize;j++) { timer[i]=timer[i]+windows[i].Sequeue[(j+windows[i].front+1)%maxsize].time;//计算当前每个窗口所需时间 } } cout<<"在时刻"< intminSize=timer[0],optiWin=0;//最优窗口 for(inti=1;i if(minSize>timer[i])//挑选出队列用时最短者 { minSize=(windows[i].rear-windows[i].front+maxsize)%maxsize; optiWin=i; } if((timer[optiWin]+now+Cus.time)>Totaltime)//如果从此时算起,排队的时间加上办业务的时间大于上班时间,今天则不予办理 return-1; else returnoptiWin;//返回最优窗口 } voidsimulator(intnWin,intservTime,CustomerCList[]) {//按指定窗口数,服务总时间模拟银行业务 Queue for(intnow=0;now { for(inti=0;i<50;i++)//检查是否有顾客到达 { if(CList[i].timeD==now) { //如果有顾客到达 CList[i].window=bestwindow(windows,nWin,now,CList[i]);//找出最佳(最短)的服务窗口 if(CList[i].window==-1) { cout<<"今天时间不足,柜台将不处理"< break; } windows[CList[i].window].EnQueue(CList[i]);//新顾客加入对应的队列 cout< break; } } for(inti=0;i if(! windows[i].Empty())//各非空队列 if(--(windows[i].Sequeue[windows[i].front+1].time)<=0)//队首顾客的服务时长减一个单位 windows[i].DeQueue();//服务完毕的顾客出队,由后继顾客接替 } } //主函数 voidmain() //初始化,将dat文件里的银行业务数据输入List[50]中 BusinessList[50]; charch[50]; stringstrtoint; fstreaminfile; inti=0; infile.open("BankBusiness.dat",ios: : in);//打开文件 if(! infile)//若打开失败,则输出"无法打开该文件" { cout<<"BankBusiness.datcan'topen.\n"; abort(); } cout<<"银行业务类型: "< while(! infile.eof())//输入业务表中的数据,并存入List[i]中 { i++;//换下一个业务 infile.getline((char*)&List[i].Operation,sizeof(List[i].Operation));//读第一行业务名 infile.getline((char*)&ch,sizeof(List[i].Operation));//读第二行业务时间 strtoint=ch; List[i].time=atoi(strtoint.c_str());//字符型转int型 cout< } infile.close();//关闭文件 //初始化,将dat文件中的顾客数据输入CList[50]中 CustomerCList[50]; fstreaminfile2; i=0; infile2.open("Customer.dat",ios: : in); if(! infile2) { cout<<"Customer.datcan'topen.\n"; abort(); } cout<<"(显示内置文件中的模拟顾客的信息: 顾客姓名,进行的业务,到达银行的时间,办业务所需的时间)"< while(! infile2.eof())//输入业务表中的数据,并存入List[i]中 { i++; infile2.getline((char*)&CList[i].Name,sizeof(CList[i].Name)); infile2.getline((char*)&CList[i].Busi,sizeof(CList[i].Name)); infile2.getline((char*)&ch,sizeof(CList[i].Name)); strtoint=ch; CList[i].timeD=atoi(strtoint.c_str()); CList[i].Calculating(List);//计算所需服务时长 cout< } infile2.close(); //仿真开始 simulator(3,Totaltime,CList); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 简单 银行 叫号 模拟 系统 代码