/*
*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<<"请重新输入密码: ";
}
else
break;
}
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(); //输入密码1
cout<<"确认密码:";
Pass2=inputPassword(); //输入密码2
if(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;
}
else
cout<<"金额少于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; //取款后余额变0
users[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(); //输入密码1
cout<<"确认密码:";
iPass2=inputPassword(); //输入密码2
if(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',则取消本次修改(在这里保存修改用户名的具体,输出到"t
ime.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',则取消本次修改(在这里保存修改地址的具体,输出到"t
ime.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;
else
low=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<<"请重新输入密码: ";
}
else
break;
}
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,这一个星期每天改一点,每天都有新成果,直到今天上午运行成功,心里真的很兴奋,都说写一个程序用不了多久,调程序才费时间,恩,深深地体会到了来自程序的恶意。对于这种大程序,一定要耐住性子,加油!