#include <iostream>   
 #include <string.h>   
 #include <stdio.h>   
 #include <iomanip>   
 using namespace std;  
   
 //银行中最大的账户数量   
 #define MAXACCOUNTNUMBER 20000   
 //银行卡的开号初始值   
 #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 login();  //登录界面   
 //主界面   
 void mainFrame();  
 //生成银行中自增卡号   
 long autoCreament();  
 //开户   
 void openAccount();  
 //存款   
 void deposit();  
 //取款   
 void withdrawal();  
 //查询   
 void query();  
 //转账   
 void transfer();  
 //销户   
 void cancelAccount();  
 //改密   
 void changepassword();  
 //输出指定卡的信息   
 void printAccount(Account acc);
 //判断密码是否合法
 bool isPassLegal(char pass[]);
 //根据卡号查找卡在数组中的下标   
 int searchAccount(long accNumber);  
   
 int main()  
 {  
       
       
     welcome();//欢迎界面   
     login();//登录界面   
     mainFrame();//主菜单   
     return 0;  
 }  
 void welcome()  
 {  
     cout<<"     +--------------------------------------+"<<endl;  
     cout<<"     *                                      *"<<endl;  
     cout<<"     *       欢迎使用储蓄综合业务平台       *"<<endl;  
     cout<<"     *                                      *"<<endl;  
     cout<<"     +--------------------------------------+"<<endl;  
 }  
 void login(){  
     int i=0;  
     char name[10],cod[10];  
     for(i=0;i<3;i++){  
         cout<<"请输入用户名:";  
         gets(name);  
         cout<<"请输入密码:";  
         gets(cod);  
         if(strcmp(name,"admin")==0&&strcmp(cod,"admin")==0)  
         {  
             break;  
         }  
         else  
             cout<<"用户名或密码输入错误!"<<endl;  
     }  
     if(i>=3)  
         exit(0);  
 }  
   
 void mainFrame()  
 {  
     int order;  
     cout<<"|----------------------------|"<<endl;  
     cout<<"|-------1.开户---------------|"<<endl;  
     cout<<"|-------2.存款---------------|"<<endl;  
     cout<<"|-------3.取款---------------|"<<endl;  
     cout<<"|-------4.销户---------------|"<<endl;  
     cout<<"|-------5.查询---------------|"<<endl;  
     cout<<"|-------6.转账---------------|"<<endl;  
     cout<<"|-------7.改密---------------|"<<endl;  
     cout<<"|-------8.退出---------------|"<<endl;  
     cout<<"|----------------------------|"<<endl;  
     cout<<"请输入操作指令"<<endl;  
     cin>>order;  
     switch(order){  
     case 1:  
         openAccount();  
         break;  
     case 2:  
         deposit();  
         break;  
     case 3:  
         withdrawal();  
         break;  
     case 4:  
         cancelAccount();  
         break;  
     case 5:  
         query();  
         break;  
     case 6:  
         transfer();  
         break;  
     case 7:  
         changepassword();  
         break;  
     default:  
         exit(0);  
     }  
 }  
   
 void openAccount()
 {
     char pwd[10];
  int errornum=0;
  for(errornum=0;errornum<3;errornum++)
  {
     cout<<"请输入户主:";
     cin>>array[size].accName;
     cout<<"请输入密码:";
     cin>>array[size].accPwd;
     cout<<"请再次输入密码:";
     cin>>pwd;
     //验证2次输入的密码是否一致
     if(strcmp(array[size].accPwd,pwd)==0)
        {
         //2次密码一致
         if(isPassLegal(pwd))
         {
             cout<<"请输入金额:";//密码是合法
             cin>>array[size].balance;
             //..
             strcpy(array[size].flag,"正常");
             //写卡号
             array[size].accNumber=autoCreament();
             printAccount(array[size]);
             size++;
             cout<<"开户成功,按任意键返回"<<endl;
             break;
         }
          else
         {
             cout<<"开户失败,密码必须是纯数字,并且是6-8位"<<endl;
             
         }
     }
        else
        {
         cout<<"开户失败,两次输入的密码不一致"<<endl;
     }
     }
    cout<<"按任意键返回主菜单"<<endl;
    fflush(stdin);
             getchar();
             mainFrame();
 }
   
 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)<<acc.accPwd<<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){  
             pos=i;  
             break;  
         }  
     }  
     return pos;  //返回pos;   
 }  
   
 void deposit()//定义存款函数   
 {  
     long accNum;//存款的账号   
     double money;//存款的金额   
     int pos,errornum=0;  
     for(errornum=0;errornum<3;errornum++)  
     {  
         cout<<"请输入存款的账号:";  
         cin>>accNum;  
         pos=searchAccount(accNum);  
         if(strcmp(array[pos].flag,"正常")==0&&pos!=-1){  
             //卡号正确   
             cout<<"请输入存款金额:";  
             cin>>money;  
             //展示下存款前卡的信息   
             cout<<"存款前卡的信息:"<<endl;  
             printAccount(array[pos]);  
             array[pos].balance+=money;  
             //展示存款后卡的信息   
             cout<<"存款后卡的信息:"<<endl;  
             printAccount(array[pos]);  
             cout<<"存款成功!"<<endl;  
             break;  
         }else{  
             cout<<"卡号不存在或已销户,请仔细确认!"<<endl;  
         }  
     }  
     cout<<"按任意键继续!"<<endl;  
     fflush(stdin);  
     getchar();  
     mainFrame();  
 }  
 void withdrawal()  
 {  
     long accNum;//取款的账号   
     double money;//取款的金额   
     int pos,errornum=0;  
     char pwd[10];  
     for(errornum=0;errornum<3;errornum++)  
     {  
         cout<<"请输入取款的账号:";  
         cin>>accNum;    
         pos=searchAccount(accNum);  
         cout<<"请输入密码:";  
         cin>>pwd;  
         if(strcmp(array[pos].accPwd,pwd)==0&&pos!=-1)  
         {  
             if(strcmp(array[pos].flag,"正常")==0)  
             {  
                 cout<<"请输入取款金额:";  
                 cin>>money;  
                 if(array[pos].balance>=money)  
                 {  
                     //展示下取款前卡的信息   
                     cout<<"取款前卡的信息:"<<endl;  
                     printAccount(array[pos]);  
                     array[pos].balance-=money;  
                     //展示取款后卡的信息   
                     cout<<"取款后卡的信息:"<<endl;  
                     printAccount(array[pos]);  
                     cout<<"取款成功!"<<endl;  
                     break;  
                 }else{  
                     cout<<"您的卡内余额不足!";  
                     break;  
                 }  
             }else{  
                 cout<<"卡的状态异常!";  
             }  
         }  
         else  
         {  
             cout<<"账号或密码输入错误!"<<endl;  
         }  
     }  
     cout<<"按任意键回主菜单:";  
     fflush(stdin);  
     getchar();  
     mainFrame();  
 }  
 void query()//定义查询函数   
 {  
     long accNum;//账号   
       
     int pos,errornum=0;  
     char pwd[10];  
     for(errornum=0;errornum<3;errornum++)  
     {  
         cout<<"请输入您要查询的的账号:";  
         cin>>accNum;    
         pos=searchAccount(accNum);  
           
         cout<<"请输入密码:";  
         cin>>pwd;  
         if(strcmp(array[pos].accPwd,pwd)==0&&pos!=-1)  
         {  
             printAccount(array[pos]);  
             break;  
         }  
         else  
         {  
             cout<<"账号或密码输入错误!"<<endl;  
         }  
     }  
     cout<<"按任意键回主菜单:";  
     fflush(stdin);  
     getchar();  
     mainFrame();  
 }  
 void transfer()  
 {  
     long accNum1,accNum2;  
     int pos1,pos2,errornum=0;  
     double money;  
     char pwd[10];  
     for(errornum=0;errornum<3;errornum++)  
     {  
         cout<<"请输入您的账号:";  
         cin>>accNum1;   
         pos1=searchAccount(accNum1);  
         cout<<"请输入密码:";  
         cin>>pwd;  
         if(strcmp(array[pos1].accPwd,pwd)==0&&pos1!=-1)  
         {  
             if(strcmp(array[pos1].flag,"正常")==0)  
             {  
                 //转账前卡的信息   
                 cout<<"转账前卡的信息:"<<endl;  
                 printAccount(array[pos1]);  
                 cout<<"请输入转账金额:";  
                 cin>>money;  
                   
                 cout<<"请输入要转入的账号:"<<endl;  
                 cin>>accNum2;  
                 pos2=searchAccount(accNum2);  
                 if(pos2!=-1&&strcmp(array[pos2].flag,"正常")==0)  
                 {  
                     array[pos1].balance-=money;  
                     array[pos2].balance+=money;  
                     cout<<"转账后卡的信息:"<<endl;  
                     printAccount(array[pos1]);  
                     cout<<"转账成功!";  
                     break;  
                 }else{  
                     cout<<"您输入的账号有误或状态异常,转账失败!"<<endl;  
                     break;  
                 }  
             }else{  
                 cout<<"卡的状态异常,无法进行操作!";  
                 break;  
             }  
         }  
         else{  
             cout<<"账号或密码错误!";  
         }  
     }  
     cout<<"按任意键回主菜单:";  
     fflush(stdin);  
     getchar();  
     mainFrame();  
 }  
 void cancelAccount()  
 {  
     long accNum;//账号   
       
     int pos,errornum=0;  
     char pwd[10];  
     for(errornum=0;errornum<3;errornum++)  
     {  
         cout<<"请输入账号:";  
         cin>>accNum;    
         pos=searchAccount(accNum);  
         cout<<"请输入密码:";  
         cin>>pwd;  
         if(strcmp(array[pos].accPwd,pwd)==0&&pos!=-1)  
         {  
             //打印销户前卡的信息   
             printAccount(array[pos]);  
             array[pos].balance=0;  
             strcpy(array[pos].flag,"销户");  
             printAccount(array[pos]);  
             cout<<"销户成功!";  
             break;  
         }  
         else  
         {  
             cout<<"账号或密码输入错误!"<<endl;  
         }  
     }  
     cout<<"按任意键回主菜单:";  
     fflush(stdin);  
     getchar();  
     mainFrame();  
 }  
   
 void changepassword()  
 {  
     long accNum;//账号   
       
     int pos,errornum=0;  
     char pwd[10],pwd1[10],pwd2[10],pwd3[10];  
     for(errornum=0;errornum<3;errornum++){  
         cout<<"请输入账号:";  
         cin>>accNum;    
         pos=searchAccount(accNum);  
         cout<<"请输入密码:";  
         cin>>pwd;  
         if(strcmp(array[pos].accPwd,pwd)==0&&pos!=-1)  
         {  
             if(strcmp(array[pos].flag,"正常")==0)  
             {  
                 cout<<"请输入原密码:";  
                 cin>>pwd1;  
                 cout<<"请输入新密码:";  
                 cin>>pwd2;  
                 cout<<"请确认新密码:";  
                 cin>>pwd3;  
                 if(strcmp(array[pos].accPwd,pwd1)==0&&strcmp(pwd2,pwd3)==0)  
                 {  
      if(isPassLegal(pwd2))
      {
                     strcpy(array[pos].accPwd,pwd3);  
                     cout<<"改密成功!"<<endl;  
                     printAccount(array[pos]);//打印改密后卡的信息   
                     break; 
      }else{
       cout<<"密码不合法,改密失败!"<<endl;
      }
                 }else{  
                     cout<<"您输入的密码有误,改密失败!";  
                 }  
             }else{  
                 cout<<"卡的状态异常,无法操作!";  
             }  
         }else{  
             cout<<"账号或密码输入错误!"<<endl;  
         }  
     }  
     cout<<"按任意键回主菜单:";  
     fflush(stdin);  
     getchar();  
     mainFrame();  
 }  
 bool isPassLegal(char pass[])
 {
     bool flag=true;
     int len=strlen(pass),i;
     if(len<9&&len>=6){
         //满足6-8位
         for(i=0;i<len;i++)
          {
             if(pass[i]<48||pass[i]>57)
            {
                 flag=false;
                 break;
             }
         }
     }else
     {
         //不满足6-8位
         flag=false;
     }
     return flag;
 }