实训项目银行储蓄系统
来源:互联网 发布:centos 6.5搭建lnmp 编辑:程序博客网 时间:2024/05/16 17:28
问题:
/* * Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:bank * 作 者:郝俊宇 * 完成日期:2015年 7 月17 日 * 版 本 号:v1.0 * 问题描述:该银行储蓄系统是一个可以支持多名储户开户、存款、取款、转帐、改密、挂失、解挂、销户等功能的系统 该项目使用了对象的指针数组,扩充了原有的功能,用二进制的方式保存文件 */
代码:
main.cpp
/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:main.cpp*文件标识:无*内容摘要:主函数,进入银行界面*其他说明:无*当前版本:v1.0*作 者:郝俊宇*完成日期:20150715**修改记录1:无*修改日期:无*版本号:v1.0*修改人:HaoJunyu*修改内容:无************************************************/#include <iostream>#include "bank.h"using namespace std;/************************************************功能描述:主函数,进入银行界面,开始工作*输入参数:无*输出参数:无*返回值:0*其他说明:无***********************************************/int main(){ cout<<"+----------------------+"<<endl; cout<<"+ 欢迎光临CSDN银行 +"<<endl; cout<<"+----------------------+"<<endl; if(pass())//pass()密码正确返回1,错误返回0 { Bank b;//建立一个对象 b.work();//开始工作 } return 0;}
bank.h
/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:bank.h*文件标识:无*内容摘要:银行类和用户类,还有业务员登录,显示菜单,由键盘输入密码等普通函数*其他说明:无*当前版本:v1.0*作 者:郝俊宇*完成日期:20150715**修改记录1:*修改日期:20150716*版本号:v1.0*修改人:HaoJunyu*修改内容:修改对象指针数组************************************************/#ifndef BANK_H_INCLUDED#define BANK_H_INCLUDED#include <cstring>using namespace std;const int upNum=2000;//系统最多容纳的用户class Bank;class User{public: void setUser(int a,char *n,int p,char *id,char *add,double b,int s);//输入用户信息 void showName();//显示姓名 void showBalance();//显示余额 bool passwordisright();//判断密码是否正确,正确返回true bool isnormaluser();//判断用户账号是否正常,正常返回true friend class Bank;private: int account;//账号 int password;//密码 char name[20];//名字 char ID[18];//身份证号 char address[20];//家庭住址 double balance;//余额 int status;//状态 0-正常,1-开户,2-销户};class Bank{public: Bank();//从文件中读取数据 ~Bank();//将数据存到文件中 void work();//登录 void openaccount();//开户 void closeaccount();//销户 void addmoney();//存款 void cutmoney();//取款 void showaccount();//查询 void transfraccount();//转账 void reportofloss();//挂失 void cancelofloss();//解挂 void changepassword();//改密 int getUser();//输入账号查询用户,返回用户在数组中的下标 void openfile();//用二进制读取文件 void savefile();//用二进制保存数据存到文件中private: int N;//实际的用户数目 User *users[upNum];//对象指针数组};int pass();//业务员登录int choosemenu();//显示菜单,选择业务int inputpassword();//键盘输入密码#endif // BANK_H_INCLUDED
work.cpp
/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:work.cpp*文件标识:无*内容摘要:业务员登录银行系统,从文件中读取业务员的信息,登录后的菜单显示,输入密码等功能*其他说明:无*当前版本:v1.0*作 者:郝俊宇*完成日期:20150715**修改记录1:无*修改日期:无*版本号:v1.0*修改人:HaoJunyu*修改内容:无************************************************/#include <iostream>#include <fstream>#include <conio.h>//使用getch()#include <cstdlib>#include <cstring>#include <ctype.h>//使用isdigit(ch),字符串处理#include "bank.h"using namespace std;/************************************************功能描述:业务员登录*输入参数:输入业务员姓名,密码*输出参数:如果密码正确将显示菜单,三次密码错误将退出*返回值:密码正确返回1,错误返回0*其他说明:从文件中读取业务员信息,判断从文件中输出的业务员信息和业务员输入的信息是否相同,密码输错三次将退出***********************************************/int pass()//业务员登录{ char ynameinfile[20];//由文件读取业务员姓名 char ypasswordinfile[20];//文件中保存的业务员的密码 ifstream infile("password.txt",ios::in); if(!infile) { cout<<"password file can not open!"<<endl; exit(1); } infile>>ynameinfile>>ypasswordinfile; infile.close(); char yname[20];//业务员登录是输入的用户名 char ypassword[20];//业务员登录时输入的密码 char ch; int itry=3;//进入系统后可尝试输入密码的次数 int right=0;//要返回的结果0-不正确1-正确 //密码输错三次将退出 do { cout<<"请输入业务员用户名:"; cin>>yname; cout<<"请输入密码:"; int j=0; while((ch=getch())!='\r')//输入字符不显示在屏幕上 { ypassword[j++]=ch; putchar('*');//每输入一个字符,显示一个* } ypassword[j]='\0'; fflush(stdin);//为避免键盘缓存区中未读出的字符影响程序,清除输入缓存区 cout<<endl; if(strcmp(ypassword,ypasswordinfile)==0&&strcmp(yname,ynameinfile)==0) { right=1; break;//用户名和密码正确,退出程序,返回1 } else { itry--; if(itry>0) { cout<<"用户名或密码错误!"<<endl; cout<<"输错三次将退出,你还可以尝试"<<itry<<"次!"<<endl; } else cout<<"对不起,密码输错三次,你不能进入系统!"<<endl; } } while(itry); return right;}/************************************************功能描述:选择菜单*输入参数:输入要操作功能的序号*输出参数:无*返回值:功能序号*其他说明:无***********************************************/int choosemenu(){ 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;}/************************************************功能描述:输入密码*输入参数:输入密码但不显示出来,只显示**输出参数:**返回值:密码*其他说明:无***********************************************/int inputpassword(){ char ch;//输入的字符串密码 int password=0;//将输入的字符串密码转换成数字 int i; while(1) { for(i=0; i<6; i++) { ch=getch();//输入但不显示 putchar('*');//输出* if(isdigit(ch))//判断字符串里的数字是否为0-9 { password=password*10+(ch-'0');//将字符转换成数字 } else { password=0; break; } } fflush(stdin);//清楚键盘中已经有的输入 cout<<endl; if(password==0) { cout<<"密码要求全为数字,且不能为0!"<<endl; cout<<"请重新输入密码:"; } else break; } return password;}
user.cpp
/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:user.cpp*文件标识:无*内容摘要:用户类的成员函数,包括输入用户信息,显示姓名,显示余额,判断密码是否正确,判断用户是否正常*其他说明:无*当前版本:v1.0*作 者:郝俊宇*完成日期:20150715**修改记录1:无*修改日期:无*版本号:v1.0*修改人:HaoJunyu*修改内容:无************************************************/#include <iostream>#include "bank.h"using namespace std;/************************************************功能描述:输入用户信息*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void User::setUser(int a,char *n,int p,char *i,char *add,double b,int s){ account=a; password=p; strcpy(name,n); strcpy(ID,i); strcpy(address,add); balance=b; status=s;}/************************************************功能描述:显示姓名*输入参数:无*输出参数:输出用户姓名*返回值:无*其他说明:无***********************************************/void User::showName(){ cout<<"户主姓名:"<<name<<endl;}/************************************************功能描述:显示余额*输入参数:无*输出参数:输出余额*返回值:无*其他说明:无***********************************************/void User::showBalance(){ cout<<balance<<"元"<<endl;}/************************************************功能描述:判断密码是否正确*输入参数:无*输出参数:判断密码是否正确*返回值:正确返回true,错误返回false*其他说明:无***********************************************/bool User::passwordisright(){ int password1; bool right=true; cout<<"输入密码:"; password1=inputpassword(); if(password1!=password) { right=false; cout<<"输入密码错误,不能继续操作!"<<endl; } return right;}/************************************************功能描述:判断用户账号是否正常*输入参数:无*输出参数:输出用户是否正常*返回值:正常返回true,否则返回false*其他说明:无***********************************************/bool User::isnormaluser(){ bool normal=true; if(status!=0)//0是正常 { normal=false; if(status==1) cout<<"该账户处于挂失状态,不能继续操作!"<<endl; if(status==2) cout<<"该账户处于销户状态,不能继续操作!"<<endl; } return normal;}
bank.cpp
/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:bank.cpp*文件标识:无*内容摘要:银行类的成员函数,包括从文件中读取数据,往文件中保存数据,柜台业务中的开户,销户,存款,取款,查询,转账,挂失,解挂,改密*其他说明:无*当前版本:v1.0*作 者:郝俊宇*完成日期:20150715**修改记录1:*修改日期:20150716*版本号:v1.0*修改人:HaoJunyu*修改内容:修改对象指针数组************************************************/#include <iostream>#include <fstream>#include <cstdlib>#include "bank.h"#include <ctype.h>using namespace std;/************************************************功能描述:银行类的构造函数,从文件中读取数据*输入参数:从文件中读取*输出参数:无*返回值:无*其他说明:从文件中读取数据,然后增加数据时,系统自动输出账号***********************************************/Bank::Bank(){ ifstream infile("account.txt",ios::in); if(!infile)//如果文件不能打开,退出程序 { cerr<<"open error!"<<endl; exit(1); } int i=0; int acc;//账号 char na[20];//用户名 int pass;//密码 char id[18];//身份证号 char add[20];//家庭住址 double ba;//余额 int sta;//状态 while(infile>>acc>>na>>pass>>id>>add>>ba>>sta)//读取成功后 { users[i]=new User; users[i]->setUser(acc,na,pass,id,add,ba,sta); i++; openfile(); } 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]->ID<<" "; outfile<<users[i]->address<<" "; outfile<<users[i]->balance<<" "; outfile<<users[i]->status<<" "; outfile<<endl; savefile(); } outfile.close();}/************************************************功能描述:用二进制读取文件*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void Bank::openfile(){ ifstream infile("account.txt",ios::in); if(!infile) { cerr<<"can not open ascii file!"<<endl; exit(1); } int i; for(i=0; i<N; ++i) { infile.read((char*)&users[i],sizeof(User)); } infile.close();}/************************************************功能描述:用二进制保存文件*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void Bank::savefile(){ int i; ofstream binaryFile("erjinzhi.txt",ios::out|ios::binary); if(!binaryFile) { cerr<<"can not open binary file!"<<endl; exit(1); } else for(i=0; i<N; ++i) { binaryFile.write((char*)&users[i],sizeof(User)); } binaryFile.close(); return;}/************************************************功能描述:办理业务,根据输入的序号选择功能*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void Bank::work(){ int i;//用于选择功能 do { i=choosemenu();//从菜单中获取功能序号 switch(i) { case 1: openaccount();//开户 break; case 2: closeaccount();//销户 break; case 3: addmoney();//存款 break; case 4: cutmoney();//取款 break; case 5: showaccount();//查询 break; case 6: transfraccount();//转账 break; case 7: reportofloss();//挂失 break; case 8: cancelofloss();//解挂 break; case 9: changepassword();//改密 break; case 0: cout<<"欢迎您再来!"<<endl; } } while(i);}/************************************************功能描述:开户*输入参数:输入用户信息*输出参数:开户是否成功*返回值:无*其他说明:只要保证银行用户没有达到上限就行,然后就是正常开户,开户要确保两次密码相同,否则开户失败***********************************************/void Bank::openaccount(){ if(N==upNum) { cout<<"银行用户数已经达到上限,不能再开户"; return ; }//正常办理开户 int acc;//账号 char na[20];//用户名 int pass;//密码 char id[18];//身份证号 char add[20];//家庭住址 double ba;//余额 int sta;//状态 cout<<"正在开户"<<endl; acc=10001+N; cout<<"账号:"<<acc<<endl; cout<<"用户姓名:"; cin>>na; int password1,password2; cout<<"密码:"; password1=inputpassword();//输入密码 cout<<"确认密码:"; password2=inputpassword();//确认密码 if(password1==password2) { pass=password1; sta=0;//账户状态正常 cout<<"身份证号:"; gets(id); cout<<"住址:"; gets(add); cout<<"存入金额:"; cin>>ba; users[N]=new User; users[N]->setUser(acc,na,pass,id,add,ba,sta); N++;//正常用户增加1 cout<<"开户成功!"<<endl; } else { cout<<"两次密码不一致,开户未成功!"<<endl; }}/************************************************功能描述:销户*输入参数:无*输出参数:判断是否销户成功*返回值:无*其他说明:首先要保证该账户存在,其次是密码正确,最后是注销,注销又分三种情况:1.正常注销 2.账号在挂始中暂时不能注销 3.账号已经注销,不能再次注销***********************************************/void Bank::closeaccount(){ int j;//查找该账号在数组中对应的下标 j=getUser();//根据账号查询用户,返回用户下标 if(j>=0)//说明账号存在 { users[j]->showName();//显示用户名 if(users[j]->passwordisright())//判断密码是否正确 { if(users[j]->status==2)//用户已经注销 { cout<<"该账户已经注销,本次操作失败!"<<endl; } if(users[j]->status==1)//用户正在挂失中 { cout<<"该账户正在挂失中,请解挂后再注销!"<<endl; } if(users[j]->status==0)//用户正常 { cout<<"余额:"; users[j]->showBalance();//显示余额 cout<<"确认销户(y/n)?"; if(tolower(getchar())=='y')//判断输入的字符是否等于y { cout<<"取款"; users[j]->showBalance();//显示余额 cout<<"销户成功!"<<endl; users[j]->balance=0;//取款后余额为0 users[j]->status=2;//状态变为注销 } else { cout<<"你取消了操作,销户失败!"<<endl; } fflush(stdin);//清除getchar()在键盘中的缓存遗留,以免影响后续操作 } } } return ;}/************************************************功能描述:存款*输入参数:存款额*输出参数:存款是否成功*返回值:无*其他说明:首先账号要存在,其次是存款又分三种情况:1.该账户正常存款 2.该账户正在挂失中不能存款 3.该账户已经注销不能存款***********************************************/void Bank::addmoney(){ int i; double money; i=getUser();//根据账号查询用户下标 if(i>=0)//说明账户存在 { if(users[i]->status==0)//用户正常 { users[i]->showName();//显示姓名 cout<<"存款额:"; cin>>money; users[i]->balance=users[i]->balance+money; cout<<"现余额共计"; users[i]->showBalance();//显示余额 cout<<"存款成功!"<<endl; } else if(users[i]->status==1)//用户正在挂失中 { cout<<"该用户正处于挂失状态,存款失败!"<<endl; } else { cout<<"该用户已经注销,存款失败!"<<endl; } } return;}/************************************************功能描述:取款*输入参数:取款额*输出参数:是否取款成功*返回值:无*其他说明:首先要保证账号存在,其次是密码正确,最后是取款分三种情况:1.该账户正常取款 分两种情况:余额不足和余额充足2.该账户在挂失中不能存款 3.该账户已经注销,存款失败***********************************************/void Bank::cutmoney(){ int i; double money; i=getUser();//根据账号查询用户,返回用户的下标 if(i>=0)//账户要存在 { if(users[i]->isnormaluser())//用户处在正常状态 { users[i]->showName();//显示姓名 if(users[i]->passwordisright())//密码要正确 { cout<<"取款额:"; cin>>money; if(money>users[i]->balance)//余额要足够 { cout<<"余额不足,取款失败!"<<endl; } else { users[i]->balance=users[i]->balance-money; cout<<"取款后还有"; users[i]->showBalance();//显示余额 } } } } return;}/************************************************功能描述:查询,显示所有信息*输入参数:无*输出参数:输出查询结果*返回值:无*其他说明:无***********************************************/void Bank::showaccount(){ int i; string sta[3]= {"正常","挂失","已经注销"}; i=getUser();//根据账号查询用户,返回用户的下标 if(i>=0) { users[i]->showName();//显示姓名 if(users[i]->passwordisright())//判断密码是否正确 { cout<<"余额:"; users[i]->showBalance();//显示余额 cout<<"当前状态:"<<sta[users[i]->status]<<endl; cout<<"身份证号:"<<users[i]->ID<<endl; cout<<"住址:"<<users[i]->address<<endl; cout<<"查询完毕!"<<endl; } } return ;}/************************************************功能描述:转账*输入参数:需要转账的金额*输出参数:判断是否转账成功*返回值:无*其他说明:首先两个用户都要存在,其次转出账号要正常,密码要正确,最后是转账分两种情况:一.余额不足,转账失败二.余额充足,分三种情况:1.转入账号正常,顺利转账 2.转入账号正在挂失,不能转账 3.转入账号已经注销,转账失败***********************************************/void Bank::transfraccount(){ int out,in; double money; cout<<"转出"; out=getUser();//根据账号查询用户,返回用户的下标 if(out>=0)//说明账户存在 { if(users[out]->isnormaluser())//判断转出账号是否正常 { users[out]->showName();//显示姓名 if(users[out]->passwordisright())//判断转出账号密码是否正确 { cout<<"转账金额:"; cin>>money; if(money>users[out]->balance)//余额不足 cout<<"余额不足,转账失败!"<<endl; else { cout<<"转入"; in=getUser();//根据账号查询用户,返回用户的下标 if(in>=0)//说明账户存在 { if(users[in]->status==0)//转入账号正常 { users[out]->balance=users[out]->balance-money;//转出后的余额 users[in]->balance=users[in]->balance+money;//转入后的余额 cout<<"转账成功!余额"; users[out]->showBalance();//显示转出后的余额 } else if(users[in]->status==1)//转入用户正在挂失中 { cout<<"转入账号正在挂失,请暂时不要转账!"<<endl; } else { cout<<"该账户已经注销,转账失败!"<<endl; } } } } } } return ;}/************************************************功能描述:挂失*输入参数:无*输出参数:判断账号是否挂失成功*返回值:无*其他说明:首先用户要存在,其次密码要正确,最后挂失分三种情况 :1.该用户处在正常状态 2.该用户正在挂失 3.该用户已经注销***********************************************/void Bank::reportofloss(){ int i; i=getUser();//根据账号查询用户,返回用户的下标 if(i>=0)//说明账户存在 { users[i]->showName();//显示姓名 if(users[i]->passwordisright())//判断密码是否正确 { if(users[i]->status==0)//用户正常 { users[i]->status=1;//因为要挂失,所以用户要从0变为1 cout<<"挂失成功!"<<endl; } else if(users[i]->status==1)//用户正在挂失中 { cout<<"该账户正处于挂失状态!"<<endl; } else { cout<<"该账户已经注销,不能挂失!"<<endl; } } } return ;}/************************************************功能描述:解挂*输入参数:无*输出参数:判断账号是否解挂成功*返回值:无*其他说明:首先该用户要存在,其次密码要正确,最后解挂要分三种情况:1.该用户正常不需要解挂2.该用户已经挂失,可以正常解挂3.该用户已经注销,操作失败***********************************************/void Bank::cancelofloss(){ int i; i=getUser();//根据账号查询用户,返回用户的下标 if(i>=0)//说明账户存在 { users[i]->showName();//显示姓名 if(users[i]->passwordisright())//判断密码是否正确 { if(users[i]->status==0)//用户正常 { cout<<"该账户处于正常状态,不需要解除挂失"<<endl; } else if(users[i]->status==1)//用户正在挂失中 { users[i]->status=0;//因为要解除挂失,所以状态要从1变为0 cout<<"解除挂失成功"<<endl; } else { cout<<"该账户已销户,操作无效"<<endl; } } } return ;}/************************************************功能描述:改密*输入参数:想要修改的密码,以及确认修改的密码*输出参数:判断密码是否修改成功*返回值:无*其他说明:首先用户要存在,其次密码要正确,最后改密分三种情况:1.该用户正常可以改密2.该用户正在挂失不能改密3.该用户已经注销,操作失败***********************************************/void Bank::changepassword(){ int i; int password1,password2; i=getUser();//根据账号查询用户,返回用户的下标 if(i>=0)//用户要存在 { users[i]->showName();//显示姓名 if(users[i]->passwordisright())//密码要正确 { if(users[i]->status==0)//用户正常 { cout<<"新密码:"; password1=inputpassword(); //输入密码1 cout<<"确认密码:"; password2=inputpassword();//输入密码2 if(password1==password2)//输入的新密码要和确认的密码相同 { users[i]->password=password1;//用户密码变为新密码 cout<<"修改成功!"<<endl; } else { cout<<"两次密码不相同,修改失败!"<<endl; } } if(users[i]->status==1)//用户正在挂失中 { cout<<"该账户正在挂失中,请解挂后再改密码!"<<endl; } if(users[i]->status==2)//用户已经注销 { cout<<"该账户已经注销,操作失败!"<<endl; } } } return ;}/************************************************功能描述:输入账号查询用户在数组中的下标*输入参数:要查找的账号*输出参数:是否找到要查找的参数*返回值:如果为负数则是没有找到该账号,如果返回一个正数则是找到对应的账号*其他说明:二分查找查找失败返回一个负数***********************************************/int Bank::getUser(){ int id; cout<<"账号:"; cin>>id;//输入要查找的账号 int index=-1; int low=0,high=N-1,mid; while(low<=high) { mid=(low+high)/2; if(users[mid]->account==id) { index=mid; break;//找到该账号的下标,立即退出该循环 } else if(users[mid]->account>id)//如果中间一个用户的账号大于输入的账号 high=mid-1;//那么最大的值为中间一个用户账号-1 else low=mid+1;//如果中间一个用户的账号小于输入的账号,那么最小值为中间用户账号+1 } if(index<0) cout<<"该用户不存在,操作失败!"<<endl; return index;//如果找到了index在0-N-1之间,没有找到index=-1;}
编译通过:
运行结果:
password文件夹内容截图:
account文件夹内容截图:
account运行后内容截图:
0 0
- 【实训项目】银行储蓄系统
- 实训项目-银行储蓄系统
- 实训项目-银行储蓄系统
- 实训项目银行储蓄系统
- 实训项目--银行储蓄系统
- 实训项目--银行储蓄系统
- 实训项目--银行储蓄系统
- 实训项目--银行储蓄系统
- 【实训项目】银行储蓄系统
- C++项目实训:银行储蓄系统
- 实训项目——银行储蓄系统
- 实训项目——银行储蓄系统
- 程序设计项目实训——银行储蓄系统
- ##..C++程序设计项目实训——银行储蓄系统
- <2015年大一C++实训项目>银行储蓄系统
- c++课程实训 银行储蓄系统
- c++课程实训 银行储蓄系统
- 课程实训--银行储蓄系统
- 使用release报错arc forbids explicit message send of 'release'
- Android与IIS身份验证——基本验证_HttpClient Http请求 验证
- LeetCode之Roman & Integer 的转换(简单题)
- 文章标题
- 数据报表实时分析:出身对命运的影响到底有多大?
- 实训项目银行储蓄系统
- 关于.bat文件执行一闪而过的问题
- 【c++】模拟实现boost库下的scoped_array
- otto学习
- ios 动画调试
- Javascript 面向对象编程
- day3---面向对象
- android gradle构建工具
- perl删除文件一行内容