c++网上购书结账系统

设计一个模拟网上购书的结账系统(或类似系统),要求包含至少5个类以上,实现一组完整的功能。尽量增加将信息(客户、书本信息)从文件中读取,最后结果(订单信息)再写入到文件中去。(头文件不要有#include“book.h”这样类似的东西)

img

代码如下:

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

//定义客户类型
enum 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 = 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 = 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 = e_layfolk;
    }
    void display();
    void setpay(double p);
};

buyer::buyer()
{
    name = " ";
    buyerId = 0;
    address = " ";
    pay = 0;
    type = e_layfolk;//添加这个设置
}
buyer::buyer(string n, int b, string a, double p)
{
    name = n;
    buyerId = b;
    address = a;
    pay = p;
    type = 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;
}

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




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


//从文件中读取用户信息
void GetUserInfo(buyer* gu[], int& nmb_gu)
{
    //1.读取用户信息
    ifstream ifsb;
    ifsb.open("guest.txt", ios::in);

    if (!ifsb.is_open())
    {
        cout << "用户文件打开失败" << endl;
        return ;
    }
    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();

}
//从文件中读取书籍信息
void GetBookInfo(book* bs[], int& nmb_bs)
{
    //2.读取书籍信息
    ifstream ifsk;
    ifsk.open("book.txt", ios::in);

    if (!ifsk.is_open())
    {
        cout << "用户文件打开失败" << endl;
        return ;
    }
    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();

}
//更新用户信息文件
void UpdateUser(buyer* gu[], int nmb_gu)
{
    //将用户信息写入文件
    ofstream ofsb;
    ofsb.open("guest.txt", ios::out);
    for (int i = 0; i < nmb_gu; i++)
    {
        if (gu[i]->gettype() == e_member)
        {
            member* b1 = (member*)gu[i];
            //写入会员数据
            ofsb << "1 " << b1->getid() << " " << b1->getbuyname() << " " << b1->getaddress() << " " << b1->getpay() << " " << b1->getleaguregrad() << endl;
        }
        else if (gu[i]->gettype() == e_honour)
        {
            //写入贵宾
            honoured_guest* b2 = (honoured_guest*)gu[i];
            ofsb << "2 " << b2->getid() << " " << b2->getbuyname() << " " << b2->getaddress() << " " << b2->getpay() << " " << b2->getrate() << endl;
        }
        else
        {
            //写入普通人
            layfolk* b3 = (layfolk*)gu[i];
            ofsb << "3 " << b3->getid() << " " << b3->getbuyname() << " " << b3->getaddress() << " " << b3->getpay() << endl;
        }



    }

    ofsb.close();
    cout << "用户信息保存成功!" << endl;
}
//更新书籍信息文件
void UpdateBooks(book* bs[], int nmb_bs)
{
    //将书籍信息写入文件
    ofstream ofsk;
    ofsk.open("book.txt", ios::out);
    for(int i=0;i<nmb_bs;i++)
        ofsk << bs[i]->getbook_ID() << " " << bs[i]->getbook_name() << " " << bs[i]->getauther() << " " << bs[i]->getpublishing() << " " << bs[i]->getprice() << endl;
    ofsk.close();
    cout << "书籍信息保存成功!" << endl;
}

//显示当前所有用户信息
void showAllGuest(buyer* gu[], int nmb_gu)
{
    if (nmb_gu == 0)
    {
        cout << "用户文件为空" << endl;
        return;
    }
    cout << "读取的用户信息为:" << endl;
    //显示读取的用户信息
    for (int i = 0; i < nmb_gu; i++)
    {
        if (gu[i]->gettype() == e_member)
        {
            member* p = (member*)gu[i];
            p->display();
        }
        else if (gu[i]->gettype() == e_honour)
        {
            honoured_guest* p = (honoured_guest*)gu[i];
            p->display();
        }
        else if (gu[i]->gettype() == e_layfolk)
        {
            layfolk* p = (layfolk*)gu[i];
            p->display();
        }
    }
}

//显示所有书籍信心
void showAllBooks(book* bs[], int nmb_bs)
{
    if (nmb_bs == 0)
    {
        cout << "目前暂无书籍信息" << endl;
        return;
    }
    //显示书籍信息
    cout << "书籍信息:" << endl;
    for (int i = 0; i < nmb_bs; i++)
        bs[i]->display();
}

//判断用户ID是否已经存在
int isIdExist(buyer* gu[], int nmb, int id)
{
    for (int i = 0; i < nmb; i++)
    {
        if (gu[i]->getid() == id)
            return 1;
    }
    return 0;
}


//新增用户
void AddUser(buyer* gu[], int &nmb_gu)
{
    int id,level,type;
    string name, ad;
    double pay, rate;
    cout << "请输入用户id:";
    //这里判断一下ID是否已经存在
    while (1)
    {
        cin >> id;
        if (isIdExist(gu, nmb_gu, id))
            cout << "该ID已存在,请重新输入:";
        else
            break;
    }


    cout << "请输入姓名:";
    cin >> name;
    cout << "请输入地址:";
    cin >> ad;
    cout << "请输入支付金额: ";
    cin >> pay;
    while (1)
    {
        cout << "请选择用户类型:1.会员  2.贵宾  3.普通用户 :";
        cin >> type;
        if (type >= 1 && type <= 3)
            break;
        else
            cout << "输入错误,";
    }

    if (type == 1)
    {
        cout << "请输入会员等级:";
        cin >> level;
        member* b = new member(name, id, level, ad, pay);
        gu[nmb_gu] = b;
        nmb_gu++;
    }
    else if (type == 2)
    {
        cout << "请输入折扣率:";
        cin >> rate;
        honoured_guest* g = new honoured_guest(name, id, rate, ad, pay);
        gu[nmb_gu] = g;
        nmb_gu++;
    }
    else
    {
        layfolk* ll = new layfolk(name, id, ad, pay);
        gu[nmb_gu] = ll;
        nmb_gu++;
    }
    cout << "添加成功!" << endl;
}

//判断书籍ID是否已经存在
int isBookIdExist(book* bs[], int nmb, string id)
{
    for (int i = 0; i < nmb; i++)
    {
        if (bs[i]->getbook_ID().compare(id) == 0)
            return 1;
    }
    return 0;
}

//新增书籍
void AddBook(book* bs[], int &nmb_bs)
{
    string id, name, au, pub;
    double price;
    cout << "请输入书籍编号:";
    while (1)
    {
        cin >> id;
        if (isBookIdExist(bs, nmb_bs, id))
            cout << "该编号已经存在,请重新输入:";
        else
            break;
    }

    cout << "请输入书籍名称:";
    cin >> name;
    cout << "请输入作者:";
    cin >> au;
    cout << "请输入出版社:";
    cin >> pub;
    cout << "请输入定价:";
    cin >> price;
    book* b = new book(id, name, au, pub, price);
    bs[nmb_bs++] = b;
    cout << "书籍添加成功!" << endl;
}

//购买书籍
void shopping(buyer* gu[], int nmb_gu, book* bs[], int nmb_bs,Dingdan dd[],int &nmb_dd)
{
    int userid,count = 0;
    string bookid;
    cout << "请输入用户id:";
    while (1)
    {
        cin >> userid;
        //判断id是否已经存在
        if (isIdExist(gu, nmb_gu, userid))
            break;
        else
            cout << "该用户ID不存在,请重新输入:";

    }

    cout << "请输入购买的书籍数量:";
    cin >> count;


    dd[nmb_dd].buyerid = userid;
    dd[nmb_dd].count = count;

    for (int i = 0; i < count; i++)
    {
        cout << "请输入书籍ID:";
        while (1)
        {
            cin >> bookid;
            if (isBookIdExist(bs, nmb_bs, bookid))
                break;
            else
                cout << "该书籍不存在,请重新输入:";
        }
        dd[nmb_dd].bookid[i] = bookid;

    }
    nmb_dd++;

    //订单写入文件
    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(); //写入完毕
    cout << "订单信息已写入文件!" << endl;
}

//显示订单信息
void showDd(Dingdan dd[], int nmb_dd)
{
    cout << "订单信息:" << endl;
    cout << "----------------------------------------" << endl;
    for (int i = 0; i < nmb_dd; i++)
    {
        cout << "顾客ID:" << dd[i].buyerid << endl;
        for (int j = 0; j < dd[i].count; j++)
            cout << "        " << dd[i].bookid[j] << endl;
        cout << "----------------------------------------" << endl;
    }
}


int main()
{
    int op;
    book* bs[50]; //存储书籍
    int nmb_bs = 0;//书籍数量
    buyer* gu[50]; //存储用户
    int nmb_gu = 0; //用户数量

    Dingdan dd[50]; //保存订单信息
    int nmb_dd = 0; //订单数量

    int flag = 1;

    //程序开始时,从文件读取已有信息
    GetUserInfo(gu, nmb_gu);
    GetBookInfo(bs, nmb_bs);


    while (flag)
    {
        system("cls");
        cout << "1.增加顾客" << endl;
        cout << "2.查看所有顾客信息" << endl;
        cout << "3.添加书籍" << endl;
        cout << "4.查看所有书籍信息" << endl;
        cout << "5.新增订单" << endl;
        cout << "6.显示所有订单" << endl;
        cout << "0.退出系统" << endl;
        cout << "请选择:";
        cin >> op;
        switch (op)
        {
        case 1: AddUser(gu,nmb_gu); break;
        case 2: showAllGuest(gu,nmb_gu); break;
        case 3: AddBook(bs,nmb_bs); break;
        case 4: showAllBooks(bs,nmb_bs); break;
        case 5: shopping(gu,nmb_gu,bs,nmb_bs,dd,nmb_dd); break;
        case 6: showDd(dd, nmb_dd); break;
        case 0:flag = 0; break;
        }
        system("pause");
    }
    return 0;
}



参考一下

#include<iostream>
#include<string>
using namespace std;
class buyfolk;
class member;
class honoured_guest;
class buyer
{
public:
       buyer()
       {

              name="Null";
              addr="Null";
              number=0;
              expense=0;
              level=0;
       }

void getid(int num)

       {

              number=num;
              if(number>=0&&number<=20)
              {   level=1;}
              else
if(number>=21&&number<=40)
              {     level=2;}
              else
if(number>=41&&number<=60)
              {     level=3;}
              else
if(number>=61&&number<=80)

              {     level=4;}
              else
if(number>=81&&number<=100)
              {     level=5;}
              else
if(number>=200&&number<=300)

              {            }

              else
if(number>=1000&&number<=2000)

              {            }

              else

                     cout<<"Error
munber please register"<<endl;

       }

       void
getbuyname()

       {

              cout<<"请输入你的姓名:"<<endl;
              cin>>name;

       }

       void
getaddress()

       {

              cout<<"请输入你的地址:"<<endl;
              cin>>addr;
       }
       virtual
void setpay()
       {
              getbuyname();
              getaddress();
              cout<<"请输入你的未打折消费: "<<endl;
              cin>>expense;
       }
       virtual
void display()
       {
              cout<<"姓名: "<<name<<endl<<"地址:
"<<addr<<endl<<"编号: "<<number<<endl<<"消费:
"<<expense<<endl;
       }
protected:
       string name;
       string addr;
       int  number;
       int level;
       double  expense;
};
class buyfolk:public buyer
{
public:
       virtual
void display()
       {
              cout<<"--欢迎您,亲爱的普通会员--"<<endl;
              buyer::display();
       }
       virtual
void setpay()
       {
              buyer::setpay();
       }      
}; 
class member:public buyer
{
public:
       member()
       {
       }
       virtual
void setpay()
       {
              buyer::setpay();
              if(level==1)
                     expense=expense*0.95;
              if(level==2)
                     expense*=0.90;
              if(level==3)
                     expense*=0.85;
              if(level==4)
                     expense*=0.80;
              if(level==5)
                     expense*=0.70;
       }

       virtual
void display()

       {

              cout<<"--欢迎您,亲爱的黄金会员--"<<endl;

              buyer::display();

              cout<<"Level:
"<<level<<endl;

       }

private:

};

 

class honoured_guest:public buyer

{

public:

       honoured_guest()
       {
              discount=0;
       }

       virtual
void setpay()
       {
              buyer::setpay();
              cout<<"请输入你的折扣: "<<endl;
              cin>>discount;
              expense*=(1-discount);
       }

       virtual
void display()
       {
              cout<<"--欢迎您,亲爱的钻石会员--"<<endl;
              buyer::display();
              cout<<"折扣:"<<discount<<endl;
       }
private:
       double discount;
}; 
int main()
{
       int number;

       buyfolk
b[10];

       member
m[10];

       honoured_guest
h[10];
       int i=0,flag=1,j=0,z=0;
       while(flag)
       {     cout<<"-------------------------------------------------"
<<endl;

              cout<<"     ------欢迎进入我们书店------     
"<<endl;

              cout<<"     ----如果你想要退出,请输入886----  
"<<endl;

              cout<<"       ----请输入你的编号----      
"<<endl;

              cout<<"-------------------------------------------------"
<<endl;
              cin>>number;
              if(number>=0&&number<=100)
              {   
                     cout<<"--欢迎您,亲爱的黄金会员--"<<endl;
                     m[i].getid(number);
                     m[i].setpay();
                     m[i].display();
                     i++;
                     cout<<endl<<endl;
              }
              else
if(number>=200&&number<=300)
              {
                     cout<<"--欢迎您,亲爱的钻石会员--"<<endl;
                     h[j].getid(number);
                     h[j].setpay();
                     h[j].display();
                     j++;
                     cout<<endl<<endl;
              }
              else
if(number>=1000&&number<=2000)
              {
                     cout<<"--欢迎您,亲爱的普通会员--"<<endl;
                     b[z].getid(number);
                     b[z].setpay();
                     b[z].display();
                     z++;
                     cout<<endl<<endl;
              }
              else
if(number==886)
              {
                     flag=0;
                     cout<<"--欢迎下次光临--"<<endl;
              }
              else

                     cout<<"Error
munber please register"<<endl;
       }
       return 0;
}

#include<iostream>
#include<string>
using namespace std;
class buyfolk;
class member;
class honoured_guest;
class buyer
{
public:
       buyer()
       {

              name="Null";
              addr="Null";
              number=0;
              expense=0;
              level=0;
       }

void getid(int num)

       {

              number=num;
              if(number>=0&&number<=20)
              {   level=1;}
              else
if(number>=21&&number<=40)
              {     level=2;}
              else
if(number>=41&&number<=60)
              {     level=3;}
              else
if(number>=61&&number<=80)

              {     level=4;}
              else
if(number>=81&&number<=100)
              {     level=5;}
              else
if(number>=200&&number<=300)

              {            }

              else
if(number>=1000&&number<=2000)

              {            }

              else

                     cout<<"Error
munber please register"<<endl;

       }

       void
getbuyname()

       {

              cout<<"请输入你的姓名:"<<endl;
              cin>>name;

       }

       void
getaddress()

       {

              cout<<"请输入你的地址:"<<endl;
              cin>>addr;
       }
       virtual
void setpay()
       {
              getbuyname();
              getaddress();
              cout<<"请输入你的未打折消费: "<<endl;
              cin>>expense;
       }
       virtual
void display()
       {
              cout<<"姓名: "<<name<<endl<<"地址:
"<<addr<<endl<<"编号: "<<number<<endl<<"消费:
"<<expense<<endl;
       }
protected:
       string name;
       string addr;
       int  number;
       int level;
       double  expense;
};
class buyfolk:public buyer
{
public:
       virtual
void display()
       {
              cout<<"--欢迎您,亲爱的普通会员--"<<endl;
              buyer::display();
       }
       virtual
void setpay()
       {
              buyer::setpay();
       }      
}; 
class member:public buyer
{
public:
       member()
       {
       }
       virtual
void setpay()
       {
              buyer::setpay();
              if(level==1)
                     expense=expense*0.95;
              if(level==2)
                     expense*=0.90;
              if(level==3)
                     expense*=0.85;
              if(level==4)
                     expense*=0.80;
              if(level==5)
                     expense*=0.70;
       }

       virtual
void display()

       {

              cout<<"--欢迎您,亲爱的黄金会员--"<<endl;

              buyer::display();

              cout<<"Level:
"<<level<<endl;

       }

private:

};

 

class honoured_guest:public buyer

{

public:

       honoured_guest()
       {
              discount=0;
       }

       virtual
void setpay()
       {
              buyer::setpay();
              cout<<"请输入你的折扣: "<<endl;
              cin>>discount;
              expense*=(1-discount);
       }

       virtual
void display()
       {
              cout<<"--欢迎您,亲爱的钻石会员--"<<endl;
              buyer::display();
              cout<<"折扣:"<<discount<<endl;
       }
private:
       double discount;
}; 
int main()
{
       int number;

       buyfolk
b[10];

       member
m[10];

       honoured_guest
h[10];
       int i=0,flag=1,j=0,z=0;
       while(flag)
       {     cout<<"-------------------------------------------------"
<<endl;

              cout<<"     ------欢迎进入我们书店------     
"<<endl;

              cout<<"     ----如果你想要退出,请输入886----  
"<<endl;

              cout<<"       ----请输入你的编号----      
"<<endl;

              cout<<"-------------------------------------------------"
<<endl;
              cin>>number;
              if(number>=0&&number<=100)
              {   
                     cout<<"--欢迎您,亲爱的黄金会员--"<<endl;
                     m[i].getid(number);
                     m[i].setpay();
                     m[i].display();
                     i++;
                     cout<<endl<<endl;
              }
              else
if(number>=200&&number<=300)
              {
                     cout<<"--欢迎您,亲爱的钻石会员--"<<endl;
                     h[j].getid(number);
                     h[j].setpay();
                     h[j].display();
                     j++;
                     cout<<endl<<endl;
              }
              else
if(number>=1000&&number<=2000)
              {
                     cout<<"--欢迎您,亲爱的普通会员--"<<endl;
                     b[z].getid(number);
                     b[z].setpay();
                     b[z].display();
                     z++;
                     cout<<endl<<endl;
              }
              else
if(number==886)
              {
                     flag=0;
                     cout<<"--欢迎下次光临--"<<endl;
              }
              else

                     cout<<"Error
munber please register"<<endl;
       }
       return 0;
}