简单工厂实现肯德基收费系统
模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式至少实现系统的以下功能:
1.正常餐品结算和找零。
2.基本套餐结算和找零。
3.使用优惠劵购买餐品结算和找零。
类图
源代码
#include "pch.h"
#include <iostream>
#include "string"
#include "fstream"
#include "time.h"
using namespace std;
class food //所有食物的基类
{
public:
string name; //食物名
double onePrice; //单价
int amount=0; //数量
double allPrice=0; //总价
public:
void AddAmount(int a) //增加数量,同时计算总价
{
amount = a + amount;
allPrice = amount * onePrice;
}
void ClearAmount() //清零数目,同时清零总价
{
amount = 0;
allPrice = amount * onePrice;
}
void SetPrice(double a) //设置单价
{
onePrice = a;
}
void SetName(string a) //设置名字
{
name = a;
}
void ShowName() //输出名字
{
cout << name << endl;
}
void OutPut() //若数目不为0,输出已点的食物个数以及总价
{
if (amount == 0)
return;
cout << amount << "个" << name << "共" <<allPrice<<"元"<<endl;
}
double Reprice() //返回总价
{
return allPrice;
}
double ReOnePrise() //返回单价
{
return onePrice;
}
string reFILE() //返回“点了x个y”,用于文件的操作
{
string s;
s = amount + "个" + name;
return s;
}
};
class choosefood //相当于工厂
{
public:
static food* Createfood()
{
return new food; //简单工厂模式
}
};
void showmain() //显示主菜单
{
cout << "==============================" << endl;
cout << "------------------------------" << endl;
cout << " 欢迎来到肯德基 " << endl;
cout << " 1.点餐 " << endl;
cout << " 2.领取优惠券 " << endl;
cout << " 3.已点餐品显示 " << endl;
cout << " 4.结账 " << endl;
cout << " 5.退出 " << endl;
cout << "------------------------------" << endl;
cout << "==============================" << endl;
cout << "请选择:" << endl;
}
int main()
{
choosefood *f = new choosefood; //设置餐品
food *f11 = f->Createfood();
f11->SetName("香辣鸡腿堡");
f11->SetPrice(9.9);
food *f12 = f->Createfood();
f12->SetName("双层牛肉堡");
f12->SetPrice(12.9);
food *f21 = f->Createfood();
f21->SetName("薯条");
f21->SetPrice(6);
food *f22 = f->Createfood();
f22->SetName("冰淇淋");
f22->SetPrice(5);
food *f31 = f->Createfood();
f31->SetName("可乐");
f31->SetPrice(4);
food *f32 = f->Createfood();
f32->SetName("果汁");
f32->SetPrice(4);
food *f41 = f->Createfood();
f41->SetName("双人鸡腿堡套餐");
f41->SetPrice(21.9);
food *f42 = f->Createfood();
f42->SetName("薯条牛肉堡");
f42->SetPrice(19.9);
int c, discount = 0; //c记录选择,discount记录是否有优惠劵
loop:showmain(); //每次循环返回
//ofstream FILE("data.txt"); //文件操作
//if (FILE.is_open()==0)
//{
// cout << "打开文件失败!" << endl;
//}
double cash = 0;double sum; //cash记录现金,sum记录所有食物花费的价格
cin >> c;
switch (c)
{
case 1: //点餐的选择
int a;
cout << "请选择食物餐品分类:" << endl;
cout << "1.主食 2.小食 3.饮料 4.套餐" << endl;
cin >> a;
switch (a)
{
int ch,items; //ch记录选择,items记录需要的食品数
case 1: //输出主食的数据
cout << "1.";
f11->ShowName();
cout << f11->ReOnePrise() <<"元每个"<< endl;
cout << "2.";
f12->ShowName();
cout << f12->ReOnePrise() << "元每个" << endl;
cout << "3.退出" << endl;
cin >> ch;
if (ch == 3)
break;
cout << "需要几个:" << endl;
cin >> items;
if (items < 0) //所需的物品数不可以小于零
{
cout << "错误!"<<endl;
break;
}
if (ch == 1)
{
f11->AddAmount(items);
f11->OutPut();
}
else if (ch == 2)
{
f12->AddAmount(items);
f12->OutPut();
}
break;
case 2: //小食类
cout << "1.";
f21->ShowName();
cout << f21->ReOnePrise() << "元每份" << endl;
cout << "2.";
f22->ShowName();
cout << f22->ReOnePrise() << "元每个" << endl;
cout << "3.退出" << endl;
cin >> ch;
if (ch == 3)
break;
cout << "需要几个:" << endl;
cin >> items;
if (items < 0)
{
cout << "错误!" << endl;
break;
}
if (ch == 1)
{
f21->AddAmount(items);
f21->OutPut();
}
else if (ch == 2)
{
f22->AddAmount(items);
f22->OutPut();
}
break;
case 3: //饮料类
cout << "1.";
f31->ShowName();
cout << f31->ReOnePrise() << "元每杯" << endl;
cout << "2.";
f32->ShowName();
cout << f32->ReOnePrise() << "元每杯" << endl;
cout << "3.退出" << endl;
cin >> ch;
if (ch == 3)
break;
cout << "需要几个:" << endl;
cin >> items;
if (items < 0)
{
cout << "错误!" << endl;
break;
}
if (ch == 1)
{
f31->AddAmount(items);
f31->OutPut();
}
else if (ch == 2)
{
f32->AddAmount(items);
f32->OutPut();
}
break;
case 4: //套餐类
cout << "1.";
f41->ShowName();
cout << f41->ReOnePrise() << "元每份,每份包括两个鸡腿堡,两杯可乐,一份薯条" << endl;
cout << "2.";
f42->ShowName();
cout << f42->ReOnePrise() << "元每份,每份包括一个牛肉堡,一杯可乐,一份薯条" << endl;
cout << "3.退出" << endl;
cin >> ch;
if (ch == 3)
break;
cout << "需要几个:" << endl;
cin >> items;
if (items < 0)
{
cout << "错误!" << endl;
break;
}
if (ch == 1)
{
f41->AddAmount(items);
f41->OutPut();
}
else if (ch == 2)
{
f42->AddAmount(items);
f42->OutPut();
}
break;
default:
cout << "错误!" << endl;
break;
}
break;
case 2: //领取优惠劵
cout << "1.八折优惠卷 2.满30减10元" << endl;
cout << "请从以上两张优惠价中选择一张:" << endl;
cin >> discount;
cout << "已选择!" << endl;
break;
case 3: //显示已点的餐品
sum = f11->Reprice() + f12->Reprice() + f21->Reprice() + f22->Reprice() + f31->Reprice() + f32->Reprice() + f41->Reprice() + f42->Reprice();
//记录所有餐品的总价
f11->OutPut();
f12->OutPut();
f21->OutPut();
f22->OutPut();
f31->OutPut();
f32->OutPut();
f41->OutPut();
f42->OutPut(); //输出已点的餐品,已点的餐品为零则会跳过
if (discount == 1) //有八折优惠劵的情况
{
cout << "使用了八折优惠劵!" << endl;
sum *= 0.8;
}
else if (discount == 2&& sum >= 30) //有满30减10优惠劵且花费超过30元
{
cout << "使用了满30减10的优惠劵!" << endl;
sum -= 10;
}
cout << "共花费" << sum << "元" << endl;
break;
case 4:
sum = f11->Reprice() + f12->Reprice() + f21->Reprice() + f22->Reprice() + f31->Reprice() + f32->Reprice() + f41->Reprice() + f42->Reprice();
if (discount == 1)
sum *= 0.8;
else if (discount == 2 && sum >= 30)
sum -= 10;
cout << "共花费" << sum << "元" << endl;
c3:cout << "付款:"; //付款不够的返回处
cin >> cash;
if (cash < sum) //付款小于总价
{
int i = 0;
cout << "所付款不足以支付本次消费!" << endl;
cout << "是否取消支付? 1.取消 2.不取消" << endl;
cin >> i;
if (i == 1) //取消支付
{
f11->ClearAmount();
f12->ClearAmount();
f21->ClearAmount();
f22->ClearAmount();
f31->ClearAmount();
f32->ClearAmount();
f41->ClearAmount();
f42->ClearAmount(); //清零数据
goto loop; //返回菜单
}
else if (i == 2)
goto c3; //重新支付
else
{
cout << "错误!" << endl;
goto c3;
}
}
cash -= sum; //现在cash为找零
cout << "找零" << cash << "元,欢迎下次光临!" << endl;
/*if (FILE.is_open()) //把点餐记录在文件里
{
FILE <<time(NULL) << endl;
if (f11->amount != 0)
FILE << f11->reFILE() << " 共" << f11->Reprice() << "元\n";
if (f12->amount != 0)
FILE << f12->reFILE() << " 共" << f12->Reprice() << "元\n";
if (f21->amount != 0)
FILE << f21->reFILE() << " 共" << f21->Reprice() << "元\n";
if (f22->amount != 0)
FILE << f22->reFILE() << " 共" << f22->Reprice() << "元\n";
if (f31->amount != 0)
FILE << f31->reFILE() << " 共" << f31->Reprice() << "元\n";
if (f32->amount != 0)
FILE << f32->reFILE() << " 共" << f32->Reprice() << "元\n";
if (f41->amount != 0)
FILE << f41->reFILE() << " 共" << f41->Reprice() << "元\n";
if (f42->amount != 0)
FILE << f42->reFILE() << " 共" << f42->Reprice() << "元\n";
FILE << "共" << sum << "元" << endl;
FILE << "找零" << cash << "元" << endl;
FILE << endl;
FILE.close(); //关闭文件
cout << "已记录至文件!" << endl;
}
else
{
cout << "写入文件错误!" << endl;
} */
f11->ClearAmount();
f12->ClearAmount();
f21->ClearAmount();
f22->ClearAmount();
f31->ClearAmount();
f32->ClearAmount();
f41->ClearAmount();
f42->ClearAmount(); //清零数据
break;
case 5:
return 0; //退出系统
default:
cout << "错误!" << endl;
break;
}
goto loop; //回到菜单
}
测试图片