C++课程设计-银行储蓄系统

*  课程设计概述

*/

*  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;
}

*  运行结果截图及说明

×银行系统主页面

×选择操作4-银行管理,效验从文件中读取数据进入链表的操作

×文件中用户数据如图所示。

×选择操作1-办卡

×其中包括了办卡功能和修改信息功能。

×选择操作2-办理业务

×输错三次退出程序。

×选择操作2-业务办理

×选择业务1-查询

×选择业务2-改密

×选择业务1-查询,查看修改后的结果

×选择业务3,4-存款,取款

×余额不足取款时提示。

×选择业务5-转账

×当账户不存在时提示;当余额不够时提示。

×选择业务7,8-挂失,解挂

×当挂失状态时无法办理正常业务,出了业务1-查询和业务8-解挂

×选择业务0-退出

×选择操作3-退出银行

×退出时用户的数据都会保存在文件中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 20:59:00

C++课程设计-银行储蓄系统的相关文章

课程设计--银行储蓄系统

介绍: 银行储蓄系统包括:支持多名储户开户.存款.取款.转帐.改密.挂失.解挂.销户等功能. 登录 输入业务员用户名和密码.3次输入不正确,强制退出程序. 基本要求 可以只设一名业务员,用全局变量表示其用户名和密码,写在程序中. 系统菜单 当业务员信息验证后,进入到系统主控菜单,由业务员为储户办理各种业务,直到按0后退出. 基本要求 每次启动系统,都是从0用户开始办理业务 开户 账号由系统自动分配 确认密码和密码不同时要拒绝. 开户后,账号状态为0-正常 销户 输入账号,确认后,将余额全部取完,

c++课程实训 银行储蓄系统

基本要求:定义了用户类(User)和银行类(Bank),用成员函数实现各种功能,多文件组织程序.能用文本文件存取数据(如演示样例中给出的技术): 拓展方向: 序号 加分项目 细       则 1 改变Bank类中用户信息的存储方式 用对象的指针数组存储(User *user[upNum]) 或者用动态数组(User *users.空间用new分配) 2 功能扩充 按银行实际业务的要求,添加User类中的数据成员,可以记录身份证号.家庭住址等信息,并在相关业务中使用这些数据. 记录用户的每一笔业

银行储蓄系统的设计与实现

作者:夏晓林 地点:烟大计控 时间:2017.04.23 题目描述: 模拟银行柜台业务的要求,实现一个小型的银行储蓄系统软件的开发,其中包括开户.存款.取款.转账.改密.挂失.解挂.销户等功能. 在开发过程中,请按照问题求解过程的要求,体验开发过程中需要做的工作.除了下面的系统基本功能的描述外,鼓励开展调研,使开发的软件尽量符合实际的银行储蓄系统的实际业务内容.可以参考8.1节中关于选用合适的数据结构的讨论,确定数据存储方案. 要求在程序运行过程中或者程序结束运行之前,将业务发生的数据保存到文件

我的LabPHP框架的Demo应用——课程设计题目统计系统

1.界面制作(为了方便起见,这里我采用了Bootstrap框架制作界面): 2.数据库设计,正确创建students表: admin表: 3.项目目录结构如下: LaPHP框架已经在上文中列出,这里就不再列出. Home模块(提供"新增题目"和"修改试题".查看所有学生题目的功能): Application/Home/Config/config.php <?php return array( //'配置项'=>'配置值' 'DB_HOST' =>

学术休假-银行储蓄系统

银行储蓄系统包括:支持多名储户开户.存款.取款.转帐.改密.挂失.解挂.销户等功能. 登录 输入业务员用户名和密码.3次输入不正确,强制退出程序. 基本要求 可以只设一名业务员,用全局变量表示其用户名和密码,写在程序中. 改进意见 可以用一个文本文件保存多名业务员的信息.定义结构体表示业务员,定义该种类型的结构体数据,在程序开始执行时,读入业务员信息,以支持多名业务员登录. 用文件保存密码时,一般不用"明文",而要加密处理. 系统菜单 当业务员信息验证后,进入到系统主控菜单,由业务员为

银行储蓄系统:问题定义及分析系统可行性

1.问题定义(系统目标及范围说明书): 项目名称:XX银行储蓄业务系统 问题描述:方便储蓄用户存取等业务.解决当前银行业务员处理储蓄业务时间消耗长.工作量大.效率低 项目目标:开发一个方便储蓄用户的银行计算机储蓄业务处理系统 项目范围:硬件主要是银行专用计算机以及ATM等,费用预计为XX元. 可行性研究:系统分析员与银行的相关人员进行研究讨论,研究讨论时长XX天,研究费用XX元. 2.系统可行性分析: 经济可行性:总费用<经济效益客观 可行   社会因素可行性:不存在违法违规.侵权等法律道德问题

C++应用实战项目:大并发高性能可伸缩服务器设计及开发(Http服务器、银行储蓄系统示例)

刚开始我也不信,可自己根据http://url.cn/TgrIZT注册一下,然后通过这个网站获取了学习卡的用户名和密码之后,真的有200元抵用券到了自己的账户中,所以,我就买了一些课程,自从在北风网学习了一些课程之后,我感觉自己对于提成技能特别高,可能和自己刚刚毕业有关系,在学校每天都是理论知识,没有过多的时间,但是自从在北风网上学习了一些项目的知识之后,尤其和老师们一起做项目,我起初以为只是简单的视频教程,谁知道和培训机构一样,老师还可以给你解答问题,费用只相当于培训机构的10%,后来自己又学

程序设计项目——银行储蓄系统

main.cpp /*********************************************************** * 版权所有 (C)2015, xinbin. * * 文件名称: main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本: V1.0 * 作 者:辛彬 * 完成日期: 20150717 * * 修改记录1: * 修改日期: 20150717 * 版本号: V1.0 * 修改人: xinbin

程序设计项目实训——银行储蓄系统

注:本程序采用多文件组织的方法 Headers:bank.h ?/* *版权所有 (c) 2015, 烟台大学计算机与控制工程学院. *All rights reserved. *文件名称: main.cpp *作者:陆云杰 *完成日期:2015年7月15日 *版本号:v1.0 *内容摘要:对所有类,函数进行了定义 *修改内容:1.增加了一个Day类用于记录开户以及进行存取款转账等服务时的日期 2.增加计算两个时间之间的天数之差的函数 3.增加了根据业务发生的情况来计算活期利息的函数 4.运用动