[Tutor] "Guess My Number" Python 3.4.0 Program partially fixed but now has Logic Errors

Peter Otten __peter__ at web.de
Wed Apr 30 00:38:43 CEST 2014

Stephen Mik wrote:

> Stephen Mik-novice programmer-getting desperate

Don't despair just yet! As a programmer you will be constantly producing and 
fixing errors. That is business as usual.
What will change is that you will produce trickier bugs as your knowledge 
level increases...

> Dear Sir(s):
> I am new to Python programming,and I have a "Guess My Number" program
> which partially works. The main while control works,the guessing of an
> integer between 1 and 60 seems to give the "too high" or "too low" elif
> branches effectively. However,when the correct number is guessed the
> "elif" for the Congratulatory Message does not print out,and the number of
> attempts at guessing the mystery number does not print out. Instead, the
> program apparently goes into the main while control loop again and queries
> the User if they want to run the program again. I have attached a sample
> Python Shell run;along with code fragments of the relevant areas.
> Anybody,please help me work out this code and get "Guess My Number"
> correctly running. CONCERNED,Stephen W. Mik

Look at that loop once more:
>   while(smv_guessNumber!=smv_pickNumber): 
>      if (smv_guessNumber > smv_pickNumber): 
>        print("Guess of mystery number Too high,enter a lesser number: \n") 
>        smv_attemptCounter+=1 
>      elif (smv_guessNumber < smv_pickNumber): 
>        print("Guess of mystery number Too Low.Enter a greater number \n") 
>        smv_attemptCounter+=1 
>      elif (smv_guessNumber == smv_pickNumber): 
>        #Print Congratulatory Message,the mystery number,the number of 
>        print("Congratulations! You have guessed the mystery number") 
>     smv_guessNumber=int(input("Take a new guess!")) 

Here's a simplified version:

while x != y:
    if ...
    elif ...
    elif x == y:
    x = int(input())

Can you see now why the print statement cannot be reached? 
If x == y were true x != y would be false, and the loop would already have 
been terminated.

The easiest fix is to move the congratulations out of the loop:

while x != y:
    if x > y: ...
    elif x < y: ... # see note 1
    x = int(input())

print("congratulations") # at this point you can be sure that
                         # x == y. Otherwise the loop would still
                         # be running.

Note 1: you do not actually need the test here as you know that

x != y and (not x > y)

so that there's no other option than x < y.

More information about the Tutor mailing list