我如何正确使用标志控制的循环,以便仅执行一次特定任务?

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

我正在编写一个程序,要求用户提供两个有理数,并根据用户是选择加还是减,我的程序将执行任务,然后必须选择继续加,减或退出。

到目前为止,我已经完成了大部分编码,但是在编写标志控制的循环时遇到了问题。对于我的程序,将显示一个显示菜单,询问用户是否要减去,添加或退出。

如果用户选择添加,则屏幕将清除,并且标题应显示在顶部,显示“有理数的添加”。该标题仅应出现一次,此后我的程序将要求用户输入一个有理数。

由于该程序应该添加两个有理数,所以在用户输入第一个有理数之后,我的程序将向用户询问另一个有理数。

因此,我的程序总共会问这个问题两次。

问题:我遇到的问题是,一旦出现标题“有理数的加法”并且我的程序第二次要求用户输入数字,标题将再次出现。我尝试使用标志控制的循环,但是无论尝试什么,它都会跳过标题或在每次询问问题时重复标题。下面是我指的代码:

void GetRational(char state, int& num, int& den)
{
    char c;
    bool once;
    once = true;

    while (once)
    {
        if (state == 'A' || state == 'a')
        {
            cout << "Addition of rational numbers" << endl;
            once = false;
        }
        else if (state == 'S' || state == 's')
        {
            cout << "Subtraction of rational numbers" << endl;
            once = true;
        }
        else break;
    }

    while (1)
    {
        cout << "\nPlease enter a fraction (n/d): ";
        cin >> num >> c >> den;
        if (den == 0)
            cout << "\nDenominator must not be 0";
        else break;
    }
}
c++ loops boolean flags
3个回答
0
投票
尝试将bool once移动到函数GetRational(...)的外部,可能是您多次调用GetRational(...),并且每次bool once都可能被重新初始化。因此该代码段如下所示:

bool once = true; void GetRational(char state, int& num, int& den) { char c; while (once) { if (state == 'A' || state == 'a') { cout << "Addition of rational numbers" << endl; once = false; } else if (state == 'S' || state == 's') { cout << "Subtraction of rational numbers" << endl; once = true; } else break; } while (1) { cout << "\nPlease enter a fraction (n/d): "; cin >> num >> c >> den; if (den == 0) cout << "\nDenominator must not be 0"; else break; } }

如戴维斯洛在评论中指出:

[全局变量,尤其是非常量的全局变量的问题是该程序的任何部分都可能与它们缠在一起。那使它很难跟踪程序的哪一行导致了错误。如果您将程序拆分为模块,然后至少可以保证只有一个文件可以将其存储上]。

因此,另一种选择是将once用作静态变量

if

您不想使用全局变量。
静态变量在函数内部使用时仅初始化一次,然后即使通过函数调用,它们也保持其值。

使用静态变量,代码段如下所示:

void GetRational(char state, int& num, int& den) { // will only be initialized one, at the first time call of function GetRational(...) static bool once = true; char c; while (once) { if (state == 'A' || state == 'a') { cout << "Addition of rational numbers" << endl; once = false; } else if (state == 'S' || state == 's') { cout << "Subtraction of rational numbers" << endl; once = true; } else break; } while (1) { cout << "\nPlease enter a fraction (n/d): "; cin >> num >> c >> den; if (den == 0) cout << "\nDenominator must not be 0"; else break; } }

阅读有关static关键字的更多信息:here

1
投票
为了使GetRational记住下次调用时的值once,请将变量声明为

0
投票
您可以尝试使用此代码。使用if循环。
© www.soinside.com 2019 - 2024. All rights reserved.