return OK; }
//若队列1不空,则删除Q1的队头元素,并用en返回其值 status DeQueue1() { Queue1 p;
if(Q1.front==Q1.rear) return ERROR; p=Q1.front->next;
en.arrivetime=p->data.arrivetime; en.OccurTime=p->data.OccurTime; en.NType=p->data.NType; en.duration=p->data.duration; en.money=p->data.money; Q1.front->next=p->next;
if(Q1.rear==p) Q1.rear=Q1.front; //只有一个人时 free(p);
return OK; }
//若队列2不空,则删除Q2的队头元素,并用en1返回其值 status DeQueue2() { Queue2 p;
if(Q2.front==Q2.rear)return ERROR; p=Q2.front->next;
en1.arrivetime=p->data.arrivetime; en1.duration=p->data.duration; en1.money=p->data.money; Q2.front->next=p->next;
if(Q2.rear==p) Q2.rear=Q2.front; //只有一个人时 free(p);
return OK; }
//营业时间结束,全部客户离开银行 void free_system() { destroyqueue1(); destroyqueue2(); } //产生随机数
status rand_ar(int *intertime,long int *money, int *duration,int *NType)
{ *intertime=rand()%INTERTIME+1; //下个客户到达的时间间隔,不大于INTERTIME *money=rand()%MONEY+1; //每个顾客办理的款数,不大于MONEY *duration=rand()%DURATION+1; //客户办理业务所要时间,不大于DURATION *NType=rand()%2; //事件类型分为0和1两种 return OK; }
void OpenForDay() { //初始化操作 printf(\请输入银行的初始存款:\ scanf(\
printf(\请输入银行的营业时间(分钟):\ scanf(\
printf(\请输入最大到达时间间隔(分钟):\
scanf(\
printf(\请输入最大的处理时间(分钟):\ scanf(\
total_time=0; //客户逗留总时间(初始值) number=0; //办理业务的次序(初始值) InitQueue1(); //初始化队列1 InitQueue2(); //初始化队列2 en.arrivetime=0; //到达时间 en.OccurTime=0; //事件发生时间 en.NType=0; //事件类型,暂时值 en.money=0; //交易金额,暂时值 en.duration=0; //办理业务时间,暂时值 EnQueue1(); //事件进队列 } //查找上一离开事件的发生时间 int find_leave() { Queue1 p; int i=0;
p=Q1.front->next; while(p!=NULL) { if(p->data.NType!=0) i=p->data.OccurTime; p=p->next; } return i; } void CustomerArrived() { int intertime; int i; time1=en.OccurTime; rand_ar(&intertime,&(en.money), &(en.duration),&(en.NType));//设置一离开事件插入事件表 en.NType++; //0变1,1变2 i=find_leave(); //查找上一离开事件的发生时间 if(i==0) //第一位顾客 en.OccurTime=en.arrivetime+en.duration; else if(i>=en.arrivetime)//本事件到达时上一事件还未离开 en.OccurTime=i+en.duration; //则此事件的离开时间=上一事件的离开时间+本事件处理时间 else //上一事件离开之后,本事件才到达
en.OccurTime=en.arrivetime+en.duration;//则此事件的离开时间=本事件到达时间+本事件处理时间 EnQueue1(); //设置下一用户到达事件插入队列1 en.arrivetime=en.arrivetime+intertime; //下一客户到达时间 en.OccurTime=en.arrivetime; en.NType=0; //暂时值 en.money=0; //暂时值 en.duration=0; //暂时值 EnQueue1(); }
//返回队列2的长度 int QueueLength_q2() { int i=0; Queue2 p;
p=Q2.front->next; while(p) { i++;
p=p->next; } return i; }
//顺序检查队列2是否有满足条件者 status check_q2() { int i,j,z=0;
i=QueueLength_q2(); //用i返回队列2长度 for(j=1;j<=i;j++)
{ DeQueue2(); //队列2出队,用en1返回其值
if(en1.money<=total_money) //若队列2出队元素的要交易的金额<=银行现存金额,则可以办理
{ if(time1>closetime)
{ printf(\ } else{ time1=time1+en1.duration; //更新系统当前时间 use_time=time1-en1.arrivetime; total_time+=use_time; //更新逗留时间 total_money-=en1.money; //更新资金总额 number++; //更新实现交易的客户数 printf(\money)); } } else { //若队列2出队元素的要交易的金额>银行现存金额,不能办理
if(time1>closetime)
{ printf(\ else{ EnQueue2(); //继续插入队列2的队尾,继续等待 } } } return OK; }
//队列1离开事件减duration(办理业务时间) int cut_duration(int e) //e即形参办理业务的时间 { Queue1 p,q,r; ElemType1 en; p=Q1.front->next; r=Q1.front; if(p) {if(p->data.NType!=0) { q=p->next; r->next=q; //删除结点 en.arrivetime=p->data.arrivetime; //到达时间 en.OccurTime=p->data.OccurTime-e; //事件发生时间 en.NType=p->data.NType; //事件类型
en.duration=p->data.duration; //办理业务时间 en.money=p->data.money; //数额 free(p); EnQueue1(); } } return OK; }
void CustomerDeparture() { int i;
i=en.NType; //业务类型,1表示存款,2表示取款 time1=en.OccurTime-en.duration; if(i==OK) //是否是办理存款 { if(en.OccurTime>closetime) //营业结束,全部客户离开银行 free_system(); else //营业时间没有结束,继续办理 { use_time=en.OccurTime-en.arrivetime; total_time+=use_time; //更新逗留的总时间 total_money=total_money+en.money; //更新资金总额 number++; //更新服务的客户数 time1=en.OccurTime; //更新系统当前时间
printf(\n.money); check_q2(); //检查队列2是否有满足条件者 } } else //办理取款 { if(en.money>total_money) //办理取款,当申请金额不能满足时,离开队列1进入队列2等待 { cut_duration(en.duration);//从队列1中删除该结点 en1.arrivetime=en.arrivetime; en1.duration=en.duration; en1.money=en.money; EnQueue2(); //进入队列2继续等待 } else //办理取款,当能满足所申请金额时进行队列1 { if(en.OccurTime>closetime) //营业结束,全部客户离开银行 free_system(); else
{ use_time=en.OccurTime-en.arrivetime;//顾客所用时间=事件发生时间-事件到达时间 total_time+=use_time; //更新逗留的总时间 total_money-=en.money; //更新资金总额 time1=en.OccurTime; //更新系统当前时间
number++; //更新客户总数
printf(\
en.money); } } } }
void main()
{ cout<<\ cout<<\欢迎使用银行业务模拟系统-------------- \ cout<<\ cout<<\姓名:钟永平----------------------- \
cout<<\学号: 200905030325 **************\ cout<<\班级:计科3班----------------------\ cout<<\ cout<<\请选择开始或退出:\ cout<<\开始银行业务模拟系统\ cout<<\退出程序\ int n; cin>>n; while(n==1) { OpenForDay(); //初始化操作 cout<<\ cout<<\ while(Q1.front) { DeQueue1(); //队列1出队列,并用en返回值 if(en.NType==0) //en.NType等于0表示客户到达,1表示客户离开 CustomerArrived(); //处理客户到达事件 else
CustomerDeparture(); //处理客户离开事件,业务类型en.NType等于1表示存款,2表示取款 } printf(\营业结束后银行现存资金总额(元): %ld\\n\ printf(\营业时间内实现交易的客户数(人): %d\\n\ printf(\客户在银行逗留的总时间(分钟): %d\\n\ printf(\客户在银行的平均逗留时间(分钟): %f\\n\ cout<<\ cout<<\以上为模拟结果!请继续选择继续或退出:\ cout<<\继续模拟\ cout<<\退出程序\ int n; cin>>n; if(n==0) { cout<<\谢谢使用本系统,再见!\ break; } } }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数据结构课程设计报告---银行业务模拟(2)在线全文阅读。
相关推荐: