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-退出銀行

×退出時用戶的數據都會保存在文件中。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章