Как исправить цикл do-while, который не прерывается при выборе выхода - PullRequest
2 голосов
/ 13 октября 2019

Я работаю над назначением, в котором отображается меню, и использую цикл do-while, если пользователь вводит 4, функция должна завершиться. Где я запутался, что функция продолжает работать? (Я определил функцию факториал и суперфакториал, но у них нет содержимого, потому что я еще не закончил.

Я попытался добавить оператор if, который гарантирует, что пользователь не выбрал опцию quit

#include <iostream>
#include <cmath>

//Function Prototypes
void ShowMenu();
int getValidUserInputPosNumGT0(int);
int Reverse(int);
int Factorial(int);
int Superfactorial(int);
int validateMenuChoice(int);

int main()
{
    int CHOICE, // Holds menu choice
        NUM; // User inputted number

    const int REVERSE = 1, //Menu choice 1 -> reverse function
            FACTORIAL = 2, //Menu choice 2 -> factorial function
            SUPERFACTORIAL = 3, //Menu choice 3 -> superfactorial function
            QUIT_CHOICE = 4; //Menu choice 4 -> quit program

    std::cout << "Welcome to the playing with numbers program!" << std::endl;
    do
    {
        ShowMenu();
        std::cin >> CHOICE;
        validateMenuChoice(CHOICE);
        std::cout << "Enter in a positive number greater than 0:  ";
        std::cin >> NUM;
        getValidUserInputPosNumGT0(NUM);

        if (CHOICE !=QUIT_CHOICE)
        {
            switch (CHOICE)
            {
                case REVERSE:
                    Reverse(NUM);
                case FACTORIAL:
                    Factorial(NUM);
                case SUPERFACTORIAL:
                    Superfactorial(NUM);
            }
        }

    }
    while (CHOICE !=QUIT_CHOICE);
    return 0;
}

int validateMenuChoice (int CHOICE)
{
    while (CHOICE < 1 || CHOICE > 4)
    {
        std::cout << "Please enter a valid menu choice:  \n";
        std::cin >> CHOICE;
    }
}


//Function to display the program menu
void ShowMenu()
    {
        std::cout << "1) Reverse Number\n"
                  << "2) Compute the factorial of a number\n"
                  << "3) Compute the superfactorial of a number\n"
                  << "4) Quit\n"
                  << "Select an option (1-4):  ";
    }

//Allows a user to enter in an integer and validated that the number is > 0
int getValidUserInputPosNumGT0 (int NUM)
    {
        while (NUM <= 0)
        {
            std::cout << "Please enter a positive number greater than 0: ";
            std::cin >> NUM;
        }
    }

//Takes a number as a value parameter and returns the reversed number
int Reverse (int NUM)
{
    std::cout << "The Reverse of "<< NUM << " is ";
    int reverse = 0, remainder;
    while (NUM != 0)
    {
        remainder = NUM % 10;
        reverse = reverse * 10 + remainder;
        NUM/=10;
    }
    std::cout << reverse << std::endl;
}

//takes a number as a value parameter and returns the factorial of the number
int Factorial (int NUM)
{

}

//takes a number as a value parameter and returns the Superfactorial of the number
int Superfactorial (int NUM)
{

}

когда пользователь вводит '4', программа должна выйти / завершиться, однако она продолжает работать и запрашивает у пользователя номер.

1 Ответ

1 голос
/ 13 октября 2019

Ваша проблема в том, что после того, как вы получите пользовательскую опцию, независимо от того, что они вводят, вы сразу же предложите им «Введите положительное число больше 0:». После запроса они вводят номер, а затем программа выполняет оператор if, который срабатывает только в том случае, если опция! = QUIT_CHOICE, тогда она проверяет информацию while (). Поэтому, если они введут 4, чтобы выйти, он попросит их ввести целое число после этого, а затем не будет проходить через оператор if, потому что пользователь выбрал выход, а затем он выйдет из программы. Другими словами, ваш цикл while все еще заканчивается, но сначала запрашивает это целое число.

Чтобы завершить цикл while после того, как пользователь введет 4, необходимо переместить операторы получения ввода (следующие три строки в цикле while) ВНУТРИ оператора if, который продолжается в ifопция пользователя! = QUIT_CHOICE. Затем, после того как пользователь введет 4, все остальное будет проигнорировано и цикл while будет завершен.

std::cout << "Enter in a positive number greater than 0:  ";
std::cin >> NUM;
getValidUserInputPosNumGT0(NUM);

Надеюсь, это поможет!

...