设计一个模拟网上购书的结账系统(或类似系统),要求包含至少5个类以上,实现一组完整的功能。尽量增加将信息(客户、书本信息)从文件中读取,最后结果(订单信息)再写入到文件中去。(头文件不要有#include“book.h”这样类似的东西)
2条回答
- qfl_sdu 2022-05-27 20:56关注
代码如下:
#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; }
解决 4无用 1
悬赏问题
- ¥15 DIFY API Endpoint 问题。
- ¥20 sub地址DHCP问题
- ¥15 delta降尺度计算的一些细节,有偿
- ¥15 Arduino红外遥控代码有问题
- ¥15 数值计算离散正交多项式
- ¥30 数值计算均差系数编程
- ¥15 redis-full-check比较 两个集群的数据出错
- ¥15 Matlab编程问题
- ¥15 训练的多模态特征融合模型准确度很低怎么办
- ¥15 kylin启动报错log4j类冲突