本文主要是介绍银行储蓄系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称: test.cpp
*作 者:陈丹
*完成日期:2015年7月16日
*版本号:v1.0
*
主函数
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <cstdio>
#include "staff.h"
#include "bank.h"
#include "user.h"
#include <ctime>
using namespace std;
void ctime();
int main()
{cout<<"+-----------------------------------+"<<endl;cout<<"+ ※※※ +"<<endl;cout<<"+ Welcome to dream bank +"<<endl;cout<<"+ ※※※ +"<<endl;cout<<"+-----------------------------------+"<<endl;//ctime();Bank b;if(!b.passtaff()) //业务员登录exit(1); //退出系统cout<<endl;ctime();b.showMenu(); //显示菜单b.manage(); //开始工作return 0;
}
/*-----------------------------------------------------------------------------------------**函数名称:ctime*功能描述:获取系统信息*输入参数:*输出参数:输出现在时间并将其保存到time.txt文件中*返回值:*说明: 这个函数借鉴的度娘。*-----------------------------------------------------------------------------------------*/
void ctime()
{tm *year; //年tm *month; //月tm *day; //日tm *hour;//时tm *minute;tm *second;time_t t;t=time(0);year = localtime(&t);month = localtime(&t);day = localtime(&t);hour = localtime(&t);minute = localtime(&t);second = localtime(&t);cout<<"现在时间:"<<(year ->tm_year+1900)<<"年" //返回的是今年减1900,所以要加上1900<<(month->tm_mon+1)<<"月" //因为Month (0 – 11; January = 0),所以要加1<<day ->tm_mday<<"日"<<hour ->tm_hour<<"时"<<minute->tm_min<<"分"<<second->tm_sec<<"秒";ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}outfile<<(year ->tm_year+1900)<<"年" //返回的是今年减1900,所以要加上1900<<(month->tm_mon+1)<<"月" //因为Month (0 – 11; January = 0),所以要加1<<day ->tm_mday<<"日"<<hour ->tm_hour<<"时"<<minute->tm_min<<"分"<<second->tm_sec<<"秒";
}
bank.h
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <iostream>
#include <cmath>
#include <iomanip>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <conio.h>
#include "user.h"
#include <ctime>
using namespace std;
class Bank
{
public:Bank(){nownum=0;}bool passtaff(); //业务员信息void openfile(); //导入文件void savefile2(int acc, string nam, char id[18], char di[30],char pho[11],int pw, double mon,int sta); //保存一行数据void caculfile(); //计算void savefile(); //保存文件void manage(); //开始工作void showMenu(); //显示菜单void openAccount(); //开户void deleteAccount(); //销户void saveMoney(); //存款void drawMoney(); //取款void refer(); //查询void transfer(); //转账void reportLoss(); //挂失void hangSolution(); //解挂void changePassword(); //改密void changename(); //改姓名void changeidcard(); //改身份证void changedizhi(); //改地址void changephone(); //改电话void display(); //显示个人信息void changedisplays(); //修改个人信息int getUser(); //查找用户int jishu(); //计算用户数
private:int nownum;User *users;//User数组,动态数组 体现在保存文件方面 delete[]users
};#endif // BANK_H_INCLUDED
bank.cpp
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <stdio.h>
#include <fstream>
#include "staff.h"
#include "bank.h"
#include <ctime>
using namespace std;
/*-----------------------------------------------------------------------------------------**函数名称:inputPassword*功能描述:接收密码,并且将其转化成数字,最后输出为“******”,并且密码要求不能全为0*输入参数:ch一位一位的输入*输出参数:"******"*返回值: 返回密码*说明: 这里要注意如何将字符转化成数字,并且这里只有用getch()和putchar('*')才能成功使得密码成为"******"格式*-----------------------------------------------------------------------------------------*/
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<<"请重新输入密码: ";}elsebreak;}return iPass;
}
/*-----------------------------------------------------------------------------------------**函数名称:passtaff*功能描述:用于业务员账户的登录,输入账户号码,并且接收密码,并且将其转化成数字,输出为“******”,判断账户跟密码是否正确,正确则返回true,成功登录,如果错误则输出"请输入密码:"字样,错误三次自动退出系统。*输入参数:业务员账户,以及密码ch一位一位的输入*输出参数:"******"*返回值: 输入的业务员密码true/false*说明: 注意业务员的密码的输入,以及错误三次退出*-----------------------------------------------------------------------------------------*/
bool Bank::passtaff()
{Staff s1;string acc;char ch;cout<<"请输入业务员账户:";cin>>acc;for(int j=0; j<3; ++j){int pw=0;cout<<"请输入密码:";for(int i=0; i<6; i++){ch=getch(); //输入但不显示putchar('*'); //输出*pw=pw*10+(ch-'0');}if(s1.pass(acc,pw)){return true;}else{cout<<"\n用户名或密码错误。"<<endl;}}cout<<"\n错误三次,系统自动退出。"<<endl;return false;
}
/*-----------------------------------------------------------------------------------------**函数名称:showMenu*功能描述:显示菜单,输出所有的操作选项。*输入参数:*输出参数:*返回值:*说明: 输出尽量整齐有序,美观。*-----------------------------------------------------------------------------------------*/
void Bank::showMenu()
{cout<<endl;cout<<"+--------------------------------+"<<endl;cout<<"+ 1 开户 2 销户 3 存款 +"<<endl;cout<<"+ 4 取款 5 查询 6 转账 +"<<endl;cout<<"+ 7 挂失 8 解挂 0 退出 +"<<endl;cout<<"+ 9 修改信息 10 个人信息 +"<<endl;cout<<"+--------------------------------+"<<endl;
}
/*-----------------------------------------------------------------------------------------**函数名称:manage*功能描述:开始工作菜单,接收操作指令,用switch()语句完成*输入参数:输入所选操作*输出参数:输出所选操作的具体*返回值:*说明: switch()语句的应用*-----------------------------------------------------------------------------------------*/
void Bank::manage()
{int order=1;do{openfile();cout<<"请输入操作指令:";cin>>order;switch(order){case 1:openAccount();break;case 2:deleteAccount();break;case 3:saveMoney();break;case 4:drawMoney();break;//取款case 5:refer();break;//查询case 6:transfer();break;//转账case 7:reportLoss();break;//挂失case 8:hangSolution();break;//解挂case 9:changedisplays();break;//修改个人信息case 10:display();break;//显示个人信息case 0:cout<<endl;cout<<"+--------------------------------------+"<<endl;cout<<"+ 谢谢您的使用,再见! +"<<endl;cout<<"+--------------------------------------+"<<endl;exit(1);break;}savefile();}while(1);
}
/*-----------------------------------------------------------------------------------------**函数名称:openAccount*功能描述:开户,按照提示输入个人信息,如果输入的个人信息合格,即可成功开户,否则不能开户*输入参数:输入各个信息*输出参数:如果输入合格,则输出"开户成功"*返回值:*说明: 注意各项输入,身份证号与电话号都是固定位数。*-----------------------------------------------------------------------------------------*/
void Bank::openAccount() //开户
{int acc; //账号char nam[20]; //姓名int pw; //密码char di[30]; //地址char pho[11];//电话double mon; //金额int sta; //状态char id[18]; //身份证号cout<<"正在开户"<<endl;acc=10001+nownum;cout<<"账号:"<<acc<<endl;cout<<"户主姓名:";cin>>nam;cout<<"身份证号:";for(int n=0; n<18; n++){cin>>id[n];}cout<<"地址:";cin>>di;cout<<"联系电话(请输入正确的手机号码):";for(int n=0; n<11; n++){cin>>pho[n];}int Pass1, Pass2;cout<<"密码:";Pass1=inputPassword(); //输入密码1cout<<"确认密码:";Pass2=inputPassword(); //输入密码2if(Pass1==Pass2){pw=Pass1;sta=0; //账户状态为“正常”cout<<"存入金额:";cin>>mon;if(mon>50) //一般银行开户最低金额为50{users[nownum].setUser(acc,nam,id,di,pho,pw,mon,sta);//出了好几次错的地方 id++nownum; //正式用户数增加1,确认了新用户已经加入cout<<"开户成功!"<<endl;}elsecout<<"金额少于50元,开户失败"<<endl;}else{cout<<"两次密码不一致,未成功开户!"<<endl; //没有N++,则读入的值无效}
}
/*-----------------------------------------------------------------------------------------**函数名称:deleteAccount*功能描述:销户,输入用户账号以及密码,显示出账户余额,完成销户的功能(在这里保存销户的具体,输出到"time.txt")*输入参数:输入用户账号及密码以及'y'/'n'*输出参数:输出余额,若输入'y',则输出"销户成功!本次取款金额为:"的字样,若输入'n',则输出"你取消了操作,销户失败!"*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::deleteAccount()
{int who; //查找到该账号在数组中对应的下标who=getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){users[who].showMoney("余额:"); //提示"余额"二字,显示金额cout<<"确认销户(y/n)?";if(getchar()=='y'||getchar()=='Y'){users[who].showMoney("销户成功!本次取款金额为:");users[who].money=0; //取款后余额变0users[who].status=2; //状态变为注销}else{cout<<"你取消了操作,销户失败!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变状态为:"<<users[who].status<<endl;outfile.close();fflush(stdin); //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作}}
}
/*-----------------------------------------------------------------------------------------**函数名称:saveMoney*功能描述:存款,输入用户账号,存款完毕后显示出账户余额,完成存款的功能(在这里保存存款的具体,输出到"time.txt")*输入参数:输入用户账号及存入金额*输出参数:若状态为0,则输出余额,若状态为1,输出"该用户处于挂失状态,存款失败!",若状态为2,则输出"该用户已经销户,存款失败!"*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::saveMoney() //存款
{int who;double money;who=getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{if(users[who].status==0){users[who].showName();//cout<<endl;cout<<"输入存款额:";cin>>money;users[who].money+=money;users[who].showMoney("存款后,金额为:");ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"存入金额"<<money<<"元"<<endl;outfile.close();}else if(users[who].status==1){cout<<"该用户处于挂失状态,存款失败!"<<endl;}else if(users[who].status==2){cout<<"该用户已经销户,存款失败!"<<endl;}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:drawMoney*功能描述:取款,输入用户账号以及密码,通过对账号及密码的判断,输入取款金额,完成取款的功能(在这里保存取款的具体,输出到"time.txt")*输入参数:输入用户账号,密码,以及取款金额*输出参数:若输入的取款金额大于账户中全部金额,则输出"余额不足,取款失败!",否则输出"取款后,余额为:"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::drawMoney() //取款
{int who;double money;who=getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{if(users[who].isNormalUser()){users[who].showName();if(users[who].passwordIsRight()){cout<<"输入取款额:";cin>>money;if(money>users[who].money){cout<<"余额不足,取款失败!"<<endl;}else{users[who].money-=money;users[who].showMoney("取款后,余额为:");}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"取出金额"<<money<<"元"<<endl;outfile.close();}}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:refer*功能描述:查询用户状态以及已办业务,输入用户账号以及密码,通过对账号及密码的判断,输出该账户的状态及余额,若选择继续查询,则输出time.txt文件中该账户曾办业务的信息。*输入参数:输入用户账号,密码,'y'/'n'*输出参数:输出该账户的状态及余额以及用户办业务的详细信息*返回值:*说明: 注意这里对time.txt文件中用户信息的调用,注意{}的适用范围。*-----------------------------------------------------------------------------------------*/
void Bank::refer() //查询
{int who;int cacc;char pan;string cnam;string sta[3]= {"正常","挂失","已经销户"};string hms;string cyw;who=getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){users[who].showMoney("余额:");cout<<"状态:"<<sta[users[who].status]<<endl;cout<<"是否进行详细查询(y/n)?"<<endl;;cin>>pan;if(pan=='y'){ifstream infile("time.txt",ios::in);if(!infile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}while(infile>>hms>>cacc>>cnam>>cyw) //天啦撸,一定要注意这里的判断!{if(users[who].account==cacc){cout<<hms<<'\t'<<cacc<<'\t'<<cnam<<'\t'<<cyw<<endl;}}if(users[who].account!=cacc){cout<<"当前未办理过任何业务。"<<endl;}infile.close();}else{cout<<"+-------------查询结束-------------+"<<endl;cout<<endl;}}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:transfer*功能描述:转账,输入用户账号以及密码,通过对账号及密码的判断,再输入被转用户的账号,输入转账金额,若金额不够,则输出"余额不足,转账失败!"的字样,若金额足够,则输出转账后余额,完成转账的功能(在这里保存转账的具体,输出到"time.txt")*输入参数:输入用户账号,密码,以及被转账者的账号与转账金额*输出参数:若输入的转账金额大于账户中全部金额,则输出"余额不足,转账失败!",否则输出"转账后,余额为:"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::transfer() //转账
{int whoout, whoin;double money;cout<<"转出自";whoout=getUser(); //根据账号查询用户,返回用户的下标if(whoout>=0) //说明id账户存在{if(users[whoout].isNormalUser()){users[whoout].showName();if(users[whoout].passwordIsRight()){cout<<"输入转账金额:";cin>>money;if(money>users[whoout].money){cout<<"余额不足,转账失败!"<<endl;}else{cout<<"转出到";whoin = getUser(); //根据账号查询用户,返回用户的下标if(whoin>=0) //说明id账户存在{if(users[whoin].isNormalUser()){users[whoout].money-=money;users[whoin].money+=money;users[whoout].showMoney("转账后,余额为:");}}}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[whoout].account<<'\t'<<users[whoout].name<<'\t'<<"转出金额"<<money<<"元"<<endl;outfile.close();}}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:reportLoss*功能描述:挂失,输入用户账号以及密码,通过对账号及密码的判断,使得用户状态变为挂失,完成挂失的功能(在这里保存挂失的具体,输出到"time.txt")*输入参数:输入用户账号,密码*输出参数:若用户状态本为0,则将状态变为1,挂失成功,若用户原来状态为1/2,那么则不能成功挂失。*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::reportLoss() //挂失
{int who;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){if(users[who].status==0){users[who].status=1;cout<<"挂失成功"<<endl;}else if(users[who].status==1){cout<<"该账户已经处于挂失状态"<<endl;}else if(users[who].status==2){cout<<"该账户已销户,不能挂失"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变状态为:"<<users[who].status<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:hangSolution*功能描述:解挂,输入用户账号以及密码,通过对账号及密码的判断,使得用户状态变为正常状态0,完成解挂的功能(在这里保存解挂的具体,输出到"time.txt")*输入参数:输入用户账号,密码*输出参数:若用户状态本为1,则将状态变为0,解挂成功,若用户原来状态为2,那么则不能成功解挂,若用户原来状态为0,那么则不能做此操作*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::hangSolution() //解挂
{int who;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){if(users[who].status==0){cout<<"该账户处于正常状态,不需要解除挂失"<<endl;}else if(users[who].status==1){users[who].status=0;cout<<"解除挂失成功"<<endl;}else if(users[who].status==2){cout<<"该账户已销户,操作无效"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变状态为:"<<users[who].status<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changePassword*功能描述:改密,输入用户账号以及密码,通过对账号及密码的判断,输入两次新密码,如果两次相同则成功修改密码,否则,密码修改失败(在这里保存改密的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新密码*输出参数:若输入两次密码相同,则输出"密码修改成功!"的字样,若不同,则输出"两次输入不同,修改失败!"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changePassword() //改密
{int who;int iPass1, iPass2;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新密码:";iPass1=inputPassword(); //输入密码1cout<<"确认密码:";iPass2=inputPassword(); //输入密码2if(iPass1==iPass2){users[who].password=iPass1;cout<<"密码修改成功!"<<endl;}else{cout<<"两次输入不同,修改失败!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变密码:"<<users[who].password<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changename*功能描述:修改用户名,输入用户账号以及密码,通过对账号及密码的判断,输入新姓名以及'y'/'n',若输入'y',则改名成功,若输入'n',则取消本次修改(在这里保存修改用户名的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新姓名,'y'/'n'*输出参数:若输入'y'则输出"用户名修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/void Bank::changename() //修改用户名
{int who;string nam;char pan;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新姓名:";cin>>nam; //输入用户名cout<<"确认修改姓名(y/n)?";cin>>pan;if(pan=='y'){users[who].name=nam;cout<<"用户名修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变用户名:"<<users[who].name<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changedizhi*功能描述:修改地址,输入用户账号以及密码,通过对账号及密码的判断,输入新地址以及'y'/'n',若输入'y',则改地址成功,若输入'n',则取消本次修改(在这里保存修改地址的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新地址,'y'/'n'*输出参数:若输入'y'则输出"地址修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changedizhi() //修改地址
{int who;char di[30];char pan;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新地址:";gets(di); //输入地址cout<<"确认修改地址(y/n)?";cin>>pan;if(pan=='y'){for(int n=0; n<30; n++)users[who].dizhi[n]=di[n];cout<<"地址修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变地址:"<<users[who].dizhi<<endl;outfile.close();}}return;
}
/*-----------------------------------------------------------------------------------------**函数名称:changeidcard*功能描述:修改身份证号,输入用户账号以及密码,通过对账号及密码的判断,输入新身份证号以及'y'/'n',若输入'y',则改身份证号成功,若输入'n',则取消本次修改(在这里保存修改身份证号的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新身份证号,'y'/'n'*输出参数:若输入'y'则输出"身份证号修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changeidcard()
{int who;char id[18];char pan;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新身份证号:";gets(id); //输入身份证号cout<<"确认修改身份证号(y/n)?";cin>>pan;if(pan=='y'){for(int n=0; n<18; n++){users[who].idcard[n]=id[n];}cout<<"身份证号修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t'<<users[who].account<<'\t'<<users[who].name<<'\t'<<"修改身份证号:"<<users[who].idcard<<endl;outfile.close();}}return;}
/*-----------------------------------------------------------------------------------------**函数名称:changephone*功能描述:修改手机号,输入用户账号以及密码,通过对账号及密码的判断,输入新电话号以及'y'/'n',若输入'y',则改电话号成功,若输入'n',则取消本次修改(在这里保存修改电话号的具体,输出到"time.txt")*输入参数:输入用户账号,密码以及新电话号,'y'/'n'*输出参数:若输入'y'则输出"电话号号修改成功!"的字样,若输入'n',则输出"你已取消修改!"的字样*返回值:*说明: 注意对业务的保存(输出时间,用户,姓名,业务,保存到time.txt文件中)*-----------------------------------------------------------------------------------------*/
void Bank::changephone()
{int who;char pho[11];char pan;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].showName();if(users[who].passwordIsRight()){cout<<"新电话号:";gets(pho); //输入电话号cout<<"确认修改电话号(y/n)?";cin>>pan;if(pan=='y'){for(int n=0; n<11; n++){users[who].phone[n]=pho[n];}cout<<"电话号修改成功!"<<endl;}else{cout<<"你已取消修改!"<<endl;}ofstream outfile("time.txt",ios::app);if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。{cerr<<"open error!"<<endl;exit(1);}char *ctime(const time_t *time);//ctime();outfile<<'\t';outfile<<users[who].account<<'\t'<<users[who].name<<'\t'<<"改变电话号:"<<users[who].phone<<endl;outfile.close();}}return;}
/*-----------------------------------------------------------------------------------------**函数名称:changedisplays*功能描述:修改个人信息,输入需要操作选项的序号,使其跳转到所选函数内,完成对信息的修改*输入参数:输入n,即操作序号*输出参数:*返回值:*说明: 依旧是switch()语句*-----------------------------------------------------------------------------------------*/
void Bank::changedisplays() //修改个人信息
{int n;cout<<"+----请输入想要修改的项目:----+"<<endl;cout<<"+-----------1.姓名-------------+"<<endl;cout<<"+-----------2.身份证号---------+"<<endl;cout<<"+-----------3.密码-------------+"<<endl;cout<<"+-----------4.地址-------------+"<<endl;cout<<"+-----------5.电话-------------+"<<endl;cout<<"请输入:";cin>>n;switch(n){case 1:changename();break;case 2:changeidcard();break;case 3:changePassword();break;case 4:changedizhi();break;case 5:changephone();break;}
}
/*-----------------------------------------------------------------------------------------**函数名称:getUser*功能描述:查找用户,输入用户账户,利用二分法,查找是否有该用户的存在,返回关键字(找不到即为-1,其他即为找到)*输入参数:输入用户账号*输出参数:*返回值: 返回index(关键字)*说明: 利用二分法查找账号,更快捷简便*-----------------------------------------------------------------------------------------*/
int Bank::getUser() //查找用户 二分法
{int id;cout<<"账号:";cin>>id;int index=-1;int low=0, high=nownum-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;elselow=mid+1;}if (index<0)cout<<"该用户不存在,本次操作失败!"<<endl;return index; //若找到,其值在0~N-1间,否则,保持-1
}
/*-----------------------------------------------------------------------------------------**函数名称:openfile*功能描述:导出文件,将用户信息从users.txt里面导出,并计算用户数*输入参数:*输出参数:*返回值:*说明: 将用户信息从users.txt里面导出,并计算用户数*-----------------------------------------------------------------------------------------*/
void Bank::openfile()//导出文件
{ifstream infile("users.txt",ios::in);int i=0;if(!infile){cerr<<"open error!"<<endl;exit(1);}nownum=jishu(); //jis里面有return当前总用户数users=new User[nownum+1];while(infile>>users[i].account>>users[i].name>>users[i].idcard>>users[i].dizhi>>users[i].phone>>users[i].password>>users[i].money>>users[i].status){++i;}infile.close();
}
/*-----------------------------------------------------------------------------------------**函数名称:savefile*功能描述:保存文件,将用户信息保存到users.txt里面,并利用动态数组,delete []users; 在这里释放了剩余空间*输入参数:*输出参数:*返回值:*说明: 将用户信息保存到users.txt里面*-----------------------------------------------------------------------------------------*/
void Bank::savefile() //保存文件
{ofstream qingkfile("users.txt",ios::trunc);//trunc 打开并清空文件qingkfile.close();ofstream outfile("users.txt",ios::out);if(!outfile){cerr<<"open error!"<<endl;exit(1);}for(int i=0; i<nownum; ++i) //注意这里的空格即‘\t',关系到是否能正常保存用户信息{outfile<<users[i].account<<'\t'<<users[i].name<<'\t';for(int n=0; n<18; n++){outfile<<users[i].idcard[n];}outfile <<'\t'<<users[i].dizhi<<'\t';for(int n=0; n<11; n++){outfile<<users[i].phone[n];}outfile<<'\t'<<users[i].password<<'\t'<<users[i].money<<'\t'<<users[i].status<<endl;}outfile.close();delete []users; //释放剩余空间return;
}
/*-----------------------------------------------------------------------------------------**函数名称:display*功能描述:显示个人信息*输入参数:输入用户账号以及密码,若验证通过,则调用display()函数显示信息*输出参数:输出个人的信息*返回值:*说明:*-----------------------------------------------------------------------------------------*/
void Bank::display() //显示个人信息
{int who;who = getUser(); //根据账号查询用户,返回用户的下标if(who>=0) //说明id账户存在{users[who].displays();}
}
/*-----------------------------------------------------------------------------------------**函数名称:jishu*功能描述:计算用户数*输入参数:*输出参数:*返回值: 返回用户总数*说明: 用while()计算用户的总数*-----------------------------------------------------------------------------------------*/
int Bank::jishu()
{int acc; //账号char nam[20]; //姓名char id[18]; //身份证号char di[30];//地址char pho[11];//电话int pw; //密码double mon; //金额int sta; //状态int i=0;int nownum;ifstream infile("users.txt");while(infile>>acc>>nam>>id>>di>>pho>>pw>>mon>>sta){++i;}infile.close();return i;
}
staff.h
#ifndef STAFF_H_INCLUDED
#define STAFF_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;
struct staffTatus
{string account;int password;
};
class Staff
{
public:bool pass(string sacc,int ps);
private:staffTatus stafft;
};#endif // STAFF_H_INCLUDED
staff.cpp
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include "staff.h"
using namespace std;
/*-----------------------------------------------------------------------------------------**函数名称:pass*功能描述:判断业务员的登录信息*输入参数:*输出参数:*返回值: 返回判断*说明: =*-----------------------------------------------------------------------------------------*/
bool Staff::pass(string sacc,int ps)
{bool judge=false;fstream infile("staff.txt",ios::in);if(!infile){cerr<<"open error!"<<endl;exit(1);}while(!infile.eof()){infile>>stafft.account>>stafft.password;if(stafft.account==sacc&&ps==stafft.password){judge=true;break;}}infile.close();return judge;
}
user.h
#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;
//定义user类
class User
{
public:User(){}void setUser(int acc, string nam,char id[18],char di[30],char pho[11],int pw, double mon,int sta);bool isNormalUser(); //判断用户状态是否正确bool passwordIsRight(); //判断密码是否正确void showName(); //输出用户名void displays(); //输出用户个人信息void showMoney(string prompt);//显示余额friend class Bank; //友元类
private:int account;string name;char dizhi[30];char phone[11];int password;double money;char idcard[18];int status;
};#endif // USER_H_INCLUDED
user.cpp
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <conio.h> //将密码变成*号
#include "user.h"
using namespace std;
/*-----------------------------------------------------------------------------------------**函数名称:inputpassw*功能描述:接收密码,并且将其转化成数字,最后输出为“******”,并且密码要求不能全为0*输入参数:ch一位一位的输入*输出参数:"******"*返回值: 返回密码*说明: 这里要注意如何将字符转化成数字,并且这里只有用getch()和putchar('*')才能成功使得密码成为"******"格式*-----------------------------------------------------------------------------------------*/
int inputpassw()
{char ch; //接收字符形式密码(这里必须输入字符,因为只有字符才能转化成'*')int iPass=0; //要转换为ascll的形式int i;while(1){for(i=0; i<6; i++){ch=getch(); //输入但不显示putchar('*'); //输出*if(isdigit(ch))iPass=iPass*10+(ch-'0'); //假设第一位输入1,第二位输入2,那么此时密码就应该是1*10+2=12####else{iPass=0;break; //退出for循环后,再次接受}}fflush(stdin); //清除键盘缓存区中已经有的输入(不会,copy,详细解释见weizhi)cout<<endl;if(iPass==0) //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环{cout<<"密码要求全为数字,且不能全0!"<<endl;;cout<<"请重新输入密码: ";}elsebreak;}return iPass;
}
/*-----------------------------------------------------------------------------------------**函数名称:setUser*功能描述:建立用户*输入参数:*输出参数:*返回值:*说明: 用户的各个信息*-----------------------------------------------------------------------------------------*/
void User::setUser(int acc,string nam,char id[18],char di[30],char pho[11],int pw, double mon,int sta)
{account=acc;name=nam;for(int n=0;n<30;n++){dizhi[n]=di[n];}for(int n=0;n<11;n++){phone[n]=pho[n];}password=pw;money=mon;for(int n=0;n<18;n++){idcard[n]=id[n];}status=sta;
}
/*-----------------------------------------------------------------------------------------**函数名称:passwordIsRight*功能描述:判断用户密码*输入参数:输入密码*输出参数:*返回值: 返回判断结果*说明:*-----------------------------------------------------------------------------------------*/
bool User::passwordIsRight()
{int iPass;bool right=true;cout<<"输入密码:";iPass=inputpassw();if(iPass!=password){right = false;cout<<"输入密码错误,不能继续操作!"<<endl;}return right;
}void User::showName()
{cout<<"用户名:"<<name<<endl;}void User::showMoney(string prompt)
{cout<<prompt<<money<<endl;
}bool User::isNormalUser() //判断用户状态是否正确
{bool normal = true;if(status!=0){normal = false;cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能继续操作..."<<endl;}return normal;
}
void User::displays()
{cout<<"卡号:"<<account<<endl;cout<<"姓名:";cout<<name<<endl;cout<<"地址:";cout<<dizhi<<endl;cout<<"电话: ";for(int n=0;n<11;n++){cout<<phone[n];}
cout<<endl;
}
运行结果:
1.业务员登录
2.开户
3.销户
4.存款
5.取款
6.查询
7.转账
8.挂失与解挂
9.修改信息
10.查看个人信息
11.退出
用到的文件:
staff.txt(业务员)
users.txt(用户)
time.txt(业务)
学习总结:
总觉得还有bug,这一个星期每天改一点,每天都有新成果,直到今天上午运行成功,心里真的很兴奋,都说写一个程序用不了多久,调程序才费时间,恩,深深地体会到了来自程序的恶意。对于这种大程序,一定要耐住性子,加油!
这篇关于银行储蓄系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!