cknox
cknox

Reputation: 57

C++: Asking the user to enter a new number if the number they entered is wrong

I'm trying to get the program to loop again, up to three times, if the user entered a number that does not follow the function defined in the if statement. The code as is, only loops once and then exits. Did I type the for loop incorrectly or is it the if...else statement that is wrong?

#include <iostream>

using std::cout; using std::cin; using std::endl;

int main() {
    cout << "Enter a positive odd number less than 40: ";
    int num = 0;


    for (int a = 0; a < 3; ++a);
    cin >> num;
    {   
        if (num < 40 && num > 0 && num % 2 == 1)
        {
            cout << "Thank you!" << endl;
        }
        else cout << "That is incorrect, try again!" << endl;
    }
}

Upvotes: 0

Views: 2463

Answers (2)

songyuanyao
songyuanyao

Reputation: 172894

Did I type the for loop incorrectly or is it the if...else statement that is wrong?

Both. You should (1) remove the semicolon following the for statment; (2) move cin >> num into the for loop body; (3) add break; inside the if.

for (int a = 0; a < 3; ++a)
{   
    cin >> num;
    if (num < 40 && num > 0 && num % 2 == 1)
    {
        cout << "Thank you!" << endl;
        break;
    }
    else cout << "That is incorrect, try again!" << endl;
}

BTW1: Try to use the debugger, then you'll find out what happened in fact.

BTW2: The code will fail when cin >> num fails (e.g. user entered an invalid value), you might need to check the result of cin >> num, to process the case. Such as:

for (int a = 0; a < 3; ++a)
{   
    if (cin >> num) 
    {
        if (num < 40 && num > 0 && num % 2 == 1)
        {
            cout << "Thank you!" << endl;
            break;
        }
        else cout << "That is incorrect, try again!" << endl;
    }
    else 
    {
        cin.clear(); // unset failbit
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
        cout << "Wrong input, try again!" << endl;
    }
}

Upvotes: 5

suroh
suroh

Reputation: 917

bool isValid = false;
int num; 
while(!isValid) 
{ 
    cout << "enter a positive odd integer " <<  endl;
    cin >> num;

    if(num < 40 && num > 0 && num % 2 == 1 ) 
     { 
        cout << "thank you"<<endl; 
        isValid = true;
     } 
     else 
            isValid = false;
} 

Why not use some thing like this, it will loop until isValid = true which will only happen when your conditions are met?

I understand I guess, if you're doing a school project or some thing and you're forced to do it with a for loop but in general this would be a much better solution for some thing like this than a for loop!

Upvotes: 0

Related Questions