作者:夏晓林
地点:烟大计控
时间:2017.04.23
题目描述:
模拟银行柜台业务的要求,实现一个小型的银行储蓄系统软件的开发,其中包括开户、存款、取款、转账、改密、挂失、解挂、销户等功能。
在开发过程中,请按照问题求解过程的要求,体验开发过程中需要做的工作。除了下面的系统基本功能的描述外,鼓励开展调研,使开发的软件尽量符合实际的银行储蓄系统的实际业务内容。可以参考8.1节中关于选用合适的数据结构的讨论,确定数据存储方案。
要求在程序运行过程中或者程序结束运行之前,将业务发生的数据保存到文件中,并在下一次运行时,能从文件中读取数据,使业务能够继续在原有的基础上开展。可以使用文本文件,也可以使用二进制文件。
根据模块化程序设计的要求,将各功能设计成独立的函数实现。必要时,提取出公共的功能设计专门的函数,作为支持各函数中的子功能要调用的模块。建议设计“”菜单“”式的操作界面,方便用户的使用。
各功能的要求分别如下:
(1)开户:增加一个银行账户,输入账号、姓名、密码、金额、状态自动设置为0(正常)。建议输入密码的过程中,以*号代替实际输入的符号显示出来(实际方法请利用搜索引擎获得帮助)。作为对密码的设置,在输入一次密码后,需要再次输入密码,两次输入一致后,才接受并保存。由于设置了密码,其他业务都需要 在输入账号密码斗殴正确后才能继续。
(2)存款:输入账号、金额,增加该账号的金额
(3)取款:输入账号、金额,减少取款的金额。要求取款额不能超过原余额
(4)查询:输入账号,显示账户信息。
(5)转账:输入转出的账号及金额以及转入的账号,减少转出账号的金额,增加转入账号的金额。要求转出账户的金额不能超过该账号的余额,转出减少的金额,与转入账户增加的金额相同。
(6)挂失:输入账号,将其状态变为1(挂失)。处于挂失状态的账户,不能进行除解挂以外的任何操作。
(7)解挂:输入账户,将其状态变为0。
(8)销户:输入账号,确认后,提示将余额全部取完,将余额置为0,并将状态state置为2(销户)。办理销户的账号,不能再执行除查询以外的功能。
(9)改密:用新密码代替旧密码。新密码要求输入两次,一致后才确认改密成功。
C语言代码:
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>//isdigit函数的头文件
#include <conio.h>//getch()的头文件
#define NumMax 1000
int N;
void OpenAccount();//开户
void SaveMoney();//存款
void DrawMoney();//取款
void Inquire();//查询
void TransferAccounts();//转账
void ReportTheLoss();//挂失
void SolutionToHang();//解挂
void ClosingAccount();//销户
void ChangeThePassword();//改密
int search();//判断账号的位置
int InputPassword();//输入密码
int judge();
typedef struct
{
int num;//账号
char name[20];//用户名
int password;//密码
double balance;//余额
int status;//状态:0正常 1挂失 2销户
} Account;
Account user[NumMax];
int main()
{
int i=0,a;
FILE *fp;
if ((fp=fopen("account.txt", "r"))==NULL)
{
printf("打不开文件!");
exit(0);
}
while(fscanf(fp,"%d %s %d %lf %d",&user[i].num, user[i].name, &user[i].password, &user[i].balance,&user
[i].status ) != EOF)
{
i++;
}
fclose(fp);
N=i;
printf("---------\n");
printf("欢迎光临!\n");
printf("---------\n");
while(a!=10)
{
printf("*************************\n");
printf("请选择您的操作:\n");
printf("1.开户 2.存款 3.取款 4.查询 5.转账\n");
printf("6.挂失 7.解挂 8.销户 9.改密 10.欢迎再次使用\n");
printf("*************************\n");
scanf("%d",&a);
if(a>0&&a<=10)
{
switch(a)
{
case 1:
OpenAccount();
break;
case 2:
SaveMoney();
break;
case 3:
DrawMoney();
break;
case 4:
Inquire();
break;
case 5:
TransferAccounts();
break;
case 6:
ReportTheLoss();
break;
case 7:
SolutionToHang();
break;
case 8:
ClosingAccount();
break;
case 9:
ChangeThePassword();
break;
case 10:
printf("欢迎再次使用!\n");
break;
}
}
else
printf("输入错误。请重新输入\n");
}
if ((fp=fopen("account.txt", "w"))==NULL)
{
printf("打不开文件!");
exit(0);
}
for(i=0; i<N; i++)
fprintf(fp,"%d %s %d %lf %d\n",user[i].num, user[i].name, user[i].password, user[i].balance,user[i].status
);
fclose(fp);
return 0;
}
void OpenAccount()
{
if(N==NumMax)
{
printf("银行用户数已达上限,不能开户");
return;
}
printf("正在开户\n");
user[N].num=10001+N;
printf("账号:%d\n", user[N].num);
printf("户主姓名:");
scanf("%s", user[N].name);
int mima1, mima2;
printf("密码:");
mima1=InputPassword();
printf("确认密码:");
mima2=InputPassword();
if(mima1==mima2)
{
user[N].password=mima1;
user[N].status=0;
N++;
printf("成功开户!\n");
}
else
{
printf("两次密码不一致,未成功开户!\n");
}
}
void SaveMoney()
{
int a;
int num;//账号
int who;//查找到该账号在数组中对应的下标
int mima;
double money;
char str[100];
printf("请输入您的账号:\n");
scanf("%d",&num);
who = search(num);
if(who<0)
printf("该用户不存在,存款失败!\n");
else
{
if(user[who].status==0)
{
printf("请输入密码:");
mima=InputPassword();
if(mima!=user[who].password)
printf("密码错误,请重新输入:");
else
{
printf("户主姓名:%s\n", user[who].name);
printf("输入存款额:");
scanf("%s", str);
a=judge(str);
while(a!=1)
{
printf("输入错误,请重新输入存款额\n");
scanf("%s", str);
a=judge(str);
}
if(a==1)
{
money=atoi(str);
if(money<0||money>1000000)
printf("输入金额太大,自动退出\n");
else
{
user[who].balance+=money;
printf("您的当前余额为%.2f元. \n",user[who].balance);
}
}
}
}
else if(user[who].status==1)
printf("该用户处于挂失状态,存款失败!\n");
else if(user[who].status==2)
printf("该用户已经销户,存款失败!\n");
}
}
void DrawMoney()
{
char str[100];
int a;
int num, who,mima;
double money;
printf("账号:");
scanf("%d", &num);
who = search(num);
if(who<0)
{
printf("该用户不存在,取款失败!\n");
}
else
{
if(user[who].status==0)
{
printf("户主姓名:%s\n", user[who].name);
printf("密码:");
mima=InputPassword();
if(mima!=user[who].password)
{
printf("输入密码错误,取款失败!\n");
}
else
{
printf("输入取款额:");
scanf("%s", str);
a=judge(str);
while(a!=1)
{
printf("输入错误,请重新输入取款额\n");
scanf("%s", str);
a=judge(str);
}
if(a==1)
{
money=atoi(str);
if(money>user[who].balance)
printf("余额不足,取款失败!\n");
else
{
user[who].balance-=money;
printf("取款成功,您的余额为%.2f元. \n",user[who].balance);
}
}
}
}
else if(user[who].status==1)
{
printf("该用户处于挂失状态,取款失败!\n");
}
else
{
printf("该用户已经销户,取款失败!\n");
}
}
printf("欢迎下次光临\n");
}
void Inquire()
{
int num, who;
int mima;
printf("账号:");
scanf("%d", &num);
who = search(num);
if(who<0)
{
printf("该用户不存在,查询完毕!\n");
}
else
{
printf("户主姓名:%s\n", user[who].name);
printf("密码:");
mima=InputPassword();
if(mima!=user[who].password)
{
printf("输入密码错误,不能继续查询其他信息!\n");
}
else
{
printf("余额:%.2f元. \n",user[who].balance);
printf("状态:");
if(user[who].status==0)
{
printf("正常\n");
}
else if(user[who].status==1)
{
printf("挂失\n");
}
else
{
printf("已经销户\n");
}
}
}
printf("欢迎下次光临\n");
}
void TransferAccounts()
{
char str[100];
int a;
int num, whoout, whoin;
int mima;
double money;
printf("输入转出账号:");
scanf("%d", &num);
whoout = search(num);
if(whoout<0)
{
printf("该用户不存在,转账失败!\n");
}
else
{
if(user[whoout].status==0)
{
printf("户主姓名:%s\n", user[whoout].name);
printf("密码:");
mima=InputPassword();
if(mima!=user[whoout].password)
{
printf("输入密码错误,转账失败!\n");
}
else
{
printf("输入转账金额:");
scanf("%s", str);
a=judge(str);
while(a!=1)
{
printf("输入错误,请重新输入转账金额\n");
scanf("%s", str);
a=judge(str);
}
if(a==1)
{
money=atoi(str);
if(money>user[whoout].balance)
{
printf("余额不足,转账失败!\n");
}
else
{
printf("输入转入账号:");
scanf("%d", &num);
whoin = search(num);
if(whoin<0)
{
printf("转入账户不存在,转账失败!\n");
}
else
{
if(user[whoin].status>0)
{
printf("转入账户异常,转账失败!\n");
}
else
{
user[whoout].balance-=money;
user[whoin].balance+=money;
printf("转账后,您还有%.2f元. \n",user[whoout].balance);
}
}
}
}
}
}
else
printf("该账户异常,转账失败!\n");
}
printf("欢迎下次光临\n");
}
void ReportTheLoss()
{
int num, who;
int mima;
printf("账号:");
scanf("%d", &num);
who = search(num);
if(who<0)
{
printf("该用户不存在,不能挂失!\n");
}
else
{
printf("户主姓名:%s\n", user[who].name);
printf("密码:");
mima=InputPassword();
if(mima!=user[who].password)
{
printf("输入密码错误,不能继续操作!\n");
}
else
{
if(user[who].status==0)
{
user[who].status=1;
printf("挂失成功\n");
}
else if(user[who].status==1)
{
printf("该账户已经处于挂失状态\n");
}
else
{
printf("该账户已销户,不能挂失\n");
}
}
}
}
void SolutionToHang()
{
int num, who;
int mima;
printf("账号:");
scanf("%d", &num);
who = search(num);
if(who<0)
{
printf("该用户不存在,解除挂失失败!\n");
}
else
{
printf("户主姓名:%s\n", user[who].name);
printf("密码:");
mima=InputPassword();
if(mima!=user[who].password)
{
printf("输入密码错误,不能继续操作!\n");
}
else
{
if(user[who].status==0)
{
printf("该账户处于正常状态,不需要解除挂失\n");
}
else if(user[who].status==1)
{
user[who].status=0;
printf("解除挂失成功\n");
}
else
{
printf("该账户已销户,操作无效\n");
}
}
}
}
void ClosingAccount()
{
int num;
int who;
int mima;
printf("待销户账号:");
scanf("%d", &num);
who = search(num);
if(who<0)
{
printf("该用户不存在,销户失败!\n");
}
else
{
printf("户主姓名:%s\n", user[who].name);
printf("密码:");
mima=InputPassword();
if(mima==user[who].password)
{
printf("余额:%.2f 元\n", user[who].balance);
user[who].balance=0;
user[who].status=2;
printf("取款 %.2f 元,销户成功!\n", user[who].balance);
}
else
{
printf("输入的密码错误,销户失败!\n");
}
}
}
void ChangeThePassword()
{
int num, who;
int mima, mima1, mima2;
printf("账号:");
scanf("%d", &num);
who = search(num);
if(who<0)
{
printf("该用户不存在,修改密码失败!\n");
}
else
{
printf("户主姓名:%s\n", user[who].name);
printf("密码:");
mima=InputPassword();
if(mima!=user[who].password)
{
printf("输入密码错误,不能继续操作!\n");
}
else
{
printf("新密码:");
mima1=InputPassword();
printf("确认密码:");
mima2=InputPassword();
if(mima1==mima2)
{
user[who].password=mima1;
printf("修改成功!\n");
}
else
{
printf("两次输入不同,修改失败!\n");
}
}
}
}
int search(int num)
{
int index=-1;
int low=0, high=N-1, mid;
while(low<=high)
{
mid = (low+high)/2;
if(user[mid].num==num)
{
index=mid;
break;
}
else if (user[mid].num>num)
high=mid-1;
else
low=mid+1;
}
return index;
}
int InputPassword()
{
char c; //接收字符形式密码
int mima=0; //要转换为数字
int i;
while(1)
{
for(i=0; i<6; i++)
{
c=getch();//输入但不显示
putchar('*');
if(isdigit(c))//isdight主要用于检查参数c是否为阿拉伯数字0到9 头文件为#include<ctype.h>
mima=mima*10+(c-'0');
else
{
mima=0;
break;
}
}
fflush(stdin); //清除键盘缓存区中已经有的输入
printf("\n");
if(mima==0)
{
printf("密码要求全为数字,且不能全0!\n");
printf("请重新输入密码: ");
}
else
break;
}
return mima;
}
int judge(char*s)//判断输入的金额是否符合要求
{
int a,i=0;
while(s[i]!='\0')
{
if(s[i]<'0'||s[i]>'9')
{
a=0;
break;
}
i++;
}
if(a!=0)
a=1;
return a;
}
心得体会:#include<ctype.h>是isdigit函数的头文件,isdight主要用于检查参数c是否为阿拉伯数字0到9 ,同时,getch()输入但不显示,学会了输入密码但是显示出*号,scanf函数是有返回值的,如果输入的相对应的话就返回1,不符合输入要求就会返回0,在输入金额密码的过程中克制了输入字符数字组合、字符串等问题。