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

银行储蓄系统(C++课程实训博客电子报告)

2015-07-17 20:19 483 查看
<pre class="cpp" name="code">/******************************************************
*版权所有(c)2015.烟台大学计算机与控制工程学院
*
*文件名称:main.cpp
*文件标示:无
*内容摘要:该代码用于满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作者:李长鸿
*完成日期:2015.7.17
*
*修改记录:
*修改日期:
*版本号:V1.0
*修改人:
*修改内容:
*********************************************************/
#include <iostream>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<ctype.h>
#include"BU.h"
using namespace std;
/******************
*功能描述:主函数
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:无
******************/
int main()
{
cout<<"--------------------------"<<endl;
cout<<"      欢迎光临CSDN银行    "<<endl;
cout<<"--------------------------"<<endl;
Bank b;
if(pass())//业务员登录
{
b.Work();//业务员开始工作
}
return 0;
}



/************************************************
*版权所有(c)2015.烟台大学计算机与控制工程学院
*
*文件名称:BU.h
*文件标示:无
*内容摘要:该代码用于满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作者:李长鸿
*完成日期:2015.7.17
*
*修改记录:
*修改日期:
*版本号:V1.0
*修改人:
*修改内容:
/************************************************/
#ifndef BU_H_INCLUDED
#define BU_H_INCLUDED
#include<cstring>
using namespace std;
/*************************
*     User类的声明
***************************/
const int maxUser=2000;
class Bank;
class User//用户类
{
string idnumber;//身份证号
string address;//地址
int account;//顺序号
int number; //账户名
string name;//户主名
int password;//密码
double leftmoney;//余额
int condition;//账户状态,1为正常,2为销户,3为挂失
public:
User(string idnu,string add,int nu,string na,int pass,double lef,int cond);
void Show();//显示开户相关个人信息
bool Provepassword();//验证密码
bool Condition();//账户状态
friend class Bank;//将Bank类声明为友元类

};
/*************************
*    Bank类的声明
*************************/
class Bank//银行类
{
static int n;
User *user[maxUser]={NULL};//组合,User类为数据成员;指针数组,用小空间的指针数组灵活处理大空间的对象集合
public:
Bank();//用文件写出初始化
~Bank();//文件读入保存数据
void Work();//决定办什么业务
void Search(int nu);//查询余额及账户状态
void Save(int nu);//存钱
void Take(int nu);//取钱
void Openoccount();//开户
void Canceloccount(int nu);//销户
void Transferaccount(int nu);//转账
void Changepass(int nu);//改密码
void Loss(int nu);//挂失
void Removel(int nu);//解挂
};
/***********************
*  业务员登录函数的声明
************************/
int pass();  //业务员登录
/**************************
*输入密码函数的声明
***************************/
int inputPassword();   //返回键盘输入的密码
#endif // BU_H_INCLUDED


/************************************************
*版权所有(c)2015.烟台大学计算机与控制工程学院
*
*文件名称:User.cpp
*文件标示:无
*内容摘要:该代码用于满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作者:李长鸿
*完成日期:2015.7.17
*
*修改记录:
*修改日期:
*版本号:V1.0
*修改人:
*修改内容:
/************************************************/
#include<iostream>
#include<cstring>
#include<cstdio>
#include"BU.h"
using namespace std;
/********************************************************************************************
*功能描述:构造函数,对象的初始化
*输入参数:身份证号,住址,账号,户主名,六位数字密码,余额,状态:1.正常;2.销户;3.挂失
*输出参数:无
*返回值:无
*其他说明:无
**********************************************************************************************/
User::User(string idnu,string add,int nu,string na,int pass,double lef,int cond)
{
idnumber=idnu;
address=add;
number=nu;
name=na;
password=pass;
leftmoney=lef;
condition=cond;
}
/********************************************
*功能描述:显示个人信息
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:无
*********************************************/
void User::Show()//显示开户时的个人及账户信息
{
if(condition!=2)//销户的用户不能显示信息
{
cout<<"户主名: "<<name<<endl<<"住址为:"<<address<<endl<<"顺序号: ";
cout<<account<<endl<<"账户名: "<<number<<endl<<"身份证号: "<<idnumber<<endl;
}
}
/********************************************
*功能描述:密码的验证
*输入参数:无
*输出参数:无
*返回值:bool型的
*其他说明:无
*********************************************/
bool User::Provepassword()//验证密码
{
int pass;
int i=0;
int j;
while(i++<3)//最多能输入三次密码
{
cout<<"请输入密码"<<endl;
pass=inputPassword();//输入六位数的密码
if(pass==password)
return 1;
if((3-i)>0)//错误输入不足三次,给予提示,继续输入
{
cout<<"密码错误,你还有"<<3-i<<"次机会"<<endl<<"继续请输入1,退出请输入2;";
cin>>j;
if(j==2)return 0;//放弃输入密码,返回失败信息
}
}
if(j==1)//三次都输入错误密码,锁定银行卡
{
cout<<"密码输入错误三次!您的银行卡已被锁定!请带上您的身份证,联系银行工作人员解决。"<<endl;
return 0;//返回密码输入失败信息
}
}
/********************************************
*功能描述:状态的判断
*输入参数:无
*输出参数:无
*返回值:bool型的
*其他说明:无
*********************************************/
bool User::Condition()//账户状态的判断
{
if(condition!=1)
{
cout<<"此账户已被"<<(condition==2?"销户":"挂失")<<",不能对它进行操作"<<endl;//若非正常,给予提示
return 0;
}
return 1;
}


/************************************************
*版权所有(c)2015.烟台大学计算机与控制工程学院
*
*文件名称:Bank.cpp
*文件标示:无
*内容摘要:该代码用于满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作者:李长鸿
*完成日期:2015.7.17
*
*修改记录:
*修改日期:
*版本号:V1.0
*修改人:
*修改内容:
************************************************/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<fstream>
#include<ctype.h>
#include"BU.h"
using namespace std;
/********************************************************************
*功能描述:用构造函数读取文件中保存的用户数据复制给用户类指针数组
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:无
**********************************************************************/
int Bank::n=0;
Bank::Bank()//构造函数读取文件中的数据
{
int i=0;
ifstream infile("acc.txt",ios::in);
if(!infile)//测试文件打开操作是否成功,不成功则提示后退出。
{
cout<<"文件输出有误"<<endl;
exit(1);
}
string idnu,add;
string na;
int nu,c,p;
double l;
while(infile>>idnu>>add>>nu>>na>>p>>l>>c)//从文件中读出数据
{
user[i]=new User(idnu,add,nu, na,p,l,c);//给指针数组赋值
++i;
user[i-1]->account=i;
}
n=i;
infile.close();
}
/********************************************************************************************
*功能描述:用析构函数将数组中的数据保存到文件中
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:acc保存的是没有顺序号的数据,保证顺利下次顺利运行,account保存的是用户所有数据
**********************************************************************************************/
Bank::~Bank() //保存数据至文件中
{
ofstream outfile("account.txt",ios::out);//account.txt中保存的数据是加入了顺序号,我是用顺序号而不是账户号来正确查找数组的数据的
if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。
{
cerr<<"file account.txt open error!"<<endl;
exit(1);
}
int i;
for(i=0; i<n; i++)//用循环将数据写入文件中
{
if(user[i]!=NULL)//若未销户,则写入文件,即删除已销户用户
{
outfile<<user[i]->idnumber<<"  ";
outfile<<user[i]->address<<"  ";
outfile<<user[i]->account<<"  ";
outfile<<user[i]->number<<"  ";
outfile<<user[i]->name<<"  ";
outfile<<user[i]->password<<"  ";
outfile<<user[i]->leftmoney<<"  ";
outfile<<user[i]->condition<<endl;
}
}

outfile.close();
ofstream outputfile("acc.txt",ios::out);//更新acc.txt中的数据,保存成功操作后的数据并使下次顺利读取
for(i=0; i<n; i++)//用循环将数据写入文件中
{
if(user[i]!=NULL)//若未销户,则写入文件,即删除已销户用户
{
outputfile<<user[i]->idnumber<<"  ";
outputfile<<user[i]->address<<"  ";
outputfile<<user[i]->number<<"  ";
outputfile<<user[i]->name<<"  ";
outputfile<<user[i]->password<<"  ";
outputfile<<user[i]->leftmoney<<"  ";
outputfile<<user[i]->condition<<endl;
}
delete user[i];//释放空间
}
outputfile.close();
}
/******************************
*功能描述:选择并办理相办业务
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:无
******************************/
void Bank::Work()//决定办什么业务
{
int i=1;
int N;//我是用序号,即用户数组的下标N-1来找对应的用户信息
while(1)//业务员结束对一个用户的操作后若不选择退出,可继续对另一客户进行操作,而不用重启程序
{
cout<<endl;
cout<<"+----------------------------+"<<endl;
cout<<"+ 1 查询    2 存钱    3 取钱 +"<<endl;
cout<<"+ 4 开户    5 销户    6 转账 +"<<endl;
cout<<"+ 7  改密   8 挂失    9解挂  +"<<endl;
cout<<"+ 10 显示账户信息            +"<<endl;
cout<<"                      0 退出 +"<<endl;
cout<<"+----------------------------+"<<endl;
cout<<"请输入操作指令:";
cin>>i;
if(i==4)//一开始就开户的话无需已有用户
Openoccount();
else//对已有用户进行操作
{
cout<<"请输入本次操作户主的顺序号:";
cin>>N;
while(N>n||N<1)//输入的顺序号错误,没有此用户,若不退出,则一直到输入正确的顺序号才进行下一步操作
{
cout<<"输入有误,此用户不存在,请仔细检查。若要继续,请输入1,退出请输入2;";
int j;
cin>>j;
if(j==1)
{
cout<<"请输入顺序号:";
cin>>N;
}
else
break;
}
if(n>=N>0)//排除选择退出引起的混乱
if(user[N-1]->Provepassword())//密码的验证
while(i!=0)//只要不选择退出,就一直对此用户进行操作
{
if(i>0 && i<11)
{
switch(i)
{
case 1:
Search(N-1);
break;
case 2:
Save(N-1);
break;
case 3:
Take(N-1);
break;
case 4:
Openoccount();
break;
case 5:
Canceloccount(N-1);
break;
case 6:
Transferaccount(N-1);
break;
case 7:
Changepass(N-1);
break;
case 8:
Loss(N-1);
break;
case 9:
Removel(N-1);
break;
case 10:
user[N-1]->Show();
break;
}
}
else
cout<<"请重新选择功能"<<endl;//若输入的数字不在选项中,重新输入
if(user[N-1]==NULL)//若进行销户操作后,则不再对此用户进行操作
{
break ;
}
cout<<endl;
cout<<"+----------------------------+"<<endl;
cout<<"+ 1 查询    2 存钱    3 取钱 +"<<endl;
cout<<"+ 4 开户    5 销户    6 转账 +"<<endl;
cout<<"+ 7  改密   8 挂失    9解挂  +"<<endl;
cout<<"+ 10 显示账户信息            +"<<endl;
cout<<"                      0 退出 +"<<endl;
cout<<"+----------------------------+"<<endl;
cout<<"请输入操作指令:";
cin>>i;
}
}
cout<<"已结束对此用户的操作!"<<endl;//已完成一位用户的所有要求
cout<<"要关闭操作请输入1,继续请输入除1之外的任意键:";//就像是选择“下班”还是”继续工作“
cin>>i;
if(i==1)
break;
}
}
/********************************************
*功能描述:查询余额或是账户状态
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:无
*********************************************/
void Bank::Search(int nu)
{
if(user[nu]->condition!=2)//状态正常的账户才能进行此操作
{
cout<<"查询余额请输入1,查询状态请输入2:";//查询余额和账户状态的选择
int i;
cin>>i;
while(i!=1&&i!=2)//输入的选择数字有误
{
cout<<"输入有误,继续查询请按1,取消请输入2,请再次输入:";
int j;
cin>>j;
if(j==1)
cin>>i;
else break;
}
if(i==1)//查询余额
cout<<"账户余额为:"<<user[nu]->leftmoney<<endl;
else//状态的查询
{
if(user[nu]->condition==1)
cout<<"您的账户一切正常。"<<endl;
else if(user[nu]->condition==2)
cout<<"您已销户,此账户为无效账户。"<<endl;
else cout<<"您的账户已办理挂失。"<<endl;
}
}
else cout<<"此账户已销户,不能进行查询操作"<<endl;
}
/********************************************
*功能描述:存款
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:无
*********************************************/

void Bank::Save(int nu)//存款
{
if(user[nu]->Condition())//状态正常的账户才能进行此操作
{
cout<<"请输入存款金额:(元)";
int m;
cin>>m;
cout<<"成功存款 "<<m<<" 元"<<endl;
user[nu]->leftmoney+=m;//成功存入m元
}

}
/********************************************
*功能描述:取款
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:无
*********************************************/
void Bank::Take(int nu)//取款
{
if(user[nu]->Condition())//状态正常的账户才能进行此操作
{
cout<<"请输入取款金额:(元)";
int m;
cin>>m;
while(m>user[nu]->leftmoney)
{
cout<<"余额不足,继续取款请输入1,退出此操作请输入2;";
int j;
cin>>j;
if(j==1)
{
cout<<"请输入取款金额:  ";
cin>>m;
}
else if(j==2)
{
m=0;
break;
}
else
while(j!=1&&j!=2)
{
cout<<"输入有误,继续取款请按1,取消取款请按2:请再次输入正确的数字:";
cin>>j;
}
}
cout<<"成功取款 "<<m<<" 元"<<endl;
user[nu]->leftmoney-=m;
}

}
/********************************************
*功能描述:开户
*输入参数:无
*输出参数:无
*返回值:无
*其他说明:账号时系统自动连续生成的,状态自动为1
*********************************************/
void Bank::Openoccount()
{
int i=0;
++n;
if(n>maxUser)
{
cout<<"对不起,人数已满,不能再开户,请您到其他银行办理此业务,我们对因此给您带来的麻烦表示由衷的歉意。"<<endl;
}
else
{
string idnu,add;
int acc;
int nu;   //账号
string na;   //姓名
int pass;   //密码
double lef;   //金额
int cond=1;   //状态
cout<<"正在开户"<<endl;
nu=user[n-2]->number+1;
cout<<"账号:"<<nu<<endl;
cout<<"户主姓名:";
cin>>na;
cout<<"身份证号:";
cin>>idnu;
cout<<"住址为:";
cin>>add;
cout<<"请输入开户密码:";
pass=inputPassword();
cout<<"请再次确认密码:";
int p1;
p1=inputPassword();
while(p1!=pass)
{
cout<<"两次密码不一致!!"<<endl;
cout<<"返回请输入1,继续请输入其他"<<endl;
cin>>i;
if(i==1)
break;
cout<<"请您再次设立密码,请注意两次密码应一致:";
pass=inputPassword();
cout<<"请再次确认密码:";
p1=inputPassword();
}
if(i!=1)
{
cout<<"请输入开户金额:";
cin>>lef;
user[n-1]=new User(idnu,add,nu,na,pass,lef,cond);
user[n-1]->account=n;
cout<<"开户成功,请注意牢记并保护好您的个人信息,防止钱财丢失。"<<endl;
}
}
}
/******************************************************************
*功能描述:销户
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:销户后,状态为2且清除此用户的数据,保存数据至文件时,清除用户
*******************************************************************/
void Bank::Canceloccount(int nu)
{
if(user[nu]->Condition())//状态正常的账户才能进行此操作
{
int j=1;
while(user[nu]->leftmoney>0)//余额不为零不能销户
{
cout<<"您目前还有余额:"<<user[nu]->leftmoney<<"元,请先取出所有余额后再销户。"<<endl;
cout<<"继续销户请按1,取消销户请按2:";
cin>>j;
while(j!=1&&j!=2)
{
cout<<"输入有误,继续销户请按1,取消销户请按2:请再次输入正确的数字:";
cin>>j;
}
if(j==1)
{
cout<<"请取出全部余额"<<endl;
Take(nu);
}
else break;
}
if(j==1)
{
user[nu]->condition=2;
cout<<"销户成功,即将结束本次操作。"<<endl;
user[nu]= {NULL};
}
}
}
/********************************************
*功能描述:转账
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:无
*********************************************/
void Bank::Transferaccount(int nu)
{

if(user[nu]->Condition())//状态正常的账户才能进行此操作
{
cout<<"请输入转入账户的序号:";
int i,j=1,k;
cin>>i;
while(i>n+1||i<1)//判断对方账户是否存在
{
cout<<"此账户不存在,继续输入账号请输入1,退出此操作请输入2;";
cin>>j;
if(j==1)
{
cout<<"请输入转入账户序号:  ";
cin>>i;
}
else break;
}
if(j==1)//对方账户存在
{
cout<<"请输入转账金额:(元)";
int m;
cin>>m;
while(m>user[nu]->leftmoney)//转出金额必须小于等于用户账户余额
{
cout<<"余额不足,重新输入转账金额请输入1,退出此操作请输入2:";
cin>>k;
while(k!=1&&k!=2)
{
cout<<"输入有误,继续转账请按1,取消转账请按2:请再次输入正确的数字:";
cin>>k;
}
if(k==1)

{
cout<<"请输入转账金额 :";
cin>>m;
}
else
{
m=0;
break;
}
}
cout<<"成功转账 "<<m<<" 元"<<endl;
user[i-1]->leftmoney+=m;//对方账户转入m元
user[nu]->leftmoney-=m;//此用户转出m元
}
}
}
/********************************************
*功能描述:改密
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:无
*********************************************/
void Bank::Changepass(int nu)
{
if(user[nu]->Condition())//状态正常的账户才能进行此操作
{
int p1,p2;
cout<<"请输入原密码:";
if(user[nu]->Provepassword())//输入密码
{
cout<<"请输入新密码:";
p1=inputPassword();
cout<<"请再次确认新密码: ";
p2=inputPassword();//输入六位数的密码
if(p1!=p2)
{
cout<<"两次密码不一致,改密失败"<<endl;
}
else
cout<<"改密成功,请牢记并保护好您的新密码。"<<endl;
}
}
}
/********************************************
*功能描述:挂失
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:挂失后状态代号为3
*********************************************/
void Bank::Loss(int nu)
{
if(user[nu]->Condition())//状态正常的账户才能进行此操作
{
user[nu]->condition=3;
cout<<"挂失成功"<<endl;
}
}
/********************************************
*功能描述:解挂
*输入参数:用户在数组中的下标,即顺序号-1
*输出参数:无
*返回值:无
*其他说明:解挂后账户代号为1;
*********************************************/
void Bank::Removel(int nu)
{
if(user[nu]->condition==3)//状态为挂失的账户才能进行解挂操作
{
user[nu]->condition=1;//解挂成功,状态为正常
cout<<"解挂成功"<<endl;
}
else if(user[nu]->condition==1)cout<<"此卡未被挂失,无需解挂。"<<endl;
else cout<<"此账户已被销户,不能解挂"<<endl;
}
/************************************************
*版权所有(c)2015.烟台大学计算机与控制工程学院
*
*文件名称:work.cpp
*文件标示:无
*内容摘要:该代码用于满足后缀要求的第一个文件
*其他说明:无
*当前版本:V1.0
*作者:李长鸿
*完成日期:2015.7.17
*
*修改记录:
*修改日期:
*版本号:V1.0
*修改人:
*修改内容:
/************************************************/
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include "BU.h"
using namespace std;
/*
功能:验证用户密码
返回值:密码正确,返回1;
不能通过密码验证,返回0
*/
/********************************************
*功能描述:业务员登录
*输入参数:无
*输出参数:无
*返回值:登陆的结果,成功为1,失败为0
*其他说明:无
*********************************************/
int pass()
{
char sNameInFile[20];   //由文件中读出的业务员用户名
char sPassInFile[20];  //文件中保存的密码,这一版本中,用字符保存密码
ifstream infile("password.txt",ios::in);
if(!infile)
{
cout<<"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;  //要返回的结果:0-不正确 1-正确

//进入系统,密码三次不对将退出
do
{
cout<<"请输入业务员用户名:";
cin>>sName;
cout<<"请输入密码:";
int i=0;
while((ch=getch())!='\r')  //getch在接受输入后,不在屏幕上显示
{
sPass[i++]=ch;
putchar('*');   //接受任何字符,屏幕上只显示*
}
sPass[i]='\0';
fflush(stdin);
cout<<endl;;
if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0)
{
right = 1;
break;
}
else
{
iTry--;
if(iTry>0)
cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
else
{
cout<<"对不起,你不能进入系统"<<endl;;
}
}
}
while(iTry);
return right;
}
/********************************************
*功能描述:输入密码
*输入参数:无
*输出参数:无
*返回值:六位数的数字密码,且不全为0
*其他说明:无
*********************************************/
int inputPassword()
{
int ch;  //接收数字形式密码
int i, Pass=0;
while(1)
{
for(i=0; i<6; i++)
{
ch=getch()-'0';  //输入但不显示
putchar('*');   //输出*
if(ch>9||ch<0)//非数字字符退出循环,i<6
break;
else Pass=Pass*10+ch;
}
fflush(stdin); //清除键盘缓存区中已经有的输入
cout<<endl;
if(Pass==0||i<6)  //6位全0后Pass=0,或输入了非数字字符退出转换成密码的循环
{
cout<<"密码要求全为数字,且不能全0!"<<endl;
cout<<"请重新输入密码: ";
}
else
break;
}
return Pass;
}
/*
关于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);清除输入缓存区
*/

acc.txt:



运行截图:

业务员登录失败



成功登陆及查询



存款



取款



新用户开户



老用户开户



转账



改密



挂失及查询



解挂及显示个人信息



销户



account.txt

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