课程实训:银行储蓄系统(多文件组织)
2015-07-17 15:09
477 查看
main.cpp
bank.h
bank.cpp
work.cpp
user.cpp
文件截图:
运行结果:
加分项目
/*********************************************************** * 版权所有(C)2015, 烟台大学计算机与控制工程学院 * All rights reserved. * * 文件名称:main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本:V1.0 * 作 者:苏强 * 完成日期:2015/7/17 * * 修改记录: * 修改日期: * 版 本 号:V1.0 * 修 改 人:苏强 * 修改内容: **********************************************************/ #include <iostream> #include"bank.h" using namespace std; /* * 功能描述:主函数,显示进入页面 * 输入参数:无 * 输出参数:无 * 返回值:0-成功 其他-失败 * 其它说明:无 */ int main() { cout<<"+--------------------------------------+"<<endl; cout<<"+ Welcome To CSDN Bank +"<<endl; cout<<"+--------------------------------------+"<<endl; if(pass()) { Bank b; b.work(); } return 0; }
bank.h
/*********************************************************** * 版权所有(C)2015, 烟台大学计算机与控制工程学院 * All rights reserved. * * 文件名称:main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本:V1.0 * 作 者:苏强 * 完成日期:2015/7/17 * * 修改记录: * 修改日期: * 版 本 号:V1.0 * 修 改 人:苏强 * 修改内容: **********************************************************/ #ifndef BANK_H_INCLUDED #define BANK_H_INCLUDED #include<cstring> using namespace std; const int upnum=2000; int pass(); //验证密码 业务员登录 int chooseInMenu(); //显示菜单并由业务员选择 int inputPassword(); //返回键盘输入的密码 class Bank; class User { private: int account; string name; int password; double balance; string ID; string addr; string telphone; int status;//0——正常,1——挂失,2——销户 public: void setUser(int a,string n,int p,double b,string id,string add,string tel,int s); void showname();//输出用户姓名 void showbalance(string prompt);//输出用户账户余额 void showinfor(); bool Rpassword();//判断密码是否正确 bool staNormal();//状态是否是正常 friend class Bank; }; class Bank { private: int N; User *users; public: Bank();//打开文件,将文件中的数据保存到数组中 ~Bank();//将数组中的数据保存到文件中 void work();//工作 void open();//开户 void cancel();//销户 void save();//存储 void withdraw();//提取 void showbalance();//查询 void transferbalance();//转账 void reportloss();//挂失 void removeloss();//解除挂失 void changepassword();//改密码 int getUser();//返回用户的账号 int number(); }; #endif // BANK_H_INCLUDED
bank.cpp
/*********************************************************** * 版权所有(C)2015, 烟台大学计算机与控制工程学院 * All rights reserved. * * 文件名称:main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本:V1.0 * 作 者:苏强 * 完成日期:2015/7/17 * * 修改记录: * 修改日期: * 版 本 号:V1.0 * 修 改 人:苏强 * 修改内容: **********************************************************/ #include<iostream> #include<fstream> #include<cstring> #include<cstdlib> #include"bank.h" using namespace std; /* * 功能描述:用构造函数读取文件中保存的业务数据 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:每次循环读取的时候开辟新空间。 */ Bank::Bank()//打开文件,将文件中的数据保存到数组中 { ifstream infile("account.dat",ios::in); if(!infile) { cerr<<"open error!"<<endl; exit(1); } int i=0; int acc; //账号 string na; //姓名 int passw; //密码 double bal; //金额 string id; //身份证号 string add; //地址 string tel; //电话 int sta; //状态 N=number(); users=new User[N+1]; //用动态数组储存用户 while(infile>>acc>>na>>passw>>bal>>id>>add>>tel>>sta) { users[i].setUser(acc,na,passw,bal,id,add,tel,sta); i++; } N = i; infile.close(); } /* * 功能描述:用析构函数,在退出系统时,将数据保存到文件中 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:从0开始写入一直到N-1 */ Bank::~Bank()//将数组中的数据保存到文件中 { ofstream outfile("account.dat",ios::out); if(!outfile) { cerr<<"open error!"<<endl; exit(1); } for(int i=0; i<N; i++) { outfile<<users[i].account<<" "<<users[i].name<<" "<<users[i].password<<" "<<users[i].balance<<" "; outfile<<users[i].ID<<" "<<users[i].addr<<" "<<users[i].telphone<<" "<<users[i].status<<endl; } outfile.close(); } /* * 功能描述:获取文件中已有的用户数目 * 输入参数:无 * 输出参数:无 * 返 回 值:用户数目 * 其它说明:返回值为动态数组提供一个空间 */ int Bank::number() { int i=0; int acc; //账号 string na; //姓名 int passw; //密码 double bal; //金额 string id; string add; string tel; int sta; //状态 ifstream infile("account.dat",ios::in); if(!infile) { cerr<<"open error!"<<endl; exit(1); } while(infile>>acc>>na>>passw>>bal>>id>>add>>tel>>sta) { i++; } infile.close(); return i; } /* * 功能描述:办理业务 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:循环进行,输入0退出循环 */ void Bank::work()//工作 { int i; do { i=chooseInMenu(); switch(i) { case 1: open();//开户 break; case 2: cancel();//销户 break; case 3: save();//存储 break; case 4: withdraw();//提取 break; case 5: showbalance();//查询 break; case 6: transferbalance();//转账 break; case 7: reportloss();//挂失 break; case 8: removeloss();//解除挂失 break; case 9: changepassword();//改密码 break; case 0: cout<<"欢迎下次光临"<<endl; break; } } while(i); } /* 功能:开户 说明:在进入系统时,在读入数据过程中,已经记录了用户数为N,在数组中对应下标为0~N-1 开户时要增加一个用户,只要为下标为N的数组元素置值,并在成功之后令N++即可。 账号由系统自动生成(10001+序号),保证其连续,这样在顺序增加的时候,就保证了其有序。 */ void Bank::open()//开户 { if(N==upnum) { cout<<"银行人数已达到上限,无法继续开户!"<<endl; return ; } int acc=10001+N,pw,sta; string na; double bal; string id,add,tel; cout<<"账户:"<<acc<<endl; cout<<"户主姓名:"; cin>>na; cout<<"身份证号:"; cin>>id; cout<<"地址:"; cin>>add; cout<<"电话:"; cin>>tel; cout<<"密码:"; int pw1,pw2; pw1=inputPassword(); cout<<"确认密码:"; pw2=inputPassword(); if(pw1==pw2) { pw=pw1; cout<<"存入金额:"; cin>>bal; sta=0; users .setUser(acc,na,pw,bal,id,add,tel,sta); N++; cout<<"开户成功!"<<endl; } else cout<<"两次密码输入不一致,开户失败!"<<endl; } /* * 功能描述:输入账号查询用户,返回用户在数组中的下标 * 输入参数:id-int-要查询用户的账号 * 输出参数:无 * 返 回 值:index-为用户账号-10001的值(其值在0~N-1间) * 其它说明:由账号自动产生,使按账号有序,本模块采用二分查找 */ int Bank::getUser()//返回用户的账号 { int n; cout<<"账号:"; cin>>n; int index=-1; int mid,low=0,high=N-1; while(low<=high) { mid=(low+high)/2; if(users[mid].account==n) { index=mid; break; } else if(users[mid].account>n) high=mid-1; else low=mid+1; } if(index<0) cout<<"账户不存在,操作失败!"<<endl; return index; } /* * 功能描述:注销账户 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:找到账户,并将其状态改为2-注销即可。 注销前应该检查余额,应该先取款再注销 */ void Bank::cancel()//销户 { int n; n=getUser(); if(n>=0) { users .showname(); users .showinfor(); if(users .Rpassword()) { users .showbalance("余额:"); cout<<"确认销户(y/n)"<<endl; if(tolower(getchar())=='y') { users .showbalance("销户成功,本次取款为:"); users .balance=0; users .status=2; } else { cout<<"你取消了本次操作,销户失败!"<<endl; } } } fflush(stdin); } /* * 功能描述:存款 * 输入参数:money-double-存款金额 * 输出参数:无 * 返 回 值:无 * 其它说明:需要保证账户存在,且处于正常状态。存入前确认账户用户名字。 存入后显示账户余额。 */ void Bank::save()//存储 { int n,money; n=getUser(); if(n>=0) { if(users .staNormal()) { users .showname(); users .showinfor(); cout<<"存款金额:"; cin>>money; users .balance+=money; users .showbalance("存款后,您有"); } } } /* * 功能描述:取款 * 输入参数:monney-double-取款金额 * 输出参数:无 * 返 回 值:无 * 其它说明:需要保证账户存在,且处于正常状态。另外,余额要足够取。 取款需要确认姓名并输入密码,取款后显示余额。 */ void Bank::withdraw()//提取 { int n,money; n=getUser(); if(n>=0) { if(users .staNormal()) { users .showname(); users .showinfor(); if(users .Rpassword()) { cout<<"取款额:"; cin>>money; if(users .balance>=money) { users .balance-=money; users .showbalance("取款成功,账户余额为:"); } else cout<<"账户余额不足,取款失败!"<<endl; } } } } /* * 功能描述:查询账户 * 输入参数:无 * 输出参数:sta[users[who]->status]-string-用户状态 * 返 回 值:无 * 其它说明:需要确认用户并输入密码,显示账户信息包括余额和状态 */ void Bank::showbalance()//查询 { int n=getUser(); string sta[3]= {"正常","挂失","已经销户"}; if(n>=0) { users .showname(); users .showinfor(); if(users .Rpassword()) { users .showbalance("账户余额为:"); cout<<"状态:"<<sta[users .status]<<endl; } } } /* * 功能描述:转账 * 输入参数:money-double-转账金额 * 输出参数:无 * 返 回 值:无 * 其它说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够。 转出账户需要输入密码,转入账户不需要,只需要确认用户是否存在。转出后显示余额。 */ void Bank::transferbalance()//转账 { int nout,nin; cout<<"转出"; nout=getUser(); double money; if(nout>=0) { users[nout].showname(); if(users[nout].Rpassword()) { cout<<"转出金额:"; cin>>money; cout<<"转入"; nin=getUser(); if(nin>=0) { users[nin].showname(); if(users[nin].staNormal()) { if(users[nin].balance<money) cout<<"余额不足,转账失败!"<<endl; else { users[nout].balance-=money; users[nin].balance+=money; users[nout].showbalance("转账后余额为:"); } } } } } return ; } /* * 功能描述:挂失账户 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:找到账户,并将其状态改为1-挂失即可。如果已经销户则不能挂失。需要查证用户名并输入密码。 */ void Bank::reportloss()//挂失 { int n=getUser(); if(n>=0) { users .showname(); users .showinfor(); if(users .Rpassword()) { if(users .status==0) { users .status=1; cout<<"挂失成功!"<<endl; } else if(users .status==1) cout<<"该账户已经被挂失,无法再次挂失!"<<endl; else cout<<"该账户已被注销,无法挂失!"<<endl; } } return ; } /* * 功能描述:解除挂失 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:找到账户,查看其状态若为正常则不需要解挂,若为销户则不能解挂, 若为挂失将其状态改为0-正常即可。 */ void Bank::removeloss()//解除挂失 { int n=getUser(); if(n>=0) { users .showname(); users .showinfor(); if(users .Rpassword()) { if(users .status==1) { users .status=0; cout<<"解挂成功!"<<endl; } else if(users .status==0) cout<<"该账户是正常状态,不需要解挂!"<<endl; else cout<<"该账户已被注销,无法解挂!"<<endl; } return; } } /* * 功能描述:改密码 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:找到账户,输入新密码并确认,若两次不同修改失败 */ void Bank::changepassword()//改密码 { int n=getUser(),pw1,pw2; if(n>=0) { users .showname(); users .showinfor(); if(users .status==0) { if(users .Rpassword()) { cout<<"新密码:"; pw1=inputPassword(); cout<<"再次输入新密码:"; pw2=inputPassword(); if(pw1==pw2) { users .password=pw1; cout<<"密码修改成功!"<<endl; } else cout<<"两次密码输入不同,修改失败!"<<endl; } } else if(users .status==0) cout<<"该账户是挂失状态,无法更改密码!"<<endl; else cout<<"该账户已被注销,无法更改密码!"<<endl; } return ; }
work.cpp
/*********************************************************** * 版权所有(C)2015, 烟台大学计算机与控制工程学院 * All rights reserved. * * 文件名称:main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本:V1.0 * 作 者:苏强 * 完成日期:2015/7/17 * * 修改记录: * 修改日期: * 版 本 号:V1.0 * 修 改 人:苏强 * 修改内容: **********************************************************/ #include <iostream> #include <fstream> #include <conio.h> #include <cstdlib> #include <cstring> #include <ctype.h> using namespace std; /* * 功能描述:验证用户密码 * 输入参数:sName-char *-业务员用户名 sPass-char *-业务员登录密码 * 输出参数:right-密码正确,返回1; 不能通过密码验证,返回0 * 返回值: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; } /* * 功能描述:显示菜单并由业务员选择 * 输入参数:i-int-操作指令 * 输出参数:无 * 返 回 值:i-int-操作指令 * 其它说明:超出指令范围则重新选择 */ int chooseInMenu() //显示菜单并由业务员选择 { int i; while(1) { cout<<endl; cout<<"+----------------------------+"<<endl; cout<<"+ 1 开户 2 销户 3 存款 +"<<endl; cout<<"+ 4 取款 5 查询 6 转账 +"<<endl; cout<<"+ 7 挂失 8 解挂 9 改密 +"<<endl; cout<<"+ 0 退出 +"<<endl; cout<<"+----------------------------+"<<endl; cout<<"请输入操作指令:"; cin>>i; if(i>=0 && i<=9) break; else cout<<"请重新选择功能"<<endl;; } return i; } /* * 功能描述:输入密码 * 输入参数:ch-char-接收字符形式密码 * 输出参数:无 * 返 回 值:iPass-int-整型的密码值 * 其它说明: 技术说明: (1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数 (2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数 (3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入 附:在实际的系统中,密码通常用字符串描述,即使只允许出现数字字符,本例仅作为参考 */ int inputPassword() //返回键盘输入的密码 { char ch; //接收字符形式密码 int iPass=0; //要转换为数字 int i; while(1) { for(i=0; i<6; i++) { ch=getch(); //输入但不显示 putchar('*'); //输出* if(isdigit(ch)) iPass=iPass*10+(ch-'0'); else { iPass=0; break; //退出for循环后,再次接受 } } fflush(stdin); //清除键盘缓存区中已经有的输入 cout<<endl;; if(iPass==0) //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环 { cout<<"密码要求全为数字,且不能全0!"<<endl;; cout<<"请重新输入密码: "; } else break; } return iPass; }
user.cpp
/*********************************************************** * 版权所有(C)2015, 烟台大学计算机与控制工程学院 * All rights reserved. * * 文件名称:main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本:V1.0 * 作 者:苏强 * 完成日期:2015/7/17 * * 修改记录: * 修改日期: * 版 本 号:V1.0 * 修 改 人:苏强 * 修改内容: **********************************************************/ #include<iostream> #include<cstring> #include"bank.h" /* * 功能描述:用构造函数为数据成员赋值 * 输入参数:User类的所有数据成员 * 输出参数:无 * 返 回 值:无 * 其它说明:数组形参形式要注意 */ void User::setUser(int a,string n,int p,double b,string id,string add,string tel,int s) { account=a; name=n; password=p; balance=b; addr=add; ID=id; telphone=tel; status=s; } /* * 功能描述:显示户主姓名 * 输入参数:无 * 输出参数:name-string-户主姓名 * 返 回 值:无 * 其它说明:无 */ void User::showname()//输出用户姓名 { cout<<"姓名:"<<name<<endl; } /* * 功能描述:显示账户余额 * 输入参数:prompt-提示词 * 输出参数:prompt-string-提示词,balance-double-账户余额 * 返 回 值:无 * 其它说明:无 */ void User::showbalance(string prompt)//输出用户账户余额 { cout<<prompt<<" "<<balance<<"元"<<endl; } /* * 功能描述:显示户主姓名 * 输入参数:无 * 输出参数:ID-string,addr-string,telphone-string,身份证,地址和电话 * 返 回 值:无 * 其它说明:无 */ void User::showinfor() { cout<<"身份证号:"<<ID<<endl; cout<<"地址:"<<addr<<endl; cout<<"电话:"<<telphone<<endl; } /* * 功能描述:确认密码正误 * 输入参数:无 * 输出参数:无 * 返 回 值:right-正确时等于 true,否则为false * 其它说明:调用输入密码函数,返回值为bool型 */ bool User::Rpassword()//判断密码是否正确 { int pw; bool right=true; cout<<"输入密码:"; pw=inputPassword(); if(pw!=password) { right=false; cout<<"密码错误,不能继续操作!"<<endl; } return right; } /* * 功能描述:查看用户状态 * 输入参数:无 * 输出参数:无 * 返 回 值:normal-true or false (bool型) * 其它说明:若状态为0,返回正常,否则输出用户状态挂失或销户 */ bool User::staNormal()//状态是否是正常 { bool normal=true; if(status!=0) { normal=false; cout<<"该账户处于"<<(status==1?"挂失":"注销")<<"状态,无法继续操作……"<<endl; } return normal; }
文件截图:
运行结果:
加分项目
相关文章推荐
- [ASP.NET MVC 小牛之路]12 - Section、Partial View 和 Child Action
- 翻转棋
- POJ 2406 Power String(KMP)
- 南阳oj 动态规划 VF
- POJ 3984 BFS 打印路径
- codeforce 551C GukiZ hates Boxes
- hdu 1513 Palindrome(LCS)
- 基于C/C++的读取文件夹下所有文件(图片、文档等)的代码
- [delphi技术]Delphi常见图象格式转换技术
- 弟弟的作业
- IOS中的模糊效果
- C#异步执行任务的方法
- snmpd占用CPU过高
- ChildActionOnly和ActionName的用法
- dd大牛的背包九讲
- Cisco Packet Tracer6.0安装及汉化
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- C# 百度语音合成
- jQuery EasyUI实现全部关闭tabs
- Suppress user properties/ custom fields when print in Outlook