代码:
bank.h
/*
*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.
*All rights reserved.
*文件名称: main.cpp
*作者:冷基栋
*完成日期:2015年7月16日
*版本号:v1.0
*内容摘要:对所有类,函数进行了声明
*修改内容:1.运用二进制文件来存储用户的信息
2.运用了动态数组
3.增加了对用户开户,存取款以及转账的日期的记录
4.新增了一个基类,包含日期数据成员
*修改日期:2015年7月16日
*修改人:冷基栋
*/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
using namespace std;
class Bank;
const int upNum=2000; //系统最多容纳的用户数
/*
功能:基类,用于菜单选择,业务员登录和密码输入等先前业务
说明:相当于登录页面
*/
class BASE
{
public:
int year; //年
int month; //月 .
int day; //日
public:
int chooseInMenu();//显示菜单并由业务员选择
int inputPassword();//返回键盘输入的密码
};
/*
功能:用户信息的声明和输入,为Bank类做准备
说明:成员函数为Bank类做辅助
*/
class User:public BASE
{
public:
void setUser(int acc, char nam[30], int pw, double bal,char ide[50],int sta,int y,int m,int d);
void showName();
void showBalance(string prompt); //显示余额,前面加上提示词prompt
bool passwordIsRight(); //校验密码,输入的密码正确则返回true
bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示
friend class Bank; //将Bank声明为友元类,方便其访问数据成员
char id[50];
private:
int account; //账号
int password; //密码
char name[30]; //用户名
double balance; //账户余额
int status; //状态 0-正常 1-挂失 2-销户
};
/*
功能:主要用于业务办理,信息读取和存储
说明:User类指针用于动态存储
*/
class Bank:public User
{
public:
Bank(); //开始前从文件中读数据,存在数组中
~Bank(); //程序结束前,将数组中的数据写入到文件中
void work(); //业务驱动
void openAccount(); //开户
void cancelAccount(); //注销账户
void save(); //存款
void withdraw(); //取款
void showAccount(); //查询余额
void transferAccounts(); //转账
void reportLoss(); //挂失
void cancelLoss(); //解除挂失
void updatePassword(); //更改密码 需要验证身份ID 实际系统中应该是扫磁
int getUser();//输入账号查询用户,返回用户在对象数组中的下标
void savework(int usernum,string infor);//记录用户的每一笔业务
private:
int N; //实际的用户数目
User *users; //User数组,耗空间啊!改进方案:1.对象指针数组;2. 动态数组;3. 链表
};
int pass(); //业务员登录
#endif // BANK_H_INCLUDED
bank.cpp
/*
*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.
*All rights reserved.
*文件名称: main.cpp
*作者:冷基栋
*完成日期:2015年7月16日
*版本号:v1.0
*内容摘要:对bank类,函数进行了定义
*修改内容:1.运用二进制文件来存储用户的信息
2.运用了动态数组
3.增加了对用户开户,存取款以及转账的日期的记录
4.新增了一个基类,包含日期数据成员
*修改日期:2015年7月16日
*修改人:冷基栋
*/
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "bank.h"
#include <ctype.h>
#include <time.h>
using namespace std;
/*
功能:用构造函数读取文件中保存的业务数据
*/
Bank::Bank()
{
ifstream infile("account.txt",ios::in|ios::binary);
if(!infile) //检测文件是否成功打开
{
cerr<<"open error!"<<endl;
exit(1);
}
//利用文件指针计算文件的长度,从而计算出用户对象的个数
infile.seekg (0, ios::end); //将文件指针标记在文件末尾
int length = infile.tellg(); //计算出文件的长度
N=length/sizeof(User); //计算出对象的个数,然后用静态数据成员保存用户个数
users=new User[N+1]; //动态数组建立对象数组
infile.seekg(0,ios::beg); //操作完文件指针后一定要把指针重新定义在文件首的位置
int i=0; //用户数目
while(infile.read((char *)&users[i],sizeof(users[i])))
{
infile.read((char *)&users[i],sizeof(users[i]));
++i;
}
//用静态数据成员保存用户个数
infile.close();
}
/*
功能:用析构函数,在退出系统时,将数据保存到文件中
*/
Bank::~Bank()
{
ofstream outfile("account.txt",ios::binary);
if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。
{
cerr<<"open error!"<<endl;
exit(1);
}
int i;//将users数组内的内容写回文件
for(i=0; i<N; i++)
{
outfile.write((char *)&users[i],sizeof(users[i]));
}
outfile.close();
free(users); //对应realloc()函数
delete[] users; //切记释放动态数组占用的空间7
}
/*
功能:办理业务
*/
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:
updatePassword(); //更改密码
brea