* 课程设计概述
*/
* C++课程设计:
* 银行储蓄系统
*
* 功 能 介 绍:
* 面向用户版的银行系统,模拟自己进入银行时相关的操作。
* 首次进入银行时,需要办理相应的银行卡。
* 当用户有银行卡后,可以办理银行有的一般业务。
* 业务包括:查询、存款、取款、转账、销户
* 挂失、解挂、改密。
* 同时设置了管理员的一个功能,查询银行所有账户的信息。
*
* 功能实现 :
* 文件保存与读取
* 为了更好的模拟真实的银行系统,采用了将用户的数据保存在文件中并且在银行系
* 统运行时将已有用户的信息读入指针数组和链表中。
* 采用指针数组和链表储存数据
* 程序运行前从文件读入的用户数据会分别保存在指针数组和链表的各个节点中,当
* 程序中有用户新建银行卡的操作时,成功建卡后数据也会加入指针数组和链表后。
* 用户的业务办理更加真实的模拟银行系统
* 主要体现在用户在不用的账户状态可以进行不同的操作
* 账户状态为”正常”的用户可以进行所有的业务办理
* 账户状态为”销户”的用户只能进行查询业务
* 账户状态为”挂失”的用户只能进行查询和解挂业务
* 还有一部分体现在用户输入是否符合银行业务的标准的效验上
*/
* 源代码
* main.cpp
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:实现了在必要信息的打印和银行中具体业务的实现
*/
#include <iostream>
#include "Bank.h"
#include "User.h"
#include <fstream>
#include <windows.h>
#include <conio.h>
void Welcome();
void choice_busniss(Bank *b);
void change_message(User *user);
User* input_account();
using namespace std;
User *newUser[100]; //全局指针数组,办卡的用户统一用此指针指向的对象,用指针数据的目的在于比较节省内存空间
int UserNumbers=0; //全局变量,用来记录办卡的人数,每从文件中读取或者通过办卡新建一个账户时,实现加1
int main()
{
Bank bank;
do
{
Welcome();
choice_busniss(&bank);
system("pause"); //实现一个等待用户输入任意按键继续的功能,需要加上头文件window.h
}
while(1);
return 0;
}
/*********************************
* 功能描述:打印银行主要业务页面
* 输入参数:无
* 输出参数:无
*********************************/
void Welcome()
{
cout<<"*******************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 欢迎来到这家银行 *"<<endl;
cout<<"* *"<<endl;
cout<<"*******************************"<<endl;
cout<<"* *"<<endl;
cout<<"* * 您要干啥? *"<<endl;
cout<<"* * 1.办卡 *"<<endl;
cout<<"* * 2.办理业务 *"<<endl;
cout<<"* * 3.离开 *"<<endl;
cout<<"* * 4.银行管理 *"<<endl;
cout<<"* *"<<endl;
cout<<"*******************************"<<endl;
}
/*************************************************************************
* 功能描述:可以选择并实现银行主页面上业务的功能,是整个项目的核心函数
* 输入参数:Bank类的指针变量
* 输出参数:无
*************************************************************************/
void choice_busniss(Bank *b)
{
int choice; //这一个变量可以用于实现以下三个地方出现的选择,第一个是选择银行主页面上的业务,
//第二个是办理业务里面的用户业务,第三个是银行管理里面的业务
cout<<"选择的服务是:";
cin>>choice;
switch(choice)
{
case 1: //当选择为1时,进行办卡业务
{
int i; //循环变量
int state=0;
int account,password;
char name[20];
char id[30];
char address[20];
double balance; //以上7个变量为暂存新建卡用户信息的变量
char judge; //为了判断输入的是Y还是N的变量
account=b->return_account_number(); //调用Bank类的成员函数得到账号并实现类中静态数据成员自增操作
cout<<"----------------------------------"<<endl;
cout<<"- 请填写以下必要的信息完成卡的创建"<<endl;
cout<<"- 持卡人姓名 : ";
cin>>name;
cout<<"- 身份证号 : ";
cin>>id;
cout<<"- 家庭住址 : ";
cin>>address;
cout<<"- 密码(6位) : ";
cin>>password;
cout<<"- 是否往卡里存钱(Y/N) : ";
cin>>judge;
if(judge=='Y'||judge=='y')
{
cout<<"- 存入金额 : ";
cin>>balance;
}
else
balance=0;
newUser[UserNumbers]=new User;
(*newUser[UserNumbers]).Set_User(account,password,state,name,id,address,balance); //当完成以上输入判定时,新建对象并初始化,然后用指针数组指向对象
print_message(*newUser[UserNumbers]);
cout<<"是否需要修改您的信息?(Y/N)";
cin>>judge;
if(judge=='Y'||judge=='y')
change_message(&(*newUser[UserNumbers])); //输出用户刚刚输入的建卡信息,并提示用户是否要修改信息
Node *node=new Node(newUser[UserNumbers]);
b->list->append(node);
UserNumbers++; //当建卡操作全部完毕后,将新增加的用户加入银行链表,并自增用户人数
for(i=0; i<6; i++) //这个for循环实现了停顿显示'.',只是娱乐,需要加入头文件window.h
{
cout<<'.';
Sleep(200);
}
cout<<endl;
cout<<"- 您的银行卡已经成功创建,感谢您对银行的支持!"<<endl;
break;
}
case 2: //当选择为2时,进行办理用户业务操作
{
User* finduser=input_account(); //在进行操作前需要验证用户的账号和密码是否存在或正确,当正确时返回用户的指针,进行如下操作
do
{
cout<<"+----------------------------+"<<endl;
cout<<"+ 1 查询 2 改密 3 存款 +"<<endl;
cout<<"+ 4 取款 5 转账 6 销户 +"<<endl;
cout<<"+ 7 挂失 8 解挂 0 退出 +"<<endl;
cout<<"+----------------------------+"<<endl;
cout<<"请输入操作指令:";
cin>>choice;
switch(choice) //这个switch语句中实现了9个用户业务的操作
{
case 1: //查询账户信息功能
{
print_message(*finduser); //调用显示用户信息的函数,形参为用户对象的引用
break;
}
case 2: //账户改密的功能
{
if(b->judge_state(finduser)==0) //if和else语句实现了功能:当用户状态是销户或者挂失时,不能进行用户业务操作
//并通过print_error()函数提示用户此账户的状态,下面不一一赘述
b->change_password(finduser);
else
b->print_error(finduser);
break;
}
case 3: //账户存款功能
{
if(b->judge_state(finduser)==0)
b->deposit(finduser);
else
b->print_error(finduser);
break;
}
case 4: //账户取款功能
{
if(b->judge_state(finduser)==0)
b->draw_money(finduser);
else
b->print_error(finduser);
break;
}
case 5: //账户转账功能
{
if(b->judge_state(finduser)==0)
b->transform_accounts(finduser);
else
b->print_error(finduser);
break;
}
case 6: //账户销户功能
{
if(b->judge_state(finduser)==0)
b->delete_account(finduser);
else
b->print_error(finduser);
break;
}
case 7: //账户挂失功能
{
if(b->judge_state(finduser)==0)
b->lose_card(finduser);
else
b->print_error(finduser);
break;
}
case 8: //账户解挂功能,只有在账户状态为挂失时才能进行如下操作
{
if(b->judge_state(finduser)==1)
b->get_card(finduser);
else
b->print_error(finduser);
break;
}
}
}
while(choice!=0); //当选择不是0时,可以重复进行用户业务办理操作
break;
}
case 3: //退出银行
{
b->~Bank(); //调用银行析构函数,意在将所有新建卡的用户保存在文件中
exit(1); //终止程序
}
case 4: //查询银行链表的功能选项
{
cout<<"+------------------+"<<endl;
cout<<"+ 1.查询银行链表 "<<endl;
cout<<"+ 2.返回 "<<endl;
cout<<"+------------------+"<<endl;
cout<<"选择业务:"<<endl;
cin>>choice;
switch(choice)
{
case 1:
{
b->list->Display_list(); //调用链表类中输出链表函数实现链表的输出
break;
}
case 2:
{
break;
}
}
}
}
}
/**********************************************************************************************
* 功能描述:实现在用户选择银行主页面业务1时的是否更改信息的功能,若用户选择Y,则执行此函数
* 输入参数:User类的指针变量
* 输出参数:无
**********************************************************************************************/
void change_message(User *user)
{
int account=user->account;
int state=0;
int password;
char name[20];
char id[30];
char address[20];
double balance=user->balance;
cout<<"- 当前持卡人姓名 : "<<user->name<<" ->";
cin>>name;
cout<<"- 当前身份证号 : "<<user->id<<" ->";
cin>>id;
cout<<"- 当前家庭住址 : "<<user->address<<" ->";
cin>>address;
cout<<"- 当前密码 : "<<user->password<<" ->";
cin>>password;
user->Set_User(account,password,state,name,id,address,balance);
cout<<"- 信息已成功修改"<<endl;
print_message(*newUser[UserNumbers]);
}
/***********************************
* 功能描述:实现输出用户信息的功能
* 输入参数:User类的对象引用
* 输出参数:无
***********************************/
void print_message(User &user)
{
cout<<"-----------------------"<<endl;
cout<<"- 银行卡状态 :"<<(user.flag==0?"正常":(user.flag==1?"挂失":"销户"))<<endl;
cout<<"- 银行卡号 :"<<user.account<<endl;
cout<<"- 密码 :"<<user.password<<endl;
cout<<"- 卡内余额 :"<<user.balance<<endl;
cout<<"- 姓名 :"<<user.name<<endl;
cout<<"- 身份证号 :"<<user.id<<endl;
cout<<"- 家庭住址 :"<<user.address<<endl;
}
/***********************************************************************************
* 功能描述:实现了用户在办理业务前登入账户的操作,并且对用户的输入进行相关的效验
* 输入参数:无
* 输出参数:User类对象的指针变量,代表成功登入银行后当前用户的指针
***********************************************************************************/
User* input_account()
{
User* finduser;
char ch;
int acc,pass;
char inpass[7];
char ascpass[7];
int i,j=0;
int trypass=3;
while(1)
{
cout<<"请输入您的账号:";
cin>>acc;
int judge=-1;
for(i=0; i<UserNumbers; i++)
if(acc==newUser[i]->account)
{
finduser=newUser[i];
int pass6,pass5,pass4,pass3,pass2,pass1;
pass=newUser[i]->password;
pass6=pass/100000;
pass5=pass%100000/10000;
pass4=pass%100000%10000/1000;
pass3=pass%100000%10000%1000/100;
pass2=pass%100000%10000%1000%100/10;
pass1=pass%100000%10000%1000%100%10;
judge=1;
ascpass[0]=char(pass6+48);
ascpass[1]=char(pass5+48);
ascpass[2]=char(pass4+48);
ascpass[3]=char(pass3+48);
ascpass[4]=char(pass2+48);
ascpass[5]=char(pass1+48);
ascpass[6]='\0';
break;
}
if(judge==1)
{
break;
}
else
cout<<"帐号不存在,请重试。"<<endl;
}
for(i=0; i<3; i++)
{
j=0;
cout<<"请输入您的密码:";
while((ch=getch())!='\r') //getch在接受输入后,不在屏幕上显示
{
inpass[j++]=ch;
putchar('*'); //接受任何字符,屏幕上只显示*
}
inpass[j]='\0';
fflush(stdin);
if(strcmp(inpass,ascpass)!=0)
{
--trypass;
if(trypass>0)
cout<<"超过3次将退出,你还可以尝试"<<trypass<<"次!"<<endl;
else
{
cout<<"对不起,你不能进入系统"<<endl;
exit(0);
}
}
else
{
cout<<endl;
break;
}
}
return finduser;
}
* Bank.h
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:Bank.h
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:Bank类的声明
*/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include "LinkList.h"
#include <fstream>
using namespace std;
class Bank
{
public:
Bank();
~Bank();
int return_account_number(); //实现用户新建卡时给予用户银行卡账号的函数
void change_password(User *user); //银行业务主页面业务2中改密业务
void deposit(User *user); //银行业务主页面业务2中存款业务
void draw_money(User *user); //银行业务主页面业务2中取款业务
void transform_accounts(User* user); //银行业务主页面业务2中转账业务
void delete_account(User* user); //银行业务主页面业务2中销户业务
void lose_card(User* user); //银行业务主页面业务2中挂失业务
void get_card(User* user); //银行业务主页面业务2中解挂业务
int judge_state(User* user); //判断账户状态的函数,通过返回值来确定是否执行银行业务主页面业务2中业务
void print_error(User* user); //和判断账户状态函数对应的一个函数,当用户状态不满足业务操作时,输出提示信息
LinkList *list; //链表数据成员
private:
static int account_number; //静态成员,生成新建卡用户银行卡账号
};
#endif // BANK_H_INCLUDED
* Bank.cpp
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:Bank.cpp
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:Bank类中成员函数的实现
*/
#include "Bank.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "Node.h"
#include <conio.h>
#include <cstring>
using namespace std;
extern User *newUser[100];
extern int UserNumbers; //以上两个语句通过extern语句实现了使用main函数中已经定义的全局变量
int Bank::account_number=10000; //初始化Bank类中静态数据成员,定义第一个用户的账号为10000
/***************************************************************************************
* 功能描述:Bank类的构造函数,实现了从文件中读入已有账户的信息,并保存在指针数组中。
* 同时完成操作:每从文件中读入一个用户数据就增加一个节点同时保存用户信息。
* 输入参数:无
* 输出参数:无
***************************************************************************************/
Bank::Bank()
{
ifstream infile("UsersData.dat",ios::in); //从文件中读入已经在银行注册卡的用户数据,文件名字应与析构函数中写入的文件同名
list=new LinkList;
if(!infile)
{
cerr<<"open error!"<<endl;
exit(1);
}
int acc,pass,fla;
char *nam=new char[20];
char *i=new char[30];
char *add=new char[20];
double balan;
while(infile>>acc>>pass>>fla>>nam>>i>>add>>balan) //当读取成功……
{
Node *node=new Node;
newUser[UserNumbers]=new User;
newUser[UserNumbers]->Set_User(acc,pass,fla,nam,i,add,balan);
node->user=newUser[UserNumbers];
list->append(node);
account_number++;
UserNumbers++;
}
infile.close();
}
/***************************************************************************************************************
* 功能描述:Bank类的析构函数,实现了将本次操作中所有新建卡的用户和从文件中读入指针数组的用户都保存在文件中
* 输入参数:无
* 输出参数:无
***************************************************************************************************************/
Bank::~Bank()
{
int i;
ofstream outfile("UsersData.dat",ios::out);
if(!outfile) //测试文件打开操作是否成功,不成功则提示后退出。
{
cerr<<"open error!"<<endl;
exit(1);
}
for(i=0; i<UserNumbers; i++) //当i小于用户的总人数时,重复写入文件中
{
outfile<<newUser[i]->account<<" ";
outfile<<newUser[i]->password<<" ";
outfile<<newUser[i]->flag<<" ";
outfile<<newUser[i]->name<<" ";
outfile<<newUser[i]->id<<" ";
outfile<<newUser[i]->address<<" ";
outfile<<newUser[i]->balance<<endl; //结尾的endl为了在文件中更好的区别每一个账户
}
delete list;
outfile.close();
}
/********************************************************
* 功能描述:实现返回当前银行卡账号给新建卡的用户的功能
* 输入参数:无
* 输出参数:Bank类中静态数据成员account_number
********************************************************/
int Bank::return_account_number()
{
return Bank::account_number++;
}
/*****************************************************************************************************************
* 功能描述:实现了更改用户密码的功能,其中还调用了User类中update_password()函数,用于将字符密码转换为数字密码
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
*****************************************************************************************************************/
void Bank::change_password(User *user)
{
int j=0; //循环变量
char ch; //用于接收用户输入的字符变量
int oldpassword; //用于接收用户输入的旧密码
char newpassword[7];
char repassword[7]; //以上两个字符数组用于保存用户输入的要更改的密码和确认后的密码,
//通过比较判断两次输入是否一致选择是否更改密码
do
{
cout<<"请输入您的旧密码:";
cin>>oldpassword;
if(oldpassword==user->password)
break;
else
cout<<"您的输入有误,请重试。"<<endl;
}
while(1); //当输入密码和该账户的原密码相同时,跳出此循环,进行更新密码的操作。否则继续输入旧密码
for(;;)
{
cout<<"请输入您的新密码:";
j=0;
while((ch=getch())!='\r') //getch在接受输入后,不在屏幕上显示
{
newpassword[j++]=ch;
putchar('*'); //接受任何字符,屏幕上只显示*
}
newpassword[j]='\0';
cout<<endl;
cout<<"请确认您的新密码:";
j=0;
while((ch=getch())!='\r') //getch在接受输入后,不在屏幕上显示
{
repassword[j++]=ch;
putchar('*'); //接受任何字符,屏幕上只显示*
}
repassword[j]='\0';
cout<<endl; //以上操作完成接收两次输入的密码
if(strcmp(newpassword,repassword)==0) //比较两次输入的密码是否一致
{
user->update_password(newpassword); //当输入密码一致时,调动User类的成员函数完成将6个字符转换成对应的数字密码
cout<<"您的密码已成功修改。"<<endl;
break;
}
else
cout<<"您两次密码输入不一致,请重试。"<<endl;
}
}
/******************************************************************************************
* 功能描述:完成用户选择存款选项时的操作,其中调用了User类的成员函数完成账户余额的增加
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
******************************************************************************************/
void Bank::deposit(User *user)
{
int money;
cout<<"请将钞票放入存钞口:";
cin>>money;
user->increase_balance(money); //调用了User类的成员函数完成账户余额的增加
cout<<"存钞成功,您的余额为:"<<user->balance<<endl;
}
/******************************************************************************************
* 功能描述:完成用户选择取款选项时的操作,其中调用了User类的成员函数完成账户余额的减少
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
******************************************************************************************/
void Bank::draw_money(User* user)
{
bool enough=false; //定义bool型变量,用于判断账户的余额是否足够取款的操作
int money;
cout<<"请输入取款金额:";
cin>>money;
enough=user->decrease_balance(money); //调用了User类的成员函数完成账户余额的减少
if(enough==true)
cout<<"请在取钞口拿走您的现金,您的余额为:"<<user->balance<<endl;
else
cout<<"您的余额不足,卡上余额为:"<<user->balance<<endl;
}
/*************************************************************************************
* 功能描述:完成用户选择转账选项时的操作,完成从当前账户转入金额至用户指定的账户。
其中调用了User类的成员函数完成当前账户余额的增加和指定账户余额的减少。
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
*************************************************************************************/
void Bank::transform_accounts(User* user)
{
bool enough=false; //定义bool型变量,用于判断账户的余额是否足够转账的操作
User *theTransed; //定义User指针变量,当用户输入的转账账户有效时,指向当前用户指定的转账用户
int TransAccount,money; //第一个变量用于保存用户输入的转账用户,用于判断该账户是否存在
//第二个变量用户保存用户输入的转账金额
int i; //循环变量,用于查找输入的账户是否存在
bool judge=false; //判断账户是否存在的变量,先赋值为false,如果又找到该账户,则赋值为true
do
{
cout<<"请输入您想要转账的账号:";
cin>>TransAccount;
for(i=0; i<UserNumbers; i++) //查找所有的指针数组指向的对象成员
{
if(TransAccount==newUser[i]->account) //当输入账号等于对象中某一个账号时
{
theTransed=newUser[i];
judge=true; //指向转账账号的指针赋值为找到账户的这一个指针,同时账户标记为存在
break;
}
}
if(judge==false)
{
cout<<"该帐号不存在,请重试。"<<endl;
}
else
break;
}
while(1); //以上操作完成了对当用户输入的转账账户是否有效的判断
cout<<"请输入转入的金额:";
cin>>money;
enough=user->decrease_balance(money); //调用了User类的成员函数,返回值能够判断是否能够完成转账操作
if(enough==false)
{
cout<<"您卡上的余额不足,无法转入该账户。"<<endl;
cout<<"您的余额为"<<user->balance<<endl; //当余额不足时,User类的成员函数不执行减少余额操作
}
else
{
theTransed->increase_balance(money); //当余额足够时,User类的成员函数执行减少余额操作,并且转账账户完成余额增加的操作
cout<<"转账成功。"<<endl;
cout<<"账户:"<<user->name<<" >> "<<"金额:"<<money<<" >> "<<"账户:"<<theTransed->name<<endl;
cout<<"您的余额为:"<<user->balance<<endl;
}
}
/************************************************************************
* 功能描述:完成用户选择销户选项时的操作,将当前账户的状态标记为销户。
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
************************************************************************/
void Bank::delete_account(User* user)
{
char choice;
cout<<"确定销户吗?(Y/N)";
cin>>choice;
if(choice=='Y'||choice=='y')
{
user->flag=-1;
cout<<"您的账户成功注销。"<<endl;
}
}
/************************************************************************
* 功能描述:完成用户选择挂失选项时的操作,将当前账户的状态标记为挂失。
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
************************************************************************/
void Bank::lose_card(User* user)
{
char choice;
cout<<"确定挂失吗?(Y/N)";
cin>>choice;
if(choice=='Y'||choice=='y')
{
user->flag=1;
cout<<"您的账户成功挂失,届时您的账户无法办理正常业务。"<<endl;
}
}
/************************************************************************
* 功能描述:完成用户选择解挂选项时的操作,将当前账户的状态标记为正常。
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
************************************************************************/
void Bank::get_card(User* user)
{
char choice;
cout<<"确定解挂吗?(Y/N)";
cin>>choice;
if(choice=='Y'||choice=='y')
{
if(user->flag==0||user->flag==-1)
{
cout<<"您的账户状态为:"<<user->flag;
cout<<"无法完成解挂操作"<<endl;
}
else
{
user->flag=0;
cout<<"您的账户成功解挂,届时您的账户可以办理正常业务。"<<endl;
}
}
}
/****************************************************************************************
* 功能描述:判断用户当前的账户状态,通过返回值来确定是否执行银行业务主页面业务2中业务
若账户的状态为正常,则可以执行银行业务主页面业务2中所有业务
若账户的状态为销户,则只能执行银行业务主页面业务2中查询业务
若账户的状态为挂失,则只能执行银行业务主页面业务2中查询业务和解挂业务
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:state,通过判断用户状态赋予state不同的值
****************************************************************************************/
int Bank::judge_state(User* user)
{
int state=-2;
if(user->flag==0)
state=0;
else
if(user->flag==-1)
state=-1;
else
state=1;
return state;
}
/*****************************************************************************************
* 功能描述:和判断账户状态函数对应的一个函数,当用户状态不满足业务操作时,输出提示信息
* 输入参数:User类的指针变量,代表当前操作的账户
* 输出参数:无
*****************************************************************************************/
void Bank::print_error(User* user)
{
cout<<"您的账户状态为:"<<(user->flag==0?"正常":(user->flag==1?"挂失":"销户"))<<endl;
cout<<"无法完成该操作。"<<endl;
}
* Node.h
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:Node.h
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:节点类的声明
*/
#ifndef NODE_H_INCLUDED
#define NODE_H_INCLUDED
#include "User.h"
class Node
{
public:
friend class Bank;
friend class LinkList; //将Bank类和LinkList类声明为友元类,可以让这两个类访问自己的数据成员
Node();
Node(User *u); //重载的构造函数
~Node();
private:
User *user; //当前节点中User类的对象指针
Node *next;
};
#endif // NODE_H_INCLUDED
* Node.cpp
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:Node.cpp
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:节点类中成员函数的定义
*/
#include <iostream>
#include "Node.h"
using namespace std;
/*****************************************************
* 功能描述:Node类的构造函数,初始化Node类的数据成员
* 输入参数:无
* 输出参数:无
*****************************************************/
Node::Node()
{
user=NULL;
next=NULL;
}
/********************************************************************
* 功能描述:Node类的重载构造函数,用实参初始化Node类的数据成员user
* 输入参数:User类的指针变量
* 输出参数:无
********************************************************************/
Node::Node(User *u)
{
user=u;
next=NULL;
}
/***********************************************
* 功能描述:Node类的析构函数,处理一些善后信息
* 输入参数:无
* 输出参数:无
***********************************************/
Node::~Node()
{
delete user;
delete next;
}
* LinkList.h
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:LinkList.h
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:链表类的声明
*/
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
#include "Node.h"
#include "User.h"
class LinkList
{
public:
friend class Bank; //将Bank类声明为友元类,可以让Bank类自由访问自己的成员
LinkList();
~LinkList();
void append(Node *node); //将节点增加至链表的函数,若头结点为空,则此节点作为链表的头结点
void Display_list(); //输出链表中各个节点的信息,包括节点数和各节点中用户的信息
void delete_node(User* user); //删除节点的函数,并且将删除节点的下一个节点放到此节点的位置
private:
Node *head; //头结点
int len; //链表长度
};
#endif // LINKLIST_H_INCLUDED
* LinkList.cpp
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:LinkList.cpp
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:链表类中成员函数的定义
*/
#include "LinkList.h"
#include <iostream>
#include "User.h"
using namespace std;
/**********************************************
* 功能描述:链表类的构造函数,初始化数据成员
* 输入参数:无
* 输出参数:无
**********************************************/
LinkList::LinkList()
{
head=NULL;
len=0;
}
/***********************************************
* 功能描述:链表类的析构函数,处理一些善后信息
* 输入参数:无
* 输出参数:无
***********************************************/
LinkList::~LinkList()
{
delete head;
}
/*****************************************************************************
* 功能描述:将节点增加至链表的函数,若头结点为空,则此节点作为链表的头结点
* 输入参数:节点类的指针变量,代表需要增加的节点
* 输出参数:无
*****************************************************************************/
void LinkList::append(Node *node)
{
Node *p=new Node;
p=head; //新建节点类指针变量,并且赋值为头结点,目的在于从头寻找一个下一个指向为空的节点
if(head==NULL)
{
head=node;
len++; //当头结点为空时,将新增加的节点赋值为头结点,同时链表的长度自增
}
else //当头结点不为空时
while(1)
{
if(p->next==NULL) //当p指向的下一节点为空时,将新增加的节点赋值为p指向的下一节点,同时链表的长度加1
{
p->next=node;
len++;
break;
}
else
p=p->next; //当头结点不为空时,并且p指向的下一节点不为空时,将p赋值为p指向的下一节点
}
}
/***********************************************************************
* 功能描述:输出链表中各个节点的信息,包括节点数和各节点中用户的信息
* 输入参数:无
* 输出参数:无
***********************************************************************/
void LinkList::Display_list()
{
int i=0; //循环变量,用户输出所有的节点信息
Node *p=new Node;
p=head; //节点指针变量指向链表头结点,意在从头输出链表中各个节点的信息
cout<<"链表中共有节点:"<<len<<endl;
while(p!=NULL) //当p不是空节点时
{
cout<<"节点:"<<++i<<endl;
print_message(*p->user);
p=p->next; //输出p指向节点中user的信息,并且p赋值为p指向的下一节点
}
}
/*************************************************************************
* 功能描述:删除节点的函数,并且将删除节点的下一个节点放到此节点的位置
* 输入参数:User类的指针变量,代表了需要删除的用户
* 输出参数:无
*************************************************************************/
void LinkList::delete_node(User* olduser)
{
Node* p=head;
if(p->user==olduser)
head=p->next; //当头节点是要被删除的节点时,下一节点赋值为头结点
else
{
while(p->next->user!=olduser)
p=p->next; //当p指向的下一节点中的user变量不是要被删除的节点时,p赋值为p指向的下一节点
p->next=p->next->next; //当p指向的下一节点中的user是要被删除的节点时,
//p指向的下一节点赋值为p指向的下下节点
}
}
* User.h
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:User.h
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:User类的声明
*/
#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED
#include <string>
using namespace std;
class User
{
public:
friend class Bank; //声明Bank类为User类的友元类,Bank类可以自由访问User类的成员
User();
~User();
void Set_User(int acc,int pass,int fla,char *n,char *i,char *add,double balan); //给对象数据成员赋值的函数
friend void print_message(User &user); //友元函数,输出实参对象的信息
friend void change_message(User *user); //友元函数,更改当前对象数据成员的信息
friend User* input_account(); //友元函数,完成账号密码的输入及效验,当效验成功时返回User类对象的指针
void update_password(char *pass); //完成用户业务中修改密码的相关操作
void increase_balance(int money); //完成用户业务中存款的相关操作
bool decrease_balance(int money); //完成用户业务中取款的相关操作
private:
int account; //用户帐号
int password; //用户密码
int flag; //用户银行卡账号,0正常,1挂失,-1销户
char *name; //用户姓名
char *id; //身份证号
char *address; //家庭地址
double balance; //银行卡余额
};
#endif // USER_H_INCLUDED
* User.cpp
/*
* Copyright (c) 2014, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:User.cpp
* 作 者:何小乐
* 完成日期:2015年 7 月 18 日
* 版 本 号:v1.0
*
* 内容摘要:User类中成员函数的定义
*/
#include "User.h"
#include <iostream>
#include <cstring>
using namespace std;
/*******************************************************
* 功能描述:User类的构造函数,完成相关数据成员的初始化
* 输入参数:无
* 输出参数:无
*******************************************************/
User::User()
{
account=0;
password=0;
flag=-1;
name=new char[20];
id=new char[30];
address=new char[20];
balance=0;
}
/***********************************************
* 功能描述:User类的析构函数,完成相关善后工作
* 输入参数:无
* 输出参数:无
***********************************************/
User::~User()
{
delete []name;
delete []id;
delete []address;
}
/*****************************************
* 功能描述:给对象数据成员赋值的函数
* 输入参数:7个参数分别对应着7个数据成员
* 输出参数:无
*****************************************/
void User::Set_User(int acc,int pass,int fla,char *n,char *i,char *add,double balan)
{
int j;
account=acc;
password=pass;
flag=fla;
for(j=0;j<strlen(n);j++)
name[j]=n[j];
name[j]='\0';
for(j=0;j<strlen(i);j++)
id[j]=i[j];
id[j]='\0';
for(j=0;j<strlen(add);j++)
address[j]=add[j];
address[j]='\0';
balance=balan;
}
/*******************************************************************************************
* 功能描述:完成用户业务中修改密码的相关操作,将Bank类中传递过来的字符密码转换为整型密码
* 输入参数:char类型的指针变量,代表当前账户的新密码
* 输出参数:无
*******************************************************************************************/
void User::update_password(char *pass)
{
password=(pass[5]-48)*1+(pass[4]-48)*10+(pass[3]-48)*100+(pass[2]-48)*1000+(pass[1]-48)*10000+(pass[0]-48)*100000;
}
/***************************************************************************************
* 功能描述:完成用户业务中存款的相关操作,将Bank类中传递过来的整型变量增加到balance中
* 输入参数:整型变量money,代表存入的金额
* 输出参数:无
***************************************************************************************/
void User::increase_balance(int money)
{
balance+=money;
}
/***************************************************************************************
* 功能描述:完成用户业务中取款的相关操作,将Bank类中传递过来的整型变量从balance中减去
* 输入参数:整型变量money,代表取出的金额
* 输出参数:布尔型输出,若返回true则表示余额足够,并且完成取款操作。
若返回false则表示余额不足,取款操作失败
***************************************************************************************/
bool User::decrease_balance(int money)
{
bool enough=false;
if((balance-money)>=0)
{
balance-=money;
enough=true;
}
else
enough=false;
return enough;
}