用实验的流程写一个披萨订购系统

439 阅读7分钟

实验内容

1、创建一个名为Pizza的类,用它来存储单个比萨饼的信息。这个类应包含以下内容:

几个私有变量,分别用来存储比萨的尺寸(小,中,大)、奶酪配料数量、意大利腊香肠配料数量和火腿配料数量。

一个(或多个)构造函数,用于设置所有变量的数值。

几个公有函数,用于获取和设置变量的数值。

一个名为calcCost () 的公有函数,用于返回一个表示比萨饼价格的double值。

比萨饼价格由以下内容决定:

小:10美元+每份配料2美元

中:12美元+每份配料2美元

大:14美元+每份配料2美元

编写测试代码来生成几个比萨饼信息并输出对这些披萨的价格。例如,一个大比萨饼外加一份奶酪配料、一份意大利腊香肠配料及两份火腿配料的总价格应为22美元

要求写程序注释。

2、对程序1进行扩充,需要你创建一个PizzaOrder类,这个类允许一个订单里最多存储三个披萨饼的信息。每个存储进来的披萨饼信息都应该是一个披萨饼对象。除了合适的变量和构造函数外,还要有以下的函数:

public int getNumPizzas()—返回订单中的披萨的个数。

public Pizza* getPizza1()—返回订单中的第一个披萨,如果pizza1未设置就返回null。

public Pizza* getPizza2()— 返回订单中第二个披萨,如果pizza2未设置就返回null。

public Pizza* getPizza3()— 返回订单中第三个披萨,如果pizza3未设置就返回null。

对于带有另一个PizzaOrder对象并为其比萨创建一个独立的复制构造函数。

使用旧订单作为新订单的起始点可能很有用。

编写一个main函数来测试这个类。如果订单中有两个或者三个披萨饼,则会用到setPizza2和setPizza3函数。下面的代码示例对函数进行了说明。注意代码不完整。作为程序的一部分,你必须补充完整。例如:

Pizza pizza1 = // 这一行代码创建一个大披萨饼,一份奶酪,一份火腿

Pizza pizza2 = // 这一行代码创建一个中披萨饼,两份奶酪,两份意大利腊香肠。

PizzaOrder order1 = // 这一行代码创建一个订单

order1.setNumPizzas(2); // 订单中有两个披萨

order1.setPizza1(pizza1); // 设置第一个披萨

order1.setPizza2(pizza2); // 设置第二个披萨

double total = order1.calcTotal(); // 计算订单的总价格:18+20 = 38

要求写程序注释。

实验环境

  1. 计算机一台;

  2. 中文Windows操作系统,安装VS2010软件。

实验主要步骤

问题分解,(画出程序流程图或者类图)

程序1:

程序2:

给出程序源码

  //  程序1
#include <iostream>
using namespace std;

class Pizza
{
	string size;
	int num_cheese;
	int num_ham;
	int num_sausage;
public:
	Pizza() { cout << "披萨 + 1" << endl; }
	void menu();
	int setdata();
	double calcCost();
};

void Pizza::menu()
{
	cout << endl << "***************************    菜     单    ***************************" << endl;
	cout << endl << "              必点系列                          配料(每份配料2美元)" << endl;
	cout << "1.  披萨     小份.........10美元                        1.  奶酪       " << endl;
	cout << "2.  披萨     中份.........12美元                        2.  火腿       " << endl;
	cout << "3.  披萨     大份.........14美元                        3.  意大利腊香肠" << endl;
	cout << endl << endl << "  披萨选择尺寸(小/中/大)                    配料按照顺序输入份数" << endl << endl;
	cout << "如:大 1  2 1           就是一个大份披萨外加一份奶酪配料、两份火腿配料、一份意大利腊香肠配料" << endl;
}
int Pizza::setdata()
{
	menu();
	int temp;
	do {
		cin >> size >> num_cheese >> num_ham >> num_sausage;
		cout << "您的订单是这样的吗?(1 是 2 否)" << endl;
		cout << "一个" << size << "份披萨   " << num_cheese << "份奶酪配料、" << num_ham;
		cout << "份火腿配料、" << num_sausage << "份意大利腊香肠配料" << endl;
		cin >> temp;
		if ((temp != 1 && temp != 2) || (size != "小" && size != "中" && size != "大") || num_cheese < 0 || num_ham < 0 || num_sausage < 0)
		{  //  防止非法输入
			cout << "输入错误,返回菜单" << endl;
			return -1;
		}
	} while (temp != 1);
	return 0;
}
double Pizza::calcCost()
{
	int sum_price;
	if (size == "小")
		sum_price = 10;
	else if (size == "中")
		sum_price = 12;
	else
		sum_price = 14;

	sum_price = sum_price + num_cheese * 2 + num_ham * 2 + num_sausage * 2;
	return sum_price;
}
void main()
{
	Pizza pizza1;  
	double sumPrice1;
	int judge;  //  有非法输入时帮助程序退回上一步
	judge = pizza1.setdata();
	while(judge)
		judge = pizza1.setdata();
	sumPrice1 = pizza1.calcCost();
	cout << "您的订单已确认,共计" << sumPrice1 << "美元" << endl;
}
//  程序2
#include <iostream>
#include<cstring>
using namespace std;

class Pizza
{
	string size;
	int num_cheese;
	int num_ham;
	int num_sausage;
public:
	double sumPrice1;
	Pizza() { cout << "披萨 + 1" << endl; }
	Pizza(const Pizza& Obj);  //  复制构造函数
	void menu();
	int setdata();
	void showPizza();
	double calcCost();
};

Pizza::Pizza(const Pizza& Obj)
{
	size = Obj.size;
	num_cheese = Obj.num_cheese;
	num_ham = Obj.num_ham;
	num_sausage = Obj.num_sausage;
}
void Pizza::showPizza()
{
	cout << "一个" << size << "份披萨   " << num_cheese << "份奶酪配料、" << num_ham;
	cout << "份火腿配料、" << num_sausage << "份意大利腊香肠配料" << endl;
}

class PizzaOrder
{
	Pizza pizza1;
	Pizza pizza2;
	Pizza pizza3;
public:
	PizzaOrder() { cout << "订单+1  (注意:每个订单最多购买三个披萨)" << endl; }
	PizzaOrder(const PizzaOrder& Obj) { pizza1 = Obj.pizza1; pizza2 = Obj.pizza2;pizza3 = Obj.pizza3;}
	int getNumPizzas();  //  返回订单中的披萨的个数。 
	Pizza* getPizza1();  //  返回订单中的第一个披萨,如果pizza1未设置就返回null。
	Pizza* getPizza2();  //  返回订单中的第二个披萨,如果pizza1未设置就返回null。
	Pizza* getPizza3();  //  返回订单中的第三个披萨,如果pizza1未设置就返回null。
	void setNumPizzas(int a); // 订单中有a个披萨
	void setPizza1(Pizza pizza01); // 设置第一个披萨
	void setPizza2(Pizza pizza02); // 设置第二个披萨
	void setPizza3(Pizza pizza03); // 设置第三个披萨
	void showPizzaOrder();  //  帮助测试
	double calcTotal();
};
void PizzaOrder::showPizzaOrder()
{
	pizza1.showPizza();
	pizza2.showPizza();
	pizza3.showPizza();
}
int PizzaOrder ::getNumPizzas()
{
	int temp;
	do {
		cout << "您要购买几个披萨?(1/2/3)" << endl;
		cin >> temp;
	} while (temp != 1 && temp != 2 && temp != 3);
	return temp;
}
Pizza* PizzaOrder::getPizza1()
{
	Pizza* returnPizza = &pizza1;
	if (pizza1.sumPrice1 > 0)
		return returnPizza;
	else
	{
		cout << "pizza1未设置" << endl;
		return NULL;
	}
}
Pizza* PizzaOrder::getPizza2()
{
	Pizza* returnPizza = &pizza2;
	if (pizza2.sumPrice1 > 0)
		return returnPizza;
	else
	{
		cout << "pizza2未设置" << endl;
		return NULL;
	}
}
Pizza* PizzaOrder::getPizza3()
{
	Pizza* returnPizza = &pizza3;
	if (pizza3.sumPrice1 > 0)
		return returnPizza;
	else
	{
		cout << "pizza3未设置" << endl;
		return NULL;
	}
}
void PizzaOrder :: setNumPizzas(int a)
{
	if (a > 0)
		if (!getPizza1())
			setPizza1(pizza1);
	if (a > 1)
		if (!getPizza2())
			setPizza2(pizza2);
	if (a > 2)
		if (!getPizza3())
			setPizza3(pizza3);
}
void PizzaOrder::setPizza1(Pizza pizza01)
{
	int judge;  //  有非法输入时帮助程序退回上一步
	judge = pizza1.setdata();
	while (judge)
		judge = pizza1.setdata();
	pizza1.sumPrice1 = pizza1.calcCost();
}
void PizzaOrder::setPizza2(Pizza pizza02)
{
	int judge;  //  有非法输入时帮助程序退回上一步
	judge = pizza2.setdata();
	while (judge)
		judge = pizza2.setdata();
	pizza2.sumPrice1 = pizza2.calcCost();
}
void PizzaOrder::setPizza3(Pizza pizza03)
{
	int judge;  //  有非法输入时帮助程序退回上一步
	judge = pizza3.setdata();
	while (judge)
		judge = pizza3.setdata();
	pizza3.sumPrice1 = pizza3.calcCost();
}
double PizzaOrder::calcTotal()
{
	double temp;
	if (pizza3.calcCost() > 0)
		temp = pizza1.calcCost() + pizza2.calcCost() + pizza3.calcCost();
	else if (pizza2.calcCost() > 0)
		temp = pizza1.calcCost() + pizza2.calcCost();
	else
		temp = pizza1.calcCost();
	return temp;
}
void Pizza::menu()
{
	cout << endl << "***************************    菜     单    ***************************" << endl;
	cout << endl << "              必点系列                          配料(每份配料2美元)" << endl;
	cout << "1.  披萨     小份.........10美元                        1.  奶酪       " << endl;
	cout << "2.  披萨     中份.........12美元                        2.  火腿       " << endl;
	cout << "3.  披萨     大份.........14美元                        3.  意大利腊香肠" << endl;
	cout << endl << endl << "  披萨选择尺寸(小/中/大)                    配料按照顺序输入份数" << endl << endl;
	cout << "如:大 1  2 1           就是一个大份披萨外加一份奶酪配料、两份火腿配料、一份意大利腊香肠配料" << endl;
}
int Pizza::setdata()
{
	menu();
	int temp;
	do {
		cin >> size >> num_cheese >> num_ham >> num_sausage;
		cout << "您的订单是这样的吗?(1 是 2 否)" << endl;
		cout << "一个" << size << "份披萨   " << num_cheese << "份奶酪配料、" << num_ham;
		cout << "份火腿配料、" << num_sausage << "份意大利腊香肠配料" << endl;
		cin >> temp;
		if ((temp != 1 && temp != 2) || (size != "小" && size != "中" && size != "大") || num_cheese < 0 || num_ham < 0 || num_sausage < 0)
		{  //  防止非法输入
			cout << "输入错误,返回菜单" << endl;
			return -1;
		}
	} while (temp != 1);
	return 0;
}
double Pizza::calcCost()
{
	int sum_price;
	if (size == "小")
		sum_price = 10;
	else if (size == "中")
		sum_price = 12;
	else
		sum_price = 14;

	sum_price = sum_price + num_cheese * 2 + num_ham * 2 + num_sausage * 2;
	return sum_price;
}
void main()
{
	PizzaOrder order1;
	int temp = order1.getNumPizzas();
	if(temp == 1)
		order1.setNumPizzas(1);
	else if (temp == 2)
		order1.setNumPizzas(2);
	else 
		order1.setNumPizzas(3);
	double total = order1.calcTotal();
	cout << "您的订单已确认,共计" << total << "美元" << endl;

	/*//  调用复制构造函数
	PizzaOrder order2 = order1;
	order2.showPizzaOrder();*/

	//作用:可用于修改订单中的披萨
	/*Pizza pizza1;
	order1.setPizza1(pizza1);*/    
	/*Pizza pizza2;
	order1.setPizza2(pizza2);*/   
	
	/*//  先创建一个对象 然后调用复制构造函数
	Pizza pizza1;
	int judge;  //  有非法输入时帮助程序退回上一步
	judge = pizza1.setdata();
	while (judge)
		judge = pizza1.setdata();
	pizza1.sumPrice1 = pizza1.calcCost();
	pizza1.showPizza();
	Pizza pizza2 = pizza1;  
	pizza2.showPizza();*/
}

程序运行结果

程序1:
程序2:

实验小结

第二个程序是第一个的完善版,根据题目要求,需要构造多个函数,代码相对较长,写代码时候需要尽可能保证头脑清醒,不然很难坚持下来。通过这次实验,对类有了更多的认识,实验完成后也有一点小小的成就感!