银行储蓄系统(C++课程实训博客电子报告)
2015-07-17 20:19
483 查看
<pre class="cpp" name="code">/****************************************************** *版权所有(c)2015.烟台大学计算机与控制工程学院 * *文件名称:main.cpp *文件标示:无 *内容摘要:该代码用于满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作者:李长鸿 *完成日期:2015.7.17 * *修改记录: *修改日期: *版本号:V1.0 *修改人: *修改内容: *********************************************************/ #include <iostream> #include<cstring> #include<cstdlib> #include<fstream> #include<ctype.h> #include"BU.h" using namespace std; /****************** *功能描述:主函数 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 ******************/ int main() { cout<<"--------------------------"<<endl; cout<<" 欢迎光临CSDN银行 "<<endl; cout<<"--------------------------"<<endl; Bank b; if(pass())//业务员登录 { b.Work();//业务员开始工作 } return 0; }
/************************************************ *版权所有(c)2015.烟台大学计算机与控制工程学院 * *文件名称:BU.h *文件标示:无 *内容摘要:该代码用于满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作者:李长鸿 *完成日期:2015.7.17 * *修改记录: *修改日期: *版本号:V1.0 *修改人: *修改内容: /************************************************/ #ifndef BU_H_INCLUDED #define BU_H_INCLUDED #include<cstring> using namespace std; /************************* * User类的声明 ***************************/ const int maxUser=2000; class Bank; class User//用户类 { string idnumber;//身份证号 string address;//地址 int account;//顺序号 int number; //账户名 string name;//户主名 int password;//密码 double leftmoney;//余额 int condition;//账户状态,1为正常,2为销户,3为挂失 public: User(string idnu,string add,int nu,string na,int pass,double lef,int cond); void Show();//显示开户相关个人信息 bool Provepassword();//验证密码 bool Condition();//账户状态 friend class Bank;//将Bank类声明为友元类 }; /************************* * Bank类的声明 *************************/ class Bank//银行类 { static int n; User *user[maxUser]={NULL};//组合,User类为数据成员;指针数组,用小空间的指针数组灵活处理大空间的对象集合 public: Bank();//用文件写出初始化 ~Bank();//文件读入保存数据 void Work();//决定办什么业务 void Search(int nu);//查询余额及账户状态 void Save(int nu);//存钱 void Take(int nu);//取钱 void Openoccount();//开户 void Canceloccount(int nu);//销户 void Transferaccount(int nu);//转账 void Changepass(int nu);//改密码 void Loss(int nu);//挂失 void Removel(int nu);//解挂 }; /*********************** * 业务员登录函数的声明 ************************/ int pass(); //业务员登录 /************************** *输入密码函数的声明 ***************************/ int inputPassword(); //返回键盘输入的密码 #endif // BU_H_INCLUDED
/************************************************ *版权所有(c)2015.烟台大学计算机与控制工程学院 * *文件名称:User.cpp *文件标示:无 *内容摘要:该代码用于满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作者:李长鸿 *完成日期:2015.7.17 * *修改记录: *修改日期: *版本号:V1.0 *修改人: *修改内容: /************************************************/ #include<iostream> #include<cstring> #include<cstdio> #include"BU.h" using namespace std; /******************************************************************************************** *功能描述:构造函数,对象的初始化 *输入参数:身份证号,住址,账号,户主名,六位数字密码,余额,状态:1.正常;2.销户;3.挂失 *输出参数:无 *返回值:无 *其他说明:无 **********************************************************************************************/ User::User(string idnu,string add,int nu,string na,int pass,double lef,int cond) { idnumber=idnu; address=add; number=nu; name=na; password=pass; leftmoney=lef; condition=cond; } /******************************************** *功能描述:显示个人信息 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 *********************************************/ void User::Show()//显示开户时的个人及账户信息 { if(condition!=2)//销户的用户不能显示信息 { cout<<"户主名: "<<name<<endl<<"住址为:"<<address<<endl<<"顺序号: "; cout<<account<<endl<<"账户名: "<<number<<endl<<"身份证号: "<<idnumber<<endl; } } /******************************************** *功能描述:密码的验证 *输入参数:无 *输出参数:无 *返回值:bool型的 *其他说明:无 *********************************************/ bool User::Provepassword()//验证密码 { int pass; int i=0; int j; while(i++<3)//最多能输入三次密码 { cout<<"请输入密码"<<endl; pass=inputPassword();//输入六位数的密码 if(pass==password) return 1; if((3-i)>0)//错误输入不足三次,给予提示,继续输入 { cout<<"密码错误,你还有"<<3-i<<"次机会"<<endl<<"继续请输入1,退出请输入2;"; cin>>j; if(j==2)return 0;//放弃输入密码,返回失败信息 } } if(j==1)//三次都输入错误密码,锁定银行卡 { cout<<"密码输入错误三次!您的银行卡已被锁定!请带上您的身份证,联系银行工作人员解决。"<<endl; return 0;//返回密码输入失败信息 } } /******************************************** *功能描述:状态的判断 *输入参数:无 *输出参数:无 *返回值:bool型的 *其他说明:无 *********************************************/ bool User::Condition()//账户状态的判断 { if(condition!=1) { cout<<"此账户已被"<<(condition==2?"销户":"挂失")<<",不能对它进行操作"<<endl;//若非正常,给予提示 return 0; } return 1; }
/************************************************ *版权所有(c)2015.烟台大学计算机与控制工程学院 * *文件名称:Bank.cpp *文件标示:无 *内容摘要:该代码用于满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作者:李长鸿 *完成日期:2015.7.17 * *修改记录: *修改日期: *版本号:V1.0 *修改人: *修改内容: ************************************************/ #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<fstream> #include<ctype.h> #include"BU.h" using namespace std; /******************************************************************** *功能描述:用构造函数读取文件中保存的用户数据复制给用户类指针数组 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 **********************************************************************/ int Bank::n=0; Bank::Bank()//构造函数读取文件中的数据 { int i=0; ifstream infile("acc.txt",ios::in); if(!infile)//测试文件打开操作是否成功,不成功则提示后退出。 { cout<<"文件输出有误"<<endl; exit(1); } string idnu,add; string na; int nu,c,p; double l; while(infile>>idnu>>add>>nu>>na>>p>>l>>c)//从文件中读出数据 { user[i]=new User(idnu,add,nu, na,p,l,c);//给指针数组赋值 ++i; user[i-1]->account=i; } n=i; infile.close(); } /******************************************************************************************** *功能描述:用析构函数将数组中的数据保存到文件中 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:acc保存的是没有顺序号的数据,保证顺利下次顺利运行,account保存的是用户所有数据 **********************************************************************************************/ Bank::~Bank() //保存数据至文件中 { ofstream outfile("account.txt",ios::out);//account.txt中保存的数据是加入了顺序号,我是用顺序号而不是账户号来正确查找数组的数据的 if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。 { cerr<<"file account.txt open error!"<<endl; exit(1); } int i; for(i=0; i<n; i++)//用循环将数据写入文件中 { if(user[i]!=NULL)//若未销户,则写入文件,即删除已销户用户 { outfile<<user[i]->idnumber<<" "; outfile<<user[i]->address<<" "; outfile<<user[i]->account<<" "; outfile<<user[i]->number<<" "; outfile<<user[i]->name<<" "; outfile<<user[i]->password<<" "; outfile<<user[i]->leftmoney<<" "; outfile<<user[i]->condition<<endl; } } outfile.close(); ofstream outputfile("acc.txt",ios::out);//更新acc.txt中的数据,保存成功操作后的数据并使下次顺利读取 for(i=0; i<n; i++)//用循环将数据写入文件中 { if(user[i]!=NULL)//若未销户,则写入文件,即删除已销户用户 { outputfile<<user[i]->idnumber<<" "; outputfile<<user[i]->address<<" "; outputfile<<user[i]->number<<" "; outputfile<<user[i]->name<<" "; outputfile<<user[i]->password<<" "; outputfile<<user[i]->leftmoney<<" "; outputfile<<user[i]->condition<<endl; } delete user[i];//释放空间 } outputfile.close(); } /****************************** *功能描述:选择并办理相办业务 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:无 ******************************/ void Bank::Work()//决定办什么业务 { int i=1; int N;//我是用序号,即用户数组的下标N-1来找对应的用户信息 while(1)//业务员结束对一个用户的操作后若不选择退出,可继续对另一客户进行操作,而不用重启程序 { cout<<endl; cout<<"+----------------------------+"<<endl; cout<<"+ 1 查询 2 存钱 3 取钱 +"<<endl; cout<<"+ 4 开户 5 销户 6 转账 +"<<endl; cout<<"+ 7 改密 8 挂失 9解挂 +"<<endl; cout<<"+ 10 显示账户信息 +"<<endl; cout<<" 0 退出 +"<<endl; cout<<"+----------------------------+"<<endl; cout<<"请输入操作指令:"; cin>>i; if(i==4)//一开始就开户的话无需已有用户 Openoccount(); else//对已有用户进行操作 { cout<<"请输入本次操作户主的顺序号:"; cin>>N; while(N>n||N<1)//输入的顺序号错误,没有此用户,若不退出,则一直到输入正确的顺序号才进行下一步操作 { cout<<"输入有误,此用户不存在,请仔细检查。若要继续,请输入1,退出请输入2;"; int j; cin>>j; if(j==1) { cout<<"请输入顺序号:"; cin>>N; } else break; } if(n>=N>0)//排除选择退出引起的混乱 if(user[N-1]->Provepassword())//密码的验证 while(i!=0)//只要不选择退出,就一直对此用户进行操作 { if(i>0 && i<11) { switch(i) { case 1: Search(N-1); break; case 2: Save(N-1); break; case 3: Take(N-1); break; case 4: Openoccount(); break; case 5: Canceloccount(N-1); break; case 6: Transferaccount(N-1); break; case 7: Changepass(N-1); break; case 8: Loss(N-1); break; case 9: Removel(N-1); break; case 10: user[N-1]->Show(); break; } } else cout<<"请重新选择功能"<<endl;//若输入的数字不在选项中,重新输入 if(user[N-1]==NULL)//若进行销户操作后,则不再对此用户进行操作 { break ; } cout<<endl; cout<<"+----------------------------+"<<endl; cout<<"+ 1 查询 2 存钱 3 取钱 +"<<endl; cout<<"+ 4 开户 5 销户 6 转账 +"<<endl; cout<<"+ 7 改密 8 挂失 9解挂 +"<<endl; cout<<"+ 10 显示账户信息 +"<<endl; cout<<" 0 退出 +"<<endl; cout<<"+----------------------------+"<<endl; cout<<"请输入操作指令:"; cin>>i; } } cout<<"已结束对此用户的操作!"<<endl;//已完成一位用户的所有要求 cout<<"要关闭操作请输入1,继续请输入除1之外的任意键:";//就像是选择“下班”还是”继续工作“ cin>>i; if(i==1) break; } } /******************************************** *功能描述:查询余额或是账户状态 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:无 *********************************************/ void Bank::Search(int nu) { if(user[nu]->condition!=2)//状态正常的账户才能进行此操作 { cout<<"查询余额请输入1,查询状态请输入2:";//查询余额和账户状态的选择 int i; cin>>i; while(i!=1&&i!=2)//输入的选择数字有误 { cout<<"输入有误,继续查询请按1,取消请输入2,请再次输入:"; int j; cin>>j; if(j==1) cin>>i; else break; } if(i==1)//查询余额 cout<<"账户余额为:"<<user[nu]->leftmoney<<endl; else//状态的查询 { if(user[nu]->condition==1) cout<<"您的账户一切正常。"<<endl; else if(user[nu]->condition==2) cout<<"您已销户,此账户为无效账户。"<<endl; else cout<<"您的账户已办理挂失。"<<endl; } } else cout<<"此账户已销户,不能进行查询操作"<<endl; } /******************************************** *功能描述:存款 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:无 *********************************************/ void Bank::Save(int nu)//存款 { if(user[nu]->Condition())//状态正常的账户才能进行此操作 { cout<<"请输入存款金额:(元)"; int m; cin>>m; cout<<"成功存款 "<<m<<" 元"<<endl; user[nu]->leftmoney+=m;//成功存入m元 } } /******************************************** *功能描述:取款 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:无 *********************************************/ void Bank::Take(int nu)//取款 { if(user[nu]->Condition())//状态正常的账户才能进行此操作 { cout<<"请输入取款金额:(元)"; int m; cin>>m; while(m>user[nu]->leftmoney) { cout<<"余额不足,继续取款请输入1,退出此操作请输入2;"; int j; cin>>j; if(j==1) { cout<<"请输入取款金额: "; cin>>m; } else if(j==2) { m=0; break; } else while(j!=1&&j!=2) { cout<<"输入有误,继续取款请按1,取消取款请按2:请再次输入正确的数字:"; cin>>j; } } cout<<"成功取款 "<<m<<" 元"<<endl; user[nu]->leftmoney-=m; } } /******************************************** *功能描述:开户 *输入参数:无 *输出参数:无 *返回值:无 *其他说明:账号时系统自动连续生成的,状态自动为1 *********************************************/ void Bank::Openoccount() { int i=0; ++n; if(n>maxUser) { cout<<"对不起,人数已满,不能再开户,请您到其他银行办理此业务,我们对因此给您带来的麻烦表示由衷的歉意。"<<endl; } else { string idnu,add; int acc; int nu; //账号 string na; //姓名 int pass; //密码 double lef; //金额 int cond=1; //状态 cout<<"正在开户"<<endl; nu=user[n-2]->number+1; cout<<"账号:"<<nu<<endl; cout<<"户主姓名:"; cin>>na; cout<<"身份证号:"; cin>>idnu; cout<<"住址为:"; cin>>add; cout<<"请输入开户密码:"; pass=inputPassword(); cout<<"请再次确认密码:"; int p1; p1=inputPassword(); while(p1!=pass) { cout<<"两次密码不一致!!"<<endl; cout<<"返回请输入1,继续请输入其他"<<endl; cin>>i; if(i==1) break; cout<<"请您再次设立密码,请注意两次密码应一致:"; pass=inputPassword(); cout<<"请再次确认密码:"; p1=inputPassword(); } if(i!=1) { cout<<"请输入开户金额:"; cin>>lef; user[n-1]=new User(idnu,add,nu,na,pass,lef,cond); user[n-1]->account=n; cout<<"开户成功,请注意牢记并保护好您的个人信息,防止钱财丢失。"<<endl; } } } /****************************************************************** *功能描述:销户 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:销户后,状态为2且清除此用户的数据,保存数据至文件时,清除用户 *******************************************************************/ void Bank::Canceloccount(int nu) { if(user[nu]->Condition())//状态正常的账户才能进行此操作 { int j=1; while(user[nu]->leftmoney>0)//余额不为零不能销户 { cout<<"您目前还有余额:"<<user[nu]->leftmoney<<"元,请先取出所有余额后再销户。"<<endl; cout<<"继续销户请按1,取消销户请按2:"; cin>>j; while(j!=1&&j!=2) { cout<<"输入有误,继续销户请按1,取消销户请按2:请再次输入正确的数字:"; cin>>j; } if(j==1) { cout<<"请取出全部余额"<<endl; Take(nu); } else break; } if(j==1) { user[nu]->condition=2; cout<<"销户成功,即将结束本次操作。"<<endl; user[nu]= {NULL}; } } } /******************************************** *功能描述:转账 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:无 *********************************************/ void Bank::Transferaccount(int nu) { if(user[nu]->Condition())//状态正常的账户才能进行此操作 { cout<<"请输入转入账户的序号:"; int i,j=1,k; cin>>i; while(i>n+1||i<1)//判断对方账户是否存在 { cout<<"此账户不存在,继续输入账号请输入1,退出此操作请输入2;"; cin>>j; if(j==1) { cout<<"请输入转入账户序号: "; cin>>i; } else break; } if(j==1)//对方账户存在 { cout<<"请输入转账金额:(元)"; int m; cin>>m; while(m>user[nu]->leftmoney)//转出金额必须小于等于用户账户余额 { cout<<"余额不足,重新输入转账金额请输入1,退出此操作请输入2:"; cin>>k; while(k!=1&&k!=2) { cout<<"输入有误,继续转账请按1,取消转账请按2:请再次输入正确的数字:"; cin>>k; } if(k==1) { cout<<"请输入转账金额 :"; cin>>m; } else { m=0; break; } } cout<<"成功转账 "<<m<<" 元"<<endl; user[i-1]->leftmoney+=m;//对方账户转入m元 user[nu]->leftmoney-=m;//此用户转出m元 } } } /******************************************** *功能描述:改密 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:无 *********************************************/ void Bank::Changepass(int nu) { if(user[nu]->Condition())//状态正常的账户才能进行此操作 { int p1,p2; cout<<"请输入原密码:"; if(user[nu]->Provepassword())//输入密码 { cout<<"请输入新密码:"; p1=inputPassword(); cout<<"请再次确认新密码: "; p2=inputPassword();//输入六位数的密码 if(p1!=p2) { cout<<"两次密码不一致,改密失败"<<endl; } else cout<<"改密成功,请牢记并保护好您的新密码。"<<endl; } } } /******************************************** *功能描述:挂失 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:挂失后状态代号为3 *********************************************/ void Bank::Loss(int nu) { if(user[nu]->Condition())//状态正常的账户才能进行此操作 { user[nu]->condition=3; cout<<"挂失成功"<<endl; } } /******************************************** *功能描述:解挂 *输入参数:用户在数组中的下标,即顺序号-1 *输出参数:无 *返回值:无 *其他说明:解挂后账户代号为1; *********************************************/ void Bank::Removel(int nu) { if(user[nu]->condition==3)//状态为挂失的账户才能进行解挂操作 { user[nu]->condition=1;//解挂成功,状态为正常 cout<<"解挂成功"<<endl; } else if(user[nu]->condition==1)cout<<"此卡未被挂失,无需解挂。"<<endl; else cout<<"此账户已被销户,不能解挂"<<endl; }
/************************************************ *版权所有(c)2015.烟台大学计算机与控制工程学院 * *文件名称:work.cpp *文件标示:无 *内容摘要:该代码用于满足后缀要求的第一个文件 *其他说明:无 *当前版本:V1.0 *作者:李长鸿 *完成日期:2015.7.17 * *修改记录: *修改日期: *版本号:V1.0 *修改人: *修改内容: /************************************************/ #include <iostream> #include <fstream> #include <conio.h> #include <cstdlib> #include <cstring> #include <ctype.h> #include "BU.h" using namespace std; /* 功能:验证用户密码 返回值:密码正确,返回1; 不能通过密码验证,返回0 */ /******************************************** *功能描述:业务员登录 *输入参数:无 *输出参数:无 *返回值:登陆的结果,成功为1,失败为0 *其他说明:无 *********************************************/ int pass() { char sNameInFile[20]; //由文件中读出的业务员用户名 char sPassInFile[20]; //文件中保存的密码,这一版本中,用字符保存密码 ifstream infile("password.txt",ios::in); if(!infile) { cout<<"password file cannot open!"<<endl; exit(1); } infile>>sNameInFile>>sPassInFile; infile.close(); char sName[20]; //业务员登录时输入的用户名 char sPass[20]; //业务员登录时输入的密码 char ch; int iTry=3; //进入系统时尝试的次数 int right = 0; //要返回的结果:0-不正确 1-正确 //进入系统,密码三次不对将退出 do { cout<<"请输入业务员用户名:"; cin>>sName; cout<<"请输入密码:"; int i=0; while((ch=getch())!='\r') //getch在接受输入后,不在屏幕上显示 { sPass[i++]=ch; putchar('*'); //接受任何字符,屏幕上只显示* } sPass[i]='\0'; fflush(stdin); cout<<endl;; if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0) { right = 1; break; } else { iTry--; if(iTry>0) cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl; else { cout<<"对不起,你不能进入系统"<<endl;; } } } while(iTry); return right; } /******************************************** *功能描述:输入密码 *输入参数:无 *输出参数:无 *返回值:六位数的数字密码,且不全为0 *其他说明:无 *********************************************/ int inputPassword() { int ch; //接收数字形式密码 int i, Pass=0; while(1) { for(i=0; i<6; i++) { ch=getch()-'0'; //输入但不显示 putchar('*'); //输出* if(ch>9||ch<0)//非数字字符退出循环,i<6 break; else Pass=Pass*10+ch; } fflush(stdin); //清除键盘缓存区中已经有的输入 cout<<endl; if(Pass==0||i<6) //6位全0后Pass=0,或输入了非数字字符退出转换成密码的循环 { cout<<"密码要求全为数字,且不能全0!"<<endl; cout<<"请重新输入密码: "; } else break; } return Pass; } /* 关于getch()的一点说明: 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 函数原型:int getch(void) 返回值:读取的字符 在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n) 1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。 2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。 3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。 为避免键盘缓存区中未读出的字符影响程序,用fflush(stdin);清除输入缓存区 */
acc.txt:
运行截图:
业务员登录失败
成功登陆及查询
存款
取款
新用户开户
老用户开户
转账
改密
挂失及查询
解挂及显示个人信息
销户
account.txt
相关文章推荐
- c++ STL
- C++ Primer Plus学习笔记五(第五章)
- fflush(stdin)小知识
- 指针的问题5 指针访问数组的方式
- c++11 lambda表达式详细解析
- iOS C语言6.2_函数多文件管理
- vc++ 多线程编程(初学)
- C++ 著名程序库 概览
- C++ 编译器的函数名修饰规则
- 基于C++与VS2012的HDF5文件处理(二)
- 【学习笔记】【OC语言】NSString
- HDU 1176
- 实训总结 ----- C++结语
- 【C语言】C的一些简单练习题,关于水仙花数,求和,整数高低位输出,制定二进制位替换
- C++标准库<sstream>
- 最佳课题选择
- C语言(回调函数与转移表)
- 【C/C++】快速排序的两种实现思路
- c++课程实训 银行储蓄系统
- C语言调用windows窗口,得到文件夹目录