数据结构课程设计实验报告_第1页
数据结构课程设计实验报告_第2页
数据结构课程设计实验报告_第3页
数据结构课程设计实验报告_第4页
数据结构课程设计实验报告_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、数据结构课程设计报告学院:信息科学与工程学院班级:通信工程1301班题目:活期储蓄帐目管理系统指导老师:康松林完成日期:2015年7月16日目录一、问题描述与基本要求 11.1 问题描述 11.2 基本要求 1二、数据结构的设计 12.1 数据结构的选择 . 12.2 单链表的定义 22.3 重要函数的定义及说明 . 2三、软件模块结构图 63.1 大体模块关系图 . 63.2 各模块具体分析 . 7四、程序流程图 8五、源程序 11六、调试分析 166.1 程序错误修改及完善的过程 . 166.2 最终程序所有功能运行结果 . 206.3 测试数据 22七、用户使用手册 23八、心得体会 2

2、3一、问题描述与基本要求1.1 问题描述设计一个活期储蓄帐目管理系统 活期储蓄处理中,储户开户、销户、存入、支出活动频繁。1.2 基本要求系统设计要求:1、能比较迅速地实现插入,以实现储户开户的功能,储户开户时需输入的 信息包括储户姓名,密码。2、能比较迅速地通过储户的账户序号和密码找到储户的账户,并删除该账 户,以实现销户的功能。3、能比较迅速地通过储户的账户序号和密码找到储户的账户 (密码不对时, 可选择是否重新输入密码) 实现账户登录的功能。 登录成功后, 再通过修改链表 结点数据域中的对应元素,以实现存款、取款、显示余额等功能,若取款时账户 余额不足,输出提示信息“取款失败 ! 你账户

3、上的金额不足 ! ”,并显示账户当前 余额,并且提示重新输入合适的取款金额。4、查找活期储蓄帐目管理系统当前存在的储户,当输出活期储蓄帐目管理 系统没有账户时,输出提示信息“活期储蓄帐目管理系统没有账户”,当有账户 时,输出所有账户的相关信息,包括储户姓名,帐号,密码,账户余额。二、数据结构的设计2.1 数据结构的选择课程设计题目的要求是,要较简单迅速地实现开户、销户、存款、取款、输 出用户信息的功能, 于是我很自然地想到了可以用单链表的结构, 通过编写相应 功能函数来实现建立新结点、 删除结点、 修改结点中数据域的内容、 输出结点数 据域中的内容等功能,即可满足课程设计题目的要求。2.2 单

4、链表的定义先定义单链表结点的数据域,数据域包括储户姓名、账户序号、账户密码、 账户金额等储户信息, 然后再定义链表结点, 链表结点包括结点数据域和结点链 域,最后再定义指向链表结点的指针。以下为单链表的相关定义: typedef struct ListData /定义结点数据域char name3;/储户姓名int account;/ 账户序号char password5;/ 账户密码int money;/账户金额ListData;typedef struct node / 定义链表结点ListData data;/结点数据域struct node *next;/ 结点链域ListNode;t

5、ypedef ListNode *LinkList; / 指向链表结点的指针2.3 重要函数的定义及说明1、void InitList (LinkList &L)/建立空链表2、void InsertList (LinkList &L)/插入链表结点,实现开户功能(需要输入储户姓名和密码,以确定开户对象)3、void DeleteList (LinkList &L) /删除链表结点,实现销户功能 (需要输入账号和密码,以确定销户对象)4、void Deposit (LinkList &L,LinkList p) / 储户存款、取款、显示余额(要先通 过账号和密码登录, 若取款时账户余额不足,

6、输出提示信息,显示账户当前余额, 并且提示重新输入取款金额。)5、void Search (LinkList L)/链表查找,实现用户登录功能(需要输入账号和密码, 以确定登录对象, 密码输出错误时可选择是否重新输入 密码)6、void PrintList (LinkList L) /输出链表,实现储户姓名,账号序号,密码,现 有余额等相关信息。(当输出活期储蓄帐目管理系统没有账户时, 输出提示信息, 当有账户时,输出所有账户的相关信息。)以下为重要函数的定义:void InitList(LinkList &L)/建立空链表L=(ListNode*)malloc (sizeof(ListNod

7、e);L-next=NULL;void InsertList(LinkList &L) /链表插入结点,实现开户功能,需输入储户姓名和密码 LinkList p; p=(ListNode*)malloc(sizeof(ListNode);printf( 请输入你要开户的姓名 (不超过 4 个字符) :); scanf(%s,);number=number+1; p-data.account=number;printf( 你开户的账号为 :%dn,p-data.account);printf( 请输入你账号的密码(不超过 6 个字符) :); scanf(%s,p-data

8、.password);p-data.money=0; p-next=NULL;if(L-next=NULL)/ 前插法L-next=p;else p-next=L-next; L-next=p;printf( 开户成功! n);void DeleteList(LinkList &L) / 删除链表结点,实现销户功能(需要输入账号和密码)LinkList p=L,q;char mima5;int s;printf( 请输入你要销户的账号 :); scanf(%d,&s);printf( 请输入该账号的密码 :); scanf(%s,mima);while(p-next!=NULL) if(p-n

9、ext-data.account=s)break; p=p-next; if(p-next!=NULL) while(strcmp(p-next-data.password,mima)!=0) printf( 密码错误 ! 请重新输入 :); scanf(%s,mima); q=p-next; p-next=q-next; free(q); printf( 销户成功。 n);else printf( 你所要销户的的账号不存在。 n);void Deposit(LinkList &L,LinkList p)/储户存款、取款、显示余额int m;int n;while(1)if(p!=NULL)4

10、、退出账号 :);printf(n 请输入数字选择功能: 1、存款 2、取款 3、查询余额 scanf(%d,&m);if(m=1)printf( 请输入你的存款金额 :); scanf(%d,&n);p-data.money=p-data.money+n; printf( 存款成功 !n);else if(m=2) printf( 请输入你的取款金额 :);gg: scanf(%d,&n);if(p-data.money-n)=0) p-data.money=p-data.money-n; printf( 取款成功 !n);elseprintf( 取款失败 ! 你账户上的金额不足 !n);p

11、rintf( 你的账户余额为 :%dn,p-data.money);printf( 请输入合适的取款金额 :); goto gg;else if(m=3)printf( 你账户的余额为 :%dn,p-data.money);else if(m=4)printf( 账号退出成功。 n);return;void Search(LinkList L)/链表查找 ,实现用户登录功能(需要输入账号和密码)LinkList p=L-next;int i;char mima5;printf( 请输入你要登录的账号 :); scanf(%d,&i);tt: printf( 请输入你的密码 :);scanf(%

12、s,mima);while(p!=NULL)if(p-data.account=i)break;p=p-next;if(p=NULL)printf( 不存在该账户 n);elseif(strcmp(p-data.password,mima)=0)printf( 登录成功。 n);else while(strcmp(p-data.password,mima)!=0) char j;printf( 密码错误 n);printf( 是否重新输入 (是,从键盘输入 Y ) 、 (否,从键盘上输入 N ):);scan f(n%c,&j);if(j=N)return;else if(j=Y)goto t

13、t;Deposit(L,p);void Prin tList(Li nkList L)输出链表,实现储户信息输出Lin kList p=L-n ext;if(p=NULL)printf(活期储蓄帐目管理系统没有账户n);else printf(姓名帐号 密码账户余额n);while(p!=NULL)prin tf(%st,p-data .n ame);prin tf(%dt%stt%dn,p-data.acco un t,p-data.password,p-data.m on ey); p=p-n ext;printf(请先输入enter键,再重新选择功能n);三、软件模块结构图3.1大体模块

14、关系图I链表插入模块链表删除模块链表 查找、 存款、 取款 模块链表显示模块3.2各模块具体分析链表插入模块具体分析如下:In sertList(L)sea nf()p-data .n ame p-data.password链表删除模块具体分析如下:s,mima链表查找、存款、取款模块具体分析如下:i,mima,jSearch(L)sca nf()p-data .n ame,p-data.password p-data.acco un t,p-data.m oney注:以上具体分析中,无箭头的线段表示函数的调用关系,椭圆中的数据为输入、输 出或传递的值,箭头表示值的方向。四、程序流程图开始功能

15、表与编号选择1-5输入数字,选择功能AbCD注:因为整个程序流程图太长,一页画不下,所以上图为大体流程图,上图中1 A,2 B, 3 C, 4 D间流程省略了,以下为 1 A,2 B,3 C,4 D间详细流 程图。11 A2 B输入销户账号账户是否存在是你所要销户的输入账户密码的账号不存在销户成功3 C输入要登录的账号账户是否存在?P不存在该账号输入账户密码密码是否正确?登录成功是否重新 输入密码Deposit(L,p)输入1-4,选择功能退出登录输入1后,输入存款金额输入2后,输入取款金额输入3,显示 当前余额输入4, 退出账户存款成功取款金额=余额?重新输入取款成功取款金额4 D4是否p=

16、NULL?输出姓名、帐号、管理系统没有账户密码、账户余额p=p-next是否p=NULL?五、源程序#in clude#in clude#in clude int nu mber=O;typedef struct ListData char n ame3;int acco unt;char password5; int mon ey;/定义的全局变量,用于开户/定义结点数据域/储户姓名/账户序号/账户密码账户金额ListData;typedef struct node / 定义链表结点ListData data;结点数据域struct node *n ext;/ 结点链域ListNode;ty

17、pedef ListNode *LinkList; / 指向链表结点的指针void InitList(LinkList &L)/建立空链表L=(ListNode*)malloc (sizeof(ListNode);L-next=NULL;void InsertList(LinkList &L) /链表插入结点,实现开户功能,需输入储户姓名和密码 LinkList p; p=(ListNode*)malloc(sizeof(ListNode);printf( 请输入你要开户的姓名 (不超过 4 个字符) :); scanf(%s,);number=number+1; p-d

18、ata.account=number;printf( 你开户的账号为 :%dn,p-data.account);printf( 请输入你账号的密码(不超过 6 个字符) :); scanf(%s,p-data.password);p-data.money=0; p-next=NULL;if(L-next=NULL)/ 前插法L-next=p;else p-next=L-next; L-next=p;printf( 开户成功! n);void DeleteList(LinkList &L) / 删除链表结点,实现销户功能(需要输入账号和密码)LinkList p=L,q;char mima5;i

19、nt s;printf( 请输入你要销户的账号 :); scanf(%d,&s);printf( 请输入该账号的密码 :); scanf(%s,mima);while(p-next!=NULL)if(p-next-data.account=s)break;p=p-next;if(p-next!=NULL)while(strcmp(p-next-data.password,mima)!=0)printf( 密码错误 ! 请重新输入 :);scanf(%s,mima);q=p-next;p-next=q-next;free(q);printf( 销户成功。 n);else printf( 你所要销

20、户的的账号不存在。 n);void Deposit(LinkList &L,LinkList p)/储户存款、取款、显示余额int m;int n;while(1)if(p!=NULL)4、退出账号 :);printf(n 请输入数字选择功能: 1、存款 2、取款 3、查询余额 scanf(%d,&m);if(m=1)printf( 请输入你的存款金额 :);scanf(%d,&n);p-data.money=p-data.money+n;printf( 存款成功 !n);else if(m=2)printf( 请输入你的取款金额 :);gg:scanf(%d,&n);if(p-data.mo

21、ney-n)=0)p-data.money=p-data.money-n; printf( 取款成功 !n);elseprintf( 取款失败 ! 你账户上的金额不足 !n); printf( 你的账户余额为 :%dn,p-data.money); printf( 请输入合适的取款金额 :);goto gg;else if(m=3)printf( 你账户的余额为 :%dn,p-data.money);else if(m=4)printf( 账号退出成功。 n);return;void Search(LinkList L)/链表查找 ,实现用户登录功能(需要输入账号和密码)LinkList p=

22、L-next;int i;char mima5;printf( 请输入你要登录的账号 :); scanf(%d,&i);tt: printf( 请输入你的密码 :); scanf(%s,mima);while(p!=NULL)if(p-data.account=i)break;p=p-next; if(p=NULL) printf( 不存在该账户 n);else if(strcmp(p-data.password,mima)=0) printf( 登录成功。 n);else while(strcmp(p-data.password,mima)!=0) char j; printf( 密码错误

23、n);N ):);printf( 是否重新输入 (是,从键盘输入 Y ) 、 (否,从键盘上输入 scanf(n%c,&j);if(j=N) return; else if(j=Y) goto tt; Deposit(L,p);void PrintList(LinkList L)/输出链表,实现储户信息输出LinkList p=L-next; if(p=NULL)printf( 活期储蓄帐目管理系统没有账户 n);else printf( 姓名 帐号 密码 账户余额 n); while(p!=NULL) printf(%st,); printf(%dt%stt%dn,p-

24、data.account,p-data.password,p-data.money); p=p-next;printf( 请先输入 enter 键,再重新选择功能 n);void main()LinkList L;InitList(L);printf(*n);n);printf( 欢迎进入活期储蓄账目管理系统,以下是相关功能及编号:printf( printf( printf( printf( printf( printf( char j;hh: printf(n请选择你需要的功能 :);1.储户开户(输入储户姓名,密码)n);2.储户销户(输入账户序号,密码)n);3.储户的账号存款、取款、

25、余额查询n);4.查看所有储蓄账户信息(输出储户姓名,帐户序号,密码,账户余额)n);5.退出账目管理系统n);*n);scanf(%c,&j);getchar();if(j5)printf( 输入有误,请重新选择操作: n);if(j=5)printf( 您将退出账目管理系统 !n);exit(0);switch(j)case 1:InsertList(L);getchar();break;case 2:DeleteList(L);getchar();break;case 3:Search(L);getchar();break;case 4:PrintList(L);getchar();br

26、eak; default:break;goto hh;六、调试分析6.1 程序错误修改及完善的过程 我这次的课程设计题目是根据我的学号选择的, 当看到这个题目时, 我觉得 还算比较简单,因为我之前数据结构实验就做过单链表的插入、删除、查找、输 出,而这次活期储蓄帐目管理系统要求的开户、销户、存款、取款、输出储户信 息等功能, 即可用单链表的相关功能函数来实现, 于是我修改了之前写过的单链 表的一些函数, 以满足这次题目的要求, 但在实验过程中仍出现了一些错误。 最 终经过我的仔细检查和修改, 最终编写出了符合要求的程序, 还增加了一些功能。1 、由于之前编写过类似程序,所以写完程序后很快就可以

27、运行了,但是运 行结果存在问题, 比如创建的新用户的账户序号不是从 1按顺序递增的, 而是永 远是 1,不会改变,错误如下图所示: D:MkrcsQft Visual Stu di o My Proj ert&yscAD ebugXssd exew萬户账有目 人肆账 进户户户看出 欣1 .2.3.4.S.以H询户 ,码码查储 系余输 目户户 账龍、户统 US账户余D雅岂坏超过弓个字符)m (不起过e个字符):Ism=123456需很! 择入户鬻 请谙您开馨码 功的:1裁 的户要开号号环 :!data.account=0;p-data.account+;这两条语句就可以达到开户时账户序号递增的目

28、的,后来才意识到这样编写程序,每次新建用户都是重新赋0值,再 自加,结果完全不对。于是我定义了一个全局变量int number=0,然后将原来的p-data.account=0;p-data.account+ “ number=number+-pata.account=numbe r;运行后得到了如下的正确的结果: D:MkrosQft Visual Stu dioIV1 yProjects5dDe bug5d exe=j回-T询户 码码查储 系:余输 理名号、 目户户、户统 宵户账有目 账 进户户户看出 查退 欢 1 M 3 4 5账户余额).冃 卄;主 I冃 卜主冃=wxk234532-I

29、sn=123456it名 1 1码 功的:1密 的户番 要开号号 需要泰! 择入户韶 户:1名 I码 功的立密 的户要开号号 需要泰! We岔 择入户入咸 青青尘目开 11111I-J.2、我编写完程序后,觉得程序太过简单,又想到题目是活期储蓄帐目管理 系统,那账户应该是有密码保证安全性的,于是我又在单链表结点的数据域中加 入了一个新的元素password5,并且还修改了后面相关函数的定义,确保在销 户时,必须账户序号和密码相对应时才能销户成功,在存款、取款时也只有当账户序号和密码相对应时才能登录成功,选择存款、取款或显示余额等功能。因此, 函数定义中除了密码正确时的相关操作,还应有密码错误时

30、的提示信息和相关操 作。于是,我在DeleteList 函数和Search函数中加入了判断 p-data.password 与mima是否相等的语句,重要语句如下:DeleteList 函数定义中:while(strcmp(p-next-data.password,nina)*=0)printFL密码错误?请重新输入匚駡scanf(Ks,nina);Search函数定义中:iF(trcmp(p-data.passuord,mima)-0) printfC*录成功.Xn*); else(lata - password ,n*ina) char j;否畫韵输入(是,从键盘输入V人(否,从键盘上输入

31、N ):); scanFCXnj&j); r e turn ;else if(j=V )|Deposit(L,p;修改了相关函数定义后,调用程序,又出现了如下错误:error C2065: strcmp: undeclared identifier,我才意识到我在 DeleteList 函数和Search函数的定义中 调用了 strcmp函数,头文件中应包括#include,加上后运行结果就对了。修改后,相关调试结果如下:功的宀鸯一, 的户窘 爲埠!M 需要总li误功 择选薯码码户 请请事密销2 3 3 3 =2引=12七=2-knJNlnlll s s匕呂*IK丄 心冃贝2 功的:2 的录码

32、 要登密 需番 tetris SAAIA 啦聾码嘉录 谙请直嘗徑W豆c SHA密1 0号12人 = V3、再次修改完程序后,我希望程序还能更加完善,于是我开始思考出了密 码与账户不对应,导致销户失败和登录失败外,还可能出现哪些其他的特殊情况。 于是我又想到了两个特殊情况,一是取款时,账户余额可能不够,则应该输出提 示信息,告知用户当前账户余额,并要求用户输入合适的取款金额。二是,可能 系统没有建立账户,或者是建立了账户但是已经销户,就会导致当前系统没有账 户,输出账户信息为空,这时就需要输出提示信息“活期储蓄帐目管理系统没有 账户”,于是我根据自己的想法又对程序做了一些修改,修改的重要语句如下

33、:Deposit函数定义中:printFCtS输人你的取款金额厂);scanFCd.&n);1(p-data.money-n)=0)data.moneyp-ydata-money-D;printfC取款成功rW);elsedata.nonej;输入合适金额J);goto gg;|PrintList函数定义中:if(p-=NULL)printfCO 储蓄帐目管理系统没有账户屮); 程序修改后调试结果如下:尖败“减沖上的金甑不足辛 账户余瓢为=100 入合适前取款金额也2取款勲查询余额4、退出账号沖鄒麟臍:爲秤2、取款査询余额退岀账号:1ri j aJ?A *蜃懿罩功能:-存款氛取款”査询余额叭退

34、出账号詔辛字诜择功舘存款2、取款3、杳询余额仏退出帐耳=3 勺余额为:刃&D:Micro soft VisuaI StudiokM yProjectss5小Debug豁d. exeI回请登登录的雌号M密码:123456你需婆的功廉回符fety请请?!yS户 SF 需要账“ 择成:-1统嗨 壬-F需帳 翌4. in型 土三古吉6.2最终程序所有功能运行结果图一:D:Micro5oft Visual StudioMyProjectsdgsdexe |回【區序款息EHL 户 账龍i理 期C 口Irs吕 有目 晋户户看出 -12345理系纽叹下是相关功能及_编号 各埶)号,密码?占I蘿储户址名,帐户序

35、号,密码账户余额)1码 功的:ii- 的户常 要开号号 需要朦! 择入户岛 选输请请蚩丈不超过4个字符)(不超过E个字符)各不超过4个希)密码(不超过6个字符)请选择你需要的功能,-Ism:asdfgh:wxlc图 Microsoft yisuall StudiolVIyProiectsXdbljgVd.exe:SAA1选書码否输录:_F :3号切 k.tk- d a ie 贝 s 功的:a 的灵码 要舊 需to J1J11JI413曰翥c Tfl人密键gh从sdfJa人(否,从键咼上输入N -V图三:回 D:Microsoft Visual Studi oM yPrcyectsVdiXDebu gsdfexe口功入入施入成 硕a总的皱穂 请请期图四:

温馨提示

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

评论

0/150

提交评论