首頁 > 軟體

C++實現快捷店會員管理系統

2022-03-18 13:02:17

本文設計C++快捷店會員的簡單管理系統。基本要求如下:

(1)定義人民幣RMB類(資料成員包括元,角,分三個整型變數),實現人民幣的基本運算(對操作符+和-運算進行過載)和顯示(顯示元,角,分)。

(2)定義會員member類,表示會員的基本資訊,包括:編號(按建立會員的順序自動生成),姓名,密碼,電話。提供輸入、輸出資訊等功能。

(3)由RMB類和member類共同派生一個會員卡memberCar類(含有memberCar型別next指標變數),提供新建會員、充值、消費和查詢餘額等功能。

(4)main函數定義一個memberCar類連結串列,儲存會員卡,模擬一個快捷店的會員卡管理功能,主要包括:

1)、 新建會員(檢查輸入的會員電話號碼是否已經存在;若存在,則表示已經有該會員,需要重新輸入會員資訊),則為該會員建立會員卡,將該會員卡所表示的物件插入memberCar類連結串列表尾;

2)、已有會員充值(需要對充值進行非負性檢查);

3)、已有會員消費(憑密碼,不能透支);

4)、輸出快捷店當前會員數,當前所有會員的消費總額,所有會員卡剩餘的額度總數;

5)、遍歷連結串列,輸出所有會員卡的資訊(不能輸出會員個人密碼);

6)、建立一個文字檔案“member.txt”,將所有會員資訊存入該檔案中;

7) 、建立一個二進位制檔案“member.dat” ,將所有會員資訊存入該檔案中;

8) 、建立指標陣列,初始化指標陣列,儲存連結串列中每個會員物件的地址;對連結串列中的每個會員按照消費額度按照從小到大進行排序(要求不能改變連結串列的邏輯結構),並將排序後的會員物件的地址存在指標陣列中;

9)、利用(8)中的指標陣列,在螢幕上輸出會員的排序結果。

RMB標頭檔案:

#pragma once
#include <iostream>
using namespace std;
 
class RMB {
public:
    static double tCost;
    int m_Yuan;
    int m_Jiao;
    int m_Fen;
    RMB();
    RMB& operator+(double rmb);
    RMB& operator-(double rmb);
    void show();
};

RMB原始檔

#include "RMB.h"
 
double RMB::tCost = 0;
RMB::RMB() {
    m_Yuan = 0;
    m_Jiao = 0;
    m_Fen = 0;
}
RMB& RMB::operator+(double rmb) {
    int yuan = ((int)(rmb * 100)) / 100;
    int jiao = ((int)(rmb * 10)) % 10;
    int fen = ((int)(rmb * 100)) % 10;
    this->m_Yuan += yuan;
    this->m_Jiao += jiao;
    this->m_Fen += fen;
    return *this;
}
RMB& RMB::operator-(double rmb) {
    int yuan = ((int)(rmb * 100)) / 100;
    int jiao = ((int)(rmb * 10)) % 10;
    int fen = ((int)(rmb * 100)) % 10;
    this->m_Yuan -= yuan;
    this->m_Jiao -= jiao;
    this->m_Fen -= fen;
    return *this;
}
void RMB::show() {
    cout << "您的餘額為:" << this->m_Yuan << "元" << this->m_Jiao << "角" << this->m_Fen << "分" << endl;
}

member標頭檔案

#pragma once
#include <iostream>
#include <string>
using namespace std;
 
class member {
public:
    static long preId;
    long m_id;
    string m_Name;
    string m_Passport;
    string m_PhoneNumber;
    member();
    void inIft();
    void outIft();
};

member原始檔

#include "member.h"
 
long member::preId = -1L;
member::member() {
    this->m_id = preId + 1;
    preId = this->m_id;
}
void member::inIft() {
    string name;
    cout << "請輸入您的姓名:";
    cin >> name;
    this->m_Name = name;
    cout << endl;
    string passport;
    cout << "請輸入您的密碼:";
    cin >> passport;
    this->m_Passport = passport;
    cout << endl;
    string phoneNum;
    cout << "請輸入您的電話:";
    cin >> phoneNum;
    this->m_PhoneNumber = phoneNum;
    cout << endl;
}
void member::outIft() {
    cout << "編號:" << m_id << " 姓名:" << m_Name << " 密碼:" << m_Passport << " 電話:" << m_PhoneNumber << endl;
}

memberCard標頭檔案

#pragma once
#include <iostream>
#include "RMB.h"
#include "member.h"
using namespace std;
 
class memberCard:public RMB,public member{
public:
    static int num_;
    memberCard* next;
    double Con = 0;
    memberCard();
    void create();
    void deposit();
    void consume();
    void balanceCheck();
    ~memberCard();
};

memberCard原始檔

#include "memberCard.h"
 
int memberCard::num_ = -1;
memberCard::memberCard() {
    num_++;
    this->next = NULL;
}
void memberCard::create() {
    inIft();
}
void memberCard::deposit() {
    cout << "請輸入充值的金額:";
    double money;
    cin >> money;
    cout << endl;
    if (money < 0) {
        cout << "充值金額不能為負!" << endl;
        return;
    }
    this->operator+(money);
}
void memberCard::consume() {
    cout << "請輸入消費金額:";
    double money;
    cin >> money;
    Con += money;
    cout << endl;
    cout << "請輸入密碼:";
    string passport;
    cin >> passport;
    if (strcmp(passport.c_str(), m_Passport.c_str()) == 0) {
        if (((int)(money * 100)) / 100 > m_Yuan) {
            cout << "餘額不足!" << endl;
            return;
        }
        else if (((int)(money * 100)) / 100 == m_Yuan) {
            if (((int)(money * 10)) % 10 > m_Jiao) {
                cout << "餘額不足!" << endl;
                return;
            }
            else if (((int)(money * 10)) % 10 == m_Jiao) {
                if (((int)(money * 100)) % 10 > m_Fen) {
                    cout << "餘額不足!" << endl;
                    return;
                }
            }
        }
        this->operator-(money);
        RMB::tCost += money;
    }
    else {
        cout << "密碼錯誤!" << endl;
        return;
    }
}
void memberCard::balanceCheck() {
    this->show();
}
memberCard::~memberCard() {
    if (this->next != NULL) {
        delete this->next;
        this->next = NULL;
    }
}

主函數

#include <iostream>
#include "RMB.h"
#include "member.h"
#include "memberCard.h"
#include <string>
#include <fstream>
using namespace std;
 
#define FILENAME1 "member.txt"
#define FILENAME2 "member.dat"
void AddMember(memberCard*& head, memberCard*& pre) {
    if (head == NULL) {
        head = new memberCard;
        pre = head;
        return;
    }
    memberCard* p = new memberCard;
    p->create();
    p->next = NULL;
    pre->next = p;
    pre = p;
    cout << "新增成功!" << endl;
    system("pause");
}
bool check(memberCard*& head, memberCard*& pre) {
    if (head == NULL) {
        return false;
    }
    cout << "請輸入要辦理會員的電話號:";
    string phoneNum;
    cin >> phoneNum;
    cout << endl;
    memberCard* p = head->next;
 
    while (p != NULL) {
        if (strcmp(phoneNum.c_str(), p->m_PhoneNumber.c_str()) == 0) {
            cout << "該手機號已有會員!" << endl;
            system("pause");
            return true;
        }
        p = p->next;
    }
    return false;
}
void deposit_(memberCard* head) {
    if (head == NULL) {
        return;
    }
    memberCard* p = head->next;
    cout << "請輸入要充值的會員卡手機號:" << endl;
    string phoneNum;
    cin >> phoneNum;
    while (p != NULL) {
        if (strcmp(phoneNum.c_str(), p->m_PhoneNumber.c_str()) == 0) {
            p->deposit();
            cout << "充值成功!" << endl;
            system("pause");
            return;
        }
        p = p->next;
    }
    cout << "未查詢到會員卡!" << endl;
    system("pause");
}
void consume_(memberCard* head) {
    if (head == NULL) {
        return;
    }
    cout << "請輸入要消費的會員手機號:" << endl;
    string phoneNum;
    cin >> phoneNum;
    memberCard* p = head->next;
    while (p != NULL) {
        if (strcmp(phoneNum.c_str(), p->m_PhoneNumber.c_str()) == 0) {
            p->consume();
            
            return;
        }
        p = p->next;
    }
    cout << "未查詢到會員卡!" << endl;
    system("pause");
}
void total(memberCard* head) {
    if (head == NULL) {
        return;
    }
    memberCard* p = head->next;
    int sum = 0;
    double totalBalance = 0;
    while (p != NULL) {
        sum++;
        double balance = p->m_Yuan * 1.0 + p->m_Jiao * 0.1 + p->m_Fen * 0.01;
        totalBalance += balance;
        p = p->next;
    }
    cout << "快捷店當前會員數為:" << sum << endl;
    cout << "當前所有會員的消費總額為:" << p->tCost << endl;
    cout << "所有會員卡剩餘額度總數為:" << totalBalance << endl;
    system("pause");
}
void display(memberCard*& head) {
    if (head == NULL) {
        cout << "無任何會員卡" << endl;
        return;
    }
    memberCard* p = head->next;
    while (p != NULL) {
        double balance = p->m_Yuan * 1.0 + p->m_Jiao * 0.1 + p->m_Fen * 0.01;
        cout << "id:" << p->m_id << " 姓名:" << p->m_Name << " 電話:" << p->m_PhoneNumber << " 餘額:" <<balance << endl;
        p = p->next;
    }
    system("pause");
}
void save(memberCard*& head) {
    if (head == NULL) {
        return;
    }
    ofstream oft;
    oft.open(FILENAME1, ios::out);
 
    memberCard* p = NULL;
    p = head->next;
    while (p != NULL) {
        oft<< p->m_id << " " << p->m_Name << " " << p->m_Passport << " " << p->m_PhoneNumber << " " << p->m_Yuan << " " << p->m_Jiao << " " <<p->m_Fen<< " " << p->preId<< " " << p->tCost<< endl; //<< "會員總人數:" << p->num_
        p = p->next;
    }
    oft.close();
}
void save2(memberCard* head) {
    if (head == NULL) {
        return;
    }
    ofstream oft;
    oft.open(FILENAME2, ios::binary | ios::out);
    memberCard* p = head->next;
    while (p != NULL) {
        oft.write((const char*)&p, sizeof(memberCard));
        p = p->next;
    }
    cout << "儲存成功!" << endl;
    system("pause");
}
void readFile() {
    ifstream ifs;
    ifs.open(FILENAME1, ios::in);
    if (ifs.is_open()) {
        char buf[1024] = { 0 };
        while (ifs >> buf) {
            cout << buf << endl;
        }
    }
    ifs.close();
    system("pause");
}
void toArray(memberCard* head,memberCard**& arr) {
    /*memberCard** arr = new memberCard*[memberCard::num_];*/
    memberCard* p = head->next;
    int index = 0;
    while (p != NULL) {
        arr[index] = p;
        index++;
        p = p->next;
    }
    for (int i = 0; i < memberCard::num_; i++) {
        for (int j = i + 1; j < memberCard::num_; j++) {
            if (arr[i]->Con > arr[j]->Con) {
                memberCard* temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}
 
int main() {
    memberCard* head = NULL;
    memberCard* pre = NULL;
    FileIsEmpty(head,pre);
    while (true) {
 
        cout << "*************************************" << endl;
        cout << "*********快捷店會員管理系統**********" << endl;
        cout << "************1.新建會員***************" << endl;
        cout << "***********2.已有會員充值************" << endl;
        cout << "***********3.已有會員消費************" << endl;
        cout << "*******4.輸出快捷店當前會員數********" << endl;
        cout << "*******當前所有會員的消費總額********" << endl;
        cout << "*******所有會員卡剩餘的額度總數******" << endl;
        cout << "********5.輸出所有會員卡的資訊*******" << endl;
        cout << "****6.採用二進位制方式儲存會員資訊*****" << endl;
        cout << "******7.讀取檔案中所有會員資訊*******" << endl;
        cout << "**8.用陣列儲存地址,並按消費額度排序*" << endl;
        cout << "*************************************" << endl;
        int d_select;
        cout << "請輸入您的選擇:" << endl;
        cin >> d_select;
 
        switch (d_select) {
        case 1:
        {
            if (check(head,pre)) {
                break;
            }
            AddMember(head, pre);
            break;
        }
        case 2:
            deposit_(head);
            break;
        case 3:
            consume_(head);
            break;
        case 4:
            total(head);
            break;
        case 5:
            display(head);
            break;
        case 6:
            save2(head);
            break;
        case 7:
            readFile();
            break;
        case 8:
        {
            memberCard** arr = new memberCard * [memberCard::num_];
            toArray(head, arr);
            for (int i = 0; i < memberCard::num_; i++) {
                double balance = arr[i]->m_Yuan * 1.0 + arr[i]->m_Jiao * 0.1 + arr[i]->m_Fen * 0.01;
                cout << "id:" << arr[i]->m_id << " 姓名:" << arr[i]->m_Name << " 電話:" << arr[i]->m_PhoneNumber << " 餘額:" << balance << endl;
            }
            system("pause");
            break;
        }
        }
        save(head);
        system("cls");
    }
 
    
    system("pause");
    return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com