课程设计 银行个人账户管理的实验报告.docx
《课程设计 银行个人账户管理的实验报告.docx》由会员分享,可在线阅读,更多相关《课程设计 银行个人账户管理的实验报告.docx(64页珍藏版)》请在冰豆网上搜索。
课程设计银行个人账户管理的实验报告
西安郵電大学
C语言课程设计报告
题目:
个人银行账户管理系统
院系名称:
计算机学院
专业名称:
计算机科学与技术
班级:
1106
学生姓名:
高丹
学号(8位):
04111196
指导教师:
王春梅
设计起止时间:
2012年06月06日~2012年06月15日
一、设计目的
1、学会用C语言编程实现小区管理系统;
能熟练的掌握各个功能函数的熟练编写和理解。
2、本次课程设计我设计的是一个银行个人账户管理系统。
由于大学生日常生活开支以及钱的来源都需要详细的记录下来,所以我设计了这个系统,目的是希望通过这个系统来让大家养成良好的记账习惯,慢慢学会理财,并且可以对自己记录的数据进行简单的分析(通过其中的排序系统),达到更合理的利用自己的金钱资源的目的。
二、设计内容
经过对程序设计题目的分析可知,整个程序的设计实现大致分为九个模块,每一个模块对应一个或多个函数。
在这些函数当中,储户注册函数,登录函数,储户信息录入函数,储户信息显示函数,信息插入函数,信息修改函数,信息排序函数以及信息删除的实现严格按照题目的要求,而储户密码的修改属于附加功能。
读取文件函数和保存信息函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。
内容如下:
1、用户登录系统(包括用户以及管理员的注册,登录界面,其中有注册函数和登录函数)。
2、系统以菜单的模式打开并工作(有储户界面和管理员界面)。
3、储户信息的录入(保存函数)。
4、储户信息的读出并显示出来(信息读出并打印函数)。
5、储户信息的查询系统,包括按月份查询和按日期查询(用过查询函数来实现)。
6、储户信息的修改系统,包括修改月份,修改日期,修改进账数目和出账数目(通过修改函数来实现)。
7、修改密码系统(修改密码函数实现储户对账户密码的修改)。
8、退出(退出到主界面和上一界面)。
每一个储户记录都包含账户编号,月份,日期,进账数目,出账数目。
在程序当中,将储户记录类型定义为结构体类型,添加以及追加的储户信息直接写入D盘的account.txt文件中,其它函数每次对储户记录的访问,其数据来源都是account.txt文件,这样做不但可以保证储户信息的一致性,而且可以对储户信息进行永久保存,保证每次运行程序都可以采用原来的数据。
三、概要设计
功能模块图
2.各个模块的详细功能
1.储户注册函数(voidregist())
主要实现程序最初储户注册自己的账户名和密码,只有注册了账户名和密码才可以进入账户管理系统并且操作自己的信息。
2.登录函数(intload())
储户和管理员通过此登录系统进入各自的页面对信息进行操作。
3.用户登陆界面(voidmenu())以及管理员登录界面(voidmenu_1())
通过界面来选择想要操作的内容。
4.储户信息录入函数,包括链表的建立和信息的保存(linklistcreat()、save(linklisth))
实现储户信息以链表的形式录入并保存到文件中,即我们所说的记账。
5.储户信息读出函(Node*show())
实现的功能是按照账号和密码对储户所存储的信息从所存文件中读出。
6.储户信息的查询函数,包括按月份查询和按日期查询。
(Node*search())
实现用户针对自己信息的查询,可以查询当月的账户信息,也可以查询当天的账户信息。
7.储户信息插入函数,包括两个函数,一个是单纯实现插入功能,另一个是在此系统中实现的插入功能。
(linklistinsert()、Insert(linklisth))
实现储户信息插到原信息并且显示出来的功能。
8.信息修改函数,包括两个函数,一个是单纯实现修改,另一个是在此系统中实现对信息的修改功能(linklistrecr(linklisth)、voidRecr())
通过该函数管理员可以对储户的数据信息进行修改。
9.信息排序函数,包括两个函数,一个是单纯实现排序,另一个是在此系统中实现对信息的排序。
(在此只举按月份查询的例子linklistsort_mon(linklisthead)、voidSort_M())
该函数实现的功能是对储户信息中各个项目按一定的顺序进行排序(默认为升序)。
10.信息删除函数,包括两个函数,一个是单纯实现修改功能,另一个是在此系统上实现对信息修改的功能。
(linklistrecr(linklisth)、voidRecr())
该函数可以对储户过期的信息进行删除操作。
11.储户密码修改函数(intres())
可以实现对储户的密码进行修改;
12.显示函数(Node*print(linklisth))
实现的是显示目前所有的有效储户记录信息。
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
四、详细设计
1.功能函数的调用关系图
2、功能函数流程
(1)信息录入函数
(2)、信息查询函数
(3)、信息修改函数
(4)信息删除函数
(5)信息插入函数
(6)信息排序函数
3、重点设计及其代码
1、链表的创建
linklistcreat()//链表创建
{
linklisthead;
Node*r,*p;
intx;
head=(linklist)malloc(sizeof(Node));//尾插法
head->next=NULL;
r=head;
do
{
p=(Node*)malloc(sizeof(Node));
printf("请输入账户编号:
\n");
scanf("%s",p->num);
printf("请输入月份:
");
scanf("%d",&p->Date.mon);
printf("请输入日期:
");
scanf("%d",&p->Date.day);
printf("请输入进账数目:
");
scanf("%f",&p->inacc);
printf("请输入出账数目:
");
scanf("%f",&p->outacc);
r->next=p;
r=p;
printf("是否继续录入?
<是:
1否:
0>");//利用x来判断是否再次录入
flushall();
scanf("%d",&x);
}while(x);
r->next=NULL;
returnhead;
}
2、信息保存于文件
voidsave(linklisth)//储户信息保存
{
FILE*fp;
Node*j;
if((fp=fopen("D:
/account.txt","wt"))==NULL)
{
printf("文件打开失败!
按任意键退出!
\n");
getch();
exit
(1);
}
for(j=h->next;j!
=NULL;j=j->next)
fprintf(fp,"%s%d%d%f%f\n",j->num,j->Date.mon,j->Date.day,j->inacc,j->outacc);
fclose(fp);
printf("文件保存成功!
按任意键返回");
getch();
}
3、信息从文件中读出
linklisthead;
Node*r,*s;
FILE*fp;
intn;
if((fp=fopen("D:
/account.txt","rt"))==NULL)
{
printf("读出文件出错!
按任意键退出!
");
getch();
exit
(1);
}
head=(linklist)malloc(sizeof(Node));
r=head;
while(!
feof(fp))
{
s=(Node*)malloc(sizeof(Node));
fscanf(fp,"%s%d%d%f%f\n",s->num,&s->Date.mon,&s->Date.day,&s->inacc,&s->outacc);
r->next=s;
r=s;
}
r->next=NULL;
fclose(fp);
printf("\n文件中信息已经正确读出!
\n");
returnhead;
}
4、信息显示
Node*print(linklisth)//储户信息显示
{
Node*q;
printf("账户信息为:
\n");
printf("账户编号月份日期进账出账\n");
for(q=h->next;q!
=NULL;q=q->next)
printf("\t%s\t%d\t%d\t%f\t%f\n",q->num,q->Date.mon,q->Date.day,q->inacc,q->outacc);
returnh;
}
5、信息查询
Node*h,*p;
intdate,x;
h=show();
p=h->next;
printf("*********************************************\n");
printf("1按月份查询\n");
printf("2按日期查询\n");
printf("*********************************************\n");
printf("请输入1or2\n");
scanf("%d",&x);
switch(x)
{
case1:
printf("请输入您要查询的月份:
\n");
scanf("%d",&date);
while(p!
=NULL)
{
if(p->Date.mon==date)
returnp;
else
p=p->next;
}
case2:
printf("请输入您要查询的日期:
\n");
scanf("%d",&date);
while(p!
=NULL)
{
if(p->Date.day==date)
returnp;
else
p=p->next;
}
}
returnNULL;
5、信息插入
FILE*fp;
Node*j;
fp=fopen("D:
/account.txt","at+");
if(fp==NULL)
{
printf("插入失败!
按任意键退出!
\n");
getch();
exit
(1);
}
for(j=h->next;j!
=NULL;j=j->next)
fprintf(fp,"%s%d%d%f%f\n",j->num,j->Date.mon,j->Date.day,j->inacc,j->outacc);
fclose(fp);
printf("插入成功!
按任意键返回");
getch();
6、信息修改
intx;
charnum[20];
intinf;
floatacc;
Node*p;
p=h->next;
printf("请输入您要修改的账户信息编号:
\n");
flushall();
scanf("%s",num);
if(p==NULL)
printf("信息为空,无法修改!
\n");
while(p!
=NULL)
{
if(strcmp(p->num,num)==0)
{
printf("****************************************************\n");
printf("1修改月份\n");
printf("2修改日期\n");
printf("3修改进账数目\n");
printf("4修改出账数目\n");
printf("*****************************************************\n");
printf("请按1-4选择\n");
scanf("%d",&x);
switch(x)
{
case1:
printf("请输入新月份:
\n");
scanf("%d",&inf);
p->Date.mon=inf;
returnh;
break;
case2:
printf("请输入新日期:
\n");
scanf("%d",&inf);
p->Date.day=inf;
returnh;
break;
case3:
printf("请输入您修改后的进账数目:
\n");
scanf("%f",&acc);
p->inacc=acc;
returnh;
break;
case4:
printf("请输入您修改后的出账数目:
\n");
scanf("%f",&acc);
p->outacc=acc;
returnh;
break;
}
}
p=p->next;
}
returnh;
7、信息排序,在此仅拿按照月份排序举例。
Node*pri,*mid,*tai,*p;
p=head->next;
while(p!
=NULL)
{
mid=head->next;
if(head->Date.mon>head->next->Date.mon)
{
head->next=mid->next;
mid->next=head;
head=mid;
}
pri=head;
mid=head->next;
tai=mid->next;
while(mid->next!
=NULL)
{
if(mid->Date.mon>tai->Date.mon)
{
pri->next=mid->next;
mid->next=tai->next;
tai->next=mid;
}
pri=pri->next;
mid=pri->next;
tai=mid->next;
}
p=p->next;
}
returnhead;
8、信息删除
charnum[20];
Node*q,*r;
q=p->next;
r=p;
if(q==NULL)
return0;
printf("请输入需要删除的账户编号:
\n");
scanf("%s",num);
while(q!
=NULL)
{
if(strcmp(q->num,num)==0)
{
r->next=q->next;
free(q);
returnp;
}
r=q;
q=q->next;
}
returnp;
9.密码修改
FILE*fp;
charpkey[20];
charnkey[20];
charrnkey[20];
charname[20];
intx;
fp=fopen("D:
/key.txt","wt");
printf("请输入您的注册名:
\n");
scanf("%s",name);
fprintf(fp,"%s",name);
printf("请输入原始密码:
\n");
scanf("%s",pkey);
flushall();
printf("请输入修改后密码:
\n");
scanf("%s",nkey);
if(fp==NULL)
{
printf("文件打开失败,按任意键推出!
");
getch();
exit
(1);
}
printf("请再次输入修改后密码:
\n");
scanf("%s",rnkey);
fprintf(fp,"%s\n",rnkey);
printf("修改密码成功!
按任意键返回\n");
getch();
fclose(fp);
printf("请选择1:
重新登录,0:
退出系统");
scanf("%d",&x);
system("cls");
if(x)
{
charn_name[10];
charn_key[20];
printf("\n");
printf("\n");
printf("*******************************************************\n");
printf("\n");
printf("欢迎登录银行个人账户管理系统\n");
printf("\n");
printf("********************************************************\n");
printf("\n");
printf("\n");
printf("请输入您的姓名:
\n");
flushall();
scanf("%s",n_name);
fscanf(fp,"%s",name);
printf("请输入您的密码:
\n");
scanf("%s",n_key);
fscanf(fp,"%s",rnkey);//从文件中读出,若和输入的相同则修改成功,若不相同,则修改失败!
if(strcmp(rnkey,n_key)==0&&strcmp(name,n_name)==0)
{
printf("成功登录!
\n");
menu();
return1;
}
else
{
printf("输入密码错误!
退出系统");
return0;
}
}
Return0;
五.测试数据及运行结果
一、用户登录数据演示
1.直接登录的情况下
注册的情况下
2.用户登录成功后可进入选择界面
3.数据录入
4.信息显示
5.信息查询,分按月份查询和按日期查询
查询月份,5月
按日期查询
6.修改密码
修改密码后重新登录
7.退出
二、管理员登录数据演示
进入管理员界面
1.显示用户的信息
2.对用户信息进行追加,也就是插入
3.对用户信息进行排序,按月份排序
按日期排序
按进账数目进行排序
按出账数目进行排序
4.信息删除
5.信息修改,分为修改月份
修改日期
修改进账数目
修改出账数目
错误数据演示:
1.用户名或密码错误时
2.查询输入错误数据时
3.所删除的信息不存在时
六、调试情况,设计技巧及体会
1.这个系统是第一次做,对于一些基本功能的需求都可以实现,这也加强了我对C语言这学期所学到的知识的理解和应用,果然要讲理论知识应用到实际中是一件很有挑战性的事。
对于这个系统我觉得做的特别粗糙,作为一个课件来演示的话还可以,但是真正应用到实际生活中缺陷很大,比如没有设置余额查询系统,这是这个系统最大的缺陷,由于我的有些知识还未掌握熟练,所以没有做这个系统,很是遗憾。
2.本次课设,我感受很多。
深刻地懂得了理论联系实际的重要性。
在课设过程中,我发现了自己有很多欠缺的地方,比如:
涉及的相关知识不全面,知识学得不够透彻,在课设时就会遇到重重困难,它启示着我在以后的学习中要精益求精,对有用的知识要做到深入研究。
在本次课程设计中,要感谢老师对我的指导,对于一些自己无法修正的错误通过老师的讲解让我对于C语言的理解更加透彻,也体会到细节决定成败,一个很小的错误可能导致整个程序无法运行。
同时要十分感谢两个同学,杨文鹏和冯鹏飞同学,对我的帮助特别大,尤其是杨文鹏同学教会我函数功能放到系统中如何实现的方法,给我打通了一条写C语言程序的思路,让我将学来的知识能够灵活运用,还有冯鹏飞同学为我耐心讲解链表的插入方法,以及帮我改正一些语法和逻辑上的错误,这些都是我通过这次课程设计而收获到的宝贵财富。
通过这次课程设计,我发现用一些字母下划线等组合起来的小小程序可以实现强大的功能是一件特别让人惊喜的事情,提升了我对C语言学习的兴趣,在以后的学习中,我相信自己会更加努力,彻底学好C语言这门课程。
七、参考文献
《C程序设计实例教程》金林樵主编机械工业出版社
《C程序设计(第三版)》谭浩强清华大学出版社
《C语言课程设计案例精编》郭翠英中国水利水电出版社
八、附录(源代码)
#include
#include
#include"conio.h"
#include
/*intload();//登录系统
voidmenu();//用户登录菜单
voidmenu_1();//管理员登陆菜单
linklistcreat();//链表创建
voidsave(linklisth);//储户信息保存
Node*show();//储户信息的读出
Node*print(linklisth);//储户信息显示
Node*search();//进行信息查询
//linklistinsert();//插入系统
//voidInsert()//大插入,完成功能的实现
res();//密码修改系统功能
linklistrecr();//信息修改系统功能
voidRecr();//信息修改系统功能实现过程
//linklistsort(linklisthead)//排序
//voidSort();//大排序
Node*del(Node*p);//信息删除系统功能
voidDel();//信息删除系统功能实现过程*/
structdate
{
intmon;
intday;
};
typedefstructbasic_inf
{
charnum[20];
structdateDate;
floatina