主文件
main.cpp
/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: main.cpp
* 文件标识:无
* 内容摘要:为主函数
* 其它说明:无
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期: 2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;
/*主函数:*/
int main()
{
cout<<"+----------------------+\n";
cout<<"+ 欢迎光临CSDN银行 +\n";
cout<<"+----------------------+\n";
Bank b;
if (pass())
{
//Bank b; //原参考中多创建了一个Bank对象,造成一个诡异的Bug,详细解释见下面“注”处的链接
b.work();
}
return 0;
}
头文件
bank.h
/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: bank.h
* 文件标识:无
* 内容摘要:为头文件,包含User类和Bank类,两者又采取了组合形式
* 其它说明:无
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期: 2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
using namespace std;
const int upNum=2000; //系统最多容纳的用户数
class Bank;
/*User类,用于定义个人用户对象*/
class User
{
public:
void setUser(int acc, char *nam, int pw, double bal,int sta,char se,char* ID,char* add,char* ph);
void showName();
void showBalance(string prompt); //显示余额,前面加上提示词prompt
bool passwordIsRight(); //校验密码,输入的密码正确则返回true
bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示
friend class Bank; //将Bank声明为友元类,方便其访问数据成员
private:
int account; //账号
int password; //密码
char name[20]; //用户名
double balance; //账户余额
char sex; //性别
char IDcard[20]; //身份证号
char address[30]; //地址
char phonenumber[20]; //电话号码
int status; //状态 0-正常 1-挂失 2-销户
};
/*Bank类,用于对个人用户的操作*/
class Bank
{
public:
Bank(); //开始前从文件中读数据,存在数组中
~Bank(); //程序结束前,将数组中的数据写入到文件中
void work(); //业务驱动
void openAccount(); //开户
void cancelAccount(); //注销账户
void save(); //存款
void withdraw(); //取款
void showAccount(); //查询余额
void transferAccounts(); //转账
void reportLoss(); //挂失
void cancelLoss(); //解除挂失
void updatePassword(); //更改密码
int getUser(); //输入账号查询用户,返回用户在对象数组中的下标
private:
int N; //实际的用户数目
User *users; // 动态数组;
};
int pass(); //业务员登录
int chooseInMenu(); //显示菜单并由业务员选择
int inputPassword(); //返回键盘输入的密码
#endif // BANK_H_INCLUDED
User类源文件
user.cpp
/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: user.cpp
* 文件标识:无
* 内容摘要:为源文件用于对user类中所声明函数的定义
* 其它说明:其对象作为bank.h的数据成员
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期: 2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;
void User::setUser(int acc, char* nam, int pw, double bal,int sta,char se,char* ID,char* add,char* ph)
{
account=acc;
strcpy(name,nam);
password=pw;
balance=bal;
sex=se;
strcpy(IDcard,ID);
strcpy(address,add);
strcpy(phonenumber,ph);
status=sta;
}
void User::showName()
{
cout<<"户主姓名:"<<name<<endl;
}
void User::showBalance(string prompt)
{
cout<<prompt<<" "<<balance<<" 元"<<endl;
}
bool User::passwordIsRight()
{
int iPass;
bool right = true;
cout<<"输入密码:";
iPass=inputPassword();
if(iPass!=password)
{
right = false;
cout<<"输入密码错误,不能继续操作!"<<endl;
}
return right;
}
bool User::isNormalUser()
{
bool normal = true;
if(status!=0)
{
normal = false;
cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能继续操作..."<<endl;
}
return normal;
}
wokr.cpp
/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: work.cpp
* 文件标识:无
* 内容摘要:为源函数,用于业务驱动,业务员进入银行系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期: 2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include "bank.h"
/*
关于头文件的说明:
*<conio>是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,
*主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
*<cstdlib>是C++里面的一个常用函数库, 等价于C中的<stdlib.h>。stdlib.h可以提供一些函数与符号常量,
*<cstring>主要用于字符串的操作
*<ctype.h>是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),
*用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节(Byte)字符,也支持宽字符
*"bank.h"为用户自定义的头文件
*/
using namespace std;
/*
功能:验证用户密码
返回值:密码正确,返回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;
}
/*
关于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);清除输入缓存区
*/
/*
功能:显示菜单并由业务员选择
返回值:用户选择的功能,范围0-9
*/
int chooseInMenu()
{
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;
}
/*
功能:输入密码
返回值:整型的密码值
技术说明:
(1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数
(2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数
(3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入
附:在实际的系统中,密码通常用字符串描述,即使只允许出现数字字符,本例仅作为参考
*/
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;
}
bank.cpp
销户
存款
取款
查询
挂失
解挂
改密
转账