C++ 如何正确使用标记控制的循环,使特定任务只执行一次?

C++ 如何正确使用标记控制的循环,使特定任务只执行一次?,c++,loops,boolean,flags,C++,Loops,Boolean,Flags,我正在制作一个程序,要求用户输入两个有理数,根据用户选择加减,我的程序将执行该任务,然后必须选择继续加减或退出 到目前为止,我已经完成了大部分编码,但在编写标记控制循环时遇到了问题。对于我的程序,将出现一个显示菜单,询问用户是否要减法、加法或退出 如果用户选择添加,屏幕将清除,顶部应显示标题“添加有理数”。这个标题应该只出现一次,然后我的程序会要求用户输入一个有理数 由于程序应该添加两个有理数,在用户输入第一个有理数后,我的程序将要求用户输入另一个有理数 总之,我的程序会问两次这个问题 问题:

我正在制作一个程序,要求用户输入两个有理数,根据用户选择加减,我的程序将执行该任务,然后必须选择继续加减或退出

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

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

由于程序应该添加两个有理数,在用户输入第一个有理数后,我的程序将要求用户输入另一个有理数

总之,我的程序会问两次这个问题

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

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;
    }
}
void GetRational(字符状态、int&num、int&den)
{
字符c;
布尔一次;
一次=真;
while(一次)
{
如果(状态='A'| |状态='A')
{
库特>登;
如果(den==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;
    }
}
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
关键字的信息:

尝试将
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;
    }
}
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
关键字:

您可以尝试此代码。使用if循环

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


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

                }
                else { }
          }

            while (1)
            {   
                once="false";
                cout << "\nPlease enter a fraction (n/d): ";
                cin >> num >> c >> den;
                if (den == 0) 
                    cout << "\nDenominator must not be 0";
                else break;
            }
        }
bool once=“true”;
void GetRational(字符状态、int&num、int&den)
{
字符c;
如果(一次==“真”)
{ 
如果(状态='A'| |状态='A')
{
库特>登;
如果(den==0)

cout您可以尝试此代码。使用if循环

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


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

                }
                else { }
          }

            while (1)
            {   
                once="false";
                cout << "\nPlease enter a fraction (n/d): ";
                cin >> num >> c >> den;
                if (den == 0) 
                    cout << "\nDenominator must not be 0";
                else break;
            }
        }
bool once=“true”;
void GetRational(字符状态、int&num、int&den)
{
字符c;
如果(一次==“真”)
{ 
如果(状态='A'| |状态='A')
{
库特>登;
如果(den==0)

cout要使
GetRational
记住
的值一次
下次调用它时,将变量声明为

static bool once = true;
static
变量将只初始化一次,这将在第一次调用
GetRational
之前

然后,在您检查它之后以及从
GetRational
返回之前,设置

once = false;

这将在调用
GetRational

之间保持,以使
GetRational
记住
的值一次
下次调用时,将变量声明为

static bool once = true;
static
变量将只初始化一次,这将在第一次调用
GetRational
之前

然后,在您检查它之后以及从
GetRational
返回之前,设置

once = false;

这将在调用
GetRational

之间持续存在。为什么对只应该发生一次的事情有一个循环???您应该将title放在这个函数之外。这个函数似乎是一个输入检查,而不是title。这是一个XY问题,您被困在您创建的循环中。请跳出循环。如果
GetRational
被调用两次,那么你不应该在这个函数中放入
state=='A'
部分。因为它只需要一次。很抱歉,我是一个初学者,所以很多这些概念对我来说都是新概念,但我尝试对标题使用标志控制循环的原因是我想让它只显示一次。最初我只使用了if语句,但是每次我的程序要求用户输入分数时,title都会重复,所以我想如果我使用了flag控件,我可以让它只显示一次(如果有意义的话)。尝试将
bool一次性移出函数并使其全局化。可能是您调用函数
GetRational(…)
多次。为什么对只应该发生一次的事情有一个循环???你应该将title放在这个函数之外。这个函数看起来像是一个输入检查,而不是title。这是一个XY问题,你被困在你创建的一个循环中。跳出这个循环。如果调用了两次
GetRational
,那么你就不应该放
state=='A'
这个函数的一部分。因为它只需要一次。很抱歉,我是一个初学者,所以很多这些概念对我来说都是新概念,但我尝试对标题使用标志控制循环的原因是我想让它只显示一次。最初我只使用了if语句,但每次我的程序都会重复标题请用户输入一个分数,因此我认为如果我使用了一个flag控件,我可以使它只显示一次,如果这样做有意义的话。尝试将
bool一次性移出函数并使其全局化。可能是您正在调用函数
GetRational(…)
多次。我曾经将bool移出GetRational函数,并且能够解决我遇到的问题!感谢您的帮助!很高兴知道它有帮助!这