Как правильно использовать управляемый флагом l oop, чтобы заданная задача c выполнялась только один раз? - PullRequest
0 голосов
/ 15 апреля 2020

Я создаю программу, которая запрашивает у пользователя два рациональных числа, и в зависимости от того, выберет ли пользователь сложение или вычитание, моя программа выполнит задачу и затем должна будет продолжить сложение, вычитание или выход.

Пока что большая часть моего кодирования выполнена, но у меня проблема с написанием флага, управляемого l oop. Для моей программы появится меню шоу, которое спросит пользователя, хотят ли они вычесть, добавить или выйти.

Если пользователь решит добавить, экран очистится, и в верхней части должен появиться заголовок с надписью «Добавление рациональных чисел». Этот заголовок должен появляться только один раз, и после этого моя программа попросит пользователя ввести рациональное число.

Поскольку предполагается, что программа добавляет два рациональных числа, после того, как пользователь введет первое рациональное число, моя программа попросит пользователя ввести другое рациональное число.

Итак, моя программа задаст вопрос два раза.

Вопрос: Проблема, с которой я столкнулся, заключается в том, что, как только появляется заголовок «Добавление рациональных чисел», и моя программа запрашивает у пользователя номер во второй раз, заголовок появляется снова. Я пытался использовать флаг l oop, контролируемый флагом, но независимо от того, что я пробовал, он будет либо пропустить заголовок, либо повторять его каждый раз, когда задают вопрос. Ниже приведен код, на который я ссылаюсь:

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;
    }
}

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Чтобы GetRational запомнил значение once при следующем вызове, объявите переменную как

static bool once = true;

Переменная static будет инициализирована только один раз, что будет перед первым вызовом GetRational.

Затем, после того как вы проверите его и прежде чем вернуться из GetRational, установите

once = false;

Это будет сохраняться между вызовами на GetRational.

1 голос
/ 15 апреля 2020

Попробуйте переместить 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 в качестве переменная stati c , если вы не хотите использовать глобальную переменную.

Переменные Stati c при использовании внутри функции инициализируются только один раз, а затем они удерживать их значение даже при вызове функций.

С переменной stati c фрагмент кода будет выглядеть следующим образом:

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: здесь

0 голосов
/ 15 апреля 2020

Вы можете попробовать этот код. Используйте, если l oop.

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;
            }
        }
...