




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课 程 设 计 报 告 题 目: 银行业务模拟 学院(系): 数学与计算科学学院 班 级: 11级信息与计算科学4班 学生学号: 1107020404 姓 名: 石站锋 指导教师: 彭叶辉 2013年 6月28 日目 录摘要2一、需求分析2二、概要设计3三、详细设计31、预定义和定义结构体 32、基本操作的算法描述63、测试界面操作提示 84、不断进入队列,出队列,时间的更新,总金额的更新 95、营业结束时判断是否为所有客户服务,并输出最后的银行总金额 9四、设计和调试分析10五、用户手册11六、测试结果11七、设计心得14八、参考文献14九、附录1411 摘 要 在日常生活中,我们经
2、常会遇到许多为了维护社会正常秩序而需要排队的情况,这样一类活动的模拟程序通常需要用到队列和线性表之类的数据结构,因此是队列的典型应用例子之一,而这次实验的题目银行业务的模拟程序就正是这样一个典型的例子。队列是一种先进先出的线性表,它只允许在表的一端插入,而在另一端删除元素。在队列中允许插入的一端叫做队尾,允许删除的一端则称为队头。我们需要编写一个程序已模拟银行的这种各种业务活动,并计算一天中客户在银行逗留的平均时间。这是一个离散事件驱动模拟程序。这也是一个的操作系统中的排队问题。假设某银行有3个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个
3、窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(客户进入时间使用随机函数产生),如果某个窗口的业务员正空闲,则可上前办理业务。关键词:排队、队列、先进先出、离散事件驱动模拟程序、2 一、需求分析 程序中处理的对象主要是“事件”,事件的主要信息是事件类型和事件发生的时刻。算法中处理的事件有两类:一类是客户到达事件,另一类是客户离开事件。前一类事件发生的时间随客户到来自然形成,后一类事件发生时刻则由客户事物所需时间和等待所耗时间而定。由于程序驱动是按事件发生时刻的先后顺序进行,则时间应是有序表,其主要操作是插入和删除事件。 由于在实际的银行中,客
4、户到达的时刻及其办理事物所需时间都是随机的,在模拟中可用随机数代替。客户到达时间时需产生两个随机数,其一为此时刻到达的客户办理事务所需时间solvetime;其二为下一客户将到达的时间间隔waitTime,假设当前事件发生的时刻为occurtime,则下一个客户到达事件发生的时刻为occurtime+waitTime。由此应产生一个新的客户到达事件插入事件表。将客户到达事件插入事件表,刚到达的客户则插入到当前所含元素最少的队列中。客户离开事件的处理比较简单。首先计算该客户在银行逗留时间,然后从队列中删除该客户后查看队列是否空,若不空则设定一个新的队头客户离开此事件。 当然其中涉及到存取款功能,
5、测试窗口会出现很多提示信息。测试出来的结果相应的也会很全面。 界面要求使用VC+6.0的运行环境。二、概要设计 1、队列抽象数据类型的定义如下:ADT Queue数据对象:D=ai|aiElemSet, i=1,2, ,n, n0数据关系:R1=<ai-1,ai>|ai-1,aiD, i=1,2, ,n 约定a1为队列头,an为队列尾。基本操作: InitQueue( &Q ) 操作结果:构造一个空队列Q。 DestroyQueue ( &Q ) 初始条件:队列Q已存在。 操作结果:销毁队列Q。 ClearQueue ( &Q ) 初始条件:队列Q已存在。
6、操作结果:将Q清为空队列。 QueueEmpty( Q ) 初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回TRUE,否则返回FALSE。 QueueLength( Q ) 初始条件:队列Q已存在。 操作结果:返回Q的数据元素个数,即队列的长度。 GetHead( Q, &e ) 初始条件:队列Q已存在且非空。 操作结果:用e返回Q的队头元素。 EnQueue( &Q, e ) 初始条件:队列Q已存在。 操作结果:插入元素e为Q的新的队尾元素。 DeQueue( &Q, &e ) 初始条件:队列Q已存在且非空。 操作结果:删除Q的队头元素,并用e返回其值
7、。QueueTraverse( Q, visit() ) 初始条件:队列Q已存在且非空。 操作结果:从队头到队尾依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。ADT Queue2、本程序调用的函数如下:void Enterqueue1(Event m);将事件m插入队尾void solvequeue1();办理银行存款业务void solvequeue2(); 办理银行取款业务printf("* 早上九点开业,欢迎光临 *n");/打印输出srand(unsigned)time( NULL );/随机产生时间3、 主函数void main
8、()cout<<"请输入银行总资金(元)和营业总时间(分钟):"<<endl;cin>>total_money>>closetime; cout<<"请输入存钱的最大值(元)和取钱的最大值(元)"<<endl; cin>>max_cunqian>>max_qvqian;cout<<"请输入事件的解决时间最大值(分钟)和客户的间隔时间的最大值(分钟)"<<endl; cin>>max_solve_time&
9、gt;>max_intertime_time;system("cls");printf("* 早上九点开业,欢迎光临 *n");cout<<" ="<<endl;cout<<" 欢迎使用银行业务模拟系统n"cout<<" -"<<endl;cout<<" 姓名:石站锋 "<<endl;cout<<" 学号:1107020404"<<endl;c
10、out<<" 班级:信计四班 "<<endl; cout<<" ="<<endl;cout<<"银行每天开业总资金为"<<total_money<<"元. 每日营业时间为"<<closetime<<"分钟."<<endl;Event temp; int intertime=0,n=1,i;intdurtime;int money;int waitTime=0; srand(un
11、signed)time( NULL );/随机产生时间 intertime = rand() % max_intertime_time;ertime = intertime;close_time = ertime+close_time;temp.arriveTime = close_time;money =rand()%(max_cunqian+max_qvqian)-max_qvqian;temp.money=money;solveTime = rand() % max_solve_time;temp.solveTime =durtime;temp.n=n;E
12、nterqueue1(temp);solvequeue1();/system("pause");for(;) intertime = rand() % max_intertime_time;ertime = intertime;close_time = ertime+close_time;temp.arriveTime = close_time;if (close_time>closetime) cout<<"*银行营业结束,谢谢光临*n"cout<<"今天来了"<&
13、lt;n<<"个顾客,"<<endl;if(q2.size()!=0)cout<<"未能给"<<q2.size()<<"位顾客提供服务,很抱歉!"<<endl;elsecout<<"为全部的顾客提供的服务,欢迎再次光临!"<<endl;cout<<"银行余额为"<<total_money<<endl;break; i=rand()%2;if(i=0)money =r
14、and()%max_cunqian;elsemoney=-rand()%max_qvqian;temp.money=money; solveTime = rand() % max_solve_time;temp.solveTime =durtime;n+;temp.n=n; Enterqueue1(temp);solvequeue1();/system("pause");三、详细设计1、预定义和定义结构体#include <iostream>#include "list"#include "queue"#include &
15、quot;time.h"using namespace std;void solvequeue1();/办理银行存款业务队列void solvequeue2();/办理银行取款业务队列class Eventpublic:int n; /客户的位子int money ; /交易金额intdurtime;/处理需要的时间int arriveTime;/到达时间int intertime;/处理业务所花费时间int waitTime; /等待时间;queue<Event>q1,q2; /声明两个队列int close_time=0,total_people=0,closet_i
16、me,total_money; /close_time为当前时间,也是距离关门的时间 close_time为营业总时间total_money为开业时银行内的资金总额totle_people为一天之内办理总的客户数 int max_solve_time,max_intertime_time; /max_slove_time办理业务花的最长的时间 /max_intertime_time为客户的间隔时间的最大值int max_cunqian,max_qvqian /max_cunqian为存钱的最大值 /max_qvqian为取钱的最大值int currentTime=0;/初始化当前时间为02、
17、基本操作的算法描述void Enterqueue1(Event m)/将事件m插入队尾q1.push(m);void Enterqueue2(Event m)/将事件m插入队尾q2.push(m);void solvequeue1()Event x=q1.front();q1.pop();cout<<"现在是"<<(x.arriveTime/60+9)<<":"<<(x.arriveTime-(x.arriveTime/60)*60)<<",第"<<x.n<
18、<"个客户到达"<<endl;if(total_money+x.money>=0)total_money+=x.money;if (x.money > 0)if(currentTime>x.arriveTime)x.waitTime=currentTime-x.arriveTime;elsex.waitTime=0;cout<<"第"<<x.n<<"个顾客等了"<<x.waitTime<<"分钟后,办理了存款 "<
19、<x.money<<" 元的业务,用了"<<x.solveTime<<"分钟"<<",此时银行余额为"<<total_money<<endl;currentTime=x.arriveTime+x.waitTime+x.solveTime;solvequeue2();else if(currentTime>x.arriveTime)x.waitTime=currentTime-x.arriveTime;elsex.waitTime=0;cout<&
20、lt;"第"<<x.n<<"个顾客等了"<<x.waitTime<<"分钟后,办理了取款 "<<-x.money<<" 元的业务,用了"<<x.solveTime<<"分钟"<<",此时银行余额为"<<total_money<<endl;currentTime=x.arriveTime+x.waitTime+x.solveTime;elsecou
21、t<<"为第"<<x.n<<"个该顾客办理取款 "<<-x.money<<" 元的业务,"<<"此时银行余额为"<<total_money<<",无法为他办理业务,请稍等片刻"<<endl;Enterqueue2(x);void solvequeue2()int n=q2.size(),i=0;while(n!=0)Event x=q2.front();q2.pop();if(total_
22、money+x.money>0)total_money+=x.money;if(currentTime>x.arriveTime)x.waitTime=currentTime-x.arriveTime;elsex.waitTime=0;cout<<"第"<<x.n<<"个顾客等了"<<x.waitTime<<"分钟后,办理了取款 "<<-x.money<<" 元的业务,用了"<<x.solveTime<
23、<"分钟,"<<"此时银行余额为"<<total_money<<endl;n-;currentTime=x.arriveTime+x.waitTime+x.solveTime;elseEnterqueue2(x);i+;if(i=n)break;3、测试界面操作提示cout<<"请输入银行总资金(元)和营业总时间(分钟):"<<endl;cin>>total_money>>closetime; cout<<"请输入存钱的最大
24、值(元)和取钱的最大值(元)"<<endl; cin>>max_cunqian>>max_qvqian;cout<<"请输入事件的解决时间最大值(分钟)和客户的间隔时间的最大值(分钟)"<<endl; cin>>max_solve_time>>max_intertime_time;system("cls");printf("* 早上九点开业,欢迎光临 *n");cout<<" ="<<endl;co
25、ut<<" 欢迎使用银行业务模拟系统n"cout<<" -"<<endl;cout<<" 姓名:石站锋 "<<endl;cout<<" 学号:1107020404"<<endl;cout<<" 班级:信计四班 "<<endl; cout<<" ="<<endl;cout<<"银行每天开业总资金为"<<t
26、otal_money<<"元. 每日营业时间为"<<closetime<<"分钟."<<endl;4、不断进入队列,出队列,时间的更新,总金额的更新Event temp; int intertime=0,n=1,i;intdurtime;int money;int waitTime=0; srand(unsigned)time( NULL );/随机产生时间 intertime = rand() % max_intertime_time;ertime = intertime;close_ti
27、me = ertime+close_time;temp.arriveTime = close_time;money =rand()%(max_cunqian+max_qvqian)-max_qvqian;temp.money=money;solveTime = rand() % max_solve_time;temp.solveTime =durtime;temp.n=n;Enterqueue1(temp);solvequeue1();5、营业结束时判断是否为所有客户服务,并输出最后的银行总金额for(;) intertime = rand() % max_intertime_
28、time;ertime = intertime;close_time = ertime+close_time;temp.arriveTime = close_time;if (close_time>closetime) cout<<"*银行营业结束,谢谢光临*n"cout<<"今天来了"<<n<<"个顾客,"<<endl;if(q2.size()!=0)cout<<"未能给"<<q2.size(
29、)<<"位顾客提供服务,很抱歉!"<<endl;elsecout<<"为全部的顾客提供的服务,欢迎再次光临!"<<endl;cout<<"银行余额为"<<total_money<<endl;break; i=rand()%2;if(i=0)money =rand()%max_cunqian;elsemoney=-rand()%max_qvqian;temp.money=money; solveTime = rand() % max_solve_time
30、;temp.solveTime =durtime;n+;temp.n=n; Enterqueue1(temp);solvequeue1();/system("pause");四、设计和调试分析1、银行业务的模拟程序是一个很典型的排队问题,运用到队列以及大量的对时间金钱等数据的操作。在数据结构的课本上我们学到了有关队列操作的一些基本知识,这次实验就是将这些知识运用到实际中。2、银行业务的模拟程序是一个很完整的,连贯性很强的程序,中间运用到了大量的语句,有结构体的定义,有函数的调用,有随机变量的产生,以及大量的变量之间的先后顺序和逻辑关系等。程序很复杂,要考虑的因素很多。要注意
31、的细节也很多。3、进入测试界面,可以看到提示:"请输入银行总资金(元)和营业总时间(分钟):” 输入后紧接着:“请输入存钱的最大值(元)和取钱的最大值(元)”输入后有:"请输入事件的解决时间最大值(分钟)和客户的间隔时间的最大值(分钟)"所有的都输入完后得出结果4、程序中需要用到多个队列,有连续的入队出队的操作。有时候因为不细心,编写程序的 时候没有注意就弄混淆了。然后调试时就调试不出结果5、输入表达式如:(3+4)*2#按erter键可以看到结果是:*6、开始时随机产生数的函数不会用,后来通过上网查找资料,看来例子,自己调试才会。五、用户手册1、本程序运行环境为
32、VC+6.0,打开界面后可按!键进入测试界面。2、按照界面上的提示输入信息3、按erter键可以看到结果。六、测试结果1、运行程序,显示系统主界面: 2、 输入总资金和总时间:3输入存钱的最大值和取钱的最大值: 4、输入解决时间最大值和间隔时间最大值:5、输出结果:七、设计心得这次数据结构的实验我的题目是银行业务模拟,这个程序的用到了大量的语言以及算法。最重要的以及最基本的是用到了队列。这个实验也主要是针对书上队列这一章的内容来开展,书上也有版面专门介绍这个程序,同时也提供了一些程序,但书上仅仅提供了一些主要的函数,也就是一个大体的框架,很多细节需要我们自己去查看资料。这次实验我在网上搜索了很
33、多资料,我通过自己的理解将别人的知识和自己的知识融合。中间也遇到看很多困难,一度写不下去,稍不留神就是整版整版的错误,但是我坚持下来,然后通过问其他同学和在网上查找资料等慢慢的解决问题终于完成。通过这次试验,我对数据结构这门课程有了更深入的了解。也才真正做到了将理论联系到实际中去,从中也看到了自己的很多方面的欠缺,包括不细心,不熟练,对一些基本错误不会改等等。因此,我也有了很大的进步,我认识到了这些不足,并且努力去改正。我觉得这次试验学到的最多的就是坚持的重要性,要动手的重要性。当遇到困难时只有坚持着不断的动手去调试才能克服困难,没有其他捷径。我相信经过了这次实验,我以后会做得更好。8、 参考
34、文献1 严蔚敏等编著 . 数据结构(C语言版).北京:清华大学出版社20072 严蔚敏等编著 数据结构题集(C语言版)北京:清华大学出版社19993 李世群编著.离散数学.天津:天津大学出版社,2010.8九、附录源程序代码:#include <iostream>#include "list"#include "queue"#include "time.h"using namespace std;void solvequeue1();void solvequeue2();class Eventpublic:int n; /
35、客户的位子int money ; /存取款金额int solveTime;/处理需要的时间int arriveTime;/到达时间,距开业的分钟数int grap;/与前一个客户的间隔时间,为了记录营业时间int waitTime; /等待时间;queue<Event>q1,q2; /声明两个队列int close_time=0,total_people=0,closetime,total_money; /close_time为当前时间,也是距离关门的时间 closetime为营业总时间totle_money为开业时银行内的资金总额totle_people为一天之内办理总的客户数
36、int max_solve_time,max_grap_time; /max_slove_time为事件的解决时间最大值 /max_grap_time为客户的间隔时间的最大值int max_insertmoney,max_drawmoney; /max_insertmoney为存钱的最大值 /max_drawmoney为取钱的最大值int currentTime=0;void putqueue1(Event m)q1.push(m);void putqueue2(Event m)q2.push(m);void solvequeue1()Event x=q1.front();q1.pop();c
37、out<<"现在是"<<(x.arriveTime/60+9)<<":"<<(x.arriveTime-(x.arriveTime/60)*60)<<",第"<<x.n<<"个客户到达"<<endl;if(total_money+x.money>=0)total_money+=x.money;if (x.money > 0)if(currentTime>x.arriveTime)x.waitTime=c
38、urrentTime-x.arriveTime;elsex.waitTime=0;cout<<"第"<<x.n<<"个顾客等了"<<x.waitTime<<"分钟后,办理了存款 "<<x.money<<" 元的业务,用了"<<x.solveTime<<"分钟"<<",此时银行余额为"<<total_money<<endl;curren
39、tTime=x.arriveTime+x.waitTime+x.solveTime;solvequeue2();else if(currentTime>x.arriveTime)x.waitTime=currentTime-x.arriveTime;elsex.waitTime=0;cout<<"第"<<x.n<<"个顾客等了"<<x.waitTime<<"分钟后,办理了取款 "<<-x.money<<" 元的业务,用了"&l
40、t;<x.solveTime<<"分钟"<<",此时银行余额为"<<total_money<<endl;currentTime=x.arriveTime+x.waitTime+x.solveTime;elsecout<<"为第"<<x.n<<"个该顾客办理取款 "<<-x.money<<" 元的业务,"<<"此时银行余额为"<<total_
41、money<<",无法为他办理业务,请稍等片刻"<<endl;putqueue2(x);void solvequeue2()int n=q2.size(),i=0;while(n!=0)Event x=q2.front();q2.pop();if(total_money+x.money>0)total_money+=x.money;if(currentTime>x.arriveTime)x.waitTime=currentTime-x.arriveTime;elsex.waitTime=0;cout<<"第"
42、;<<x.n<<"个顾客等了"<<x.waitTime<<"分钟后,办理了取款 "<<-x.money<<" 元的业务,用了"<<x.solveTime<<"分钟,"<<"此时银行余额为"<<total_money<<endl;n-;currentTime=x.arriveTime+x.waitTime+x.solveTime;elseputqueue2(x);i+
43、;if(i=n)break;void main()/主函数cout<<"请输入银行总资金(元)和营业总时间(分钟):"<<endl;cin>>total_money>>closetime; cout<<"请输入存钱的最大值(元)和取钱的最大值(元)"<<endl; cin>>max_insertmoney>>max_drawmoney;cout<<"请输入事件的解决时间最大值(分钟)和客户的间隔时间的最大值(分钟)"<<endl; cin>>max_solve_time>>max_grap_time;system("cls");cout<<"* 早上九点开业,欢迎光临 *n"cout<<" ="<<endl;cout<<" 欢迎使用银行业务模拟系统n"cout<<" -"<<endl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【G1工业锅炉司炉】理论试题及答案
- 消防基础知识快速入门试题及答案
- 2024计算机二级考试试题及答案分析
- 2024年CPA写作能力试题及答案
- 数据库连接方式试题及答案解读
- 黑龙江生态工程职业学院《大数据统计与分析》2023-2024学年第二学期期末试卷
- 黑龙江省佳木斯一中2025年下学期高三期中历史试题卷(简答)含解析
- 黑龙江省哈尔滨市阿城区二中2024-2025学年高三下学期期中模拟统练(七)历史试题含解析
- 黑龙江省大兴安岭漠河县高中2025届高三毕业生四月调研测试历史试题试卷含解析
- 黑龙江省鸡西市第十六中学2025年中考化学试题模拟(三诊)试题含解析
- 2024版互联网企业股东合作协议书范本3篇
- 合规教育培训
- 加油站安全检查表
- 化工设备安全操作规程
- 工业发展现状及未来趋势分析 汇报材料
- 信用管理与客户信用评估制度
- 2024年中国家具浸渍纸市场调查研究报告
- 2024年版《输变电工程标准工艺应用图册》
- 委托装修合同范本
- 2024-2030年中国石榴花提取物行业发展动态及供需前景预测报告
- UL859(个人修饰电器标准)中文
评论
0/150
提交评论