数据结构课程设计之银行储蓄管理.docx
- 文档编号:27761547
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:28
- 大小:765.17KB
数据结构课程设计之银行储蓄管理.docx
《数据结构课程设计之银行储蓄管理.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之银行储蓄管理.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之银行储蓄管理
##大学
数据结构课程设计报告
题目:
活期储蓄账目管理
院(系):
计算机工程学院
学生姓名:
班级:
学号:
起迄日期:
2011.06.20-2011.06.27
指导教师:
指导教师评语:
成绩:
签名:
年月日
2010—2011年度第2学期
一、需求分析
1.问题描述:
活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求:
1)能比较迅速地找到储户的账户,以实现存款、取款记账;2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
我做的系统包括以下模块:
开户模块:
要求能新建账户并且能够进一步对所建立的账户进行查询等操作。
查询模块:
能够通过账号查找,迅速的找到要查找的账户,并显示账户余额。
存取钱模块:
在迅速地查找到目的账户后,对账户余额进行修改。
销户模块:
查找到目的账户,对其销户。
2.基本功能
该系统具有以下四个部分的功能:
开户功能:
能够新建账户,并对其进行存储以备查询。
查询功能:
能够通过账号查找,迅速的找到要查找的账户,并显示账户余额。
存取钱功能:
在迅速地查找到目的账户后,对账户进行存钱取钱操作。
销户功能:
查找到目的账户,对其销户。
3.输入输出
账号值大小为long,密码、存款数额值的范围为int大小,姓名为字符串。
假定账号是从50000开始,否则输出提示错误并返回主菜单;
主菜单,输入从1-到5,依次实现开户、查询、存取钱、销户和退出功能,按其他数字键位返回主菜单。
开户的时候,账号是自动分配的,从50000开始,依次增加我这里暂定账户数上限为2000,然后需要输入用户姓名,再然后是账号密码和存储金额;对于用户姓名,是字符串类型,而账号和密码必须输入数字,开户金额10元起存,小于10元慧提示并允许重新输入开户金额。
查询的时候,首先需要输入要查询的账号,如果输入的账号小于默认起始账号,那么提示输入错误并返回主菜单;如果输入了大于默认账户的账号,那么密码核实不会通过,加入输入的密码错误,则会提示并返回主菜单。
存取钱,首先符合查询的输入要求,账号密码都正确时提示存款还是取款,此时要求存款输入s,取款输入t,否则提示错误并返回主菜单,然后输入存入或取出的金额,存款提示成功,取款如果账户余额不足,则会提示余额不足并返回主菜单。
销户的时候,也是需要首先满足查找的输入要求,然后提示确定销户吗,s是确定,c是取消,输入其他的就相当于输入了字符c,提示销户不成功并返回。
二、概要设计
1.设计思路:
每个账户是一个基本单位,可以看作是一个对象
每个储蓄账户由账号、户主名、密码和余额组成
能进行查找,能快速查找到所需要的账号,我选用的是哈希表。
查找到所需要的账号之后还能够进一步进行存取款操作,销户操作。
2.数据结构设计:
我采用的是哈希表,若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。
由此,不需比较便可直接取得所查记录。
称这个对应关系f为散列函数(Hashfunction),按这个思想建立的表为散列表。
逻辑结构:
线性结构。
存储结构:
顺序结构。
采取这种存储结构和逻辑结构的原因:
银行账号是按照顺序排列下来的,采取这种结构,便于增加账号和删除帐户,最主要的是便于查找,查找效率最高,而且不会有存储冲突。
其存储结构如下(哈希函数:
p=Num-50000):
对象
0
1
2
3
4
5
6
……
2000
账号
50000
50001
50002
50003
50004
50005
50006
……
50002000
抽象数据类型线性表的定义如下:
ADTList
{
数据对象:
D={A_Name//用于存储帐户姓名
A_Num//用于存储帐户的账号
A_Overmongy//用于存储帐户余额
PassWord//用于存储帐户密码
}
基本操作:
{
NewAcount()
初始条件:
线性表P存在
操作结果:
给线性表的一个基本单位的A_Name,PassWord,A_OverMoney赋初值。
Search()
初始条件:
线性表存在。
操作结果:
输入要查找的账号,验证密码,如果验证成功,则给出该结点的A_Name,A_OverMone等信息,否则返回主菜单。
ChangeMoney()
初始条件:
线性表P存在,输入要查找的账号,验证密码,如果验证成功,则对结点的A_OverMoney进行修改数值操作,否则返回主菜单。
DeleteAcount()
初始条件:
线性表P存在
操作结果:
输入A_Num的值及PassWord值并进行验证,如果匹配,则将该结点所有信息清零。
}
}
3.软件结构设计:
三、详细设计
1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现;
数据类型:
constboolOK=1;
constboolNO=0;
Depositor
{
voidDisp()
{
cout< } voidGetValue() { A_Num=Count_OP+50000;//记录新建结点的位置 cin>>A_Name>>PassWord>>A_OverMoney; if(A_OverMoney<10) reinput; } voidSaveORGet()//存钱或者取钱 { cin>>jud; if(jud=='s')//存钱 { cin>>change_amount; A_OverMoney+=change_amount; } elseif(jud=='t')//取钱 { cin>>change_amount; A_OverMoney+=change_amount; } else { cout<<输入错误; } } boolChechPassWord() { cin>>x;//输入密码 if(x==PassWord) { Disp(); returnOK; } else { cout<<密码错误; returnNO; } } voidDestroy()//销户 { A_Num=0; A_Name=""; A_OverMoney=0; PassWord=Random; } } 2.主函数和其他函数的伪码算法; 全局函数: voidNewAcount_Num() { p[Count_OP].GetValue(); p[Count_OP].Disp(); Count_OP+=1;//增加一个记录 } voidChangeMoney() { cin>>no; k=no-50000; if(k>0) { if(p[k].CheckPassWord()=OK)//验证密码 { p[k].A_SaveORGet(); } elseif(p[k].CheckPassWord()=NO) cout<<密码错误; } elsecout<<不存在的账户; } voidDeleteAcount() { cin>>no; k=no-50000;//哈希函数的使用 if(k>0) { if(p[k].CheckPassWord()=OK)//验证密码 { cin>>ch; if(ch=='s') p[k].Destroy(); } elsecout<<未删除; } elsecout<<账号输入错误; } 主函数: voidmain() { switch(choice) { case1: NewAcount_Num();break; case2: search_Num();break; case3: ChangeMoney_Num();break; case4: DeleteAcount_Num();break; case5: exit(0); default: {gotoloop1;system("cls");} } } 3.主要函数的程序流程图, 各个成员函数流程图: 成员函数: 4.画出函数之间的调用关系图。 四、调试分析 实际完成的情况说明(完成的功能,支持的数据类型等); 要求的功能全部完成。 程序的性能分析,包括时空分析; 本程序使用的是哈希表查找方法,所以,查找速度还是比较快的,时间复杂度为。 上机过程中出现的问题及其解决方案; 1、本来想用结构体的,但是我对类比较了解,所以就用了类;可是后来在主函数里面调用全局功能函数,没法实现,因为属性都是私有的。 于是我便想出了用全局函数调用类成员函数,进而改变类属性的方法。 而后来发现,这样是整个程序的结构也更加的清晰。 2、本来想设计两种查找方法: 账号查询和姓名查询的。 但是后来发现用姓名查询不太符合实际。 所以就保留了账号查询方法。 3、最初的设计没有密码,后来在某同学的提醒下,我决定也加上密码,然后就在类属性里面加入了PassWord,可是问题是,密码都是暗文,如何使输入时显示暗文,这个问题我没有解决。 密码本来想定义成string类型的,但是,根据实际,还是定义成了int型的。 4、当用户忘记密码时怎么办? 可以查询,开户的所有信息在文件里面也可以查询。 5、用户开户时存入负数怎么办? 干脆模仿银行开户时必须存入10元的做法,如果用户开户时输入金额小于10元,则提示并让用户重新输入。 6、用户查询的时候需要输入账号,假如用户输入的账号小于50000怎么办,输入的账号大于50000但是没有开过户怎么办? 我在查询的时候加了一判断语句,如果输入账号小于50000则提示错误,返回主菜单。 如果输入的账号不存在,那么其密码未初始化,无论输入任何密码,几乎不可能正确。 7、存取款的时候,编程出了点小错误: 无论密码输入对能存取钱,输入错误也能提示输入错误,但是也能存取钱,经检查发现,是未把存取款处理语句放到判断执行语句里面。 8、存取款的时候,如果用户输入s或者t之外的字符,就会出现错误,我的解决办法: 用if-elseif-else语句。 9、存取款如果用户输入负值怎么办? 跟开户的处理办法一样。 10、在构造函数的定义中我发现,其实最好不要给PassWord初始化,因为,不给他初始化,它会有一个不确定的值,这样,后面如果用户输入的账号不是已开户的账号时,在密码验证的那一步不会通过。 程序中可以改进的地方说明; 1.密码输入改为暗码。 2.密码限制,不能无限输入。 3.从文件读取之前存入的信息。 我只是写入到文件了,这里的作用也只能是备份信息的。 4.未做到: 一次输入密码之后选择存取款、查询等功能。 五、测试结果 开户: 查询: 存款: 销户: 六、用户手册 双击该程序: 出现以下界面: 你可以选择开户操作,查询操作,存取款操作,销户操作。 输入各个功能对应的数字,并按下回车。 (1)输入1,按下回车,出现以下界面: 接下来您需要输入所开户的姓名,然后按回车,接着会提示让您创建密码,您需要输入不是以零开头的7位以下的数字作为您的密码,否则您的账户可能会丢失。 接下来,请输入您要存储的金额,请输入非零开头的7位以下的数字,否则您的存款可能会丢失。 创建完账户会有以下提示,您需要按下回车以返回主菜单。 (2)返回主菜单后,您可以进行查询您的存款,输入2按回车,根据提示,输入您的账号,和密码,如果输入错误,程序会给出您具体操作提示,您需要根据提示进行操作。 (3)之后您还可以进行存取款操作,在主菜单选择3,输入账号和密码,出现以下界面, 现在您需要输入s或者t,输入s表示您要存款,t则是要取款,其他字符,会返回主菜单, 假设要取钱,您就输入t,然后,输入要取出的金额就是了。 (4)如果要销户,您需要在主界面选择4,输入账号,输入密码,选择确定,账户就会被删掉,删掉的账户不可以再利用。 七、体会与自我评价 银行活期储蓄管理系统制作心得与体会 两周的时间,就做了这么一个系统,而且还漏洞百出,不能应用到银行里面去。 由此可见,编程这条路还是很漫长的,就像老师说的: c语言学完了,就以为自己会编程了,其实不然,现在学的还只是基础入门的东西,真正的实用的软件目前还是做不出来。 这是我最大的感慨。 这两周的时间里,除了这些感慨,当然我也学到了很多品德和知识,编程或者说软件开发,绝对不是随笔,需要有计划、有目的的去做,首先得需要进行结构的设计,我要做的软件需要哪些功能,要实现这些功能需要什么样的逻辑结构,各个结构之间怎么连接,应该使用什么样的存储结构,这都需要事先设计好。 各个部分分别用于什么样的用途,这需要在设计过程中做记录的,否则真的很容易忘记。 编程的过程中,需要集中精力,要清晰明白地记着自己做到哪里了,这一部分是什么功能,它跟其他的部分是什么关系,都要综合考虑,否则,很容易才出现牵一发而动全身的麻烦。 有时候,我遇到问题,会想是不是vs编译器的问题,但是经过这次课程设计,我懂得了,编译器出现问题的概率真的是很小很小,而自己考虑不周到的概率确实非常的大,所以,以后要全面、仔细考虑各种问题。 编程过程中,还有一个看似不是问题却不容忽略的大问题,就是很多同学不会休息,我中午一般不休息,但是下午编程的效率确实很低。 编程过程需要高度集中注意力,所以,好好休息时必要的。 源代码 #include"iostream" #include"windows.h" #include"fstream" #include"iomanip" #include"string" constboolOK=1; constboolNO=0; usingnamespacestd; intCount_OP=0;//用来记录新建储户的位置 ofstreamoutput("储户信息.bat"); ifstreaminput("储户信息.bat"); //////////////////////////////////////////////////////////////////////////////////////////////////////////// ////每个账户是一个基本单位,可以看作是一个对象。 /// ///每个储蓄账户由账号、户主名组成,此外还要包括该储户的当前金额。 (当然如果可以的话,还应该包括交易记录。 /// ////能进行搜索,我要求既能通过账号搜索,又能通过姓名搜索。 /// ////我想,账号搜索用哈希表。 /// ////假设账号共五位,从50000到50020,对象是从0-20,那么哈希函数为i=A_Num-50000;/// //////////////////////////////////////////////////////////////////////////////////////////////////////////// classDepositor { private: longintA_Num;//储蓄帐号 stringA_Name;//储户姓名 doubleA_Overmoney;//储蓄余额 intPassWord;//用户密码 public: Depositor() { A_Num=0; A_Name=""; A_Overmoney=0; } voidGetValue() { //output<<"alskdjf;laks"< A_Num=Count_OP+50000; cout<<"您的账号是"< cin>>A_Name; cout<<"请为您的账户创建密码"< cin>>PassWord; loop2: cout<<"请输入您要存储的金额"< cin>>A_Overmoney; if(A_Overmoney<10) {cout<<"对不起,开户最少10元,请重新输入"< } voidA_SaveORGet()//存钱或者取钱(类成员函数)。 { charjud; doublechange_amount; loop1: cout<<"存钱还是取钱? 存-s,取-t"< cin>>jud; if(jud=='s') { re1: cout<<"请输入要存入的金额"< cin>>change_amount; if(change_amount<0) {cout<<"输入金额错误,请重新输入"< else{ A_Overmoney+=change_amount; cout<<"存钱成功,存入"< } elseif(jud=='t') { re2: cout<<"请输入要取出的钱"< cin>>change_amount; if(change_amount>A_Overmoney||change_amount<0) {cout<<"金额不足"< else{A_Overmoney-=change_amount; cout<<"取钱成功,取出"< } else{cout<<"输入错误,返回重试"< } boolJud() { if(A_Num==0) {returnNO;} else{returnOK;} } //验证密码,如果正确会输出当前详情 boolCheckPassWord() { longintx; cout<<"请输入该账户的密码"< cin>>x; if(x==PassWord) {Disp();returnOK;} else{cout<<"密码错误,请返回重试"< } voidDisp() { cout< cout< cout< } voidWrite_inFile() { ofstreamoutput("储户信息.bat",ios: : app|ios: : out); output< } voidDestroy() { A_Num=0; A_Name=""; A_Overmoney=0; PassWord=0; } }; Depositorp[2000];//存储用户数上限; voidNewAcount_Num(); voidsearch_Num(); voidChangeMoney_Num(); voidDeleteAcount_Num(); voidmain() { loop1: cout<<"本行账号从50000开始。 "< cout<<"请选择要进行的操作"< cout< cout< cout< cout< cout< cout< cout< cout< cout< intchoice; cin>>choice; for(intm=0;m<10;m++) printf("\a"); switch(choice) { case1: NewAcount_Num();break; case2: search_Num();break; case3: ChangeMoney_Num();break; case4: DeleteAcount_Num();break; case5: exit(0); default: {gotoloop1;system("cls");}; } system("pause"); system("cls"); gotoloop1; system("pause"); } voidsearch_Num() { longintno; cout<<"输入您要查询的账号"< cin>>no; longintk=no-50000; if(k>=0) { p[k].CheckPa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 银行 储蓄 管理