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