#include <iostream>
#include <string.h>
#include <iomanip>
#include<fstream>
using namespace std;
//银行中最大的账户数量
#define MAXACCOUNTNUMBER 20
//银行卡的开号初始值
#define INITNUMBER 10001
struct Account
{
long accNumber; //卡号
char accName[20]; //户主
char accPwd[10]; //密码
double balance; //余额
char flag[6]; //卡的状态
};
//银行中所有卡
Account array[MAXACCOUNTNUMBER];
//银行中银行卡数量
int size=0;
//欢迎界面
void welcome();
//主界面
void mainFrame();
//生成银行中自增卡号
long autoCreament();
//开户
void openAccount();
//存款
void deposit();
//取款
void withdraw();
//查询
void query();
//销户
void closeAnAccount();
//修改密码
void updatePwd();
//转账
void transferAccount();
//输出指定卡的信息
void printAccount(Account acc);
//根据卡号查找卡在数组中的下标
int searchAccount(long accNumber);
//用户选择操作
void select();
//检查密码输入是否满足长度
bool isPassLegal(char pass[]);
//检查账号状态
void checkstate(int size);
void getInformation(); //用于读取帐户数据
void saveInformation(); //退出前保存数据
int main()
{
char loginName[20];
char loginPwd[20];
int i;
//欢迎界面
getInformation() ;
welcome();
//..
for(i=0; i<3; i++)
{
cout<<"请输入用户名:";
cin>>loginName;
cout<<"请输入密码:";
cin>>loginPwd;
if(strcmp(loginName,"admin")==0&&strcmp(loginPwd,"admin")==0)
{
mainFrame();
break;
}
else
{
cout<<"用户名或密码输入错误!"<<endl;
}
}
saveInformation() ;
return 0;
}
void welcome()
{
cout<<" "<<"+**********************************+"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"|********欢迎登陆银行系统**********|"<<endl;
cout<<" "<<"| |"<<endl;
cout<<" "<<"+**********************************+"<<endl;
}
void mainFrame()
{
int order;
cout<<" "<<"+******************************+"<<endl;
cout<<" "<<"* 1.开户 | 2.存款 *"<<endl;
cout<<" "<<"* 3.取款 | 4.查询 *"<<endl;
cout<<" "<<"* 5.转账 | 6.销户 *"<<endl;
cout<<" "<<"* 7.修改密码 | 0.退出 *"<<endl;
cout<<" "<<"+******************************+"<<endl;
cout<<"请输入操作指令:";
cin>>order;
switch(order)
{
case 0:
cout<<"谢谢您的使用,欢迎再次光临!"<<endl;
break;
case 1:
openAccount();
break;
case 2:
deposit();
break;
case 3:
withdraw();
break;
case 4:
query();
break;
case 5:
transferAccount();
break;
case 6:
closeAnAccount();
break;
case 7:
updatePwd();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
//检查密码输入是否满足长度
bool isPassLegal(char pass[])
{
bool flag=true;
int len=strlen(pass),i;
if(len==6){
//满足6位
for(i=0;i<len;i++){
if(pass[i]<48||pass[i]>57){
flag=false;
break;
}
}
}else{
//不满足6-8位
flag=false;
}
return flag;
}
void select()
{
int i;
cout<<"继续操作请按 1,退出操作请按 0.:";
cin>>i;
switch (i)
{
case 0:
cout<<"谢谢您的使用,欢迎再次光临!"<<endl;
break;
case 1:
mainFrame();
break;
}
}
//开户
void openAccount()
{
char pwd1[10],pwd2[10];
cout<<"请输入户主:";
cin>>array[size].accName;
cout<<"请输入密码:";
cin>>pwd1;
cout<<"请再次输入密码:";
cin>>pwd2;
//验证2次输入的密码是否一致
if(strcmp(pwd1,pwd2)==0)
//2次密码一致
{
if(isPassLegal(pwd1))
//密码是合法
{
strcpy(array[size].accPwd,pwd1);
cout<<"请输入金额:";
cin>>array[size].balance;
//..
strcpy(array[size].flag,"正常");
//写卡号
array[size].accNumber=autoCreament();
printAccount(array[size]);
size++;
cout<<"存款成功,请选择是否继续操作。"<<endl;
select();
}
else
{
cout<<"密码必须是纯数字,并且是6-8位"<<endl;
openAccount();
}
}
else
{
//2次输入的密码不一致
cout<<"两次输入的密码不一致"<<endl;
openAccount();
}
}
long autoCreament()
{
if(size==0)
{
return INITNUMBER;
}
else
{
return array[size-1].accNumber+1;
}
}
//输出指定卡的信息
void printAccount(Account acc)
{
cout<<"|----------------------------------------|"<<endl;
cout<<setiosflags(ios::left)<<"|"<<setw(8)<<"卡号"<<setw(8)<<"户主"<<setw(8)<<"密码"<<setw(8)<<"金额"<<setw(8)<<"状态"<<"|"<<endl;
cout<<setiosflags(ios::left)<<"+----------------------------------------+"<<endl;
cout<<setiosflags(ios::left)<<"|"<<setw(8)<<acc.accNumber<<setw(8)<<acc.accName<<setw(8)<<"******"<<setw(8)<<acc.balance<<setw(8)<<acc.flag<<"|"<<endl;
cout<<"|----------------------------------------|"<<endl;
}
/*根据卡号查找卡的下标
* 若返回值>=0,卡号是正确
* 若返回值=-1,卡号有误
*/
int searchAccount(long accNumber)
{
int i,pos=-1;
for(i=0; i<size; i++)
{
if(array[i].accNumber==accNumber&&strcmp(array[i].flag,"销户")!=0)
{
//找到了这张卡
pos=i;
break;
}
}
return pos;
}
//存款
void deposit()
{
long accNum;//存款的账号
double money;//存款的金额
int pos;
int i;
cout<<"请输入存款的账号:";
cin>>accNum;
pos=searchAccount(accNum);
if(pos==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
deposit();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
else
{
cout<<"请输入存款金额:";
cin>>money;
//展示下存款前卡的信息
cout<<"存款前卡的信息:"<<endl;
printAccount(array[pos]);
//找到了该卡号所对应的卡
array[pos].balance+=money;
//展示存款后卡的信息
cout<<"存款后卡的信息:"<<endl;
printAccount(array[pos]);
cout<<"存款成功,请选择是否继续操作。"<<endl;
select();
}
}
//取款
void withdraw()
{
long accNum;//取款的账号
double money;//取款的金额
char accPwd[6];//取款账号的密码
int pos,i;
cout<<"请输入取款的账号:";
cin>>accNum;
pos=searchAccount(accNum);
if(pos==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
withdraw();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
//账号正确
else
{
cout<<"请输入取款账号的密码:";//验证密码
cin>>accPwd;
if(strcmp(array[pos].accPwd,accPwd)==0)
{
cout<<"请输入取款金额:";
cin>>money;
if(array[pos].balance<money)
{
cout<<"您的余额不足,无法取出!!"<<endl;
select();
}
else
{
//展示下取款前卡的信息
cout<<"取款前卡的信息:"<<endl;
printAccount(array[pos]);
//取款后的余额
array[pos].balance-=money;
//展示取款后卡的信息
cout<<"取款后卡的信息:"<<endl;
printAccount(array[pos]);
cout<<"取款成功,请选择是否继续操作。"<<endl;
select();
}
}
else
{
cout<<"输入密码有误,本次操作失败,请选择是否继续操作!!"<<endl;
select();//返回
}
}
}
//查询
void query()
{
long accNum;//查询的账号
char accPwd[6];//查询账号的密码
int pos,i;
cout<<"请输入要查询的账号:";
cin>>accNum;
pos=searchAccount(accNum);
if(pos==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
query();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
//账号正确
else
{
cout<<"请输入要查询账号的密码:";//验证密码
cin>>accPwd;
if(strcmp(array[pos].accPwd,accPwd)==0)
{
cout<<"该卡的信息为:"<<endl;
printAccount(array[pos]);
cout<<"查询成功,请选择是否继续操作。"<<endl;
select();
}
else
{
cout<<"输入密码有误,本次操作失败,请选择是否退出系统!!"<<endl;
select();//返回
}
}
}
//销户
void closeAnAccount()
{
long accNum;//销户的账号
char accPwd[6];//销户 账号的密码
int pos,i;
cout<<"请输入要销户的账号:";
cin>>accNum;
pos=searchAccount(accNum);
if(pos==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
closeAnAccount();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
//账号存在
else
{
cout<<"请输入要销户账号的密码:";//验证密码
cin>>accPwd;
if(strcmp(array[pos].accPwd,accPwd)==0)
{
array[pos].balance=0;
strcpy(array[pos].flag, "销户");
printAccount(array[pos]);
cout<<"销户成功,请选择是否继续操作。"<<endl;
select();
}
else
{
cout<<"密码输入有误,本次操作失败,请选择是否继续操作!!"<<endl;
select();//返回
}
}
}
//修改密码
void updatePwd()
{
long accNum;//要修改密码的账号
char accPwd1[10];//原来密码
char accPwd2[10];//重新设置的密码
char accPwd3[10];
int pos,i;
cout<<"请输入要修改密码的账号:";
cin>>accNum;
pos=searchAccount(accNum);
if(pos==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
updatePwd();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
//账号存在
else
{
cout<<"请输入该账号的密码:";//验证密码
cin>>accPwd1;
if(strcmp(array[pos].accPwd,accPwd1)==0)
{
cout<<"请输入新密码:";
cin>>accPwd2;
cout<<endl;
cout<<"请再次输入密码:";
cin>>accPwd3;
cout<<endl;
if(strcmp(accPwd2,accPwd3)==0)
{
strcpy(array[pos].accPwd,accPwd2);
printAccount(array[pos]);
cout<<"修改密码成功,请选择是否继续操作!"<<endl;
select();
}
else
{
cout<<"两次密码输入不同,修改密码失败,请重新修改!"<<endl;
updatePwd();
}
}
else
{
cout<<"输入密码有误,请选择是否继续操作!!"<<endl;
select();;//返回
}
}
}
//转账
void transferAccount()
{
long accNum1;//转出账号
long accNum2;//转入账号
double money;//转款的金额
char accPwd[6];//转出账号的密码
int pos1,pos2,i;
cout<<"请输入转出账号:";
cin>>accNum1;
pos1=searchAccount(accNum1);
if(pos1==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
transferAccount();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
//账号正确
else
{
cout<<"请输入取款账号的密码:";//验证密码
cin>>accPwd;
if(strcmp(array[pos1].accPwd,accPwd)==0)
{
cout<<"请输入转出金额:";
cin>>money;
if(array[pos1].balance<money)
{
cout<<"您的余额不足,无法转账!!!"<<endl;
withdraw();
}
cout<<"请输入转入账号:";
cin>>accNum2;
pos2=searchAccount(accNum2);
if(pos2==-1)
{
//卡号有误
cout<<"卡号输入有误,请选择是否继续输入!"<<endl;
cout<<"继续输入请按 1,退出请按0:";
cin>>i;
switch(i)
{
case 0:
mainFrame();
break;
case 1:
transferAccount();
break;
default:
cout<<"输入有误,请重新输入!"<<endl;
break;
}
}
else
{
//展示下转账前卡的信息
cout<<"转出账号转账前的信息:"<<endl;
printAccount(array[pos1]);
//展示下转账前卡的信息
cout<<"转入账号转账前的信息:"<<endl;
printAccount(array[pos2]);
//展示下转账后卡的信息
cout<<"转出账号转账后的信息:"<<endl;
//转账后的余额
array[pos1].balance-=money;
printAccount(array[pos1]);
cout<<"转入账号转账后的信息:"<<endl;
//转账后的余额
array[pos2].balance+=money;
printAccount(array[pos2]);
cout<<"转账成功,请选择是否继续操作。"<<endl;
select();
}
}
else
{
cout<<"输入密码有误,请选择是否继续操作!!"<<endl;
select();;//返回
}
}
}
//从文件中读取数据,保存到全局数组中
void getInformation() //用于读取帐户数据
{
int i=0;
ifstream infile("bank.dat",ios::in); //以输入的方式打开文件
if(!infile) //测试是否成功打开
{
cerr<<"不好啦,找不到储户信息了!"<<endl;
exit(0);
}
while(!infile.eof())
{
infile>>array[i].accNumber>>array[i].accName>>array[i].accPwd>>array[i].balance>>array[i].flag;
++i;
}
size=i;
infile.close();
//accountNum=i; //用户数目
return;
}
//退出时,将变化了的数据保存到文件中,下次运行,接着上次的业务继续办下去
void saveInformation() //退出前保存数据
{
ofstream outfile("bank.dat",ios::out); //以输入的方式打开文件
if(!outfile) //测试是否成功打开
{
cerr<<"不好啦,储户信息保存不了了!"<<endl;
exit(1);
}
int i=0;
while(i<size)
{
outfile<<array[i].accNumber<<" "<<array[i].accName<<" "<<array[i].accPwd<<" "<<array[i].balance<<" "<<array[i].flag<<endl;
++i;
}
outfile.close();
return;
}