我有一项任务要制作餐厅菜单。菜单必须循环,直到用户输入 4 才能得到账单。我应该使用一个函数来显示菜单,另一个函数来计算运行总计并在用户完成订购时显示账单。
问题是,我必须在使用它之前初始化
runningTotal
,而且我不知道将它放在哪里以阻止它重置为初始化。最初我的计算函数cost()
是这样设置的:
void cost(const double ITEM_PRICE, int amtOfItemOrdered, bool isDoneOrdering) {
// initializing runningTotal and declaring other variables...
double runningTotal = 0, tip, finalBill;
// if statement so bill only displays when order is finished...
if (isDoneOrdering == false)
// calculate running total...
runningTotal += (ITEM_PRICE * amtOfItemOrdered);
else {
// when order finishes, calculate and display bill...
tip = (runningTotal * 0.20);
finalBill = (runningTotal + tip);
cout << "\nFood total: " << runningTotal <<
"\nTip: " << tip <<
"\nFinal Bill: " << finalBill;
}
我认为这会导致每次函数执行时
runningTotal
重置为 0。当我运行程序,订购一些东西,然后按 4 查看账单时,账单中的所有内容都显示为 0。以下是输出示例:
Food total: 0
Tip: 0
Final Bill: 0
我认为将
runningTotal
移到 cost()
函数之外可能会有所帮助,如下所示:
int main() {
// initializing runningTotal with 0 in main...
double runningTotal = 0;
// other variables...
const double ITEM1_PRICE = 2.50, ITEM2_PRICE = 3.50, ITEM3_PRICE = 4.50;
int itemOrdered, amtOfItemOrdered;
bool isDoneOrdering = false;
// loop menu choice until order is finished...
do {
displayMenu(ITEM1_PRICE, ITEM2_PRICE, ITEM3_PRICE);
cout << "Enter your choice: ";
cin >> itemOrdered;
// don't ask "how many" when done ordering...
if (itemOrdered != 4) {
cout << "\nHow many? ";
cin >> amtOfItemOrdered;
}
switch (itemOrdered) {
case 1:
// passing runningTotal to cost() so cost() can use it...
cost(ITEM1_PRICE, amtOfItemOrdered, isDoneOrdering, runningTotal);
break;
case 2:
cost(ITEM2_PRICE, amtOfItemOrdered, isDoneOrdering, runningTotal);
break;
case 3:
cost(ITEM3_PRICE, amtOfItemOrdered, isDoneOrdering, runningTotal);
break;
case 4:
isDoneOrdering = true;
cost(0, 0, isDoneOrdering, runningTotal);
// zeroes are here because cost() asks for parameters,
// but we're done adding to running total...
break;
default:
0; // empty placeholder statement...
}
} while (isDoneOrdering == false);
}
但这有相同的结果。我认为这里发生的事情是,
runningTotal
中的main
与runningTotal
中的cost()
不同,并且main
的runningTotal
中的值0被传递给runningTotal
中的cost()
,到底哪个正在重置它?
我考虑过为
runningTotal
、tip
和 finalBill
制作返回语句,并在函数外部显示账单,但我认为作业希望我坚持使用 void 函数。
刚刚测试在
runningTotal
中将main
初始化为1,账单显示以下内容:
Food total: 1
Tip: 0.2
Final Bill: 1.2
所以我确实认为初始化是这里的问题。任何帮助,将不胜感激。谢谢。
由于这是 C++,因此使用类是有意义的。
考虑一个类来封装成本计算,并使用一个单独的类来存储菜单。
constexpr double TIP_MARGIN = 0.2;
class BillCalculator
{
double m_RunningTotal = 0.0;
public:
void AddCost(const double price, int count)
{
m_RunningTotal += price * count;
}
double CalculateTip() const
{
return m_RunningTotal * TIP_MARGIN;
}
double CalculateTotalBill() const
{
return GetRunningTotal() + CalculateTip();
}
double GetRunningTotal() const
{
return m_RunningTotal;
}
};
在
main
中实例化这两个类。拥有一个仅关注 I/O 的函数将使代码更易于理解。
如果您需要传递您创建的任一类的实例,请通过引用传递。