课程实训——银行系统
来源:互联网 发布:2016融资租赁行业数据 编辑:程序博客网 时间:2024/06/05 22:48
/*
* Copyright (c) 2014, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作 者:李晓凯
* 完成日期:2015年 7 月 17 日
* 版 本 号:v1.0
*
* Copyright (c) 2014, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作 者:李晓凯
* 完成日期:2015年 7 月 17 日
* 版 本 号:v1.0
*
* 问题描述:编写一个银行系统来模拟完成银行的各种业务
* 输入描述:见运行图
* 程序输出:见运行图
*/
利用多文件组织,将程序放在5个文件中。
head.h
/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录2:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建*********************************************/#ifndef HEAD_H_INCLUDED#define HEAD_H_INCLUDED#include <iostream>#include <conio.h>#include <cstring>#include <cstdio>#include <fstream>#include <cstdlib>#include <ctype.h>#include "head.h"using namespace std;const int upnum=2000;//系统最多容纳的用户数class Bank;class User{public: void setUser(int acc,string na,int pw,double mon,double bal,char id[],int sta); void showName(); void showBalance(string prompt);//显示账户余额 bool psaaWordISRight();//判断密码是否正确 bool ISNormalUser();//存款,取款,转账,贷款等功能需要账户处于正常状态,判断账户是否处于正常状态 friend class Bank;//将Bank设为User的友元类private: int account;//账号 int password;//密码 string name;//名字 double balance;//余额 double money;//未加利率的金额 char identificant[18];//身份证号 int status;//账户状态:0—正常,1—挂失,2—销户};class Bank{public: Bank();//从文件中读取数据 ~Bank();//程序结束时将数据存入文件中 void work();//业务驱动 void openAccount();//开户 void cancelAccount();//销户 void save();//存款 void withdraw();//取款 void showAccount();//显示余额 void transferAccount();//转账 void reportLoss();//挂失 void canlelLoss();//解除挂失 void updatePassword();//修改密码 void showRate();//显示利率 void repayLoan();//贷款 int getUser();//输入账号查询用户,返回用户在对象数组的下表private: int N;//实际用户数目 double rate;//存款利率 static double rate2;//贷款利率 User *users;//User指针};int pass();//业务员登录int chooseInMenu();//显示菜单并由业务员选择int intputPassword();//返回键盘输入的密码#endif // HEAD_H_INCLUDED
work.cpp
/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录3:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建贷款*********************************************/#include "head.h"using namespace std;/*********************************************功能描述:输入密码*输入参数:无*输出参数:密码*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/int intputPassword(){ 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; } } fflush(stdin);//清理键盘缓存区已有的输入 cout<<endl; if(iPass==0) { cout<<"密码要求全为数字且不能都是0!"<<endl; cout<<"请重新输入!"; } else break; } return iPass;}/*********************************************功能描述:业务选择*输入参数:无*输出参数:选项*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/int chooseInMenu(){ int i; while (1) { cout<<endl; cout<<"+-------------------------+\n"; cout<<"+ 1.开户 2.销户 3.存款 +\n"; cout<<"+ 4.取款 5.查询 6.转账 +\n"; cout<<"+ 7.挂失 8.解挂 9.改密 +\n"; cout<<"+ 10.贷款 0.退出 +\n"; cout<<"+-------------------------+\n"; cout<<"请输入操作指令"; cin>>i; if(i>=0&&i<=10) break; else cout<<"请重新选择功能!"<<endl; } return i;}/*********************************************功能描述:验证密码是否正确*输入参数:无*输出参数:正确-1 错误-0*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/int pass(){ char sNameInFile[20]; char sPassInFile[20]; ifstream infile("password.txt",ios::out); if(!infile) { cerr<<"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; do { cout<<"请输入业务员用户名:"<<endl; cin>>sName; cout<<"请输入密码"<<endl; int i=0; while((ch=getch())!='\r') { sPass[i++]=ch; putchar('*'); } sPass[i]='\0'; fflush(stdin); cout<<endl; if(strcmp(sName,sNameInFile)==0&&strcmp(sPass,sPassInFile)==0) { right=1; break; } else { itry--; if(itry>0) { cout<<"超过3次将会退出,您还可以尝试"<<itry<<"次!"<<endl; } else { cout<<"对不起,您不能进入系统!"<<endl; } } } while(itry); return right;}
main.cpp:
/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录1:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建*********************************************/#include "head.h"using namespace std;int main(){ cout<<"+-----------------------------------+\n"; cout<<"+ 欢迎使用坑你点没商量银行 +\n"; cout<<"+-----------------------------------+\n"; if(pass()) { Bank b; b.work(); } return 0;}
user.cpp
/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录4:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建*********************************************/#include "head.h"using namespace std;/*********************************************功能描述:建立用户*输入参数:账号,姓名,密码,余额,身份证号,状态等*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void User::setUser(int acc,string na,int pw,double mon,double bal,char id[],int sta){ account=acc; password=pw; name=na; money=mon; balance=bal; strcpy(identificant,id); status=sta;}void User::showName(){ cout<<"户主姓名:"<<name<<endl;}void User::showBalance(string prompt){ cout<<prompt<<" "<<balance<<"元"<<endl;}/*********************************************功能描述:验证密码是否正确*输入参数:无*输出参数:正确-true 错误-false*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/bool User::psaaWordISRight(){ int iPass; bool right=true; cout<<"请输入密码:"<<endl; iPass=intputPassword(); if(iPass!=password) { right=false; cout<<"密码输入错误,操作失败!"<<endl; } return right;}/*********************************************功能描述:验证账户是否处于正常状态*输入参数:无*输出参数:是-true 否-false*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/bool User::ISNormalUser(){ bool normal=true; if(status!=0) { normal=false; cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能进行操作!"<<endl; } return normal;}
bank.cpp
/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录1:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建身份证号,贷款,利息,记录每笔账单*********************************************/#include "head.h"#include <time.h>using namespace std;double Bank::rate2=0.0485;Bank::Bank(){ ifstream infile("account.txt",ios::in); if(!infile) { cerr<<"open error!"<<endl; exit(1); } int i=0; int acc; int pw; string na; double bal; char id[18]; int sta; double mon; users=new User[2000]; while (infile>>acc>>na>>pw>>bal>>id>>sta)//文件读取用户 { users[i].setUser(acc,na,pw,mon,bal,id,sta); i++; } N=i; infile.close();}Bank::~Bank(){ ofstream outfile("account.txt",ios::out); if(!outfile) { cerr<<"open error!"<<endl; exit(1); } int i; for(i=0; i<N; i++)//读入到文件中 { outfile<<users[i].account<<" "; outfile<<users[i].name<<" "; outfile<<users[i].password<<" "; outfile<<users[i].balance<<" "; outfile<<users[i].identificant<<" "; outfile<<users[i].status<<" "<<endl; } outfile.close();}/*********************************************功能描述:系统工作函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::work(){ int ichoice; do { ichoice=chooseInMenu(); switch(ichoice) { case 1: openAccount(); //开户 break; case 2: cancelAccount(); //销户 break; case 3: save(); //存款 break; case 4: withdraw(); //取款 break; case 5: showAccount(); //查余额 break; case 6: transferAccount(); //转账 break; case 7: reportLoss(); //挂失 break; case 8: canlelLoss(); //解除挂失 break; case 9: updatePassword(); //修改密码 break; case 10: repayLoan(); break; case 0: cout<<"欢迎您再来O(∩_∩)O "<<endl; } } while(ichoice);}/*********************************************功能描述:开户函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::openAccount(){ if(N==upnum) { cout<<"银行用户数目已达上限,不能在开户!"<<endl; return ; } int acc; int pw; string na; double mon; double bal; char id[18]; int sta; int ipw1,ipw2; double year; acc=10001+N; cout<<"正在开户......"<<endl; acc=10001+N; cout<<"账号:"<<acc<<endl; cout<<"请输入户主的名字:"; cin>>na; while(1) { cout<<"请输入身份证号:"; cin>>id; if(strlen(id)!=18) { cout<<"您的身份证号不足18位!"<<endl; continue; } else break; } cout<<"请输入密码:"; ipw1=intputPassword(); cout<<"确认密码:"; ipw2=intputPassword(); if(ipw1==ipw2) { pw=ipw1; sta=0; cout<<"存入金额:"; cin>>bal; ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } time_t timep; struct tm *p; time(&timep); p=localtime(&timep);//读取当前时间 outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 "; outfile<<acc<<" 存入 "<<acc<<" "<<bal<<" 元"<<endl;//存款记录存入文件 outfile.close(); showRate(); cout<<"请输入要存入的期限(年):"; cin>>year; double sum; if(year>=1&&year<=3) sum=bal+bal*year*0.02; else if(year==4||year==5) sum=bal+bal*year*0.032; else if(year>5) sum=bal+bal*year*0.0445; cout<<"期限到时,您将拥有"<<sum<<"元"<<endl; users[N].setUser(acc,na,pw,mon,sum,id,sta); N++; cout<<"成功开启!"<<endl; } else { cout<<"两次密码不一致,开启账户失败!"<<endl; }}/*********************************************功能描述:销户函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::cancelAccount(){ int who; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { users[who].showBalance("余额"); if(users[who].balance<0) cout<<"您还有贷款没处理,不能销户!"<<endl; else { cout<<"确认销户(y/n)?"; if(tolower(getchar())=='y') { users[who].showBalance("销户成功!,本次取款金额为"); users[who].balance=0; users[who].status=2; } else { cout<<"您取消了此操作,销户失败"<<endl; } } fflush(stdin); } }}/*********************************************功能描述:存款函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::save(){ int who; double year,money; who=getUser(); if(who>=0) { if(users[who].status==0) { users[who].showName(); cout<<"请输入存入的金额:"; cin>>money; ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } time_t timep; struct tm *p; time(&timep); p=localtime(&timep);//读取当前时间 outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 "; outfile<<users[who].account<<" 存入 "<<users[who].account<<" "<<money<<" 元"<<endl;//存款记录存入文件 outfile.close(); showRate(); cout<<"请输入要存入的期限(年):"; cin>>year; if(year>=1&&year<=3) users[who].balance+=(money+money*0.02*year); else if(year==4&&year==5) users[who].balance+=(money+money*0.032*year); else if(year>5) users[who].balance+=(money+money*0.0445*year); users[who].showBalance("存款后,您有"); } else if(users[who].status==1) { cout<<"该用户的账户处于挂失状态,存款失败!"<<endl; } else { cout<<"该用户的账户已经销户,存款失败!"<<endl; } } return;}/*********************************************功能描述:显示函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::showAccount(){ int who; string sta[3]= {"正常","挂失","已经销户"}; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { users[who].showBalance("余额有"); cout<<"状态为"<<sta[users[who].status]<<endl; cout<<"是否要查看您的每一笔账单(y/n)?"; char ch; cin>>ch; if(ch=='y') { cout<<"您的账单如下:"<<endl; ifstream infile("expence_record.txt",ios::in); if(!infile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } //从文件中读取每笔账单 int r1,r3,y,m,d; string r2,r4,r5,ch1,ch2,ch3; while(infile>>y>>ch1>>m>>ch2>>d>>ch3>>r1>>r2>>r3>>r4>>r5) { if(r1==users[who].account&&r3==users[who].account) cout<<y<<ch1<<m<<ch2<<d<<ch3<<" "<<r2<<" "<<r4<<" "<<r5<<endl; else if(r1==users[who].account) cout<<y<<ch1<<m<<ch2<<d<<ch3<<" "<<r2<<" "<<r3<<"("<<users[r3-10000].name<<")"<<" "<<r4<<" "<<r5<<endl; } infile.close(); } } } return ;}/*********************************************功能描述:取款函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::withdraw(){ int who; double money; who=getUser(); if(who>=0) { if(users[who].ISNormalUser()) { users[who].showName(); if(users[who].psaaWordISRight()) { cout<<"输入取款额"; cin>>money; if(money>users[who].balance) { cout<<"亲,余额不足呀!"<<endl; } else { users[who].balance-=money; users[who].showBalance("取款后,您还有"); ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } time_t timep; struct tm *p; time(&timep); p=localtime(&timep);//读取当前时间 outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 "; outfile<<users[who].account<<" 取款 "<<users[who].account<<" "<<money<<" 元"<<endl;//取款记录存入文件 outfile.close(); } } } } return ;}/*********************************************功能描述:转账*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::transferAccount(){ int whoout,whoin; double money; whoout=getUser(); cout<<"转出自"; if(whoout>=0) { if(users[whoout].ISNormalUser()) { users[whoout].showName(); if(users[whoout].psaaWordISRight()) { cout<<"请输入转入的金额:"; cin>>money; if(money>users[whoout].balance) cout<<"金额不足,转账失败!"<<endl; else { cout<<"转出到:"; whoin=getUser(); if(whoin>=0) { if(users[whoin].ISNormalUser()) { users[whoout].balance-=money; users[whoin].balance+=money; users[whoout].showBalance("转账户,您有"); ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } time_t timep; struct tm *p; time(&timep); p=localtime(&timep);//读取当前时间 outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 "; outfile<<users[whoin].account<<" 转账到 "<<users[whoout].account<<" "<<money<<" 元"<<endl;//转账记录存入文件 outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 "; outfile<<users[whoout].account<<" 收到 "<<users[whoin].account<<" "<<money<<" 元"<<endl; outfile.close(); } } } } } } return ;}/*********************************************功能描述:挂失*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::reportLoss(){ int who; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { if(users[who].status==0) { users[who].status=1; cout<<"挂失成功!"<<endl; } else if(users[who].status==1) cout<<"该账户已经挂失!"<<endl; else cout<<"该账户已经销户,操作失败!"<<endl; } } return;}/*********************************************功能描述:解挂函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::canlelLoss(){ int who; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { if(users[who].status==0) { cout<<"该用户处于正常状态,不需要解除挂失!"<<endl; } else if(users[who].status==1) { users[who].status=0; cout<<"解除挂失成功"<<endl; } else { cout<<"该用户已销户,操作失败!"<<endl; } } } return ;}/*********************************************功能描述:改密函数*输入参数:无*输出参数:密码*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::updatePassword(){ int who; int iPass1,iPass2; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { cout<<"新密码:"<<endl; iPass1=intputPassword(); cout<<"确认密码:"<<endl; iPass2=intputPassword(); if(iPass1==iPass2) { users[who].password=iPass1; cout<<"密码修改成功!"<<endl; } else cout<<"两次输入的不同,修改失败!"<<endl; } }}/*********************************************功能描述:贷款函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::repayLoan(){ int who; double money,year; who=getUser(); if(who>=0) { if(users[who].ISNormalUser()) { users[who].showName(); if(users[who].psaaWordISRight()) { cout<<"输入贷款额"; cin>>money; if(money<=users[who].balance) { cout<<"您的余额很足,不需要贷款!"<<endl; } else { cout<<"请输入贷款期限(年)"; cin>>year; money-=users[who].balance; users[who].balance=-(money+money*rate2); ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } outfile<<users[who].account<<" 贷款 "<<users[who].account<<" "<<users[who].balance<<" 元"<<endl;//贷款记录存入文件 outfile.close(); cout<<"到期时您需要还"<<users[who].balance<<" 元"<<endl; } } } }}/*********************************************功能描述:查询用户函数*输入参数:无*输出参数:用户序号*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/int Bank::getUser(){ int id; cout<<"账号:"; cin>>id; int idex=-1; int low=0,high=N-1,mid; while (low<=high) { mid=(low+high)/2; if(users[mid].account==id) { idex=mid; break; } else if(users[mid].account>id) high=mid-1; else low=mid+1; } if(idex<0) cout<<"此用户不存在,本次操作失败!"<<endl; return idex;}/*********************************************功能描述:显示利率函数*输入参数:无*输出参数:无*返回值:0-成功 其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::showRate(){ cout<<"银行当前的利率情况如下:"<<endl; cout<<" 1~3年 2.00%"<<endl; cout<<" 4~5年 3.20%"<<endl; cout<<" 5年以上 4.45%"<<endl;}
学习心得:
虽然是在老师代码的基础上该写了这个庞大的银行系统,但还是从中学到了很多知识,以前多文件存储还不是很熟悉,现在感觉熟练的许多,还有就是在这环环相扣的函数中写来写去,觉得逻辑思维能力明显提高哈,当然也在这其中发现了自己的一些不足,比如多与动态数组就有点陌生,想在个程序里加上的,结果加上之后,也不知道是什么问题,在文件中存储的用户信息都成了代码,所以就没有加成功,望有大神可以来指导我一下,万分感谢!
还有就是,想弄一个活期的存储,结果想了想,然后百度了下,感觉超麻烦,so,就弄了个定取存款,等以后能力在高一点的时候再改吧!↖(^ω^)↗
0 0
- 课程实训——银行系统
- C++课程实训——银行系统
- c++课程实训 银行储蓄系统——感受
- 课程实训——银行储蓄系统
- 课程实训(银行系统)
- 课程实训之银行系统第一版
- c++课程实训 银行储蓄系统
- c++课程实训 银行储蓄系统
- c++课程实训-银行系统
- 课程实训--银行储蓄系统
- c++课程实训 银行储蓄系统
- 课程实训 银行储蓄系统
- 【CPP课程实训】-----银行系统
- 【课程实训】银行储蓄系统
- 程序设计基础课程实训报告:银行储蓄系统
- 课程实训:银行储蓄系统(多文件组织)
- ★C++课程实训:银行储蓄系统(多文件组织)
- 银行储蓄系统(C++课程实训博客电子报告)
- Java中多态性的实现
- 基于三层网络的音频传输技术
- Apache2.4.12移植
- linux网络编程之udp的connect趣谈
- java中的enum枚举类型的适用范围
- 课程实训——银行系统
- 学习MongoDB 六: MongoDB查询(游标操作、游标信息)(三)
- C语言小例子
- Hudson + Ant + SVN + Tomcat配置详解
- Hibernate中的inverse在表关系映射中经常应用,
- 实习第13天
- 覆盖每一个角落,无线路由器中继简明教程
- 算法导论 第十五章:动态规划之棒的切割(Rod Cutting)
- c/c++存储区分配 堆,栈。。。。