您的位置:首页 > 编程语言 > C语言/C++

C++项目实训:银行储蓄系统

2015-07-18 13:44 471 查看
/***********************************************************
* 版权所有(C)2015, lishangze。
*
* 文件名称:main.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作  者:李尚泽
* 完成日期:2015/07/18
*
* 修改记录:
* 修改日期:2015/07/18
* 版本号:V1.0
* 修改人:Li Shangze
* 修改内容:创建
**********************************************************/

#include <iostream>
#include <iomanip>
#include <windows.h>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <conio.h>
#include <ctype.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,string id,int sta);//设置用户信息
void showName();//输出姓名信息
void showBalance(string prompt);//显示账户余额
bool passWordISRight();//判断密码是否正确
bool ISNormalUser();//存款,取款,转账等功能需要账户处于正常状态,判断账户是否处于正常状态
friend class Bank;//将Bank设为User的友元类
private:
int account;//账号
int password;//密码
string name;//名字
double balance;//余额
double money;//未加利率的金额
string identificant;//身份证号
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();//修改密码
int getUser();//输入账号查询用户,返回用户在对象数组的下标
private:
int N;//实际用户数目
static double rate;//利率
User users [upnum];//User数组
};

double Bank::rate=0.0225;//年利率
int pass();//业务员登录
int chooseInMenu();//显示菜单并由业务员选择
int inputPassword();//返回键盘输入的密码
int m=0;//记录明细业务
/*********************************************************
* 功能描述:<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">从文件读取数据</span>
* 返回值:0-成功  1-失败
************************************************************/
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;
string id;
int sta;
double mon;
while (infile>>acc>>na>>pw>>bal>>id>>sta)
{

users[i].setUser(acc,na,pw,mon,bal,id,sta);
i++;
}
N=i;
infile.close();
}
/*********************************************************
* 功能描述:<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">向文件存入数据</span>
* 返回值:0-成功  1-失败
************************************************************/
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();
}
<pre name="code" class="cpp">/*********************************************************
* 功能描述:<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">启动工作系统</span>
* 返回值:用户选择的各种功能
************************************************************/
void Bank::work()//启动工作系统{ int ichoice; system("cls"); 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 0: cout<<"谢谢使用!"<<endl; Sleep(1000);
system("cls"); cout<<"+--------------------------+"<<endl; cout<<"1.开户 "<<"2 .销户"<<endl; cout<<"3.存钱 "<<"4 .取款"<<endl; cout<<"5.查询 "<<"6 .转账"<<endl; cout<<"7.挂失 "<<"8 .解挂"<<endl; cout<<"9.改密 "<<"10.退出"<<endl; cout<<"+--------------------------+"<<endl; break;
} } while(ichoice);}


<pre name="code" class="cpp">/*********************************************************
* 功能描述:实现开户功能,由业务员输入各种信息,完成开户
************************************************************/
void Bank::openAccount()//实现开户功能{ if(N==upnum) { cout<<"银行用户数已达上限,无法开户!"<<endl; return; } int acc; int pw; string na; double mon; double bal; string id; int sta; int ipw1,ipw2; int year; acc=10001+N; Sleep(1000); cout<<"可以开户!"<<endl; acc=10001+N;
cout<<"请输入账号:"<<acc<<endl; cout<<"请输入用户名:"; cin>>na; cout<<"请输入身份证号:"; cin>>id; cout<<"请输入密码:"; ipw1=inputPassword(); cout<<"请再输一次:"; ipw2=inputPassword(); if(ipw1==ipw2) { pw=ipw1; sta=0; cout<<"存款金额:"; cin>>bal; ofstream outfile1("expence_record.txt",ios::app);
if(!outfile1) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } outfile1<<acc<<" 存入 "<<acc<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<bal<<" 元"<<endl; outfile1.close(); ofstream outfile2("account.txt",ios::app); if(!outfile2) { cerr<<"account.txt
file cannot open!"<<endl; exit(1); } outfile2<<acc<<" "<<na<<" "<<ipw1<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<bal<<" "<<id<<" "<<sta<<endl; outfile2.close(); cout<<"请输入存入期限(年):"; cin>>year; double sum=bal+bal*double(year)*rate; cout<<"届时账户总额为:"; cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<"元"<<endl;
users
.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].passWordISRight())
{
users[who].showBalance("余额");
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,year;
double money;
who=getUser();
if(who>=0)
{
if(users[who].status==0)
{
users[who].showName();
if(users[who].passWordISRight())
{
cout<<"请输入存款金额:";
cin>>money;
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<<"  "
<<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl;
outfile.close();
ifstream infile("expence_record.txt",ios::in);
if(!infile)
{
cerr<<"expence_record file cannot open!"<<endl;
exit(1);
}
cout<<users[who].account<<" 存入 "<<users[who].account<<"  "<<setiosflags(ios::fixed)
<<setprecision(2)<<money<<" 元"<<endl;
infile.close();
cout<<"请输入存款期限(年):";
cin>>year;
double sum=money+money*double(year)*rate;
cout<<"届时账户总额为:"<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<"元"<<endl;
}
}
else if(users[who].status==1)
{
cout<<"该用户账户已挂失,存款失败!"<<endl;
}
else
{
cout<<"该用户账户已销户,存款失败!"<<endl;
}
}
return;
}
/*********************************************************
* 功能描述:查看账户的状态,<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">以及账户进行过的每一笔交易记录</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">* 返回值:0-成功  其他-失败</span>
************************************************************/
void Bank::showAccount()//查看账户及交易信息
{
int who;
string sta[3]= {"正常","已挂失","已销户"};
who=getUser();
if(who>=0)
{
users[who].showName();
if(users[who].passWordISRight())
{
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;
string r2,r4,r5;
while(infile>>r1>>r2>>r3>>r4>>r5)
{
if(r1==users[who].account&&r3==users[who].account)
cout<<r2<<" "<<r4<<" "<<r5<<endl;
else if(r1==users[who].account)
cout<<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].passWordISRight())
{
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);
}
outfile<<users[who].account<<" 取款 "<<users[who].account<<" "<<setiosflags(ios::fixed)
<<setprecision(2)<<money<<" 元"<<endl;
outfile.close();
}
}
}
}
return ;
}
/*********************************************************
* 功能描述:在已存在的两个账户间进行转账,并显示余额,
余额不足时转账无法完成。
* 返回值:0-成功  其他-失败
************************************************************/
void Bank::transferAccount()//实现转账功能
{
int whoout,whoin;
double money;
whoout=getUser();
if(whoout>=0)
{
if(users[whoout].ISNormalUser())
{
users[whoout].showName();
if(users[whoout].passWordISRight())
{
cout<<"请输入转账金额:";
cin>>money;
if(money>users[whoout].balance)
cout<<"余额不足,转账失败!"<<endl;
else
{
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);
}
outfile<<users[whoin].account<<" 转入到 :"<<users[whoout].account<<" "
<<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl;
outfile.close();
}
}
}
}
}
}
return;
}
/*********************************************************
* 功能描述:进行账户的挂失操作,只有在账户处于正常的状态下才可以进行挂失操作
* 返回值:0-成功  其他-失败
************************************************************/
void Bank::reportLoss()//实现挂失功能
{
int who;
who=getUser();
if(who>=0)
{
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
cout<<"该账户已销户,操作失败!"<<endl;
}
}
return;
}
/*********************************************************
* 功能描述:实现挂失的解除,只有在账户处于已挂失的状态下才可以进行解挂,否则该操作无法完成
* 返回值:0-成功  其他-失败
************************************************************/
void Bank::canlelLoss()//实现解除挂失功能
{
int who;
who=getUser();
if(who>=0)
{
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
{
cout<<"该用户已销户,操作失败!"<<endl;
}
}
}
return ;
}
/*********************************************************
* 功能描述:更改密码,先输入原密码,正确后,两次输入新密码完成改密工作,
*          两次输入不一致,则改密失败。
* 返回值:0-成功  其他-失败
************************************************************/
void Bank::updatePassword()//实现改密功能
{
int who;
int iPass1,iPass2;
who=getUser();
if(who>=0)
{
users[who].showName();
if(users[who].passWordISRight())
{
cout<<"请输入新密码:"<<endl;
iPass1=inputPassword();
cout<<"请再输一次:"<<endl;
iPass2=inputPassword();
if(iPass1==iPass2)
{
users[who].password=iPass1;
cout<<"密码修改成功!"<<endl;
}
else
cout<<"两次输入不一致,修改失败!"<<endl;
}
}
}
/*********************************************************
* 功能描述:输入账号查询用户,利用二分查找的算法
* 返回值:返回用户在对象数组的下标
************************************************************/
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 User::setUser(int acc,string na,int pw,double mon,double bal,string id,int sta)//设置用户信息
{
account=acc;
password=pw;
name=na;
money=mon;
balance=bal;
identificant=id;
status=sta;
}
/*********************************************************
* 功能描述:输出姓名信息
* 返回值:0-成功  其他-失败
************************************************************/
void User::showName()//输出姓名信息
{
cout<<"户主姓名:"<<name<<endl;
}

void User::showBalance(string prompt)//显示账户余额
{
cout<<prompt<<" "<<balance<<"元"<<endl;
}
/*********************************************************
* 功能描述:判断密码是否正确
* 返回值:right-成功  false-失败
************************************************************/
bool User::passWordISRight()//判断密码是否正确
{
int iPass;
bool right=true;
cout<<"请输入密码:"<<endl;
iPass=inputPassword();
if(iPass!=password)
{
right=false;
cout<<"密码错误!"<<endl;
}
return right;
}
/*********************************************************
* 功能描述:判断账户状态是否合适
* 返回值:normal-成功  false-失败
************************************************************/
bool User::ISNormalUser()//判断账户状态是否合适
{
bool normal=true;
if(status!=0)
{
normal=false;
cout<<"该账户"<<(status==1?"已挂失":"已销户")<<"状态,无法执行此操作!"<<endl;
}
return normal;
}
/*********************************************************
* 功能描述:输入密码
* 返回值:其他-成功  0-失败
************************************************************/
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-48);
}
else
{
iPass=0;
break;
}
}
fflush(stdin);//清理键盘缓存区已有的输入
cout<<endl;
if(iPass==0)
{
cout<<"密码应全为数字且不全为0!"<<endl;
cout<<"请重新输入!"<<endl;
}
else
break;
}
return iPass;
}
/*********************************************************
* 功能描述:由业务员选择菜单功能,执行各项操作
* 返回值:0-成功  其他-失败
************************************************************/
int chooseInMenu()//菜单功能选择
{
int i;
while (1)
{
Sleep(300);
cout<<"MIND THE SECURITY AROUND YOU!"<<endl;
cout<<"THE SYSTEM IS LOADING YOU , PLEASE WAIT!"<<endl;
Sleep(2000);
system("cls");
cout<<"+--------------------------+"<<endl;
cout<<"请选择办理业务:"<<endl;
cout<<endl;
cout<<"1.开户        "<<"2 .销户"<<endl;
cout<<"3.存款        "<<"4 .取款"<<endl;
cout<<"5.查询        "<<"6 .转账"<<endl;
cout<<"7.挂失        "<<"8 .解挂"<<endl;
cout<<"9.改密        "<<"10.退出"<<endl;
cout<<"+--------------------------+"<<endl;
cin>>i;
if(i>=0&&i<=9)
break;
else
cout<<"输入有误,请重新选择功能!"<<endl;
}
return i;
}
/*********************************************************
* 功能描述:验证业务员操作是否正确,当业务员输入的信息与password文档中预存的
信息一致时,则操作可以进行,进入主菜单
* <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">返回值:0-成功  其他-失败</span>
************************************************************/
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;
int q;
for(q=0; q<8; q++)
{
Sleep(100);
}
system("cls");
do
{
cout<<"+--------------------------+"<<endl;
cout<<"PLEASE INPUT THE OFFICER NAME:";
cin>>sName;
cout<<"PLEASE INPUT THE PASSWORD:";
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;
}
/*********************************************************
* 功能描述:最初界面显示
* 返回值:0-成功  其他-失败
************************************************************/
int main()
{
system("cls");
cout<<"+-------------------------------------------+"<<endl;
cout<<"+                                           +"<<endl;
cout<<"+     WELCOME TO THE INTERNATIONAL BANK     +"<<endl;
cout<<"+                                           +"<<endl;
cout<<"+-------------------------------------------+"<<endl;
Sleep(500);
cout<<"THE SYSTEM IS CHANGING THE LANGUAGE , PLEASE WAIT!"<<endl;
Sleep(1000);
cout<<"转换成功,已将您的语言切换为汉语!"<<endl;
if(pass())
{
Bank b;
b.work();
}
return 0;
}


运行结果:






















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: