实验内容
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
要求写程序注释。
实验环境
-
计算机一台;
-
中文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: |
|---|
实验小结
第二个程序是第一个的完善版,根据题目要求,需要构造多个函数,代码相对较长,写代码时候需要尽可能保证头脑清醒,不然很难坚持下来。通过这次实验,对类有了更多的认识,实验完成后也有一点小小的成就感!