Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Digit Check in C++

  1. Mar 3, 2010 #1

    madmike159

    User Avatar
    Gold Member

    I want the user to enter a number from 1 to 9, then check its in that range and a number.
    This is the code I have, but its not working.
    Code (Text):

        int NumPlayers = 0;
        do
        {
            cout << "Please enter a interger from 1 to 9." << endl;
            cin >> NumPlayers;
        }
        while(isdigit(NumPlayers)  && (1 <= NumPlayers <= 9));
     
    Any Suggestions?
     
  2. jcsd
  3. Mar 3, 2010 #2
    Print statements!
    print out NumPlayers and your logic and see that everything is evaluating as it should be.

    Also, it's been a while, but I'm pretty sure you can't do:
    (1 <= NumPlayers <= 9)

    You have to break it up:
    ((1<=NumPlayers) && (NumPlayers<=9))
     
  4. Mar 3, 2010 #3

    jtbell

    User Avatar

    Staff: Mentor

    In situations like this, it's instructive to insert code that displays your input and the results of your tests explicitly:

    Code (Text):

    int NumPlayers = 0;
    do
    {
        cout << "Please enter a interger from 1 to 9." << endl;
        cin >> NumPlayers;
        cout << "You entered " << NumPlayers << "." << endl;
        if (isdigit(NumPlayers))
            cout << "NumPlayers is a digit." << endl;
        if (NumPlayers >= 1)
            cout << "NumPlayers is >= 1." << endl;
        if (NumPlayers <= 9)
            cout << "NumPlayers is <= 9." << endl;
    }
    while(isdigit(NumPlayers)  && (1 <= NumPlayers) && (NumPlayers <= 9));
     
    This technique often enables you to find the solution faster than by posting to the Internet and waiting for responses. :smile:
     
  5. Mar 3, 2010 #4

    DavidSnider

    User Avatar
    Gold Member

    or better yet, use a debugger.
    Set a breakpoint at the top, set watches on the variables you are interested in and then step through each line.
     
  6. Mar 3, 2010 #5

    jtbell

    User Avatar

    Staff: Mentor

    Just another tip: In general, it really really helps people if you say exactly what you mean by "not working."

    Does the program fail to compile? If so, what error messages did you get?

    Does the program seem to compile OK, but doesn't give correct results when it runs? If so, what results did you expect and what did you actually get?

    Or did your monitor screen melt down, or did you get electric shocks to your fingers through the keyboard, or...? :uhh:
     
  7. Mar 3, 2010 #6

    madmike159

    User Avatar
    Gold Member

    Ok thanks, I'll remember that next time. I fixed the problem now. Thanks for the help.
     
  8. Mar 3, 2010 #7

    Borek

    User Avatar

    Staff: Mentor

    Actually this is a correct expression :wink:
     
  9. Mar 3, 2010 #8

    DavidSnider

    User Avatar
    Gold Member

    I wonder if the compiler optimizes it to if(true) { ... }
     
  10. Mar 3, 2010 #9

    Mark44

    Staff: Mentor

    The user interface of your program --
    Code (Text):
    cout << "Please enter a interger from 1 to 9." << endl;
    -- could use some editing. Note spelling of integer.

    "Please enter an integer from 1 to 9."

    To expand on what Borek and DavidSnyder said, the expression 1 <= NumPlayers <= 9 always evaluates to true, regardless of the value of NumPlayers.

    This expression is evaluated as if it were written as ((1 <= NumPlayers) <= 9).

    The logical expression 1 <= NumPlayers will evaluate to true (1) or false (0), depending on the value of NumPlayers.

    The expressions (0 <= 9) and (1 <= 9) both evaluate to true (1).

    The moral of the story is that the continued inequality that is used in mathematics is syntactically correct but semantically incorrect in all programming languages based on C.
     
  11. Mar 3, 2010 #10
    In addition to all problems already mentioned, the call to isdigit() does not do what you think it does.

    isdigit() is normally called with a 'char' parameter and it returns nonzero if the parameter is between '0' and '9' (or, in ASCII, between 0x30 and 0x39). Your NumPlayers is an 'int'. Therefore it will already have been converted from char to integer. There's no need to call isdigit.
     
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook