数据结构课程设计之银行储蓄管理_第1页
数据结构课程设计之银行储蓄管理_第2页
数据结构课程设计之银行储蓄管理_第3页
数据结构课程设计之银行储蓄管理_第4页
数据结构课程设计之银行储蓄管理_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#大学数据结构课程设计报告题目:活期储蓄账目管理院(系):计算机工程学院学生姓名 :班级:学号 :起迄日期 : 2011.06.20-2011.06.27 指导教师 :指导教师评语:成绩:签名:2010 2011年度第 2 学期一、需求分析1.问题描述:活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求: 1) 能比较迅速地找到储户的账户,以实现存款、取款记账; 2) 能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。我做的系统包括以下模块:开户模块 :要求能新建账户并且能够进一步对所建立的账户进行查询等操作。查询模块 :能够通过账号查找,迅速的找到要查找的账户,并显示账

2、户余额。存取钱模块 :在迅速地查找到目的账户后,对账户余额进行修改。销户模块 :查找到目的账户,对其销户。2.基本功能该系统具有以下四个部分的功能:开户功能 :能够新建账户,并对其进行存储以备查询。查询功能 :能够通过账号查找, 迅速的找到要查找的账户, 并显示账户余额。存取钱功能 :在迅速地查找到目的账户后,对账户进行存钱取钱操作。销户功能 :查找到目的账户,对其销户。3.输入输出账号值大小为 long,密码、存款数额值的范围为int大小,姓名为字符串。假定账号是从 50000开始,否则输出提示错误并返回主菜单;主菜单,输入从 1-到5,依次实现开户、查询、存取钱、销户和退出功能,按其他数字

3、键位返回主菜单。开户的时候,账号是自动分配的,从 50000开始,依次增加我这里暂定账户数上限为 2000,然后需要输入用户姓名, 再然后是账号密码和存储金额; 对于用户姓名,是字符串类型,而账号和密码必须输入数字,开户金额 10元起存,小于10元慧提示并允许重新输入开户金额。查询的时候,首先需要输入要查询的账号,如果输入的账号小于默认起始账号,那么提示输入错误并返回主菜单; 如果输入了大于默认账户的账号, 那么密码核实不会通过,加入输入的密码错误,则会提示并返回主菜单。存取钱,首先符合查询的输入要求,账号密码都正确时提示存款还是取款,此时要求存款输入 s,取款输入 t,否则提示错误并返回主菜

4、单,然后输入存入或取出的金额, 存款提示成功, 取款如果账户余额不足, 则会提示余额不足并返回主菜单。销户的时候,也是需要首先满足查找的输入要求,然后提示确定销户吗, s 是确定, c是取消,输入其他的就相当于输入了字符 c,提示销户不成功并返回。二、概要设计1. 设计思路:每个账户是一个基本单位,可以看作是一个对象每个储蓄账户由账号、户主名、密码和余额组成能进行查找,能快速查找到所需要的账号,我选用的是哈希表。查找到所需要的账号之后还能够进一步进行存取款操作,销户操作。2. 数据结构设计:我采用的是哈希表,若结构中存在关键字和 K 相等的记录,则必定在 f(K) 的存储位置上。由此,不需比较

5、便可直接取得所查记录。称这个对应关系 f为散列函数 (Hash function),按这个思想建立的表为散列表。逻辑结构:线性结构。存储结构:顺序结构。采取这种存储结构和逻辑结构的原因:银行账号是按照顺序排列下来的,采取这种结构,便于增加账号和删除帐户,最主要的是便于查找,查找效率最高,而且不会有存储冲突。其存储结构如下(哈希函数: p=Num-50000):对01234562000象账5000050001500025000350004500055000650002000号抽象数据类型线性表的定义如下:ADT List数据对象: D=A_Name/ 用于存储帐户姓名A_Num/ 用于存储帐户的

6、账号A_Overmongy/ 用于存储帐户余额PassWord/用于存储帐户密码基本操作:NewAcount()初始条件:线性表P 存在操作结果:给线性表的一个基本单位的 A_Name,PassWord, A_OverMoney 赋初值。Search()初始条件:线性表存在。操作结果:输入要查找的账号,验证密码,如果验证成功,则给出该结点的 A_Name,A_OverMone 等信息,否则返回主菜单。ChangeMoney()初始条件:线性表 P 存在,输入要查找的账号,验证密码,如果验证成功,则对结点的 A_OverMoney 进行修改数值操作,否则返回主菜单。DeleteAcount()初

7、始条件:线性表P 存在操作结果:输入 A_Num 的值及 PassWord值并进行验证, 如果匹配,则将该结点所有信息清零。3. 软件结构设计 :开始Switch(Opti on)Case 1Case 2Case 3Case 4Case 5NewAcount ()Search()ChangeMoney()DeleteAcount()D:GetValue()D:CheckPassD:SaveORGet()D:Disp()D:Destroy()word()End三、详细设计1. 定义程序中所有用到的数据及其数据结构,及其基本操作的实现;数据类型:const bool OK=1;const bool

8、 NO=0;Depositorvoid Disp()coutA_NumA_NameA_NamePassWordA_OverMoney;if(A_OverMoneyjud;if(jud=s)/ 存钱cinchange_amount;A_OverMoney+=change_amount;else if(jud=t)/ 取钱cinchange_amount;A_OverMoney+=change_amount;elsecoutx;/ 输入密码if(x=PassWord)Disp();return OK;elsecoutno;k=no-50000;if(k0)if(pk.CheckPassWord()

9、=OK)/ 验证密码pk.A_SaveORGet();else if(pk.CheckPassWord()=NO)cout密码错误 ;else coutno;k=no-50000;/哈希函数的使用if(k0)if(pk.CheckPassWord()=OK)/ 验证密码cinch;if(ch=s)pk.Destroy();else cout未删除 ;else coutno输出成功信息提示K=no-50000Yk0PCount_OP.Disp()Npk.CheckPassWor输入错误d()ChangeMoney ()DeleteAcount()提示要输入的账号 ;cinno提示输入账号, ci

10、nnoK=no-50000Yk0jud2=pk.CheckPassWord()jud2=OKYNpk.A_Save输入密码ORGet()错误GetValue()A_Num=Count_OP+50000输出账号输入姓名、秘密、开户金额开户金额小于 10YN返回重新输入开户成功K=no-50000Njud2=pk.CheckPassWord()输入错误,不Jud2=OKNY存在的账号Pk.Destroy()删除不成功CheckPassWord()Destroy()提示用户输入密码; Cinx;A_Num=0;X=PassWordA_Name= ;YNA_Overmoney=0;Disp()密码错误

11、PassWord=0;Return OKReturn NOSaveORGet()提示输入存款还是取款?cinjudsJud=t成员函数:Cinhange_amountCinchange amountChange_amountA_OverMoneyA_OverMoney+=change_amountYNCout存钱成功余额不足A_OverMoney+=change_amount4. 画出函数之间的调用关系图。开始主Switch(Option)函数Case 1Case 2Case 3Case 4Case 5全局函NewAcount ()Search()ChangeMoney()DeleteAcou

12、nt()数类D:GetValue()D:CheckPassD:SaveORGet()D:Disp()D:Destroy()成word()员End四、 调试分析实际完成的情况说明(完成的功能,支持的数据类型等) ; 要求的功能全部完成。程序的性能分析,包括时空分析;本程序使用的是哈希表查找方法, 所以,查找速度还是比较快的, 时间复杂度为。上机过程中出现的问题及其解决方案;1、本来想用结构体的,但是我对类比较了解,所以就用了类;可是后来在主函数里面调用全局功能函数,没法实现,因为属性都是私有的。于是我便想出了用全局函数调用类成员函数,进而改变类属性的方法。而后来发现,这样是整个程序的结构也更加的

13、清晰。2、本来想设计两种查找方法:账号查询和姓名查询的。但是后来发现用姓名查询不太符合实际。所以就保留了账号查询方法。3、最初的设计没有密码,后来在某同学的提醒下,我决定也加上密码,然后就在类属性里面加入了PassWord,可是问题是,密码都是暗文,如何使输入时显示暗文,这个问题我没有解决。密码本来想定义成string类型的,但是,根据实际,还是定义成了int 型的。4、当用户忘记密码时怎么办?可以查询,开户的所有信息在文件里面也可以查询。5、用户开户时存入负数怎么办?干脆模仿银行开户时必须存入10 元的做法,如果用户开户时输入金额小于10 元,则提示并让用户重新输入。6、用户查询的时候需要输

14、入账号, 假如用户输入的账号小于50000 怎么办,输入的账号大于 50000但是没有开过户怎么办?我在查询的时候加了一判断语句,如果输入账号小于 50000 则提示错误,返回主菜单。如果输入的账号不存在,那么其密码未初始化,无论输入任何密码,几乎不可能正确。7、存取款的时候,编程出了点小错误:无论密码输入对能存取钱,输入错误也能提示输入错误,但是也能存取钱,经检查发现,是未把存取款处理语句放到判断执行语句里面。8、存取款的时候,如果用户输入s 或者 t 之外的字符,就会出现错误,我的解决办法:用if-elseif-else 语句。9、存取款如果用户输入负值怎么办?跟开户的处理办法一样。10、

15、 在构造函数的定义中我发现,其实最好不要给 PassWord初始化,因为,不给他初始化,它会有一个不确定的值,这样,后面如果用户输入的账号不是已开户的账号时,在密码验证的那一步不会通过。程序中可以改进的地方说明;1. 密码输入改为暗码。2. 密码限制,不能无限输入。3. 从文件读取之前存入的信息。我只是写入到文件了,这里的作用也只能是备份信息的。4. 未做到:一次输入密码之后选择存取款、查询等功能。五、测试结果开户:查询:存款:销户:六、用户手册双击该程序:出现以下界面:你可以选择开户操作,查询操作,存取款操作,销户操作。输入各个功能对应的数字,并按下回车。(1)输入 1,按下回车,出现以下界

16、面:接下来您需要输入所开户的姓名,然后按回车,接着会提示让您创建密码,您需要输入不是以零开头的 7位以下的数字作为您的密码,否则您的账户可能会丢失。接下来,请输入您要存储的金额,请输入非零开头的 7位以下的数字,否则您的存款可能会丢失。创建完账户会有以下提示,您需要按下回车以返回主菜单。(2)返回主菜单后,您可以进行查询您的存款,输入 2按回车,根据提示,输入您的账号,和密码,如果输入错误,程序会给出您具体操作提示,您需要根据提示进行操作。(3)之后您还可以进行存取款操作,在主菜单选择 3,输入账号和密码,出现以下界面,现在您需要输入 s或者 t,输入 s表示您要存款, t则是要取款,其他字符

17、,会返回主菜单,假设要取钱,您就输入 t,然后,输入要取出的金额就是了。(4)如果要销户,您需要在主界面选择 4,输入账号,输入密码,选择确定,账户就会被删掉,删掉的账户不可以再利用。七、体会与自我评价银行活期储蓄管理系统制作心得与体会两周的时间, 就做了这么一个系统, 而且还漏洞百出, 不能应用到银行里面去。由此可见,编程这条路还是很漫长的,就像老师说的: c语言学完了,就以为自己会编程了, 其实不然,现在学的还只是基础入门的东西, 真正的实用的软件目前还是做不出来。这是我最大的感慨。这两周的时间里,除了这些感慨,当然我也学到了很多品德和知识,编程或者说软件开发,绝对不是随笔,需要有计划、有

18、目的的去做,首先得需要进行结构的设计,我要做的软件需要哪些功能, 要实现这些功能需要什么样的逻辑结构,各个结构之间怎么连接, 应该使用什么样的存储结构, 这都需要事先设计好。各个部分分别用于什么样的用途, 这需要在设计过程中做记录的, 否则真的很容易忘记。编程的过程中,需要集中精力,要清晰明白地记着自己做到哪里了,这一部分是什么功能,它跟其他的部分是什么关系,都要综合考虑,否则,很容易才出现牵一发而动全身的麻烦。 有时候,我遇到问题,会想是不是 vs编译器的问题,但是经过这次课程设计, 我懂得了,编译器出现问题的概率真的是很小很小, 而自己考虑不周到的概率确实非常的大,所以,以后要全面、仔细考

19、虑各种问题。编程过程中,还有一个看似不是问题却不容忽略的大问题,就是很多同学不会休息,我中午一般不休息, 但是下午编程的效率确实很低。 编程过程需要高度集中注意力,所以,好好休息时必要的。源代码#includeiostream#includewindows.h#includefstream#includeiomanip#includestringconst bool OK=1;const bool NO=0;using namespace std;int Count_OP=0;/ 用来记录新建储户的位置ofstream output( 储户信息 .bat);ifstream input( 储户

20、信息 .bat);/ / 每个账户是一个基本单位,可以看作是一个对象。/ 每个储蓄账户由账号、户主名组成,此外还要包括该储户的当前金额。(当然如果可以的话,还应该包括交易记录。/ 能进行搜索,我要求既能通过账号搜索,又能通过姓名搜索。/ 我想,账号搜索用哈希表。/ 假设账号共五位,从50000 到 50020,对象是从0-20,那么哈希函数为i=A_Num-50000;/class Depositorprivate:long int A_Num;/ 储蓄帐号string A_Name;/ 储户姓名double A_Overmoney;/ 储蓄余额int PassWord;/ 用户密码publi

21、c:Depositor()A_Num=0;A_Name=;A_Overmoney=0;void GetValue()/outputalskdjf;laksendl;A_Num=Count_OP+50000;cout 您的账号是 A_Num 请输入该账户的姓名 A_Name;cout 请为您的账户创建密码PassWord;loop2:cout 请输入您要存储的金额A_Overmoney;if(A_Overmoney10)cout 对不起,开户最少10 元,请重新输入endl;goto loop2;void A_SaveORGet()/ 存钱或者取钱(类成员函数)。char jud;double

22、change_amount;loop1:cout 存钱还是取钱?存-s,取 -tjud;if(jud=s)re1:cout 请输入要存入的金额change_amount;if(change_amount0)cout 输入金额错误,请重新输入endl;goto re1;elseA_Overmoney+=change_amount;cout 存钱成功,存入change_amount 元 endl;else if(jud=t)re2:cout 请输入要取出的钱change_amount;if(change_amountA_Overmoney|change_amount0)cout 金额不足 endl

23、;goto re2;else A_Overmoney-=change_amount;cout 取钱成功,取出change_amount 元 endl;else cout 输入错误,返回重试endl;bool Jud()if(A_Num=0)return NO;else return OK;/ 验证密码,如果正确会输出当前详情bool CheckPassWord()long int x;cout 请输入该账户的密码x;if(x=PassWord)Disp();return OK;else cout 密码错误,请返回重试endl;return NO;void Disp()coutsetfill(-

24、);coutsetw(15)left 账号 setw(10)left 储户名 setw(15)left 当前账户余额 endl;coutsetw(15)leftA_Numsetw(10)leftA_Namesetw(15)leftA_Overmoneyendl 请记好您的密码endl;void Write_inFile()ofstream output( 储户信息 .bat,ios:app|ios:out);outputA_Num PassWord A_Name A_Overmoneyendl;void Destroy()A_Num=0;A_Name=;A_Overmoney=0;PassWo

25、rd=0;Depositor p2000;/ 存储用户数上限;void NewAcount_Num();void search_Num();void ChangeMoney_Num();void DeleteAcount_Num();void main()loop1:cout 本行账号从50000 开始。 endl;cout 请选择要进行的操作endl;coutsetfill(*);coutsetw(20)left;coutsetw(30)left主菜单 endl;coutsetw(20)left;coutsetw(30)left1-开户 endl;coutsetw(20)left;couts

26、etw(30)left2-查询 endl;coutsetw(20)left;coutsetw(30)left3-存取钱 endl;coutsetw(20)left;coutsetw(30)left4-销户 endl;coutsetw(20)left;coutsetw(30)left5-退出 endl;coutsetw(20)left;coutsetw(30)left其他数字键返回endl;coutsetw(50)leftchoice;for(int m=0;m10;m+)printf(a);switch(choice)case 1:NewAcount_Num();break;case 2:search_Num();break;case 3:ChangeMoney_Num();b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论