南京邮电大学程序设计银行管理系统DOCWord格式.docx
《南京邮电大学程序设计银行管理系统DOCWord格式.docx》由会员分享,可在线阅读,更多相关《南京邮电大学程序设计银行管理系统DOCWord格式.docx(27页珍藏版)》请在冰豆网上搜索。
![南京邮电大学程序设计银行管理系统DOCWord格式.docx](https://file1.bdocx.com/fileroot1/2022-11/24/40404de1-aa5e-45f1-9f71-f3ae7e9ff7c7/40404de1-aa5e-45f1-9f71-f3ae7e9ff7c71.gif)
评分等级共五种:
优秀、良好、中等、及格、不及格
一、课题内容和要求
银行定期储蓄管理系统可以实现定期利息计算,客户按密码取款,工作人员口令修改等功能。
具体功能如下:
(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新建存单信息
管理员输入密码成功后,选择查询存单信息,输入存单信息正确,主界面显示存单单号,姓名,身份证,地址,手机号码,,存入金额,存期,利率。
输入存单信息错误,提示重新输入。
流程图如图4所示:
图4查询存单信息
管理员输入密码成功后,选择取款,用户输入存单单号,单号正确,主界面显示存单单号,存入金额,利率,存期,应得利息,单号错误重新输入;
继续输入密码,密码正确,取款成功,密码错误,重新输入,错误3次,系统终止取款业务,返回主界面。
流程图如图5所示:
图5取款函数
(5)修改管理员登录密码函数,:
管理员输入密码成功后,选择修改管理员登录密码,输入原密码,密码正确,继续输入新密码,再次输入新密码,修改成功。
若原密码输错3次,则终止修改密码操作,返回主界面。
流程图如图6所示:
图6修改管理员登录密码函数
四、源程序代码
#include<
stdio.h>
stdlib.h>
#include<
string.h>
intkeyy;
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("
a"
structbilla;
intn;
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);
//录入姓名
姓名:
scanf("
%s"
a.name);
//录入身份证号
身份证号:
do
i=0;
scanf("
(a.id));
n=strlen(a.id);
while(a.id!
='
\0'
)
{
if(a.id[i]>
0'
&
a.id[i]<
9'
||a.id[i]=='
x'
X'
i++;
else
break;
}if(i==n&
n==18)
break;
else
printf("
\n输入有误,请重新输入正确的身份证号码:
\n"
while
(1);
//录入住址
住址:
(a.add));
//录入电话
联系电话:
(a.tel));
n=strlen(a.tel);
while(a.tel!
if(a.tel[i]>
a.tel[i]<
n==11)
\n输入有误,请重新输入正确的手机号码:
}while
(1);
存入金额:
%lf"
(a.money));
if(a.money<
=0)
\n输入有误,请重新输入正确的存入金额:
elsebreak;
存期:
(a.year));
//计算利率
if(a.year>
5)a.lilv=0.0420;
elseif(a.year>
3)a.lilv=0.0378;
elsea.lilv=0.0225;
利率为:
%0.4f"
a.lilv);
\n\n>
请设置取款数字密码,按回车键结束:
(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"
cls"
fclose(fbill);
return0;
}
intfind()//查询信息
inti,fnumb,flag=0;
structbillb[100];
doublelixi;
//利息
for(i=0;
i<
100;
i++)
fscanf(fbill,"
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);
请输入您需要查找的存单号:
fnumb);
您好,这是您所查询的存单信息:
\n"
for(i=0;
if(b[i].numb==fnumb)
{
存单编号:
%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;
}
if(flag==0)
您好,您输入的存单不存在,请查对后再输入。
intout()
inti,fnumb,flag=0,temp;
请输入您的存单编号:
if(flag==1)
lixi=b[i].money*b[i].lilv*b[i].year;
\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);
\n请输入密码,注意遮挡:
temp);
if(temp==b[i].key)
\n取款成功\n您已取出:
%0.2lf元\n\n"
b[i].money+lixi);
else
\n密码错误,请重新输入\n密码:
scanf("
if(temp==b[i].key)
printf("
{
printf("
scanf("
if(temp==b[i].key)
{
printf("
}
else
\n您好,由于您多次输入错误密码,为保障账号安全,系统终止取款操作。
\n\n"
}
return0;
intrevise()
FILE*rekeyy=fopen("
keyy.txt"
"
w"
);
inttemp,temp1,temp2,flag;
请输入原密码\n密码:
if(temp==keyy)
flag=1;
system("
for(;
flag!
=1;
密码错误,请重新输入\n密码:
if(temp==keyy)
system("
/*认证成功*/
请输入新密码:
temp1);
请再次输入新密码:
temp2);
if(temp1==temp2)
fprintf(rekeyy,"
temp1);
修改成功\n"
else
您好,由于您多次输入错误密码,为保障账号安全,系统终止修改密码操作。
4\n"
fclose(rekeyy);
intmain()
FILE*fkeyy=fopen("
intt;
//输入密码的次数
inttemp;
//输入的密码
inti;
//序号
intflag=0;
fscanf(fkeyy,"
keyy);
请输入管理员登录密码:
if(temp==keyy)
管理员密码错误,请重新输入:
{//认证成功
do
puts("
***************************************"
**"
*欢迎使用银行定期储蓄管理系统:
*"
*1:
新存单信息录入*"
*2:
存单信息查询*"
*3:
取款*"
*4:
修改管理员登录密码*"
*5:
退出系统*"
请选择您的操作:
i);
system("
//清屏
switch(i)
{
case1:
newa();
case2:
find();
case3:
out();
case4:
revise();
case5:
return0;
default:
操作选择有误,请重新输入您需要的操作:
system("
}while
(1);
fclose(fkeyy);
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("
函数,实现了清楚屏幕上原有的字符,使界面更加干净整洁,符合用户习惯。
(3)身份证号内包输入非数字的’x’字符影响输入的问题:
在第一次测试中,身份证号只允许为数字,采用数组存放身份证号导致无法识别字符’x’,为了解决这个问题,我们把存放身份证号的数组改为字符串,并采用了
while(a.id!
{
if(a.id[i]>
i++;
break;
}
的方法,实现了对”x”和”X”的识别。
(4)忘记取款则无法继续程序的问题:
在使用中,取款密码错误会导致无法取款,这时需要重新输入密码,再次错误后再次重试,再次错误后再次重试,再次错误后再次重试,再次错误后