/* 02.* 程序的版权和版本声明部分 03.* Copyright (c)2012, 烟台大学计算机学院学生 04.* All rightsreserved. 05.* 文件名称: 银行系统 06.* 作 者:刘明亮 07.* 完成日期:2013年1月1日 08.* 版本号: v1.0 09.* 输入描述:无 10.* 问题描述:无 */ #include <fstream> #include <iostream> #include <iomanip> #include <string.h> #include <stdlib.h> #include <stdio.h> 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; //销户卡号 long num; //欢迎界面 void welcome(); //主界面 void mainFrame(); //读取帐户数据 void getInformation(); //读入帐户数据 void saveInformation(); //生成银行中自增卡号 long autoCreament(); //根据卡号查找卡的下标 int searchAccount(long accNumber); //卡的信息 void printAccount(Account acc); //密码鉴定 bool isPassLegal(char pass[]); //开户 void openAccount(); //销户 void cancel(); //取款 void withdrawal(); //存款 void deposit(); //查询 void search(); //转账 void transfer(); //改密码 void changepassword(); int main() { char loginName[20]; char loginPwd[20]; int i; //欢迎界面 welcome(); for(i=0;i<3;i++) { cout<<"请输入用户名:"; cin>>loginName; cout<<"请输入密码:"; cin>>loginPwd; if(strcmp(loginName,"admin")==0&&strcmp(loginPwd,"admin")==0) { getInformation(); mainFrame(); break; }else{ cout<<"用户名或密码输入错误"<<endl; } } return 0; } //欢迎界面 void welcome() { cout<<" +----------------------------------+"<<endl; cout<<" |-------欢迎登陆银行系统-----------|"<<endl; cout<<" +----------------------------------+"<<endl; } //主界面 void mainFrame() { int order; cout<<"|--------------------------------|\n"; cout<<"|-----------1.开户---------------|\n"; cout<<"|-----------2.销户---------------|\n"; cout<<"|-----------3.取款---------------|\n"; cout<<"|-----------4.存款---------------|\n"; cout<<"|-----------5.查询---------------|\n"; cout<<"|-----------6.转账---------------|\n"; cout<<"|-----------7.改密码-------------|\n"; cout<<"|-----------8.退出---------------|\n"; cout<<"|--------------------------------|\n"; cout<<"请输入操作指令:"; cin>>order; switch(order) { case 1: openAccount(); break; case 2: cancel(); break; case 3: withdrawal(); break; case 4: deposit(); break; case 5: search(); break; case 6: transfer(); break; case 7: changepassword(); break; case 8: saveInformation(); cout<<"祝您心情愉快!"<<endl; cout<<"欢迎您下次光临!"<<endl; break; } } //根据卡号查找卡的下标 long autoCreament() { if(size==0) { return INITNUMBER; } else { return array[size-1].accNumber+1; } } /* *根据卡号查找卡的下标 * 若返回值>=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; } //卡的信息 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; } //开户 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<<"开户成功,按Enter返回。"<<endl; fflush(stdin); getchar(); mainFrame(); }else{ cout<<"密码必须是6位的纯数字!"<<endl; openAccount(); } }else{ //2次输入的密码不一致 cout<<"两次输入的密码不一致!"<<endl; openAccount(); } } //密码鉴定 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]<'0'||pass[i]>'9'){ flag=false; break; } } }else{ //不满足6位 flag=false; } return flag; } //销户 void cancel() { char key[7]; int i,pos,accNumber; cout<<"请输入要销户的账号:"; cin>>accNumber; num=accNumber; //寻找该卡号 pos=searchAccount(accNumber); cout<<"请输入密码:"; for(i=0;i<6;i++) { cin>>key[i]; } key[6]='\0'; if(strcmp(key,array[pos].accPwd)==0) { array[pos].balance=0; strcpy(array[pos].flag,"不存在"); strcpy(array[pos].accName,"不存在"); cout<<"销户成功,请按Enter返回!"<<endl; fflush(stdin); getchar(); mainFrame(); } else { cout<<"密码错误,请按Enter返回"<<endl; fflush(stdin); getchar(); mainFrame(); } } //取款 void withdrawal() { long accNum;//取款的账号 double money;//取款的金额 int pos,i; Account key; cout<<"请输入取款的账号:"; cin>>accNum; pos=searchAccount(accNum); if(pos==-1) { //卡号有误 cout<<"卡号不存在,请重新输入卡号"<<endl; //... withdrawal(); } else { for(i=1;i<4;i++) { cout<<"请输入密码:"; cin>>key.accPwd; if(strcmp(array[pos].accPwd,key.accPwd)==0) { break; } else { if(i<3) { cout<<"密码错误!请核对后重新输入\n"; cout<<"您还有"<<3-i<<"次机会重新输入密码。"<<endl; } else { cout<<"密码错误超过3次,退出系统……\n"; exit(0); } } } } cout<<"请输入取款金额:"; cin>>money; //展示下取款前卡的信息 cout<<"取款前卡的信息:"<<endl; printAccount(array[pos]); if(array[pos].balance<money) { cout<<"您的余额不足,请重新输入取款账号和密码:"<<endl; cout<<"------按任意键返回------"<<endl; withdrawal(); } else { //找到了取卡号所对应的卡 array[pos].balance-=money; } //展示存款后卡的信息 cout<<"取款后卡的信息:"<<endl; printAccount(array[pos]); cout<<"取款成功,按enter键返回"<<endl; fflush(stdin); getchar(); mainFrame(); } //存款 void deposit() { long accNum;//存款的账号 double money;//存款的金额 int pos; cout<<"请输入存款的账号:"; cin>>accNum; cout<<"请输入存款金额:"; cin>>money; pos=searchAccount(accNum); if(pos==-1){ //卡号有误 cout<<"卡号不存在,请重新输入卡号:"<<endl; deposit(); }else{ //展示下存款前卡的信息 cout<<"存款成功!"<<endl<<"存款前卡的信息:"<<endl; printAccount(array[pos]); //找到了该卡号所对应的卡 array[pos].balance+=money; //展示存款后卡的信息 cout<<"存款后卡的信息:"<<endl; printAccount(array[pos]); cout<<"存款成功,按Enter返回"<<endl; fflush(stdin); getchar(); mainFrame(); } } //查询 void search() { long accNum;//查询的账号 int pos,i; Account key; cout<<"请输入查询的账号:"; cin>>accNum; pos=searchAccount(accNum); if(pos==-1 ||accNum==num)//|| strcpy(array[size].accName,"不存在")) { //卡号有误 cout<<"卡号不存在,请重新输入卡号:"<<endl; //... search(); }else{ for(i=1;i<4;i++) { cout<<"请输入密码:"; cin>>key.accPwd; if(strcmp(array[pos].accPwd,key.accPwd)==0) { break; } else { if(i<3) { cout<<"账号或密码错误!请核对后重新输入\n"; cout<<"您还有"<<3-i<<"次机会重新输入账号和密码。"<<endl; } else { cout<<"密码错误超过3次,退出系统……\n"; exit(0); } } } //展示卡的信息 cout<<"您的卡的信息:"<<endl; printAccount(array[pos]); cout<<"查询成功,按Enter返回"<<endl; 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&&isPassLegal(pwd2)) { strcpy(array[pos].accPwd,pwd3); cout<<"改密成功!"<<endl; printAccount(array[pos]);//打印改密后卡的信息 break; }else { cout<<"您输入的密码有误!"; } } else { cout<<"卡的状态异常,无法操作!"; } }else { cout<<"账号或密码输入错误!"<<endl; } } cout<<"按Enter返回主菜单。"<<endl; 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; cout<<"您成功的向"<<accNum2<<"账号转入"<<money<<"钱"<<endl; cout<<"转账后您卡的信息:"<<endl; printAccount(array[pos1]); break; }else{ cout<<"您输入的账号有误或状态异常,转账失败!"<<endl; break; } }else{ cout<<"卡的状态异常,无法进行操作!"; break; } } else{ cout<<"账号或密码错误!"; } } cout<<"按Enter返回主菜单"<<endl; fflush(stdin); getchar(); mainFrame(); } //退出时,将变化了的数据保存到文件中,下次运行,接着上次的业务继续办下去 void saveInformation() //退出前保存数据 { ofstream outfile("bank.txt",ios::out); //以输入的方式打开文件 if(!outfile) //测试是否成功打开 { cerr<<"不好啦,储户信息保存不了了!"<<endl; exit(1); } for(int i=0;i<size;i++) { outfile<<array[i].accNumber<<" "<<array[i].accName<<" "<<array[i].accPwd<<" "<<array[i].balance<<" "<<array[i].flag<<endl; } outfile.close(); } //从文件中读取数据,保存到全局数组中 void getInformation() //用于读取帐户数据 { ifstream infile("bank.txt",ios::in); //以输入的方式打开文件 if(!infile) //测试是否成功打开 { cerr<<"不好啦,找不到储户信息了!"<<endl; exit(1); } while(!infile.eof()) { infile>>array[size].accNumber>>array[size].accName>>array[size].accPwd>>array[size].balance>>array[size].flag; size++ ; } size-=1; infile.close(); }