如何停止在 void 函数中将运行总计重置为 0?

问题描述 投票:0回答:1

我有一项任务要制作餐厅菜单。菜单必须循环,直到用户输入 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++ function void cumulative-sum
1个回答
0
投票

由于这是 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 的函数将使代码更易于理解。

如果您需要传递您创建的任一类的实例,请通过引用传递

© www.soinside.com 2019 - 2024. All rights reserved.