C++点餐系统 C++实现KFC点餐系统
Cynthia! 人气:0一、题目名称:模拟肯德基收银系统
二、题目内容:
同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
4.可在一定时间段参与店内活动(自行设计或参考官网信息)。
5.模拟打印小票的功能(写到文件中)。
基本要求:
1.程序设计风格良好,控制台界面友好,最多两人一组完成任务。
2.实现功能测试代码,确保程序的健壮性。
3.画出使用的设计模式图。
提高要求:
1.实现可视化界面(使用MFC)。
2.实现会员储值卡功能,完成储值卡消费。
实现当天营业额和餐品销量计算和统计,用数据库记录。
三、算法设计:
四、代码
1.点餐系统代码
#include<iostream> #include<string> #include<fstream> using namespace std; class Food { protected: string name; double price; int num; public: virtual double get_sum() { double sum = price * num; return sum; } virtual void set_name(string name) { this->name = name; } virtual string get_name() { return name; } virtual void set_price(double price) { this->price = price; } virtual double get_price() { return price; } virtual void set_num(int num) { this->num = num; } virtual int get_num() { return num; } }; class Hamburger :public Food { public: virtual double get_sum() { double sum = price * num; return sum; } }; class Snack :public Food { public: virtual double get_sum() { double sum = price * num; return sum; } }; class Drink :public Food { public: virtual double get_sum() { double sum = price * num; return sum; } }; class Set :public Food { public: virtual double get_sum() { double sum = price * num; return sum; } }; class Factory { public: virtual Food* food() = 0; }; class Factory_Hamburger :public Factory { public: Food* food() { return new Hamburger; } }; class Factory_Snack :public Factory { public: Food* food() { return new Snack; } }; class Factory_Drink :public Factory { public: Food* food() { return new Drink; } }; class Factory_Set :public Factory { public: Food* food() { return new Set; } }; class xiaopiao { public: virtual void output() = 0; } ; class H1 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "巨无霸--" << num << "份" <<endl; outfile << "巨无霸--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class H2 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "双层吉士汉堡--" << num << "份" <<endl; outfile << "双层吉士汉堡--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class H3 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "麦辣鸡腿汉堡--" << num << "份" <<endl; outfile << "麦辣鸡腿汉堡--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class S1 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "大薯条--" << num << "份" <<endl; outfile << "大薯条--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class S2 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "麦乐鸡--" << num << "份" <<endl; outfile << "麦乐鸡--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class D1 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "可口可乐--" << num << "份" <<endl; outfile << "可口可乐--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class D2 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "七喜--" << num << "份" <<endl; outfile << "七喜--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class D3 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "橙汁--" << num << "份" <<endl; outfile << "橙汁--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class SET1 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "巨无霸超值套餐--" << num << "份" <<endl; outfile << "巨无霸超值套餐--" << num << "份" << endl; outfile.close(); } } protected: int num; }; class SET2 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { if(0 != num) { ofstream outfile("receipt.dat", ios::out); cout << "双层吉士汉堡超值套餐--" << 1 << "份" <<endl; outfile << "双层吉士汉堡超值套餐--" << 1 << "份" << endl; outfile.close(); } } protected: int num; }; //运用策略模式简化 class Context { public: Context(xiaopiao *p) : pStrategy(p) { } void Interface() { pStrategy->output(); } private: xiaopiao *pStrategy; }; class collect { private: public: void main_menu() { cout << "---------------------" << endl; cout << "欢迎进入肯德基点餐系统!" << endl; cout << "---------------------" << endl; cout << "请问你选择单点(1)或者套餐(2):" << endl; } void single_menu() { cout << "---------------------" << endl; cout << "请选择您要点的产品: " << endl; cout << "主食: " << endl; cout << " 1.巨无霸 --17元 " << endl; cout << " 2.双层吉士汉堡--15元 " << endl; cout << " 3.麦辣鸡腿汉堡--15元 " << endl; cout << "配餐: " << endl; cout << " 4.大薯条 --11元 " << endl; cout << " 5.麦乐鸡 --9元 " << endl; cout << "饮料: " << endl; cout << " 6.可口可乐 --7元 " << endl; cout << " 7.七喜 --7元 " << endl; cout << " 8.橙汁 --10元 " << endl; cout << "若点餐结束,请输入0以结束点餐!" << endl; } void set_menu() { cout << "---------------------" << endl; cout << "请选择您要点的套餐: " << endl; cout << " 1.巨无霸超值套餐 --25元" << endl; cout << " (包含巨无霸一份、大薯条一份、可口可乐一份)" << endl; cout << " 2.双层吉士汉堡超值套餐 --23元" << endl; cout << " (包含双层吉士汉堡一份、大薯条一份、可口可乐一份)" << endl; cout << "若点餐结束,请输入0以结束点餐!" << endl; } void menu() { main_menu(); int choose; int hamburger[3], snack[2], drink[3],set[2]; for (int i = 0; i < 3; i++) { hamburger[i] = 0; drink[i] = 0; } for (int i = 0; i < 2; i++) { snack[i] = 0; set[i] = 0; } cin >> choose; if (1 == choose) { single_menu(); int ch,flag=1; while(flag) { cout << "请输入对应商品的序号:" ; cin >> ch; switch (ch) { case(0): { flag = 0; break; } case(1): { cout << "请输入需要几份?:"; int number; cin >> number; hamburger[0] = number; break; } case(2): { cout << "请输入需要几份?:"; int number; cin >> number; hamburger[1] = number; break; } case(3): { cout << "请输入需要几份?:"; int number; cin >> number; hamburger[2] = number; break; } case(4): { cout << "请输入需要几份?:"; int number; cin >> number; snack[0] = number; break; } case(5): { cout << "请输入需要几份?:"; int number; cin >> number; snack[1] = number; break; } case(6): { cout << "请输入需要几份?:"; int number; cin >> number; drink[0] = number; break; } case(7): { cout << "请输入需要几份?:"; int number; cin >> number; drink[1] = number; break; } case(8): { cout << "请输入需要几份?:"; int number; cin >> number; drink[2] = number; break; } default: { cout << "请输入正确的序号!" << endl; break; } } } } else if (2 == choose) { set_menu(); int ch, flag = 1; while (flag) { cout << "请输入对应商品的序号:"; cin >> ch; switch (ch) { case(0): { flag = 0; break; } case(1): { cout << "请输入需要几份?:"; int number; cin >> number; set[0] = number; break; } case(2): { cout << "请输入需要几份?:"; int number; cin >> number; set[1] = number; break; } default: { cout << "请输入正确的序号!" << endl; break; } } } } //生成汉堡工厂类 Factory_Hamburger* fac_h = new Factory_Hamburger(); //生成具体的汉堡类 Food* hamburger1 = fac_h->food(); Food* hamburger2 = fac_h->food(); Food* hamburger3 = fac_h->food(); //实例化各个汉堡 //巨无霸 hamburger1->set_name("巨无霸"); hamburger1->set_price(17); hamburger1->set_num(hamburger[0]); //双层吉士汉堡 hamburger2->set_name("双层吉士汉堡"); hamburger2->set_price(15); hamburger2->set_num(hamburger[1]); //麦辣鸡腿汉堡 hamburger3->set_name("麦辣鸡腿汉堡"); hamburger3->set_price(15); hamburger3->set_num(hamburger[2]); //生成小吃工厂类 Factory_Snack* fac_s = new Factory_Snack(); //生成具体的小吃类 Food* snack1 = fac_s->food(); Food* snack2 = fac_s->food(); //实例化各个小吃 //大薯条 snack1->set_name("大薯条"); snack1->set_price(11); snack1->set_num(snack[0]); //麦乐鸡 snack2->set_name("麦乐鸡"); snack2->set_price(9); snack2->set_num(snack[1]); //生成饮料工厂类 Factory_Drink* fac_d = new Factory_Drink(); //生成具体的饮料类 Food* drink1 = fac_d->food(); Food* drink2 = fac_d->food(); Food* drink3 = fac_d->food(); //实例化各个饮料 //可口可乐 drink1->set_name("可口可乐"); drink1->set_price(7); drink1->set_num(drink[0]); //七喜 drink2->set_name("七喜"); drink2->set_price(7); drink2->set_num(drink[1]); //橙汁 drink3->set_name("橙汁"); drink3->set_price(7); drink3->set_num(drink[2]); //生成套餐工厂类 Factory_Set* fac_se = new Factory_Set(); //生成具体的套餐类 Food* set1 = fac_se->food(); Food* set2 = fac_se->food(); //实例化各个套餐 //巨无霸超值套餐 set1->set_name("巨无霸超值套餐"); set1->set_price(25); set1->set_num(set[0]); //双层吉士汉堡超值套餐 set2->set_name("双层吉士汉堡超值套餐"); set2->set_price(23); set2->set_num(set[1]); //找零部分 cout << "---------------------" << endl; double sum = 0; sum = sum + hamburger1->get_sum(); sum = sum + hamburger2->get_sum(); sum = sum + hamburger3->get_sum(); sum = sum + snack1->get_sum(); sum = sum + snack2->get_sum(); sum = sum + drink1->get_sum(); sum = sum + drink2->get_sum(); sum = sum + drink3->get_sum(); sum = sum + set1->get_sum(); sum = sum + set2->get_sum(); cout << "您共计消费:" << sum << endl; cout << "请问您是否使用优惠券?(输入0已接受)"; int ch; cin >> ch; int yhq=0; if (0 == ch) { cout << "您拥有如下优惠券:" << endl; cout << "-1.满50减5" << endl; cout << "-2.满100减15" << endl; cout << "-3.满200减40" << endl; cout << "每次消费仅能使用一张优惠券,请选择使用的优惠券" << endl; int flag = 1; while (flag) { int ch; cin >> ch; if (ch == 1) { if (sum > 50) { sum -= 5; cout << "使用消费券成功!"; } else { cout << "您的消费金额还不能使用优惠券!" << endl; } flag = 0; } if (ch == 2) { if (sum > 100) { sum -= 15; cout << "使用消费券成功!";} else { cout << "您的消费金额还不能使用优惠券!" << endl; } flag = 0; } if (ch == 3) { if (sum > 200) { sum -= 40; cout << "使用消费券成功!";} else { cout << "您的消费金额还不能使用优惠券!" << endl; } flag = 0; } if (ch == 0) { cout << "不使用优惠券" << endl; flag = 0; } } } cout << "请问您支付多少:"; double pay; cin >> pay; double payback = pay - sum; while (0 > payback) { cout << "您好,您的钱不够本次消费(微笑.jpg),请重给,谢谢您哦~"; cin >> pay; payback = pay - sum; } cout << "共计收您" << pay << "元。" << endl; cout << "找零为:" << payback << "元" << endl; int cho; cout << "---------------------" << endl; cout << "请选择是否打印小票:(输入0以打印)" << endl; cin >> cho; if (0 == cho) { //打印小票部分 /* ofstream outfile("receipt.dat", ios::out); cout << "---------------------" << endl; outfile << "---------------------" << endl; cout << "欢迎来到肯德基欢乐餐厅!" << endl; outfile << "欢迎来到肯德基欢乐餐厅!" << endl; cout << "您共计点餐:" << endl; outfile << "您共计点餐:" << endl; cout << endl; outfile << endl; if (0 != hamburger[0]) { cout << "巨无霸--" << hamburger[0] << "份" <<endl;outfile << "巨无霸--" << hamburger[0] << "份" << endl; } if (0 != hamburger[1]) { cout << "双层吉士汉堡--" << hamburger[1] << "份" << endl;outfile << "双层吉士汉堡--" << hamburger[1] << "份" << endl; } if (0 != hamburger[2]) { cout << "麦辣鸡腿汉堡--" << hamburger[2] << "份" << endl; outfile << "麦辣鸡腿汉堡--" << hamburger[2] << "份" << endl;} if (0 != snack[0]) { cout << "大薯条--" << snack[0] << "份" << endl;outfile << "大薯条--" << snack[0] << "份" << endl; } if (0 != snack[1]) { cout << "麦乐鸡--" << snack[1] << "份" << endl; outfile << "麦乐鸡--" << snack[1] << "份" << endl;} if (0 != drink[0]) { cout << "可口可乐--" << drink[0] << "份" << endl;outfile << "可口可乐--" << drink[0] << "份" << endl; } if (0 != drink[1]) { cout << "七喜--" << drink[1] << "份" << endl; outfile << "七喜--" << drink[1] << "份" << endl;} if (0 != drink[2]) { cout << "橙汁--" << drink[2] << "份" << endl;outfile << "橙汁--" << drink[2] << "份" << endl; } if (0 != set[0]) { cout << "巨无霸超值套餐--" << set[0] << "份" << endl;outfile << "巨无霸超值套餐--" << set[0] << "份" << endl; } if (0 != set[1]) { cout << "双层吉士汉堡超值套餐--" << set[1] << "份" << endl; outfile << "双层吉士汉堡超值套餐--" << set[1] << "份" << endl;} cout << "---------------------" << endl; outfile << "---------------------" << endl; cout << "共计收您" << pay << "元。" << endl; outfile << "共计收您" << pay << "元。" << endl; cout << "找零为:" << payback << "元" << endl; outfile << "找零为:" << payback << "元" << endl; */ ofstream outfile("receipt.dat", ios::out); cout << "---------------------" << endl; outfile << "---------------------" << endl; cout << "欢迎来到肯德基欢乐餐厅!" << endl; outfile << "欢迎来到肯德基欢乐餐厅!" << endl; cout << "您共计点餐:" << endl; outfile << "您共计点餐:" << endl; cout << endl; outfile << endl; H1 *h1 = new H1; h1->get_num(hamburger[0]); H2 *h2 = new H2; h2->get_num(hamburger[1]); H3 *h3 = new H3; h3->get_num(hamburger[2]); S1 *s1 = new S1; s1->get_num(snack[0]); S2 *s2 = new S2; s2->get_num(snack[1]); D1 *d1 = new D1; d1->get_num(drink[0]); D2 *d2 = new D2; d2->get_num(drink[1]); D3 *d3 = new D3; d3->get_num(drink[2]); SET1 *set1 = new SET1; set1->get_num(set[0]); SET2 *set2 = new SET2; set2->get_num(set[1]); Context *ph1 = new Context(h1); Context *ph2 = new Context(h2); Context *ph3 = new Context(h3); Context *ps1 = new Context(s1); Context *ps2 = new Context(s1); Context *pd1 = new Context(d1); Context *pd2 = new Context(d2); Context *pd3 = new Context(d3); Context *pset1 = new Context(set1); Context *pset2 = new Context(set2); ph1->Interface(); ph2->Interface(); ph3->Interface(); ps1->Interface(); ps2->Interface(); pd1->Interface(); pd2->Interface(); pd3->Interface(); pset1->Interface(); pset2->Interface(); cout << endl; outfile << endl; cout << "---------------------" << endl; outfile << "---------------------" << endl; cout << "---------------------" << endl; outfile << "---------------------" << endl; cout << endl; outfile << endl; cout << "共计收您" << pay << "元。" << endl; outfile << "共计收您" << pay << "元。" << endl; cout << "找零为:" << payback << "元" << endl; outfile << "找零为:" << payback << "元" << endl; outfile.close(); //运用策略模式简化上列大量if语句 } } }; int main() { collect c; c.menu(); }
2.测试代码
#include <iostream> #include <fstream> using namespace std; class xiaopiao { public: virtual void output() = 0; } ; class H1 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { ofstream outfile("receipt.dat", ios::out); cout << "巨无霸--" << num << "份" <<endl; outfile << "巨无霸--" << num << "份" << endl; outfile.close(); } protected: int num; }; class H2 : public xiaopiao { public: void get_num(int n) { num = n; } void output() { ofstream outfile("receipt.dat", ios::out); cout << "双层吉士汉堡--" << num << "份" <<endl; outfile << "双层吉士汉堡--" << num << "份" << endl; outfile.close(); } protected: int num; }; class H3 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "麦辣鸡腿汉堡--" << 1 << "份" <<endl; outfile << "麦辣鸡腿汉堡--" << 1 << "份" << endl; outfile.close(); } }; class S1 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "大薯条--" << 1 << "份" <<endl; outfile << "大薯条--" << 1 << "份" << endl; outfile.close(); } }; class S2 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "麦乐鸡--" << 1 << "份" <<endl; outfile << "麦乐鸡--" << 1 << "份" << endl; outfile.close(); } }; class D1 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "可口可乐--" << 1 << "份" <<endl; outfile << "可口可乐--" << 1 << "份" << endl; outfile.close(); } }; class D2 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "七喜--" << 1 << "份" <<endl; outfile << "七喜--" << 1 << "份" << endl; outfile.close(); } }; class D3 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "橙汁--" << 1 << "份" <<endl; outfile << "橙汁--" << 1 << "份" << endl; outfile.close(); } }; class SET1 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "巨无霸超值套餐--" << 1 << "份" <<endl; outfile << "巨无霸超值套餐--" << 1 << "份" << endl; outfile.close(); } }; class SET2 : public xiaopiao { public: void output() { ofstream outfile("receipt.dat", ios::out); cout << "双层吉士汉堡超值套餐--" << 1 << "份" <<endl; outfile << "双层吉士汉堡超值套餐--" << 1 << "份" << endl; outfile.close(); } }; class Context { public: Context(xiaopiao *p) : pStrategy(p) { } void Interface() { pStrategy->output(); } private: xiaopiao *pStrategy; }; int main() { ofstream outfile("receipt.dat", ios::out); cout << "---------------------" << endl; outfile << "---------------------" << endl; cout << "欢迎来到麦当劳欢乐餐厅!" << endl; outfile << "欢迎来到麦当劳欢乐餐厅!" << endl; cout << "您共计点餐:" << endl; outfile << "您共计点餐:" << endl; cout << endl; outfile << endl; H1 *h1 = new H1; h1->get_num(2); H2 *h2 = new H2; h2->get_num(3); H3 *h3 = new H3; S1 *s1 = new S1; S2 *s2 = new S2; D1 *d1 = new D1; D2 *d2 = new D2; D3 *d3 = new D3; SET1 *set1 = new SET1; SET2 *set2 = new SET2; Context *ph1 = new Context(h1); Context *ph2 = new Context(h2); Context *ph3 = new Context(h3); Context *ps1 = new Context(s1); Context *ps2 = new Context(s1); Context *pd1 = new Context(d1); Context *pd2 = new Context(d2); Context *pd3 = new Context(d3); Context *pset1 = new Context(set1); Context *pset2 = new Context(set2); ph1->Interface(); ph2->Interface(); ph3->Interface(); ps1->Interface(); ps2->Interface(); pd1->Interface(); pd2->Interface(); pd3->Interface(); pset1->Interface(); pset2->Interface(); if (h1) delete h1; if (h2) delete h2; if (h3) delete h3; if (s1) delete s1; if (s2) delete s2; if (d1) delete h1; if (d2) delete d2; if (d3) delete d3; if (set1) delete set1; if (set2) delete set2; }
五、结果展示
六、总结
1.本次作业为KFC点餐系统,刚开始的想法是用Java做,但是在看了许多资料结合自己的情况,最终采用C++来写程序,C++确实较Java熟悉了很多。
2.这次只做了基本要求,没有做提高要求,我会在后面的学习中,结合可视化界面和数据库连接,将点餐系统完善。
3.主要运用到设计模式中的策略模式和工厂模式,其中工厂模式负责生产餐厅中的各种食物的对象,策略模式负责在生成小票时避免出现冗杂的if语句。
4.从RPG游戏和KFC点餐系统两次的作业来看,这两次的代码认为量来说都是比较大的,对于其中的一些函数功能的使用,还有设计模式的理解并且不到位。
更多学习资料请关注专题《管理系统开发》。
加载全部内容