肯德基收费系统

简单工厂实现肯德基收费系统

模拟肯德基快餐店的收银系统,合理使用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;		//回到菜单
}

测试图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值