c语言银行业务模拟16页精选文档文档格式.docx
《c语言银行业务模拟16页精选文档文档格式.docx》由会员分享,可在线阅读,更多相关《c语言银行业务模拟16页精选文档文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
一是两个到达事件之间的间隔很短,而客户的交易时间很长;
另一个正好相反,设置两个到达事件的间隔时间很长,而客户之间交易的时间很短。
[实现提示]
事件有两类:
到达银行和离开银行。
初始时银行现存资金总额为Total。
开始营业后的第一个事件是客户到达,营业时间从0到Closetime。
到达事件发生时随机地设置各客户的交易时间和距下一次到达时间之间的时间间隔。
每个客户要办理的款项也是随机确定的,用负值和正值分别表示第一类和第二类业务。
变量Total、CloseTime以及上述两个随机量的上下界均交互地从终端读入,作为模拟参数。
两个队列和一个事件表均要用动态的存储结构实现。
注意弄清应该在什么条件下设置离开事件,以及第二个队列用怎样的存储结构实现可以获得较高的效率。
时间表是按照时间顺序有序的。
#include<
iostream>
string>
time.h>
usingnamespacestd;
inttotal;
//初始时银行现存资金总额
intcloseTime;
//营业结束时间
intarriveTime;
//两个到达事件之间的间隔上限
intdealTime;
//客户之间交易的时间上限
intdealMoney=5000;
//交易额上限
intcurrentTime=0;
//当前时间
inttotalTime=0;
//客户逗留总时间
intcounter=0;
//客户总数
intnumber=1;
//初始客户序列号+
structservice
{
intnum;
//客户号
stringtype;
//到达或离开
intbeginTime;
intendTime;
intmoney;
//正数为存款,负数为取款
service*next;
};
structqueue
{//队列
service*head;
service*rear;
voidpush(queue&
q,intd)
{//插入元素d为Q的新的队尾元素
service*temp=newservice;
temp->
money=d;
next=NULL;
if(NULL==q.head)
{//队列为空,初始化
q.head=temp;
q.rear=temp;
}//if
else
{//队列不为空,插入元素d
q.rear->
next=temp;
q.rear=q.rear->
next;
}//else
}
voidpop(queue&
q)
{//若队列不空,出对列函数
service*temp;
temp=q.head;
if(NULL==q.head->
next)
q.head=q.rear=NULL;
else
q.head=q.head->
deletetemp;
service*front(queue&
{//返回队首元素
returnq.head;
service*back(queue&
{//返回队尾元素
returnq.rear;
service*searchAndDel(queue&
q,intm)
{//在对列中寻找可处理元素
service*sign=q.head;
//标记头节点
while(NULL!
=q.head)
if((-(q.head->
money))<
m)
{//队首元素可以处理
if(q.head==q.rear)
q.head=q.rear=NULL;
returntemp;
{//队首元素出列
q.head=q.head->
//首节点后移一位,返回原首节点
}//while
{//队首元首不能被处理
if(q.head==q.rear){}
{//首节点移到队列尾部
next=q.head;
q.rear=q.rear->
q.head=q.head->
if(q.head==sign)//队列循环一周时停止
returnNULL;
boolstate=1;
//用于判断是否有窗口在处理
intcurrentTimeOfDeal=0;
inttheArriveTime=0;
queueeq;
//事件队列
queuefq;
//队列一
queuesq;
//对列二
//初始化三个队列
voidarrive()
{/*"
到达"
函数随机产生顾客,进入队列一
产生到达事件进入事件队列*/
push(fq,(rand()%(2*dealMoney)-dealMoney));
//随机产生顾客加入第一队列
back(fq)->
beginTime=currentTime;
num=number;
push(eq,(back(fq)->
money));
//将产生事件加入事件队列
back(eq)->
type="
;
++number;
voidputMoney()
{//存款函数
total+=front(fq)->
money;
//更新资金总额
push(eq,front(fq)->
money);
//加入事件队列离开
离开"
num=front(fq)->
num;
endTime=(front(fq)->
beginTime+rand()%dealTime+1);
++counter;
//更新客户总数
totalTime+=(back(eq)->
endTime-front(fq)->
beginTime);
//更新逗留时间
pop(fq);
//删除第一队列第一个业务
currentTimeOfDeal=back(eq)->
endTime;
state=0;
voidgetMoney()
{//取款函数
if((-fq.head->
money)>
total)
{//资金短缺加入第二队列
push(sq,front(fq)->
money);
back(sq)->
beginTime=front(fq)->
beginTime;
total+=back(fq)->
beginTime=0;
//更新客户总数
totalTime+=(back(eq)->
endTime-back(fq)->
beginTime);
service*temped;
intrandomTemp;
voidfindAndDeal()
{//在对列中寻找可处理元素,对其进行处理
while((temped=searchAndDel(sq,total))&
&
NULL!
=temped)
{//查找可处理取款
total+=temped->
push(eq,temped->
//加入事件队列训离开
num=temped->
randomTemp=rand()%dealTime+1;
endTime=currentTime+randomTemp;
currentTimeOfDeal+=randomTemp;
endTime-temped->
//更新逗留时间
deletetemped;
//删除节点
temped=NULL;
state=0;
intmain()
{
printf("
********************************************\n"
);
欢迎进入银行模拟系统\n"
1.开始模拟0.退出\n"
intn;
scanf("
%d"
&
n);
while(n==1)
srand(time(NULL));
//初始化随机函数
输入银行的初始存款:
\n"
total);