程序的修改及完善

        这次我修改的程序是与同学交换的的大一下学期时c++课程的期末大作业“网上购书结账系统”,在原本代码就已经运行成功的基础上又对系统的功能进行了完善,在客户登录后,增加了“我的信息”功能,客户可以在其中看到自己的个人信息,包括账号、密码、名字、省、市、享受折扣、积分、余额。

修改后的代码如下:

#include<iostream>
#include<string>
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
class Address{///地址
public:
    char province[66];///
    char city[66];///
};
///用户
class User{
public:
    char name[66];//用户名
    char account[66];
    char password[66];
    Address address;
};
///Vip用户
class VipUser:public User{
public:
    int discount;//折扣
    int integral;//积分
    double balance;///余额
};
///正常用户
class NormalUser:public User{
public:
    int integral;//积分
};
///
class Book{
public:
    char id[66];
    char name[66];
    double price;///价格
    int repertory;///库存
};
///订单
class Order{
public:
    char bookId[66];///书id
    char bookName[66];///书名
    char userAccount[66];///账号
    char userName[66];///用户名
    int cnt;//本数
    double price;///价格
    Address address;

};

class BookBySystem{
public:
    void run_(){
        readDataByFile();
        printf("程序加载中");
        for (int i = 0; i < 10; i++) {
            Sleep(100);    
            printf(".");
            fflush(stdout);
        }
        printf("\n");
        system("cls");
        login();
        int cmd;
        while(true){
            if(nowUserIsVip){
                cout<<home_menu_vip<<endl;
            }else{
                cout<<home_menu<<endl;
            }
            printf("请输入你需要操作的指令序号:");scanf("%d",&cmd);
            if(cmd == 0){
                exit_();
            }
            system("cls");
            switch(cmd){
                case 1:///购买书
                    buyBook();
                    break;
                case 2:///查看订单
                    seeOrder();
                    break;
                case 3:///充值为vip用户或者账户充值
                    if(nowUserIsVip){
                        recharge();
                    }else{
                        openVip();
                    }
                    break;
                case 4:///我的信息
                    lookMyInfo();
                    break;
            }
            system("pause");
            system("cls");
        }
    }

private:

    vector<VipUser> vipUserList;///vip用户登录
    vector<NormalUser> normalUserList;///普通用户列表
    vector<Book> bookList;///书列表
    vector<Order> orderList;///订单列表

    bool nowUserIsVip;///当前用户是否是vip用户

    VipUser nowVipUser;///当前登录的用户

    NormalUser nowNormalUser;///当前登录的用户

    string home_menu =
    "+=====================================网上购书的结账系统=====================================+\n"
    "|                                                                                            |\n"
    "|                                                                                            |\n"
    "|                                        1.购买书                                            |\n"
    "|                                        2.查看订单                                          |\n"
    "|                                        3.开通Vip                                           |\n"
    "|                                        4.我的信息                                          |\n"
    "|                                        0.退出                                              |\n"
    "|                                                                                            |\n"
    "|                                                                                            |\n"
    "+============================================================================================+\n\n";


    string home_menu_vip =
    "+=====================================网上购书的结账系统=====================================+\n"
    "|                                                                                            |\n"
    "|                                                                                            |\n"
    "|                                        1.购买书                                            |\n"
    "|                                        2.查看订单                                          |\n"
    "|                                        3.账户充值                                          |\n"
    "|                                        4.我的信息                                          |\n"
    "|                                        0.退出                                              |\n"
    "|                                                                                            |\n"
    "|                                                                                            |\n"
    "+============================================================================================+\n\n";

    string login_menu =
    "+=====================================欢迎使用网上购书的结账系统=====================================+\n"
    "|                                                                                                    |\n"
    "|                                                                                                    |\n"
    "|                                              1.登录                                                |\n"
    "|                                              2.注册                                                |\n"
    "|                                              0.退出                                                |\n"
    "|                                                                                                    |\n"
    "|                                                                                                    |\n"
    "+====================================================================================================+\n\n";

  
    void readDataByFile(){
        ///normalUserList
        FILE *normalUserDB = fopen("normalUserList.txt", "rb");
        NormalUser normalUser;
        while (fread(&normalUser, sizeof(struct NormalUser), 1, normalUserDB) == 1) {
            normalUserList.push_back(normalUser);
        }
        fclose(normalUserDB);

        ///vipUserList
        FILE *vipUserDB = fopen("vipUserList.txt", "rb");
        VipUser vipUser;
        while (fread(&vipUser, sizeof(struct VipUser), 1, vipUserDB) == 1) {
            vipUserList.push_back(vipUser);
        }
        fclose(vipUserDB);

        ///order
        FILE *orderDB = fopen("orderList.txt", "rb");
        Order order;
        while (fread(&order, sizeof(struct Order), 1, orderDB) == 1) {
            orderList.push_back(order);
        }
        fclose(orderDB);

        ///book
        FILE *bookDB = fopen("bookList.txt", "rb");
        Book book;
        while (fread(&book, sizeof(struct Book), 1, bookDB) == 1) {
            bookList.push_back(book);

        }
        fclose(bookDB);
    }


    void saveDataToFile(){
        ///normalUserList
        FILE *normalUserDB = fopen("normalUserList.txt","wb");
        for (int i = 0; i < normalUserList.size(); i++) {
            fwrite(&normalUserList[i], sizeof(NormalUser), 1, normalUserDB);
        }
        fclose(normalUserDB);
        ///vipUserList
        FILE *vipUserDB = fopen("vipUserList.txt","wb");
        for (int i = 0; i < vipUserList.size(); i++) {
            fwrite(&vipUserList[i], sizeof(VipUser), 1, vipUserDB);
        }
        fclose(vipUserDB);
        ///order
        FILE *orderDB = fopen("orderList.txt","wb");
        for (int i = 0; i < orderList.size(); i++) {
            fwrite(&orderList[i], sizeof(Order), 1, orderDB);
        }
        fclose(orderDB);
        ///book
        FILE *bookDB = fopen("bookList.txt", "wb");
        for (int i = 0; i < bookList.size(); i++) {
            fwrite(&bookList[i], sizeof(Book), 1, bookDB);
        }
        fclose(bookDB);
    }

    void exit_(){
        if(nowUserIsVip){
            for(int i = 0;i < vipUserList.size();i ++){
                if(strcmp(nowVipUser.account,vipUserList[i].account) == 0){
                    vipUserList[i] = nowVipUser;
                    break;
                }
            }
        }else{
            for(int i = 0;i < normalUserList.size();i ++){
                if(strcmp(nowNormalUser.account,normalUserList[i].account) == 0){
                    normalUserList[i] = nowNormalUser;
                }

            }
        }
        printf("1111");
        saveDataToFile();
        system("cls");
        printf("正在退出");
        for (int i = 0; i < 10; i++) {
            Sleep(100);   
            printf(".");
            fflush(stdout);
        }
        system("cls");
        printf("已退出!");
        exit(1);
    }

    bool getUserByAccount(char account[]){
        for(int i = 0;i < normalUserList.size();i ++){
            if(strcmp(normalUserList[i].account,account) == 0){
                nowUserIsVip = false;
                nowNormalUser = normalUserList[i];
                return true;
            }
        }
        for(int i = 0;i < vipUserList.size();i ++){
            if(strcmp(vipUserList[i].account,account) == 0){
                nowUserIsVip = true;
                nowVipUser = vipUserList[i];
                return true;
            }
        }
        return false;
    }

    void login(){
        int cmd = -1;
        User user;
        while(true){
            cout<<login_menu<<endl;
            printf("请输入你需要操作的指令:");scanf("%d",&cmd);
            if(cmd == 0){
                exit_();
            }
            system("cls");
            switch(cmd){
                case 1:
                    printf("请输入账号:");scanf("%s",user.account);
                    printf("请输入密码:");scanf("%s",user.password);
                    ///查找用户是否存在
                    if(getUserByAccount(user.account) && ((nowUserIsVip && strcmp(nowVipUser.password,user.password) == 0) || (!nowUserIsVip && strcmp(nowNormalUser.password,user.password) == 0))){
                        printf("登录成功!\n");
                        system("pause");
                        system("cls");
                        return ;
                    }else{
                        printf("登录失败!账号密码错误!\n");
                    }
                    break;
                case 2:
                    printf("请输入真实姓名:");scanf("%s",user.name);
                    printf("请输入账号:");scanf("%s",user.account);
                    printf("请输入密码:");scanf("%s",user.password);
                    printf("请输入你所在省:");scanf("%s",user.address.province);
                    printf("请输入你所在市:");scanf("%s",user.address.city);
                    ///查找用户是否存在
                    if(getUserByAccount(user.account)){
                        printf("该账号已被占用!\n");
                    }else{
                        NormalUser normalUser;
                        strcpy(normalUser.account , user.account);
                        strcpy(normalUser.address.province , user.address.province);
                        strcpy(normalUser.address.city , user.address.city);
                        strcpy(normalUser.password , user.password);
                        strcpy(normalUser.name , user.name);
                        normalUser.integral = 0;
                        normalUserList.push_back(normalUser);
                        printf("注册成功!\n");
                    }
                    break;
            }
            system("pause");
            system("cls");
        }
    }

    void print_allBook(){
        printf("%-16s%-16s%-16s%-16s\n","编号","书名","价格","库存");
        for(int i = 0;i < bookList.size();i ++){
            printf("%-16s%-16s%-16.2lf%-16d\n",bookList[i].id,bookList[i].name,bookList[i].price,bookList[i].repertory);
        }
    }

    void buyBook(){
        Book book;
        printf("\n========================= 书城 ========================\n\n");
        print_allBook();
        printf("\n\n");
        printf("请输入你需要购买书籍的编号:");scanf("%s",book.id);
        printf("请输入你需要购买多少本:");scanf("%d",&book.repertory);
        for(int i = 0;i < bookList.size();i ++){
            if(strcmp(bookList[i].id,book.id) == 0){
                if(bookList[i].repertory >= book.repertory){

                    Order order;
                    if(nowUserIsVip){
                        strcpy(order.userName , nowVipUser.name);
                        strcpy(order.userAccount , nowVipUser.account);
                        order.address = nowVipUser.address;
                        nowVipUser.integral += (book.repertory * bookList[i].price);
                        nowVipUser.balance -= (book.repertory * bookList[i].price)*1.0*(nowVipUser.discount*1.0/10);
                    }else{
                        strcpy(order.userName , nowNormalUser.name);
                        strcpy(order.userAccount , nowNormalUser.account);
                        order.address = nowNormalUser.address;
                        nowNormalUser.integral += (book.repertory * bookList[i].price);
                    }
                    strcpy(order.bookId , bookList[i].id);
                    strcpy(order.bookName , bookList[i].name);
                    order.cnt = book.repertory;
                    if(nowUserIsVip){
                        order.price = (book.repertory * bookList[i].price)*1.0*(nowVipUser.discount*1.0/10);
                    }else{
                        order.price = book.repertory * bookList[i].price;
                    }
                    orderList.push_back(order);
                    bookList[i].repertory -= book.repertory;
                    printf("购买成功!");
                }else{
                    printf("库存不足!");
                }
            }
        }

    }

    void seeOrder(){
        printf("========================= 订单 =========================\n\n");
        printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","账号","用户名","图书id","书名","","","数量","总价");
        for(int i = 0;i < orderList.size();i ++){
            if(nowUserIsVip && strcmp(nowVipUser.account,orderList[i].userAccount) == 0){
                printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10d%-10.2lf\n",orderList[i].userAccount,orderList[i].userName,orderList[i].bookId,orderList[i].bookName,orderList[i].address.province,orderList[i].address.city,orderList[i].cnt,orderList[i].price);
            }else if(strcmp(nowNormalUser.account,orderList[i].userAccount) == 0){
                printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10d%-10.2lf\n",orderList[i].userAccount,orderList[i].userName,orderList[i].bookId,orderList[i].bookName,orderList[i].address.province,orderList[i].address.city,orderList[i].cnt,orderList[i].price);
            }
        }
    }

    void recharge(){
        printf("========================= 充值 =========================\n\n");
        double money;
        printf("当前账户余额:%.2lf\n\n",nowVipUser.discount);
        printf("请输入你充值的金额:");scanf("%lf",&money);
        if(money >= 0){
            nowVipUser.balance += money;
            printf("充值成功!你的余额为%.2lf\n",nowVipUser.balance);
        }else{
            printf("开通失败!请充值正确金额!\n");
        }
    }

    void openVip(){
        double money;
        printf("========================= 开通Vip =========================\n\n");
        printf("开头Vip最少需要充值1000元至vip卡中,卡中金额可以用来买书,可享受9折优惠!\n\n");
        printf("请输入你充值的金额:");scanf("%lf",&money);
        if(money >= 1000){
            strcpy(nowVipUser.account , nowNormalUser.account);
            strcpy(nowVipUser.password , nowNormalUser.password);
            nowVipUser.address = nowNormalUser.address;
            nowVipUser.balance = money;
            nowVipUser.discount = 9;
            nowVipUser.integral = nowNormalUser.integral;
            strcpy(nowVipUser.name , nowNormalUser.name);
            nowUserIsVip = true;
            vipUserList.push_back(nowVipUser);
            for(int i = 0;i < normalUserList.size();i ++){
                if(strcmp(normalUserList[i].account,nowNormalUser.account) == 0){
                    for(int j = i;j < normalUserList.size() - 1;j ++){
                        normalUserList[i] = normalUserList[i + 1];
                    }
                    normalUserList.pop_back();
                    break;
                }
            }
            printf("vip开通成功!");
        }else{
            printf("开通失败!请充值1000元以上!\n");
        }
    }

    void lookMyInfo(){
        printf("========================= 我的信息 =========================\n\n");
        if(nowUserIsVip){
            printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","账号","密码","名字","","","享受折扣","积分","余额");
            printf("%-10s%-10s%-10s%-10s%-10s%-10d%-10d%-10.2lf\n",nowVipUser.account,nowVipUser.password,nowVipUser.name,nowVipUser.address.province,nowVipUser.address.city,nowVipUser.discount,nowVipUser.integral,nowVipUser.balance);
        }else{
            printf("%-10s%-10s%-10s%-10s%-10s%-10s\n","账号","密码","名字","","","积分");
            printf("%-10s%-10s%-10s%-10s%-10s%-10d%\n",nowNormalUser.account,nowNormalUser.password,nowNormalUser.name,nowNormalUser.address.province,nowNormalUser.address.city,nowNormalUser.integral);

        }
    }



};

int main(){
    BookBySystem bookBuySystem;
    bookBuySystem.run_();

    return 0;
}

增加的内容主要为:

 void lookMyInfo(){
        printf("========================= 我的信息 =========================\n\n");
        if(nowUserIsVip){
            printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","账号","密码","名字","","","享受折扣","积分","余额");
            printf("%-10s%-10s%-10s%-10s%-10s%-10d%-10d%-10.2lf\n",nowVipUser.account,nowVipUser.password,nowVipUser.name,nowVipUser.address.province,nowVipUser.address.city,nowVipUser.discount,nowVipUser.integral,nowVipUser.balance);
        }else{
            printf("%-10s%-10s%-10s%-10s%-10s%-10s\n","账号","密码","名字","","","积分");
            printf("%-10s%-10s%-10s%-10s%-10s%-10d%\n",nowNormalUser.account,nowNormalUser.password,nowNormalUser.name,nowNormalUser.address.province,nowNormalUser.address.city,nowNormalUser.integral);

        }
    }

 

增加后的选项界面为:

“我的信息”界面为:

充值VIP后“我的信息”界面

posted @ 2021-03-14 23:54  文玥斓  阅读(94)  评论(0)    收藏  举报