Headers
/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:bank.h
*文件标识:无
*内容摘要:该代码用于获取满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作 者:陈银丽
*完成日期:2015年7月18日
*
*修改记录:
*修改日期:无
*版本号:V1.0
*修改人:陈银丽
*修改内容:
*/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
using namespace std;
class User
{
private:
int account; //账号
string name; //姓名
int code; //密码
double money; //存款
int state; //状态 0-正常 1-挂失 2-销户
string ID; //身份证号
string address; //地址
public:
void showMoney(string p);
void showstate();
void showName();
bool pass();
void set(int acc,string na,int co,double m,int sta,string id,string add);
friend class Bank;
};
class Bank
{
public:
Bank(); //开始前从文件中读数据,存在数组中
~Bank(); //程序结束前,将数组中的数据写入到文件中
void work(); //业务驱动
int getno(int acc);
void openAccount(); //开户
void cancelAccount(); //注销账户
void save(); //存款
void withdraw(); //取款
void showAccount(); //查询账户
void transferAccounts(); //转账
void reportLoss(); //挂失
void cancelLoss(); //解除挂失
void changePassword(); //更改密码
private:
static int N; //实际用户数目
User users[10];//对象指针数组
};
int chooseInMenu(); //显示菜单并由业务员选择
#endif // BANK_H_INCLUDED
</pre><pre name="code" class="cpp">Sources:main.cpp
<pre name="code" class="cpp">/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:该代码用于获取满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作 者:陈银丽
*完成日期:2015年7月18日
*
*修改记录:
*修改日期:无
*版本号:V1.0
*修改人:陈银丽
*修改内容:
*/
#include <iostream>
#include"bank.h"
using namespace std;
bool text();
int main() //主函数
{
cout<<"+----------------------+\n";
cout<<"+ 尊敬的客户 欢迎使用 +\n";
cout<<"+----------------------+\n";
Bank b; //创建一个银行对象
if (text()) //用text校验用户,若用户名和密码输入正确,则进入主界面
{
b.work();
}
return 0;
}
Sources bank.cpp
<pre name="code" class="cpp">/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:bank.cpp
*文件标识:无
*内容摘要:该代码用于获取满足后缀要求的第一个文件
*其他说明:Bank类中成员函数的定义
*当前版本:V1.0
*作 者:陈银丽
*完成日期:2015年7月18日
*
*修改记录:
*修改日期:无
*版本号:V1.0
*修改人:陈银丽
*修改内容:
*/
#include <iostream>
#include<fstream>
#include<cstdlib>
#include <conio.h>
#include<cstring>
#include<string>
#include <stdio.h>
#include"bank.h"
int Bank::N=0;
void getime();
Bank::Bank()
{
ifstream infile("account.txt",ios::in);
if(!infile)
{
cerr<<" gz open error!"<<endl;
exit(1);
}
int i=0;
int acc; //账号
string nam; //姓名
int co; //密码
double m; //金额
int sta;//状态
string id;
string add;
while(infile>>acc>>nam>>co>>m>>sta>>id>>add) //当读取成功……
{
//User *users=new User[++i];
users[i].set(acc,nam,co,m,sta,id,add);
i++;
}
N = i; //用静态数据成员
infile.close();
}
//功能:用析构函数,在退出系统时,将数据保存到文件中
Bank::~Bank()
{
ofstream outfile("account.txt",ios::out);
if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。
{
cerr<<"xg open error!"<<endl;
exit(1);
}
int i;
for(i=0; i<N; i++)
{
outfile<<users[i].account<<" ";
outfile<<users[i].name<<" ";
outfile<<users[i].code<<" ";
outfile<<users[i].money<<" ";
outfile<<users[i].state<<" ";
outfile<<users[i].ID<<" ";
outfile<<users[i].address<<"\n";
}
outfile.close();
// delete []users;
}
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:
transferAccounts(); //转账
break;
case 7:
reportLoss(); //挂失
break;
case 8:
cancelLoss(); //解除挂失
break;
case 9:
changePassword(); //更改密码
break;
case 0:
cout<<"欢迎您再来. "<<endl;
}
}
while(iChoice);
}
/* 功能:开户
说明:在进入系统时,在读入数据过程中,已经记录了用户数为N,在数组中对应下标为0~N-1 开户时要增加一个用户,只要为下标为N的数组元素置值,并在成功之后令N++即可。
账号由系统自动生成(10001+序号),保证其连续,这样在顺序增加的时候,就保证了其有序。
*/
void Bank::openAccount()
{
cout<<"正在开户\n";
if(N==2000)
{
cout<<"抱歉,银行账户已满,请退出!\n";
return;
}
int acc=10001+N;
cout<<"账号:"<<acc;
cout<<"\n户主姓名:";
string name,ID,address;
cin>>name;
int code1,code2;
cout<<"密码 :";
cin>>code1;
cout<<"请确认密码:";
cin>>code2;
while(code1!=code2)
{
cout<<"输入密码:";
cin>>code1;
cout<<"确认密码:";
cin>>code2;
}
if(code1==code2)
{
cout<<"ID:";
cin>>ID;
cout<<"地址:";
cin>>address;
cout<<"存入金额:";
double money;
cin>>money;
cout<<"开户成功!";
(users+N)->set(acc,name,code1,money,0,ID,address);
N++;
cout<<"开户成功!\n";
}
}
/* 功能:销户
说明:找到账户,并将其状态改为2-注销即可。 注销前应该检查余额,应该先取款再注销
*/
void Bank::cancelAccount()
{
int acc;
cout<<"待销户账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
(users+number)->showName();
if((users+number)->pass())
{
if((users+number)->state==2)
{
cout<<"yi xaio\n";
return;
}
(users+number)->showMoney("余额");
cout<<"确认销户?(y/n)?";
char s;
cin>>s;
if(s=='y')
{
(users+number)->showMoney("取款");
(users+number)->money=0;
(users+number)->state=2;
cout<<"销户成功!\n";
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<(users+number)->name<<"已销户!"<<endl;
outfile.close();
}
}
}
else cout<<"查无此帐号!\n";
}
/*功能:存款
说明:说明:需要保证账户存在,且处于正常状态
*/
void Bank::save()
{
int acc;
cout<<"账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
if((users+number)->state==0)
{
double bill;
(users+number)->showName();
cout<<"存款额:";
cin>>bill;
(users+number)->money+=bill;
(users+number)->showMoney("现余额共计:");
cout<<"存款成功!\n";
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<(users+number)->name<<"存款"<<bill<<"元!"<<endl;
outfile.close();
}
else if((users+number)->state==1)
cout<<"已挂失,存款失败!\n";
else cout<<"已销户,存款失败!\n";
}
else cout<<"查无此帐号!\n";
}
/*功能:取款
说明:需要保证账户存在,且处于正常状态,另外,余额要足够取
*/
void Bank::withdraw()
{
int acc;
cout<<"账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
if((users+number)->state==0)
{
double bill;
(users+number)->showName();
if((users+number)->pass())
{
cout<<"取款额:";
cin>>bill;
if(bill>(users+number)->money)
{
cout<<"余额不足,退出\n";
return;
}
(users+number)->money-=bill;
cout<<"成功取款!\n";
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<(users+number)->name<<"取款"<<bill<<"元!"<<endl;
outfile.close();
}
else
{
cout<<"密码错误,退出!\n";
return;
}
}
else if((users+number)->state==1)
cout<<"已挂失,取款失败!\n";
else cout<<"已销户,取款失败!\n";
}
else cout<<"查无此帐号!\n";
}
/*功能:查询
说明:显示账户信息及用户个人信息
*/
void Bank::showAccount()
{
int acc;
cout<<"账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
(users+number)->showName();
if((users+number)->pass())
{
(users+number)->showMoney("余额:");
(users+number)->showstate();
cout<<"身份证号"<<(users+number)->ID;
cout<<"\n地址:"<<(users+number)->address;
cout<<"\n你还想继续,再看一下账户的业务记录吗?y/n:";
char c;
cin>>c;
if(c=='y')
{
int r1,r3,r4,r5;
string r2;
ifstream infile("business.txt",ios::app);
if(!infile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
while(infile>>r1>>r3>>r4>>r5>>r2)//>>r3>>r4>>r5)
{
if(r1==(users+number)->account)
cout<<r1<<r2<<" "<<r3<<"/"<<r4<<"/"<<r5<<endl;//
}
}
cout<<"\n查询完毕!\n";
}
}
else cout<<"查无此帐号!\n";
}
/*功能:转账
说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够
*/
void Bank::transferAccounts()
{
int acc,acc1;
cout<<"转出账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
(users+number)->showName();
if((users+number)->pass())
{
if((users+number)->state!=0)
cout<<"您的账户状态不正常,失败!\n";
else
{
double bill;
cout<<"转账金额";
cin>>bill;
if(bill>(users+number)->money)
cout<<"余额不足,转账失败!\n";
else
{
cout<<"元\n转入账号:";
cin>>acc1;
int number1=getno(acc1);
if(number1>=0)
{
if((users+number1)->state==0)
{
(users+number)->money-=bill;
(users+number1)->money+=bill;
cout<<"转帐成功!现余额"<<(users+number)->money;
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<(users+number)->name<<"转入账户"<<(users+number1)->account<<":"<<(users+number1)->name<<bill<<"元!"<<endl;
outfile.close();
}
else cout<<"转入账户状态不正常!\n";
}
else cout<<"查无此账户!\n";
}
}
}
}
else cout<<"查无此账户!\n";
}
/*功能:挂失
说明:挂失账户
*/
void Bank::reportLoss()
{
int acc;
cout<<"账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
(users+number)->showName();
if((users+number)->pass())
{
if((users+number)->state==0)
{
(users+number)->state=1;
cout<<"挂失成功!\n";
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<(users+number)->name<<"挂失成功!"<<endl;
outfile.close();
}
}
}
else cout<<"查无此账户!\n";
}
/*功能:解挂
说明:解挂账户
*/
void Bank::cancelLoss()
{
int acc;
cout<<"账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
(users+number)->showName();
if((users+number)->pass())
{
if((users+number)->state==1)
{
(users+number)->state=0;
cout<<"解挂成功!\n";
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<(users+number)->name<<"解挂成功!"<<endl;
outfile.close();
}
else if((users+number)->state==0)
cout<<"正常状态,未挂失!\n";
else cout<<"已销户,挂失失败!\n";
}
}
else cout<<"查无此账户!\n";
}
/*功能:改密
说明:用户进行改密操作
*/
void Bank::changePassword()
{
int acc;
cout<<"账号:";
cin>>acc;
int number=getno(acc);
if(number>=0)
{
(users+number)->showName();
if((users+number)->pass())
{
int code,code1;
cout<<"新密码:";
cin>>code;
cout<<"确认密码";
cin>>code1;
if(code==code1)
{
cout<<"\n修改成功!";
(users+number)->code=code;
ofstream outfile("business.txt",ios::app);
if(!outfile)
{
cerr<<"business.open error!"<<endl;
exit(1);
}
outfile<<(users+number)->account<<"修改密码成功!"<<endl;
outfile<<"已改为:"<<(users+number)->code<<endl;
outfile.close();
}
}
}
else cout<<"查无此账户!\n";
}
/*入口参数:要查询用户的账号
返回值:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-1)
说明:由账号自动产生,使按账号有序,本模块采用二分查找 */
int Bank::getno(int acc) //输入账号查询用户,返回用户在数组中的下标
{
int index=-1;
int low=0, high=N-1, mid;
while(low<=high)
{
mid = (low+high)/2;
if((users+mid)->account==acc)
{
index=mid;
break; //找到了,立即退出循环
}
else if ((users+mid)->account>acc)
high=mid-1;
else
low=mid+1;
}
if (index<0)
cout<<"该用户不存在,本次操作失败!"<<endl;
return index; //若找到,其值在0~N-1间,否则,保持-1
}
</pre>Scources user.cpp<pre>
<pre name="code" class="cpp">/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:user.cpp
*文件标识:无
*内容摘要:该代码用于获取满足后缀要求的第一个文件
*其他说明:User类成员函数的定义
*当前版本:V1.0
*作 者:陈银丽
*完成日期:2015年7月18日
*
*修改记录:
*修改日期:无
*版本号:V1.0
*修改人:陈银丽
*修改内容:
*/
#include <iostream>
#include"bank.h"
using namespace std;
/*
*功能描述:显示户主姓名
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:无
*/
void User::showName() //关于用户的个人信息及账号信息
{
cout<<"户主姓名:"<<name<<endl;
}
/*
*功能描述:显示账户金额
*输入参数:string p
*输出参数:无
*返回值:无
*其他说明:无
*/
void User::showMoney(string p)
{
cout<<p<<money<<" 元"<<endl;
}
/*
*功能描述:设置账户信息
*输入参数:int acc,string na,int co,double m,int sta,string id,string add
*输出参数:无
*返回值:无
*其他说明:无
*/
void User::set(int acc,string na,int co,double m,int sta,string id,string add) //用户各项信息
{
account=acc;
name=na;
code=co;
money=m;
state=sta;
ID=id;
address=add;
}
/*
*功能描述:显示账户状态
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:无
*/
void User::showstate()
{
cout<<"当前状态:";
if(state==0)
cout<<"正常\n";
else if(state==1)
cout<<"挂失\n";
else cout<<"销户\n";
}
/*
*功能描述:验证输入的账户密码
*输入参数:无
*输出参数:数字
*返回值:0-false,1-true
*其他说明:3次错误返回0
*/
bool User::pass() //验证用户密码是否正确
{
int password;
int i=3; //共有三次密码输入机会
cout<<"密码:";
while(i--)
{
cin>>password;
if(password==code)
return 1;
if(i>0)
cout<<"密码错误,"<<i<<"次输入\n";
}
return 0;
}
</pre>Scources work.cpp<pre>
<pre name="code" class="cpp">/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:work.cpp
*文件标识:无
*内容摘要:该代码用于获取满足后缀要求的第一个文件
*其他说明:程序中一般函数的定义
*当前版本:V1.0
*作 者:陈银丽
*完成日期:2015年7月18日
*
*修改记录:
*修改日期:无
*版本号:V1.0
*修改人:陈银丽
*修改内容:
*/
#include <iostream>
#include<fstream>
#include<cstdlib>
#include <conio.h>
#include<cstring>
#include <stdio.h>
#include"bank.h"
/*
*功能描述:业务员身份验证
*输入参数:无
*输出参数:right
*返回值:1-true,0-false
*其它说明:3次验证错误,退出
关于getch()的一点说明:
所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上
函数原型:int getch(void)
返回值:读取的字符
在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。
2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。
为避免键盘缓存区中未读出的字符影响程序,用fflush(stdin);清除输入缓存区
*/
bool text() //功能:校验用户 说明:若用户的用户名及密码输入正确,则进入主界面,否则强制退出
{
char name[20],name1[20],code[20];
ifstream infile("assistant.txt",ios::in);
if(!infile)
{
cout<<"password file cannot open!"<<endl;
exit(1);
}
infile>>name>>code;
infile.close();
char ch,code1[20];
int iTry=3; //进入系统时尝试的次数,密码三次不对将退出
int right = 0; //要返回的结果:0-不正确 1-正确
do
{
cout<<"请输入业务员用户名:";
cin>>name1;
cout<<"请输入密码:";
int i=0;
while((ch=getch())!='\r') //getch在接受输入后,不是回车,不在屏幕上显示
{
code1[i++]=ch;
putchar('*'); //接受任何字符,屏幕上只显示*
}
code1[i]='\0';
fflush(stdin); //清空输入缓冲区
cout<<endl;;
if(strcmp(code,code1)==0&&strcmp(name,name1)==0)
{
right = 1;
break;
}
else
{
iTry--;
if(iTry>0)
cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
else
{
cout<<"对不起,你不能进入系统"<<endl;;
}
}
}
while(iTry);
return right;
}
/*
*功能描述:功能菜单选择
*输入参数:无
*输出参数:i
*返回值:0~9 数字
*其它说明:
*/
int chooseInMenu() //用户功能选择,从0到9
{
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;
}
运行结果:
<img src="https://img-blog.csdn.net/20150718111538852?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20150718111700239?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />