数据结构课程设计银行模拟系统文档格式.docx
《数据结构课程设计银行模拟系统文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计银行模拟系统文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
在开发这个银行系统时,用到了c语言里的函数调用,结构体等,并用基本对话框的一些控件对之进行实现。
使之完成了一些功能。
报告将会对银行模拟系统程序的一些功能模块进行具体的分析,写出概要设计方案,详细设计,各个功能的流程图,以及调试分析等,从各个方面具体的对程序进行了分析。
银行系统是非常之重要的,对于我们的生活将有巨大的作用,所以我们学习是更应该努力学,以对银行取款信息有充分的了解,并进行编程实现。
通过程序实践来巩固运用所学的专业知识,提高我们的计算机应用技能,提高编程能力,加深对相关内容的理解,拓宽知识面,培养我们的创新精神和实践能力。
随着社会的迅速发展,人们的生活水平越来越高,人们的经济越来越多,所以人们对自己的资产保护也越来越注重,这便产生了银行,而随着人口的迅速增长,存钱的人也越来越多,因此设计一个程序是存钱和取钱的时间缩短是非常重要的,设计一个好的程序,使之能更好的方便我们的生活。
它的领域使用在人们快速取款或存款当中。
第二章需求分析:
设计一个简单的银行业务模拟程序,主要实现的功能是使每个存款或取款的窗口都不是空闲的,保持每个窗口都在工作。
即是实现最大的工作效率。
1本题需要求客户在银行内逗留的平均时间,用客户逗留除以客户总数即可
2本题涉及到队列的建立、初始化和插入,队列的关键字为整数,处理第一、二种业务分别用负数和正数表示。
3对客户进行编号用来统计客户总数,同时在队列元素的循环处理中更新总的逗留时间。
4演示程序以用户和计算机的对话方式执行,即在计算机终端显示的“提示信息”下,输入数据进行测试。
5最后对所得结果进行简要分析。
银行业务模拟程序主要用于存取的各种信息,所包含的有排队的人数扽很多重要数据。
第三章.概要设计:
本程序包含两个模块:
1)主程序模块:
Voidmain(){
初始化:
do{
接受命令;
处理命令
}while(“命令”!
=“退出”);
2)队列单元模块—实现队列的抽象数据类型
各模块之间的调用关系。
1队列的抽象数据类型定义
ADTQueue{
数据对象:
D={ai∈Elemseti=1,2,…,n,n≥0}
数据关系:
R1={<
ai-1ai>
ai-1ai∈D,i=2,…,n}
约定其中a1端为队列头,an端为队列尾.
基本操作:
InitQueue(&
Q)
操作结果:
构造一个空队列Q
QueueEmpty(Q)
若Q为空队列,则返回TRUE,否则FALSE
GetHead(Q&
q)EnQueue(&
Qq)
插入元素q为Q的新的队尾素
DeQueue(&
Q&
q);
操作结果删除Q的队头元素,并用q返回其值。
客户服务模块包含两个子系统:
取款系统和存款系统。
客户服务功能图模块如图2
图2
取款系统和存款系统:
银行通过判断用户业务类型进行业务办理。
3.4数据管理系统
数据管理系统模块包含两个子系统:
数据整理系统和数据管理系统。
数据管理功能图模块如图。
数据采集系统:
收集客户信息包括存取款的资金数目
数据整理系统:
更新银行现存资金总额、客户的逗留时间、已办理的客户总数。
3.5简要算法
为了实现上述程序功能,需要定义单链表的抽象数据类型如下:
链表结构体:
structAction{
charname[50];
//客户名
doubledeposit;
//存取款金额
intsloveTime;
//处理需要的时间
intarriveTime;
//到达时间,距开业的分钟数
intgrap;
//与前一个客户的间隔时间
intwaitTime;
//总的等待时间
};
typedefstructNode{
Actiondata;
Node*next;
}LinkNode,*LinkList;
队列结构体如下:
typedefstruct
{
Node*front;
Node*rear;
}LinkQueue,*Queue;
3.6函数调用
1.主函数main
2.进栈函数push
3.出栈函数pop
4.查找和处理函数service*searchAndDel
5.到达函数arrive
6.存款函数putMoney
7.群款函数getMoney
8.随机函数rand
第四章调试与测试:
编制银行业务模拟程序时,用到了很多语句,如队列,指针,函数调用等等许多程序。
由于自己的知识有限且学习的也不是很多,总的来说还是很缺乏编程知识,经过我的努力最后还是运行成功。
银行业务模拟程序,在编译的时候,由于对话框之间的衔接不太懂,所以并没有实现应有的结果。
但后来还是通过学生,上网查询等多种方法,终于弄清了对话框之间的衔接和一些基本算法。
最终也运行出来了。
第五章.测试结果:
:
第六章.设计体会:
经过了两周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的两个星期的日子里,我虽然吃了很多苦,但我学到了很多很多以前不知道的的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了很多,理论必须和实践永远的结合起来,才能有质的飞跃,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到过很多问题,困难很多,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。
虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。
第七章结束语:
时间过的很快,在不知不觉中,课程设计也接近了尾声.说起课程设计,我认为最重要的就是做好设计的预习,并且认真的去复习以前的知识和查各种资料同时认真的研究老师给的题目,老师对题目的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计来才会有底,有信心。
课程设计是一门培养学生综合运用所学知识,发现,提出,分析和解决实际问题的学科,它能充分锻炼我们的动手能力,时我们实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
我想这次不只是一次简单的课程设计,更体现了数据结构算法和生活的紧密联系。
生活中也存在许多与数据结构有关联的事情,它让人不得不深思,这一个学期的学习,这两年来的大学学习生涯,自己究竟学会了什么,掌握了多少,我也不清楚,我以前也疯狂的玩过,现在才知道自己时多么的缺乏知识,大多数问题自己不能解决,感觉将来自己是否能胜任以后作编译人员的职位。
我想大家都心里都有很多的感触。
对于自己,我想我已经认识到了自己的不足,在今后的学习过程中,我一定以最好的心态去对待,以最好的面貌来迎接大三的软件专业课程,并且经常上机调试,坚持理论与实践相结合。
相信自己将会有很大的进步。
。
【1】严蔚敏,吴伟民数据结构(C语言版)清华大学出版社
【2】谭浩强C程序设计(第三版)清华大学出版社
【3】
附录源代码:
#include<
iostream>
string>
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"
*欢迎进入银行模拟系统*\n"
1.开始模拟0.退出\n"
intn;
scanf("
%d"
&
n);
while(n==1)
srand(time(NULL));
//初始化随机函数
输入银行的初始存款:
\n"
total);
输入银行的营业时间:
closeTime);
输入最大到达时间间隔:
arriveTime);
输入最大的处理时间:
dealTime);
theArriveTime+=rand()%arriveTime+1;
//首次到达时间
while(currentTime<
closeTime)
++currentTime;
if(currentTimeOfDeal<
currentTime)currentTimeOfDeal=currentTime;
if(currentTimeOfDeal==currentTime)state=1;
if(currentTime==theArriveTime)//到达事件
arrive();
theArriveTime+=rand()%arriveTime+1;
if(1==state&
NULL!
=fq.head)
if(fq.head->
money>
=0)
putMoney();
findAndDeal();
getMoney();
cout<
<
endl<
"
客户序列"
"
\t"
<
事件类型"
\t\t"
时间"
处理金额"
endl;
while(NULL!
=eq.head)//清除事件队列
if(eq.head->
type=="
)
eq.head->
num<
eq.head->
type<
endTime<
money<
beginTime<
pop(eq);
未处理客户:
totalTime+=(closeTime-fq.head->
//更新结束时第一队列中未处理的客户
fq.head->
num<
endl;
}//while
客户逗留平均时间为:
totalTime/counter<
cout<
银行当前余额:
total<
break;
}//while(n==1)
return0;
}//maim()