课程实训:银行储蓄系统(多文件组织)
来源:互联网 发布:正版ug软件价格 编辑:程序博客网 时间:2024/06/06 03:27
main.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[N].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[n].showname(); users[n].showinfor(); if(users[n].Rpassword()) { users[n].showbalance("余额:"); cout<<"确认销户(y/n)"<<endl; if(tolower(getchar())=='y') { users[n].showbalance("销户成功,本次取款为:"); users[n].balance=0; users[n].status=2; } else { cout<<"你取消了本次操作,销户失败!"<<endl; } } } fflush(stdin);}/** 功能描述:存款* 输入参数:money-double-存款金额* 输出参数:无* 返 回 值:无* 其它说明:需要保证账户存在,且处于正常状态。存入前确认账户用户名字。 存入后显示账户余额。*/void Bank::save()//存储{ int n,money; n=getUser(); if(n>=0) { if(users[n].staNormal()) { users[n].showname(); users[n].showinfor(); cout<<"存款金额:"; cin>>money; users[n].balance+=money; users[n].showbalance("存款后,您有"); } }}/** 功能描述:取款* 输入参数:monney-double-取款金额* 输出参数:无* 返 回 值:无* 其它说明:需要保证账户存在,且处于正常状态。另外,余额要足够取。 取款需要确认姓名并输入密码,取款后显示余额。*/void Bank::withdraw()//提取{ int n,money; n=getUser(); if(n>=0) { if(users[n].staNormal()) { users[n].showname(); users[n].showinfor(); if(users[n].Rpassword()) { cout<<"取款额:"; cin>>money; if(users[n].balance>=money) { users[n].balance-=money; users[n].showbalance("取款成功,账户余额为:"); } else cout<<"账户余额不足,取款失败!"<<endl; } } }}/** 功能描述:查询账户* 输入参数:无* 输出参数:sta[users[who]->status]-string-用户状态* 返 回 值:无* 其它说明:需要确认用户并输入密码,显示账户信息包括余额和状态*/void Bank::showbalance()//查询{ int n=getUser(); string sta[3]= {"正常","挂失","已经销户"}; if(n>=0) { users[n].showname(); users[n].showinfor(); if(users[n].Rpassword()) { users[n].showbalance("账户余额为:"); cout<<"状态:"<<sta[users[n].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[n].showname(); users[n].showinfor(); if(users[n].Rpassword()) { if(users[n].status==0) { users[n].status=1; cout<<"挂失成功!"<<endl; } else if(users[n].status==1) cout<<"该账户已经被挂失,无法再次挂失!"<<endl; else cout<<"该账户已被注销,无法挂失!"<<endl; } } return ;}/** 功能描述:解除挂失* 输入参数:无* 输出参数:无* 返 回 值:无* 其它说明:找到账户,查看其状态若为正常则不需要解挂,若为销户则不能解挂, 若为挂失将其状态改为0-正常即可。*/void Bank::removeloss()//解除挂失{ int n=getUser(); if(n>=0) { users[n].showname(); users[n].showinfor(); if(users[n].Rpassword()) { if(users[n].status==1) { users[n].status=0; cout<<"解挂成功!"<<endl; } else if(users[n].status==0) cout<<"该账户是正常状态,不需要解挂!"<<endl; else cout<<"该账户已被注销,无法解挂!"<<endl; } return; }}/** 功能描述:改密码* 输入参数:无* 输出参数:无* 返 回 值:无* 其它说明:找到账户,输入新密码并确认,若两次不同修改失败*/void Bank::changepassword()//改密码{ int n=getUser(),pw1,pw2; if(n>=0) { users[n].showname(); users[n].showinfor(); if(users[n].status==0) { if(users[n].Rpassword()) { cout<<"新密码:"; pw1=inputPassword(); cout<<"再次输入新密码:"; pw2=inputPassword(); if(pw1==pw2) { users[n].password=pw1; cout<<"密码修改成功!"<<endl; } else cout<<"两次密码输入不同,修改失败!"<<endl; } } else if(users[n].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;}
文件截图:
运行结果:
加分项目
0 0
- 课程实训:银行储蓄系统(多文件组织)
- ★C++课程实训:银行储蓄系统(多文件组织)
- c++课程实训 银行储蓄系统
- c++课程实训 银行储蓄系统
- 课程实训--银行储蓄系统
- c++课程实训 银行储蓄系统
- 课程实训 银行储蓄系统
- 【课程实训】银行储蓄系统
- 程序设计基础课程实训报告:银行储蓄系统
- c++课程实训 银行储蓄系统——感受
- 课程实训——银行储蓄系统
- 银行储蓄系统(C++课程实训博客电子报告)
- 第十二周实践——多文件组织(银行储蓄系统)
- 【实训项目】银行储蓄系统
- 实训项目-银行储蓄系统
- 实训项目-银行储蓄系统
- 实训项目银行储蓄系统
- 实训项目--银行储蓄系统
- MFC,C++,VC++,VS2010 之间到底是什么关系
- POJ 2406 Power String(KMP)
- hdu 1513 Palindrome(LCS)
- 基于C/C++的读取文件夹下所有文件(图片、文档等)的代码
- android之事件
- 课程实训:银行储蓄系统(多文件组织)
- 查看Windows下端口占用情况
- key-value 多线程服务器的Linux C++实现
- C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- hadoop2.7.1本地编译
- javaScript Element对象
- bootstrap基础代码
- 浏览在线图片
- Android开发过程中R文件丢失clean和build project都无效 已解决