C语言实现银行管理系统
要求实现的系统能进行以下操作:
话不多说,上代码。并不完全是我自己构思自己编写的,是我在社区上看了一些前辈的,然后自己在慢慢改,修改密码的版块换了好几种方法,最后还是决定用这种。觉得还是很垃圾,改密版块还有一个strcmp的使用方法的警告没有办法解决,但是能勉强运行吧。
/*
*作 者:蓝浩
*root密码:0101
*完成时间:2019年6月27日
*版 本:v3.0
*文 件 名:银行管理系统
*文件描述:
银行管理项目:主要功能是模拟银行的存取款业务,软件功能囊括了银行从用户开户到最终销户等业务的全过程。
一、账户操作:开户、销户、修改密码、判断用户名密码登录,
二、账户金额操作:登录成功后,下一步选择操作类型。操作类型包括八种:存款、取款、挂失、解挂、开户、销户、查询账户余额、退出,
要求写出需求分析,设计报告,完成银行管理系统设计开发,制作功能说明的PPT。
*/
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#include <windows.h>
int mingyan(); //用户名验证
int guayan(int); //挂失验证
int miyan(int); //密码函数
void qukuan(); //取款函数
void cunkuan(); //存款函数
void chaxun(); //查询函数
void xiaohu(); //销户函数
void kaihu(); //开户函数
void guashi(); //挂失函数
void jiegua(); //解挂函数
void tuichu(); //退出函数
void denglu(); //管理员登录函数
void xiugaimima(); //更改密码函数
void zhucaidan(); //主菜单函数
//全局变量
char gUser[100][32]; //用户名
char gMima[100][32]; //密码
char Ggua[100][32]; //挂失用户名
char mima_temp[20];
char new_mima[20];
char new_mima1[20];
float YuE[100]; //存款余额
int UserShu=0; //用户数
int guashu=0; //挂失用户数
void main()
{
system("color f1"); //定义字体颜色 7为背景颜色(白色)1为字体颜色(蓝色)
denglu(); //首界面调用登录函数板块。
int zhiling;
while(zhiling)
{
printf("\n\n\n\n");
printf("\t\t\t<_____________________移动银行管理系统______________________>\n");
printf("\t\t\t|| (1)取 款 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (2)存 款 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (3)查 询 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (4)开 户 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (5)销 户 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (6)挂 失 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (7)解 挂 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (8)退 出 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (9)更改密码 ||\n");
printf("\t\t\t<___________________________________________________________>\n");
printf("\n\n\t\t\t请选择操作(1--9):< >\b\b");
printf("请输入您的指令: ");
scanf("%d",&zhiling);
printf("\n");
switch(zhiling)
{
case 1: //跳到取款板块
qukuan();
break;
case 2: //跳到存款板块
cunkuan();
break;
case 3: //跳到查询板块
chaxun();
break;
case 4: //跳到开户板块
kaihu();
break;
case 5: //跳到销户板块
xiaohu();
break;
case 6: //跳到挂失板块
guashi();
break;
case 7: //跳到解挂板块
jiegua();
break;
case 8:
tuichu(); //跳到退出板块
break;
case 9:
xiugaimima(); //修改密码
break;
}
}
}
void zhucaidan()
{
int zhiling;
while(zhiling)
{
printf("\n\n\n\n");
printf("\t\t\t<_____________________移动银行管理系统______________________>\n");
printf("\t\t\t|| (1)取 款 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (2)存 款 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (3)查 询 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (4)开 户 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (5)销 户 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (6)挂 失 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (7)解 挂 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (8)退 出 ||\n");
printf("\t\t\t||---------------------------------||\n");
printf("\t\t\t|| (9)更改密码 ||\n");
printf("\t\t\t<___________________________________________________________>\n");
printf("\n\n\t\t\t请选择操作(1--9):< >\b\b");
printf("请输入您的指令: ");
scanf("%d",&zhiling);
printf("\n");
switch(zhiling)
{
case 1: //跳到取款板块
qukuan();
break;
case 2: //跳到存款板块
cunkuan();
break;
case 3: //跳到查询板块
chaxun();
break;
case 4: //跳到开户板块
kaihu();
break;
case 5: //跳到销户板块
xiaohu();
break;
case 6: //跳到挂失板块
guashi();
break;
case 7: //跳到解挂板块
jiegua();
break;
case 8:
tuichu(); //跳到退出板块
break;
case 9:
xiugaimima();
break;
}
}
}
void denglu() //登录板块
{
char zhanghu[32]="0101",mima[32]; //定义两个本版块变量,用于储存输入的管理员账号和密码。
int m=1; //m=1 即为用户名与密码不一致(提示密码错误),会重新弹出以下的界面。
while(m==1)
{
printf("\t\t ┌================================================================┐\n");
printf("\t\t │ │\n");
printf("\t\t ├————————————欢迎进入银行管理系统——————————┤\n");
printf("\t\t │ │\n");
printf("\t\t ├================================================================┤\n");
printf("\t\t │ 请以管理员的身份登陆管理系统! │\n");
printf("\t\t ├────────────────────────────────┤\n");
printf("\t\t │ 声明:本银行想存多少久存多少但是无法取款! │\n");
printf("\t\t ├────────────────────────────────┤\n");
printf("\t\t │ 管理员帐号:admin 密码为:admin │\n");
printf("\t\t └================================================================┘\n");
printf("\t\t \n");
printf("\t\t\t请输入root用户密码: ");
scanf("%s",&mima);
printf("\n");
if(!strcmp(zhanghu,mima)) //当输入的用户名与密码一致时,视为密码正确。否则视为密码错误。
{
printf("\t\t\t▁▁▁▂▂▂▃▃▃▄▄正在登陆,请稍后......▄▅▅▅▆▆▆▇▇▇████\n\n "); //密码正确是执行的步骤。
m=0; //m=0 即为密码正确,不再弹出上面的界面。
}
else{
printf("\n\n\t\t\t\t┌───────——─────────────────┐\n");
printf("\t\t\t\t **********用户名或密码错误,请重新输入!**********\n");
printf("\t\t\t\t└───────────——─────────────┘\n\n\n"); //密码错误时执行的步骤。
}
}
}
void qukuan() //取款板块
{
int i,m;
float n;
i=mingyan(); //进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==1){
m=miyan(i); //调用密码验证函数对密码进行检测。
}
else{
qukuan(); //如果输入的用户名不对则会要求重新输入,输入的密码不对也会要求重新输入。
}
while(m==1) //进入取款程序
{
printf("\t\t\t请输入您的取款金额: ");
scanf("%f",&n);
if(n<=YuE[i]) //检测账户余额是否满足输入的取款金额。
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t **********交易成功,请取走您的钞票**********\n");
printf("t\t\t\t\t└────────────────────────┘\n");
YuE[i]=YuE[i]-n; //对取款后的账户余额进行校准。
break;
}
else{ //账户余额不满足输入的取款金额时执行这个语句。
printf("\n\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t**********对不起,您的余额不足**********\n");
printf("t\t\t\t\t└────────────────────────┘\n");
break;
}
}
}
void cunkuan() //存款板块
{
int i,m;
float n;
i=mingyan(); // 进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==1){
m=miyan(i); //调用密码验证函数对密码进行检测。
}
while(m==1)
{
printf("\t\t\t请输入您的存款金额: ");
scanf("%f",&n);
YuE[i]=YuE[i]+n; //对存款后的账户余额进行校准。
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t**********交易成功!**********\n");
printf("t\t\t\t\t└────────────────────────┘\n");
printf("\t\t\t您的当前余额为: %.2f\n",YuE[i]); //显示本次存款操作后的账户余额。
break;
}
}
void chaxun() //查询板块
{
int i,m;
i=mingyan(); // 进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==1){
m=miyan(i);
}
while(m==1)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t 您的当前余额为: %.2f\n",YuE[i]);
printf("\t\t\t\t└────────────────────────┘\n");
break;
}
}
void kaihu() //开户板块
{
int i,n=UserShu,j=0;
int t=0;
float m;
int jinjidianhua[20];
int dianhua[20];
int len;
int len1;
int len2;
char *dh;
char *jinjidh;
char *sfz;
char name[20];
char tongxindizhi[32];
char jinjixingming[32];
char jjtelephone[32];
char telephone[32];
char shenfenzheng[32];
char User[32];
char mima1[32];
char mima2[32]; //定义三个变量用于储存输入的用户名、密码和二次确认密码。
printf("\t\t\t请输入您的十位用户名: ");
scanf("%s",User);
for(i=0;i<n+1;i++)
{
if(strcmp(User,gUser[i])==0) //对用户名进行查重,如果重复则需重新输入。
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********该用户名已存在**********\n");
printf("\t\t\t\t└────────────────────────┘\n");
break;
}
else //如果通过用户名查重,则进行此操作。
{
strcpy(gUser[UserShu],User);
while(j!=1)
{
printf("\n\t\t\t请输入您的姓名:");
scanf("%s",&name);
printf("\n\t\t\t请输入您的十八位身份证号:");
scanf("%s",&shenfenzheng);
char *sfz=shenfenzheng;
int len = strlen(sfz);
if(len !=18)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********输入有误!**********\n");
printf("\t\t\t\t└────────────────────────┘\n");
zhucaidan();
}
printf("\n\t\t\t请输入您的十一位手机号:");
scanf("%s",&telephone);
char *dh=telephone;
int len1 = strlen(dh);
if(len1 !=11)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********输入有误!**********\n");
printf("\t\t\t\t└────────────────────────┘\n");
zhucaidan();
}
/*
while( *sfz != '\n' ) //求字符串的长度
{
len1++;
sfz++;
}
if(len1!=18)
{
printf("\n\t\t\t**********输入有误!**********");
zhucaidan();
}*/
printf("\n\t\t\t请输入您的通信地址:");
scanf("%s",&tongxindizhi);
printf("\n\t\t\t请输入您的紧急联系人姓名:");
scanf("%s",&jinjixingming);
printf("\n\t\t\t请输入您的紧急联系人电话:");
scanf("%s",&jjtelephone);
char *jinjidh=jjtelephone;
int len2 = strlen(jinjidh);
if(len2 !=11)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********输入有误!**********\n");
printf("\t\t\t\t└────────────────────────┘\n");
zhucaidan();
}
printf("\t\t\t请输入您的密码: ");
scanf("%s",mima1);
printf("\t\t\t请再次输入您的密码: ");
scanf("%s",mima2);
if(strcmp(mima1,mima2)==0) //如果两次输入的密码一致,则设置成功,自动进入存款操作界面。
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********密码设置成功**********\n");
printf("\t\t\t\t└────────────────────────┘\n\n\n");
printf("\t\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("\t\t\t$$$$$ $$$$$\n");
printf("\t\t\t$$$$$********************请为新开账户首次存款!********************$$$$$\n");
printf("\t\t\t$$$$$ $$$$$\n");
printf("\t\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("\n\t\t\t\t请输入您的首次存款金额: ");
scanf("%f",&m);
strcpy(gMima[UserShu],mima1); //再次对密码进行校验。
YuE[UserShu]=m; //讲输入的存款金额打入账户余额。
j=1;
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********交易成功!**********\n");
printf("\t\t\t\t└────────────────────────┘\n");
}
else{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t **********两次输入不一致,请重新输入**********\n "); //当输开户时输入的两次密码不一致时执行此操作。 返回到输入第一次密码的步骤,重新输入两次一致的密码。
printf("\t\t\t\t└────────────────────────┘\n");
}
}
UserShu++; //在数据库中增加一个用户数量。
break;
}
}
}
void xiaohu() //销户板块
{
int i,n,m;
i=mingyan(); // 进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==1){
m=miyan(i); //调用密码验证函数对密码进行检测。
}
while(m==1)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t\t您确定要注销您的账户?\n \t\t\t\t\t\t<1>确认 <2>取消 \n");
printf("\t\t\t\t└────────────────────────┘\n");
printf("\t\t\t请输入您的指令:");
scanf("%d",&n);
if(n==1) //输入1时执行本语句里的操作。
{
for(i=0;i<UserShu;i++) //对要销户的账户进行账号密码的一个确认
{
strcpy(gUser[i],gUser[i+1]); //调出用户名进行确认 。
strcpy(gMima[i],gMima[i+1]); //调出用户名对应的密码进行确认。
YuE[i]=YuE[i+1]; //对销户的余额进行清除 。
UserShu--; //在数据库中减少一个用户数量。
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("t\t\t\t\t\t**********注销账户成功!!**********\n");
printf("t\t\t\t\t└────────────────────────┘\n");
}
}
m=0;
}
}
void guashi() //挂失板块
{
int n,i,m;
i=mingyan(); // 进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==1){
m=miyan(i); //调用密码验证函数对密码进行检测。
}
if(m==1)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t\t您确定要挂失您的账户?\n \t\t\t\t\t\t<1>确认 <2>取消 \n");
printf("\t\t\t\t└────────────────────────┘\n");
printf("\t\t\t请输入您的指令:");
scanf("%d",&n);
if(n==1)
{
strcpy(Ggua[guashu],gUser[i]); //讲确定挂失的用户名称扔进数据库。
guashu++; //增加一个挂失用户数据。
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t**********账户挂失成功!**********\n",gUser[i]);
printf("\t\t\t\t└────────────────────────┘\n");
}
if(n==2)
{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t ******************取消成功!******************\n");
printf("\t\t\t\t└────────────────────────┘\n");
zhucaidan();
}
}
}
void jiegua() //解挂板块
{
int i,m,j;
i=mingyan(); // 进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==0)
m=miyan(i)+1; //调用密码验证函数对密码进行检测。
if(m==2)
{
for(j=0;j<guashu;j++)
{
if(strcmp(gUser[i],Ggua[j])==0) //如果数据库中没有输入的用户数据,则视为该用户未挂失,直接跳出这次循环。
break;
}
for(;j<guashu;j++)
{
strcpy(Ggua[j],Ggua[j+1]); //如果数据中能找到输入的用户名,则讲此次输入的用户名拉出记录挂失的数据库,即解挂。
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********账户解挂成功!**********\n",gUser[i]);
printf("\t\t\t\t└────────────────────────┘\n");
guashu--;
} //解挂成功后在挂失记录的数据库中减掉一个对应的用户数据。
}
else{
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t **********该用户未挂失!**********\n",gUser[i]);
printf("\t\t\t\t└────────────────────────┘\n");
zhucaidan();
}
}
int mingyan() //用户名验证
{
int m=1,i;
char yonghuming[32];
while(m==1)
{
printf("\t\t\t请输入您的用户名: ");
scanf("%s",yonghuming);
for(i=0;i<UserShu;i++)
if(strcmp(gUser[i],yonghuming)==0) //如果输入的用户名与已储存的用户名一致,则视为验证通过。
{
m=0;
break;
}
if(i==UserShu)
{ //如果在已经储存的用户名中未找到输入的用户名,则视为验证未通过。
printf("\n\n\t\t\t\t┌──────────────────────────┐\n");
printf("\t\t\t\t **********该用户不存在,请确认后重新输入**********\n");
printf("\t\t\t\t└──────────────────────────┘\n");
zhucaidan();
}
return i;
}
}
int guayan(int i) //挂失验证
{
int j,n;
for(j=0;j<guashu;j++)
{
if(strcmp(gUser[i],Ggua[j])==0) //如果已经储存的挂失用户名与输入的用户名 一致,即为该用户已经挂失,无法重复挂失。
{
printf("\n\n\t\t\t\t┌─────────────————─────────────┐\n");
printf("\t\t\t\t **********此用户已经挂失,请解挂后再进行操作!**********\n");
printf("\t\t\t\t└─────────────——──——───────────┘\n");
n=0;
break;
zhucaidan();
}
}
if(j==guashu)
n=1;
return n;
}
int miyan(int i) //密码验证,为提高安全性,在每一个操作都会调用到本板块。
{
char mima[32]; // 定义一个储存输入的密码的变量
while(1)
{
printf("\t\t\t请输入您的密码: ");
scanf("%s",mima);
if(strcmp(gMima[i],mima)==0) //如果输入的密码与数据库中的密码完全一致,即可视为密码正确。执行if中的语句。
{
printf("\n\t\t\t\t\t**********登陆成功!**********\n\n");
printf("\n\n\t\t\t\t┌────────────────────────┐\n");
printf("\t\t\t\t\t\t当前用户:%s \n",gUser[i]); //显示用户名以及余额。
printf("\t\t\t\t└────────────────────────┘\n");
break;
}
else{ //如果输入的密码与数据库中的不一致即可视为密码错误,执行else中的语句。
printf("\n\n\t\t\t┌───────────────——───────────┐\n");
printf("\t\t\t **********您输入的密码不正确,请确认后重新输入**********\n");
printf("\t\t\t└───────────────────——───────┘\n");
zhucaidan();
}
}
return 1;
}
void tuichu() //退出板块,因为没有使用txt文件进行永久性的储存,所以这个版块没有进行深入编写,直接退出!
{
denglu();
}
/*
void xiugaimima() //修改密码
{
char mima_temp[20]; //用来存放用户输入的密码
char new_mima[20]; //存放第一次新密码
char new_mima1[20];
char name[32];
int i,m,j;
i=mingyan(); // 进行调用用户名验证的操作。
printf("\t\t\t\t\t请输入原始密码:");
scanf("%s",&mima_temp);
if(!strcmp(mima_temp,gMima)) //比较原始密码 与 用户输入的密码
{
printf("\t\t\t\t\t请输入新密码:");
scanf("%s",&new_mima);
printf("\t\t\t\t\t请再输一次:");
scanf("%s",&new_mima1);
if(strcmp(new_mima1,new_mima)==0) //比较 两次修改后输入的密码
{
strcpy(gMima,new_mima); //将 新密码 拷贝给 原始密码,因为知道strcpy函数有这个覆盖的功能,所以先将就着用。
printf("\n\t\t\t\t******密码修改成功!请牢记!******\n");
zhucaidan();
}
else
{
printf("\n\t\t\t\t******两次输入的密码不一致!******\n");
zhucaidan();
}
}
else
{
printf("\n\t\t\t\t\t******原始密码错误!******\n");
zhucaidan();
}
}*/
void xiugaimima() //修改密码
{
char name[32];
char xmm1[10]= {0};
char xmm2[10]= {0};
char ch; //存放第二次新密码
int i,m;
int t=0,j=0,r;
i=mingyan(); // 进行调用用户名验证的操作。
m=guayan(i); //进行调用挂失验证的操作。如果已经挂失则无法进行本次取款操作。
if(m==1){
m=miyan(i);
printf("\t\t\t\t\t请输入新密码:"); //调用密码验证函数对密码进行检测。
scanf("%s",xmm1);
}
/* while((ch=getch()!='\r'))
{
xmm1[i++]=ch;
putchar('*');
}*/
printf("\t\t\t\t\t请再输一次:");
scanf("%s",xmm2);
/* while((ch=getch()!='\r'))
{
xmm2[j++]=ch;
putchar('*');
}*/
if(r=strcmp(xmm1,xmm2)!=0) //比较 两次修改后输入的密码
{
printf("\n\t\t\t\t******两次输入的密码不一致!******\n");
zhucaidan();
}
else
{
strcpy(gMima,xmm2); //将 新密码 拷贝给 原始密码,因为知道strcpy函数有这个覆盖的功能,所以先将就着用。
printf("\n\t\t\t\t******密码修改成功!请牢记!******\n");
zhucaidan();
}
}