实现简单银行叫号模拟系统附代码(C版).docx

上传人:b****9 文档编号:5901311 上传时间:2023-01-02 格式:DOCX 页数:15 大小:138.59KB
下载 相关 举报
实现简单银行叫号模拟系统附代码(C版).docx_第1页
第1页 / 共15页
实现简单银行叫号模拟系统附代码(C版).docx_第2页
第2页 / 共15页
实现简单银行叫号模拟系统附代码(C版).docx_第3页
第3页 / 共15页
实现简单银行叫号模拟系统附代码(C版).docx_第4页
第4页 / 共15页
实现简单银行叫号模拟系统附代码(C版).docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实现简单银行叫号模拟系统附代码(C版).docx

《实现简单银行叫号模拟系统附代码(C版).docx》由会员分享,可在线阅读,更多相关《实现简单银行叫号模拟系统附代码(C版).docx(15页珍藏版)》请在冰豆网上搜索。

实现简单银行叫号模拟系统附代码(C版).docx

实现简单银行叫号模拟系统(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;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*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;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);

}

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

当前位置:首页 > 小学教育 > 语文

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

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