
代码如下:
#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;
}