资源描述
活期储蓄帐目管理数据结构
精品文档
洛 阳 理 工 学 院
课 程 设 计 报 告
课程名称 数据结构课程设计
设计题目 活期储蓄帐目管理
专 业 计算机科学与技术
课 程 设 计 任 务 书
设计题目: 活期储蓄帐目管理
设计内容与要求:
【问题描述】活期储蓄处理中,储户开户、销户、存入、支出活动频繁。设计一个活期储蓄账目管理系统。
【基本要求】
1) 能比较迅速地找到储户的帐户,以实现存款、取款记账;
2) 能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
课 程 设 计 评 语
成绩:
指导教师:_______________
年 月 日
收集于网络,如有侵权请联系管理员删除
目 录
一、问题描述与基本要求 1
1.1问题描述 1
1.2基本要求 1
二、数据结构的设计 2
2.1数据结构的选择 2
2.2单链表的定义 2
2.3模块划分 2
三、模块结构图 4
四、程序流程图 4
五、调试分析 7
5.1程序错误修改及完善的过程 7
5.2最终程序所有功能运行结果 8
六、心得体会 9
七、源程序清单 10
一、问题描述与基本要求
1.1问题描述
活期储蓄处理中,储户开户、销户、存入、支出活动频繁。设计一个活期储蓄账目管理系统。
1.2基本要求
系统设计要求:
1、能比较迅速地实现插入,以实现储户开户的功能,储户开户时需输入的信息包括储户姓名,密码。
2、能比较迅速地通过储户的账户序号和密码找到储户的账户,并删除该账户,以实现销户的功能。
3、能比较迅速地通过储户的账户序号和密码找到储户的账户(密码不对时,可选择是否重新输入密码)实现账户登录的功能。登录成功后,再通过修改链表结点数据域中的对应元素,以实现存款、取款、显示余额等功能,若取款时账户余额不足,输出提示信息“取款失败!你账户上的金额不足!”,并显示账户当前余额,并且提示重新输入合适的取款金额。
4、查找活期储蓄帐目管理系统当前存在的储户,当输出活期储蓄帐目管理系统没有账户时,输出提示信息“活期储蓄帐目管理系统没有账户”,当有账户时,输出所有账户的相关信息,包括储户姓名,帐号,密码,账户余额。
二、数据结构的设计
2.1数据结构的选择
课程设计题目的要求是,要较简单迅速地实现开户、销户、存款、取款、输出用户信息的功能,于是我很自然地想到了可以用单链表的结构,通过编写相应功能函数来实现建立新结点、删除结点、修改结点中数据域的内容、输出结点数据域中的内容等功能,即可满足课程设计题目的要求。
2.2单链表的定义
先定义单链表结点的数据域,数据域包括储户姓名、账户序号、账户密码、账户金额等储户信息,然后再定义链表结点,链表结点包括结点数据域和结点链域,最后再定义指向链表结点的指针。
数据结构类型定义:
typedef struct ListData //定义结点数据域
{ char name[3]; //储户姓名
int account; //账户账号
char password[5]; //账户密码
int money; //账户金额
}ListData;
typedef struct node //定义链表结点
{
ListData data; //结点数据域
struct node *next; //结点链域
}ListNode;
2.3模块划分
(1)建立空链表函数:void InitList (LinkList *L)
(2)插入链表结点,实现开户功能函数:void InsertList (LinkList *L)
(3)删除链表结点,实现销户功能函数:void DeleteList (LinkList *L)
(4)储户存款、取款、显示余额函数:void Deposit (LinkList *L,LinkList *p)
(5)链表查找,实现用户登录功能函数:void Search (LinkList *L)
(6)输出链表函数:void PrintList (LinkList *L)
(7)主菜单函数:void menu()
(8)选择函数:void choice()
(9)主函数:void main()
三、模块结构图
四、程序流程图
1. InitList ()函数 2. InsertList ()函数
3. DeleteList()函数 4. PrintList()函数
5. Deposit()函数
6. Search()函数
7. menu()函数
8. choice()函数
9.main()函数
五、调试分析
5.1程序错误修改及完善的过程
1、当看到这个课程设计题目时,我觉得还算比较简单,因为我之前数据结构实验就做过单链表的插入、删除、查找、输出,而这次活期储蓄帐目管理系统要求的开户、销户、存款、取款、输出储户信息等功能,即可用单链表的相关功能函数来实现,于是我修改了之前写过的单链表的一些函数,以满足这次题目的要求,但在实验过程中仍出现了一些错误。最终经过我的仔细检查和修改,最终编写出了符合要求的程序,还增加了一些功能。
2、我编写完程序后,觉得程序太过简单,又想到题目是活期储蓄帐目管理系统,那账户应该是有密码保证安全性的,于是我又在单链表结点的数据域中加入了一个新的元素password[5],并且还修改了后面相关函数的定义,确保在销户时,必须账户序号和密码相对应时才能销户成功,在存款、取款时也只有当账户序号和密码相对应时才能登录成功,选择存款、取款或显示余额等功能。因此,函数定义中除了密码正确时的相关操作,还应有密码错误时的提示信息和相关操作。于是,我在DeleteList函数和Search函数中加入了判断p->data.password与mima是否相等的语句。
3、修改了相关函数定义后,调试程序,又出现了如下错误:error C2065: 'strcmp' : undeclared identifier,我才意识到我在DeleteList函数和Search函数的定义中调用了strcmp函数,头文件中应包括#include<string.h>,加上后运行结果就对了。
修改后,相关调试结果如下:
4、再次修改完程序后,我希望程序还能更加完善,于是我开始思考出了密码与账户不对应,导致销户失败和登录失败外,还可能出现哪些其他的特殊情况。于是我又想到了两个特殊情况,一是取款时,账户余额可能不够,则应该输出提示信息,告知用户当前账户余额,并要求用户输入合适的取款金额。二是,可能系统没有建立账户,或者是建立了账户但是已经销户,就会导致当前系统没有账户,输出账户信息为空,这时就需要输出提示信息“活期储蓄帐目管理系统没有账户”,于是我根据自己的想法又对程序做了一些修改,最终程序完成所有功能运行。
5.2最终程序所有功能运行结果
(1)主菜单
(2)开户 (3)销户
(4)账号登录,存、取款及查询余额
(5)显示出户信息
六、心得体会
这次课程设计,我选的题目是活期储蓄账目管理,对于这个实验开始感觉不知从哪儿开始,后来经过认真分析后,结合所学知识并查阅了许多相关的课外知识,我们开始了一步步解题编程。
在编程过程中,遇到问题的时候就与同学一起讨论解决,从其他人身上学到了很多,慢慢把不会不理解的地方给弄明白了。在经过很多次调试以后,最终没有出现错误了,实验能够执行,将功能实现,最后完成程序编写。虽然不是很完美,但发现不足之处并在以后的设计中注意这些细节,对于将来的实践还是很有帮助,我们可以不断发现我们的不完美,并想办法去改进这些不完美。
这次的综合性实验使我了解到,平时对知识的积累相当重要,同时也要注重课上老师的讲解,老师在课上的延伸是课本上所没有的,这些知识对于我们对程序的编写有很大的作用。同时,编程也要求我们有足够的耐心,细细推敲,越着急可能就越无法得到我们想要的结果,遇到不会的问题要多多请教,知识是在实践与向别人请教的过程中积累的,所以问是至关重要的,只要肯下功夫很多东西都是可以完成的。总之,编程使我学到更多,更全面的知识。
通过这次课程设计学到了很多东西包括以前在课本上没有学到的知识,还使我懂得了理论和时间结合是很重要的。让我进一步了解了程序设计方法,并且对这门课产生了浓厚的兴趣。更重要的是培养了自己耐心、细心、用心的良好品质。同时也非常感谢同学的帮助及老师的建议与指导。
七、源程序清单
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int total=1;//定义的全局变量,用于开户所需
typedef struct ListData //定义结点数据域
{
char name[8]; //储户姓名
int account; //账户账号
char password[6]; //账户密码
float money; //账户金额
}ListData;
typedef struct node //定义链表结点
{
ListData data; //结点数据域
struct node *next; //结点链域
}Link;
void InitList(Link *L) //建立空链表
{
L=(Link *)malloc(sizeof(Link)); //建立头结点
L->next=NULL; //建立空的单链表L
}
void InsertList(Link *L) //链表插入结点,实现开户功能,需输入储户姓名和密码
{
Link *s;
s=(Link*)malloc(sizeof(Link)); //建立新结点s
printf("请输入你要开户的姓名:");
scanf("%s",s->data.name);
s->data.account=1000+total++;
printf("你开户的账号为:%d\n",s->data.account);
printf("请输入你账号的密码:");
scanf("%s",s->data.password);
s->data.money=0.00;
s->next=NULL;
if(L->next==NULL) //头插法
L->next=s;
else
{
s->next=L->next; //将s结点插入表头
L->next=s;
}
printf("开户成功!\n");
}
void DeleteList(Link *L) //删除链表结点,实现销户功能(需要输入账号和密码)
{
Link *p=L,*q;
char pass[6];
int s;
printf("请输入你要销户的账号:");
scanf("%d",&s);
printf("请输入该账号的密码:");
scanf("%s",pass);
while(p->next!=NULL)
{
if(p->next->data.account==s)
break;
p=p->next;
}
if(p->next!=NULL)
{
while(strcmp(p->next->data.password,pass)!=0)
{
printf("密码错误!请重新输入:");
scanf("%s",pass);
}
q=p->next;
p->next=q->next; //修改指针,删除结点q
free(q);
printf("账号销户成功!\n");
}
else printf("你所要销户的的账号不存在(或已经销户)。\n");
}
void PrintList(Link *L) //输出链表,实现储户信息输出
{
Link *p=L->next;
while (p!=NULL)
{
printf("%s\t",p->data.name);
printf("%d\t%s\t%.2f\n",p->data.account,p->data.password,p->data.money);
p=p->next;
}
}
void Deposit(Link *L,Link *p) //储户存款、取款、查询余额
{
int cq;
float mn;
while(1)
if(p!=NULL)
{
printf("\n1、存款 2、取款 3、查询余额 4、退出账号\n请输入数字(1-4)选择功能:\n");
scanf("%d",&cq);
if(cq==1)
{
printf("请输入你的存款金额:");
scanf("%f",&mn);
p->data.money=p->data.money+mn;
printf("存款成功!\n");
}
else if(cq==3)
{
printf("你账户的余额为:%.2f\n",p->data.money);
}
else if(cq==4)
{
printf("账号退出成功!\n");
return;
}
else
{
printf("请输入你的取款金额:");
scanf("%f",&mn);
if((p->data.money-mn)>=0)
{
p->data.money=p->data.money-mn;
printf("取款成功!\n");
}
else
{
printf("取款失败!\n");
printf("你账户上的金额不足!你的账户余额为:%.2fRMB\n",p->data.money);
printf("请输入合适的取款金额:");
}
}
}
}
void Search(Link *L) //链表查找,实现用户登录功能(需要输入账号和密码)
{
Link *p=L->next; //从表中第一个结点开始
int acc;
char pass[6];
printf("请输入你要登录的账号:");
scanf("%d",&acc);
printf("请输入你的密码:");
scanf("%s",pass);
while(p!=NULL) //当前表未查完
{
if(p->data.account==acc)
break;
p=p->next;
}
if(p==NULL)
printf("不存在该账户!\n");
else
{
if(strcmp(p->data.password,pass)==0)
printf("账号登录成功!\n");
else
{
while(strcmp(p->data.password,pass)!=0)
{
char pa;
printf("密码错误!\n");
printf("是否重新输入(是,就输入任意键)、(否,从键盘上输入N or n):");
scanf("\n%c",&pa);
if(pa=='n'||pa=='N')
{
system ("cls");
return;
}
printf("\n请重新输入你的密码:");
scanf("%s",pass);
}
}
Deposit(L,p);
}
}
void menu() //主菜单
{
printf(" *********欢迎进入活期储蓄账目管理系统********* \n");
printf(" ※ 1.储户开户 ※ \n");
printf(" ※ 2.储户销户 ※ \n");
printf(" ※ 3.储户的账号存款、取款 ※ \n");
printf(" ※ 4.返回菜单 ※ \n");
printf(" ※ 5.查看所有储蓄账户信息 ※ \n");
printf(" ※ 6.退出账目管理 ※ \n");
printf(" ********************************************** \n");
}
void choice()
{
Link *L;
InitList(L);
while(1)
{
int m;
char ch;
printf("请选择你需要的功能:");
scanf("%d",&m);
if(m==6)
break;
system ("cls");
switch(m)
{
case 1:InsertList(L);ch=getchar();break;
case 2:DeleteList(L);ch=getchar();break;
case 3:Search(L);ch=getchar();break;
case 4:menu();ch=getchar();break;
case 5:PrintList(L);ch=getchar();break;
default:printf("输入错误!请重新选择功能。\n");break;
}
}
}
void main()
{
menu();
choice();
}
展开阅读全文