实现简单银行叫号模拟系统附代码(C版).docx
《实现简单银行叫号模拟系统附代码(C版).docx》由会员分享,可在线阅读,更多相关《实现简单银行叫号模拟系统附代码(C版).docx(15页珍藏版)》请在冰豆网上搜索。
![实现简单银行叫号模拟系统附代码(C版).docx](https://file1.bdocx.com/fileroot1/2023-1/2/46feb333-1e81-4ced-bfbb-1017fbde3ca1/46feb333-1e81-4ced-bfbb-1017fbde3ca11.gif)
实现简单银行叫号模拟系统(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(Queuewindows[],intnWin,intnow,CustomerCus)
{//为新到顾客确定最佳队列
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;iif(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*windows=newQueue[nWin];//为每一窗口创建一个队列
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;iif(!
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);
}