南京邮电大学程序设计银行管理系统DOC.docx
- 文档编号:3621271
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:27
- 大小:268KB
南京邮电大学程序设计银行管理系统DOC.docx
《南京邮电大学程序设计银行管理系统DOC.docx》由会员分享,可在线阅读,更多相关《南京邮电大学程序设计银行管理系统DOC.docx(27页珍藏版)》请在冰豆网上搜索。
南京邮电大学程序设计银行管理系统DOC
程序设计报告
(2015/2016学年第1学期)
题目:
银行定期储蓄管理系统
专业测控技术与仪器
组长学号姓名B14050608刘晨星昱
组员学号姓名B14050629郭文超
B14050633蒋文杰
指导教师崔子冠
指导单位计算机学院软件教学中心
日期2015年9月24日
成员分工
组长(刘晨星昱)
新建存单、查询存单、修改登录密码函数编写
组员(郭文超)
取款函数编写,完成实验报告
组员(蒋文杰)
主函数编写,界面优化,程序BUG最终检查
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
B14050608刘晨星昱
B14050629郭文超
B14050633蒋文杰
备注
评分等级共五种:
优秀、良好、中等、及格、不及格
银行定期储蓄管理系统
一、课题内容和要求
银行定期储蓄管理系统可以实现定期利息计算,客户按密码取款,工作人员口令修改等功能。
具体功能如下:
(1)工作人员根据口令进入系统;
(2)可以录入新的存单信息(存单编号,储户姓名,身份证编号,住址,联系电话,
存款金额,存期,利率,密码),存单信息可以保存在文件中,利率在存期决定后自动得到;
(3)根据存单编号可以查询存单信息;
(4)根据存单编号和密码可以完成储户取款操作,自动算清应支付的利息并显示在屏
幕上。
(5)界面友好,可操作性强,输入信息符合逻辑如存款金额不为负数、不可能有非
数字的字符等;
(6)工作人员可对信息维护,如口令修改等。
二、需求分析
系统中要求工作人员有一个系统帐号,并且帐号有密码,系统的一切操作(如:
录入存单信息,信息维护等)都由工作人员执行,而不是由存储用户执行,也主要是说存储用户并不直接与系统交互,而是通过管理员与系统交互。
储户填写的新的存单信息由工作人员输入系统,存单信息包括存单编号,储户姓名,
身份证编号,住址,联系电话,存款金额,存期,利率,密码。
存单信息可以保存在文件中,利率在存期决定后自动得到;储户可以根据存单编号查询存单信息,根据存单信息和密码完成储户取款操作,自动计算利息,并显示利息。
功能如图1所示:
图1功能框架图
(1)提供可操作的主菜单:
输出5个菜单,用于显示管理人员和用户可供操作的函数选项。
根据客户输入的选项来运行不同的功能,运行不同的函数。
(2)新建存单函数:
管理人员利用函数输入存单单号,姓名,身份证,地址,手机号码,存期,取款密码,存入金额。
(3)查询存单函数:
管理人员和用户利用函数查询已存入的存单信息。
(4)取款函数:
用户利用函数,输入取款密码取出自己的存款。
(5)修改管理员登录密码函数:
管理人员利用函数重新设定管理员登陆密码。
三、概要设计
1主要结构体
structbill//账单
{
intnumb;//账单编号
charname[32];//用户姓名
charid[19];//身份证号
charadd[20];//住址
chartel[12];//电话
doublemoney;//存款金额
intyear;//存期
doublelilv;//利率
intkey;//密码
};
2主要函数流程图
(1)主函数:
用于从文本中载入管理员登录密码,识别管理员输入密码,正确则载入主界面,错误则重输。
主界面包含5个选项,分别为新建存单,查询存单,取款,修改管理员密码,退出。
等待用户选择进入下一界面。
流程图如图2所示:
图2主函数
(2)新建存单函数:
管理员输入密码成功后,选择新建存单,输入存单单号,姓名,身份证,地址,手机号码,存期,取款密码,存入金额,输入成功后显示存入成功。
流程图如图3所示:
图3新建存单信息
(3)查询存单函数:
管理员输入密码成功后,选择查询存单信息,输入存单信息正确,主界面显示存单单号,姓名,身份证,地址,手机号码,,存入金额,存期,利率。
输入存单信息错误,提示重新输入。
流程图如图4所示:
图4查询存单信息
(4)取款函数:
管理员输入密码成功后,选择取款,用户输入存单单号,单号正确,主界面显示存单单号,存入金额,利率,存期,应得利息,单号错误重新输入;继续输入密码,密码正确,取款成功,密码错误,重新输入,错误3次,系统终止取款业务,返回主界面。
流程图如图5所示:
图5取款函数
(5)修改管理员登录密码函数,:
管理员输入密码成功后,选择修改管理员登录密码,输入原密码,密码正确,继续输入新密码,再次输入新密码,修改成功。
若原密码输错3次,则终止修改密码操作,返回主界面。
流程图如图6所示:
图6修改管理员登录密码函数
四、源程序代码
#include
#include
#include
intkeyy;
structbill//账单
{
intnumb;//账单编号
charname[32];//用户姓名
charid[19];//身份证号
charadd[20];//住址
chartel[12];//电话
doublemoney;//存款金额
intyear;//存期
doublelilv;//利率
intkey;//密码
};
intnewa()//新建存单
{
intn,i,flag;
FILE*nbill=fopen("bill.txt","r");
FILE*fbill=fopen("bill.txt","a");
{
structbilla;
intn;
printf("请输入新存单信息");
printf("\n>>编号:
");
do
{
intj,fnumb;
structbillc[10];
scanf("%d",&(a.numb));
flag=0;
for(j=0;j<10;j++)
{
fscanf(nbill,"%d\t%s\t%s\t%s\t%s\t%lf\t%d\t%lf\t%d",&c[j].numb,&c[j].name,&c[j].id,&c[j].add,&c[j].tel,&c[j].money,&c[j].year,&c[j].lilv,&c[j].key);
if(c[j].numb==a.numb)
{
printf("存单号重复,请重新输入\n");
j=10;
flag=2;
}
}
}while(flag==2);
//录入姓名
printf("\n>>姓名:
");
scanf("%s",a.name);
//录入身份证号
printf("\n>>身份证号:
");
do
{
i=0;
scanf("%s",&(a.id));
n=strlen(a.id);
while(a.id!
='\0')
{
if(a.id[i]>='0'&&a.id[i]<='9'||a.id[i]=='x'||a.id[i]=='X')
i++;
else
break;
}if(i==n&&n==18)
break;
else
printf("\n输入有误,请重新输入正确的身份证号码:
\n");
}
while
(1);
//录入住址
printf("\n>>住址:
");
scanf("%s",&(a.add));
//录入电话
printf("\n>>联系电话:
");
do
{
i=0;
scanf("%s",&(a.tel));
n=strlen(a.tel);
while(a.tel!
='\0')
{
if(a.tel[i]>='0'&&a.tel[i]<='9')
i++;
else
break;
}if(i==n&&n==11)
break;
else
printf("\n输入有误,请重新输入正确的手机号码:
\n");
}while
(1);
printf("\n>>存入金额:
");
do
{
scanf("%lf",&(a.money));
if(a.money<=0)
printf("\n输入有误,请重新输入正确的存入金额:
\n");
elsebreak;
}
while
(1);
printf("\n>>存期:
");
scanf("%d",&(a.year));
//计算利率
{
if(a.year>5)a.lilv=0.0420;
elseif(a.year>3)a.lilv=0.0378;
elsea.lilv=0.0225;
}
printf("\n>>利率为:
%0.4f",a.lilv);
printf("\n\n>>请设置取款数字密码,按回车键结束:
");
scanf("%d",&(a.key));
//写入文件
fprintf(fbill,"%d\t%s\t%s\t%s\t%s\t%f\t%d\t%f\t%d\n",a.numb,a.name,a.id,a.add,a.tel,a.money,a.year,a.lilv,a.key);
}
printf("存入成功\n");
system("pause");
system("cls");
fclose(fbill);
return0;
}
intfind()//查询信息
{
inti,fnumb,flag=0;
FILE*fbill=fopen("bill.txt","r");
structbillb[100];
doublelixi;//利息
for(i=0;i<100;i++)
{
fscanf(fbill,"%d\t%s\t%s\t%s\t%s\t%lf\t%d\t%lf\t%d",&b[i].numb,&b[i].name,&b[i].id,&b[i].add,&b[i].tel,&b[i].money,&b[i].year,&b[i].lilv,&b[i].key);
}
printf("请输入您需要查找的存单号:
\n>>");
scanf("%d",&fnumb);
printf("您好,这是您所查询的存单信息:
\n");
printf("\n");
for(i=0;i<10;i++)
if(b[i].numb==fnumb)
{
printf("存单编号:
%d\n\n用户姓名:
%s\n\n身份证号:
%s\n\n用户住址:
%s\n\n手机号码:
%s\n\n存入金额:
%0.2f\n\n存期:
%d年\n\n利率:
%0.4f\n\n取款密码:
已隐藏\n\n\n",b[i].numb,b[i].name,b[i].id,b[i].add,b[i].tel,b[i].money,b[i].year,b[i].lilv);//,b[i].key
flag=1;
break;
}
if(flag==0)
printf("您好,您输入的存单不存在,请查对后再输入。
\n");
system("pause");
system("cls");
return0;
}
intout()
{
inti,fnumb,flag=0,temp;
FILE*fbill=fopen("bill.txt","r");
structbillb[100];
doublelixi;//利息
for(i=0;i<100;i++)
{
fscanf(fbill,"%d\t%s\t%s\t%s\t%s\t%lf\t%d\t%lf\t%d",&b[i].numb,&b[i].name,&b[i].id,&b[i].add,&b[i].tel,&b[i].money,&b[i].year,&b[i].lilv,&b[i].key);
}
printf("请输入您的存单编号:
\n>>");
scanf("%d",&fnumb);
for(i=0;i<100;i++)
if(b[i].numb==fnumb)
{
flag=1;
break;
}
if(flag==0)
printf("您好,您输入的存单不存在,请查对后再输入。
\n");
if(flag==1)
{
lixi=b[i].money*b[i].lilv*b[i].year;
printf("\n存单编号:
%d\n\n存入金额:
%0.2f\n\n利率:
%0.4f\n\n存期:
%d年\n\n应得利息:
%0.2f\n\n",b[i].numb,b[i].money,b[i].lilv,b[i].year,lixi);
printf("\n请输入密码,注意遮挡:
");
scanf("%d",&temp);
if(temp==b[i].key)
printf("\n取款成功\n您已取出:
%0.2lf元\n\n",b[i].money+lixi);
else
{
printf("\n密码错误,请重新输入\n密码:
");
scanf("%d",&temp);
if(temp==b[i].key)
printf("\n取款成功\n您已取出:
%0.2lf元\n\n",b[i].money+lixi);
else
{
printf("\n密码错误,请重新输入\n密码:
");
scanf("%d",&temp);
if(temp==b[i].key)
{
printf("\n取款成功\n您已取出:
%0.2lf元\n\n",b[i].money+lixi);
}
else
printf("\n您好,由于您多次输入错误密码,为保障账号安全,系统终止取款操作。
\n\n");
}
}
}
system("pause");
system("cls");
return0;
}
intrevise()
{
FILE*rekeyy=fopen("keyy.txt","w");
inttemp,temp1,temp2,flag;
printf("请输入原密码\n密码:
");
scanf("%d",&temp);
if(temp==keyy)
flag=1;
system("cls");
for(;flag!
=1;)
{
printf("密码错误,请重新输入\n密码:
");
scanf("%d",&temp);
if(temp==keyy)
flag=1;
system("cls");
}
/*认证成功*/
printf("请输入新密码:
\n");
scanf("%d",&temp1);
system("cls");
printf("请再次输入新密码:
\n");
scanf("%d",&temp2);
system("cls");
if(temp1==temp2)
{
fprintf(rekeyy,"%d",temp1);
printf("修改成功\n");
system("pause");
}
else
{
printf("您好,由于您多次输入错误密码,为保障账号安全,系统终止修改密码操作。
");
system("pause");
}
printf("4\n");
system("cls");
fclose(rekeyy);
return0;
}
intmain()
{
FILE*fkeyy=fopen("keyy.txt","r");
intt;//输入密码的次数
inttemp;//输入的密码
inti;//序号
intflag=0;
fscanf(fkeyy,"%d",&keyy);
printf("请输入管理员登录密码:
\n");
scanf("%d",&temp);
if(temp==keyy)
flag=1;
system("cls");
for(;flag!
=1;)
{
printf("管理员密码错误,请重新输入:
\n");
scanf("%d",&temp);
if(temp==keyy)
flag=1;
system("cls");
}
{//认证成功
do
{
puts("***************************************");
puts("**");
puts("*欢迎使用银行定期储蓄管理系统:
*");
puts("**");
puts("*1:
新存单信息录入*");
puts("*2:
存单信息查询*");
puts("*3:
取款*");
puts("*4:
修改管理员登录密码*");
puts("*5:
退出系统*");
puts("**");
puts("***************************************");
printf("请选择您的操作:
");
scanf("%d",&i);
system("cls");//清屏
switch(i)
{
case1:
newa();
break;
case2:
find();
break;
case3:
out();
break;
case4:
revise();
break;
case5:
return0;
default:
printf("操作选择有误,请重新输入您需要的操作:
\n");
system("pause");
}
}while
(1);
}
fclose(fkeyy);
return0;
}
5、测试数据及其结果分析
提前在桌面建立一个“keyy.txt”文本文档,里面写入管理员登陆密码。
运行后,输入正确的密码(如图7),登入程序。
程序的主菜单界面如下(图8所示)。
图7输入管理员登录密码
图8主菜单界面
(1)新建存单测试(结果如图9所示):
图9完成新存单输入后的界面
(2)查询存单测试(结果如图10所示):
图10查询存单的结果
(3)取款测试(结果如图11所示):
图11取款成功的结果
(4)修改管理员密码测试(过程及结果如图12、13、14、15所示):
图12输入原密码
图13输入新密码
图14再次确认新密码
图15修改管理员密码成功的结果
(5)退出测试:
选择退出后,直接关闭系统。
结果分析如下:
(1)提示输入管理人员登录密码时,输入错误会一直停留在提示界面;
(2)新建存单测试,如果输入重复存单号会提示重新输入,身份证输入必须为18位数字,末位可为X,输入错误会提示重新输入,手机号码输入必须为11位数字,输入错误会提示重新输入,存款金额输入必须为正数,输入错误会提示输入错误。
(3)查询存单测试,存单单号输入必须为已有单号,输入错误会提示重新输入。
(4)取款测试,存单单号输入必须为已有单号,输入错误会提示重新输入。
密码输入必须正确,输入错误提示重新输入,错误3次会退出取款,重返主界面。
(5)修改管理员密码测试,原密码输入必须正确,输入错误提示重新输入,错误3次会退出密码修改界面,重返主界面。
再次输入新密码必须和第一次输入新密码相同,输入错误会提示重新输入。
六、调试过程中的问题
(1)结构体建立时的账单密码类型出问题:
为了可以记录用户所设计的密码,原先采用了一维整形数组来依次存放用户所输入的数字。
但是因为一个多位数的数字的大小足以用一个整形空间储存,采用一维数组不仅造成了大量的内存空间浪费,还使得对密码数位的分离造成困难。
故采用了用整形空间代替数组的方法,轻松解决了数字数位难以分离的问题。
(2)程序界面只能连续显示的处理问题:
程序每次运行时,每次输出显示都会接在原先的输出底下,长时间使用会使程序页面过长并且杂乱。
通过
system("cls");
函数,实现了清楚屏幕上原有的字符,使界面更加干净整洁,符合用户习惯。
(3)身份证号内包输入非数字的’x’字符影响输入的问题:
在第一次测试中,身份证号只允许为数字,采用数组存放身份证号导致无法识别字符’x’,为了解决这个问题,我们把存放身份证号的数组改为字符串,并采用了
while(a.id!
='\0')
{
if(a.id[i]>='0'&&a.id[i]<='9'||a.id[i]=='x'||a.id[i]=='X')
i++;
else
break;
}
的方法,实现了对”x”和”X”的识别。
(4)忘记取款则无法继续程序的问题:
在使用中,取款密码错误会导致无法取款,这时需要重新输入密码,再次错误后再次重试,再次错误后再次重试,再次错误后再次重试,再次错误后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南京 邮电大学 程序设计 银行 管理 系统 DOC