模拟网上购书的问题代码

原来的代码截图发在下面了,要求就是增加将信息(客户、书本信息)从文件中读取,最后结果(订单信息)再写入到文件中去。请问这一步要怎么操作。平台不给一次把所有代码全发出来,放在百度网盘了。

img

img

代码需要做一些修改,还需要定义一个订单结构体。
因为读文件需要跟写文件配合使用,否则格式不一致会导致读取失败,所以main函数的代码中先创建了用户和书籍实例后,先写入了文件,然后又从文件中读取的,注释写的很详细。
另外,main函数不能放在.h文件中,需要单独写一个cpp文件。
buy.h修改如下:

#ifndef _BUY_H_
#define _BUY_H_

#include <iostream>
#include <string>
using namespace std;

//定义客户类型
enum class eGuestType // 在高版本VS中,需要用enum class,在低版本的vs中,直接用enum也可以
{
    e_member,
    e_honour,
    e_layfolk
};



class buyer
{
protected:
    string name;
    int buyerId;
    string address;
    double pay;
    eGuestType type;  //添加这个字段
public:
    buyer();
    buyer(string n, int b, string a,double p);
    string getbuyname();
    int getid();
    string getaddress();
    double getpay();
    virtual void setpay(double p= 0) = 0;

    eGuestType gettype();//添加这个函数
};


eGuestType buyer::gettype()
{
    return type;
}


class member :public buyer
{
    int leagure_grad;
public:
    member(string n, int b, int l, string a, double p) :buyer(n, b, a, p)
    {
        leagure_grad = l;
        type = eGuestType::e_member; //添加这个设置
    }

    void setleaguregrad(int l) { leagure_grad = l; }
    int getleaguregrad() { return leagure_grad; }

    void display();
    void setpay(double p);
};

class honoured_guest :public buyer
{
    double discount_rate;
public:
    honoured_guest(string n, int b, double r, string a, double p) :buyer(n, b, a, p)
    {
        discount_rate = r;
        type = eGuestType::e_honour;//添加这个设置
    }

    void setrate(double r) { discount_rate = r; }
    double getrate() { return discount_rate; }

    void display();
    void setpay(double p);
};


class layfolk :public buyer
{
public:
    layfolk(string n, int b, string a, double p) :buyer(n, b, a, p)
    {
        type = eGuestType::e_layfolk;
    }
    void display();
    void setpay(double p);
};

buyer::buyer()
{
    name = " ";
    buyerId = 0;
    address = " ";
    pay = 0;
    type = eGuestType::e_layfolk;//添加这个设置
}
buyer::buyer(string n, int b, string a, double p)
{
    name = n;
    buyerId = b;
    address = a;
    pay = p;
    type = eGuestType::e_layfolk;//添加这个设置
}

double buyer::getpay()
{
    return pay;
}
string buyer::getaddress()
{
    return address;
}
string buyer::getbuyname()
{
    return name;
}
int buyer::getid()
{
    return buyerId;
}

void member::display()
{
    cout << "购书人姓名:" << name << endl;
    cout << "购书人编号:" << buyerId << endl;
    cout << "购书人地址:" << address << endl;
    cout << "购书人为会员,级别:" << leagure_grad << endl;
}

void member::setpay(double p)
{
    if (leagure_grad == 1)
        pay = 0.95 * p + pay;
    else if (leagure_grad == 2)
        pay = 0.9 * p + pay;
    else if (leagure_grad == 3)
        pay = 0.85 * p + pay;
    else if (leagure_grad == 4)
        pay = 0.8 * p + pay;
    else if (leagure_grad == 5)
        pay = 0.7 * p + pay;
    else
        cout << "级别错误!";
}

void honoured_guest::display()
{
    cout << "购书人姓名:" << name << endl;
    cout << "购书人编号:" << buyerId << endl;
    cout << "购书人地址:" << address << endl;
    cout << "购书人为贵宾!折扣率为:" << discount_rate << endl;
}

void honoured_guest::setpay(double p)
{
    pay = pay + (1 - discount_rate) * p;  
}


void layfolk::display()
{
    cout << "购书人姓名:" << name << endl;
    cout << "购书人编号:" << buyerId << endl;
    cout << "购书人地址:" << address << endl;
    cout << "购书人为普通人"  << endl;
}

void layfolk::setpay(double p)
{
    pay = pay + p;
}


#endif


book.h修改如下:

#ifndef _BOOK_H_
#define _BOOK_H_
#include <iostream>
#include <string>
#include <fstream>


using namespace std;
class book
{
protected:
    string book_ID;
    string book_name;
    string auther;
    string publishing;
    double price;
public:
    book();
    book(string b_id, string b_n, string au, string pu, double pr);
    void display();
    string getbook_ID();
    string getbook_name();
    string getauther();
    string getpublishing();
    double getprice();
};


book::book()
{
    book_ID = " ";
    book_name = " ";
    auther = " ";
    publishing = " ";
    price = 0;
}
book::book(string b_id, string b_n, string au, string pu, double pr)
{
    book_ID = b_id;
    book_name = b_n;
    auther = au;
    publishing = pu;
    price = pr;
}

string book::getbook_ID()
{
    return book_ID;
}
string book::getbook_name()
{
    return book_name;
}
string book::getauther()
{
    return auther;
}

string book::getpublishing()
{
    return publishing;
}
double book::getprice()
{
    return price;
}

void book::display()
{
    cout << "书号:" << book_ID << endl;
    cout << "书名:" << book_name << endl;
    cout << "作者:" << auther << endl;
    cout << "出版社:" << publishing << endl;
    cout << "定价:" << price << endl;
}



#endif


main.cpp文件:

#define _CRT_SECURE_NO_WARNINGS 1


#include "book.h"
#include "buy.h"

//定义订单类,这里规定用户ID和书籍ID都是唯一的,根据用户ID可以从用户信息数组中查找到完整的用户信息,书籍类似
struct Dingdan
{
    int buyerid;//用户id
    int count; //购买数量
    string bookid[20]; //保存购买的书籍id
};




int main()
{
    int i = 0, buyerid, flag;
    book* bs[10]; //存储书籍
    int nmb_bs = 0;//书籍数量
    buyer* gu[10]; //存储用户
    int nmb_gu = 0; //用户数量


    //生成顾客实例对象
    member* b1 = new member("张三",1001,1,"幸福家园1-101",33.3);
    honoured_guest* b2 = new honoured_guest("李四", 1002, 0.8, "田园山庄2-301", 44.4);
    layfolk* b3 = new layfolk("王五", 1003, "龙兴园3-303", 55.4);

    //生成书籍对象
    book* k1 = new book("isbn1001", "钢铁冶炼", "小刚", "浩方出版社", 55.5);
    book* k2 = new book("isbn1002", "兴趣培养", "李有才", "清华出版社", 66.5);

    //将用户信息写入文件
    ofstream ofsb;
    ofsb.open("guest.txt", ios::out);
    //写入会员数据
    ofsb << "1 " << b1->getid() << " " << b1->getbuyname() << " " << b1->getaddress() << " " << b1->getpay() <<" "<<b1->getleaguregrad() << endl;
    //写入贵宾
    ofsb << "2 " << b2->getid() << " " << b2->getbuyname() << " " << b2->getaddress() << " " << b2->getpay() << " " << b2->getrate() << endl;
    //写入普通人
    ofsb << "3 " << b3->getid() << " " << b3->getbuyname() << " " << b3->getaddress() << " " << b3->getpay() << endl;
    ofsb.close();

    //将书籍信息写入文件
    ofstream ofsk;
    ofsk.open("book.txt", ios::out);
    ofsk << k1->getbook_ID() << " " << k1->getbook_name() << " " << k1->getauther() << " " << k1->getpublishing() << " " << k1->getprice() << endl;
    ofsk << k2->getbook_ID() << " " << k2->getbook_name() << " " << k2->getauther() << " " << k2->getpublishing() << " " << k2->getprice() << endl;
    ofsk.close();

    //读取文件
    //1.读取用户信息
    ifstream ifsb;
    ifsb.open("guest.txt", ios::in);

    if (!ifsb.is_open())
    {
        cout << "用户文件打开失败" << endl;
        return 0;
    }
    while (!ifsb.eof())
    {
        int t=0, level=0,id=0;
        double rate=0,pay=0;
        string  name = "", ad = "";
        ifsb >> t; //读取类型
        if (t == 1) //读取会员书籍
        {
            ifsb >> id >> name >> ad >> pay >> level;
            if (id > 0) //验证读取成功
            {
                gu[nmb_gu] = new member(name, id, level,ad,pay);
                nmb_gu++;
            }
        }
        else if (t == 2) //读取贵宾书籍
        {
            ifsb >> id >> name >> ad >> pay >> rate;
            if (id > 0)
            {
                gu[nmb_gu] = new honoured_guest(name, id, rate, ad, pay);
                nmb_gu++;
            }
        }
        else if (t == 3)
        {
            ifsb >> id >> name >> ad >> pay;
            if (id > 0)
            {
                gu[nmb_gu] = new layfolk(name, id, ad, pay);
                nmb_gu++;
            }
        }
    }
    ifsb.close();
    //显示读取的用户信息
    for (int i = 0; i < nmb_gu; i++)
    {
        if (gu[i]->gettype() == eGuestType::e_member)
        {
            member* p = (member*)gu[i];
            p->display();
        }
        else if (gu[i]->gettype() == eGuestType::e_honour)
        {
            honoured_guest* p = (honoured_guest*)gu[i];
            p->display();
        }
        else if (gu[i]->gettype() == eGuestType::e_layfolk)
        {
            layfolk* p = (layfolk*)gu[i];
            p->display();
        }
    }


    //2.读取书籍信息
    ifstream ifsk;
    ifsk.open("book.txt", ios::in);

    if (!ifsk.is_open())
    {
        cout << "用户文件打开失败" << endl;
        return 0;
    }
    while (!ifsk.eof())
    {
        string id="", name="", au="", pub="";
        double price=0;
        ifsk >> id >> name >> au >> pub >> price;
        if (!id.empty())
        {
            bs[nmb_bs] = new book(id, name, au, pub, price);
            nmb_bs++;
        }
    }
    ifsk.close();
    //显示书籍信息
    for (int i = 0; i < nmb_bs; i++)
        bs[i]->display();


    //处理订单
    Dingdan dd[10];
    //用户1买了1本书
    dd[0].buyerid = b1->getid();
    dd[0].count = 1;
    dd[0].bookid[0] = k1->getbook_ID();

    //用户2买了2本数
    dd[1].buyerid = b2->getid();
    dd[1].count = 2;
    dd[1].bookid[0] = k1->getbook_ID();
    dd[1].bookid[1] = k2->getbook_ID();

    //订单写入文件
    ofstream ofsdd;
    ofsdd.open("dingdan.txt", ios::out);
    for (int i = 0; i < 2; i++)
    {
        //写入用户id和书籍数量
        ofsdd << dd[i].buyerid << " " << dd[i].count << " ";
        //写入书籍id
        for (int j = 0; j < dd[i].count; j++)
        {
            if (j < dd[i].count - 1)
                ofsdd << dd[i].bookid[j] << " ";
            else
                ofsdd << dd[i].bookid[j] << endl;
        }
    }
    ofsdd.close(); //写入完毕
    return 0;
}


这个很简单啊,只需要读取word中的代码然后再创建时间的代码文件就行

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632