0

I'm having a problem where when I ask my program to quit out it prints like I ask it to, however shows my menu of options as well continuously.

So I'm getting this:

>>> 
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to begin: q
Goodbye!
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to continue:

Where I want it to display this if I choose 'q':

>>> 
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to begin: q
Goodbye!

Here is my complete code, please explain why my menu is reprinting, did I make my while loop wrong, or is something out of place in my code?

def hw8():
 print('(S)huffle a message.')
 print('(U)nshuffle a message.')
 print('(Q)uit program.')
 x = input('Choose a option to begin: ')
 if x == 'Q' or x == 'q':
 print('Goodbye!')
 while x != 'q' or 'Q' :
 if x == 'S' or x == 's':
 y = input('Enter a message to shuffle: ')
 q1 = ''
 for i in y:
 if ord(i) in range(65,90) or ord(i) in range(97,122):
 q = chr(ord(i) + 1)
 q1 = q1 + q
 elif ord(i) == 90:
 q = chr(ord(i) + 7)
 q1 = q1 + q
 elif ord(i) == 122:
 q = 'A'
 q1 = q1 + q
 else:
 q = i
 q1 = q1 + q
 print(q1)
 if x == 'U' or x == 'u':
 f = input('Enter a message to unshuffle: ')
 t2 = ''
 for i in f:
 if ord(i) in range (66,91) or ord(i) in range(98,123):
 t = chr(ord(i) - 1)
 t2 = t2 + t
 elif ord(i) == 65:
 t = 'z'
 t2 = t2 + t
 elif ord(i) == 97:
 t = 'Z'
 t2 = t2 + t
 else:
 t = i
 t2 = t2 + t
 print(t2)
 print('(S)huffle a message.')
 print('(U)nshuffle a message.')
 print('(Q)uit program.')
 x = input('Choose a option to continue: ')
hw8()

I want the program to display the menu after shuffling a message, or unshuffling a message, as well as at the beginning, but not after the user has asked to quit the program by choosing 'q'.


Edited code:

def hw8():
 print('(S)huffle a message.')
 print('(U)nshuffle a message.')
 print('(Q)uit program.')
 x = input('Choose a option to begin: ')
 while x != 'q' or x != 'Q' :
 if x == 'S' or x == 's':
 y = input('Enter a message to shuffle: ')
 q1 = ''
 for i in y:
 if ord(i) in range(65,90) or ord(i) in range(97,122):
 q = chr(ord(i) + 1)
 q1 = q1 + q
 elif ord(i) == 90:
 q = chr(ord(i) + 7)
 q1 = q1 + q
 elif ord(i) == 122:
 q = 'A'
 q1 = q1 + q
 else:
 q = i
 q1 = q1 + q
 print(q1)
 if x == 'U' or x == 'u':
 f = input('Enter a message to unshuffle: ')
 t2 = ''
 for i in f:
 if ord(i) in range (66,91) or ord(i) in range(98,123):
 t = chr(ord(i) - 1)
 t2 = t2 + t
 elif ord(i) == 65:
 t = 'z'
 t2 = t2 + t
 elif ord(i) == 97:
 t = 'Z'
 t2 = t2 + t
 else:
 t = i
 t2 = t2 + t
 print(t2)
 print('(S)huffle a message.')
 print('(U)nshuffle a message.')
 print('(Q)uit program.')
 x = input('Choose a option to continue: ')
 if x == 'Q' or x == 'q':
 print('Goodbye!')
hw8()

New Output:

>>> ================================ RESTART ================================
>>> 
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to begin: s
Enter a message to shuffle: hello
ifmmp
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to continue: q
Goodbye!
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to continue: 
asked Nov 27, 2012 at 0:18
1
  • In addition to the correct answers you could consider using a while x.lower() != 'q': ... else: print ('Goodbye') . That saves an if statement and expresses the intent more clearly in my opinion. Commented Nov 27, 2012 at 0:36

2 Answers 2

4

x != 'q' or 'Q' is being handled as (x != 'q') or 'Q', and 'Q' is always True.

It would better be: x not in 'qQ' or x.lower() != 'q'

answered Nov 27, 2012 at 0:32
Sign up to request clarification or add additional context in comments.

1 Comment

You are repeating yourself in the code, which is a bad habit. I suggest you do everything in a while True: loop, and if the user wants to quit, break. This sort of issue with 'while' loops comes up frequently.
0

Your problem is this line:

while x != 'q' or 'Q' :

The problem is that Q itself will always return True, so the expression will always be true. Try changing the line with:

while x != 'q' and x != 'Q' :
answered Nov 27, 2012 at 0:31

7 Comments

This helps but however if I shuffle a message, and then attempt to quit, the program stops without printing the quit message of "Goodbye!". Why's this?
This is because the print("Goodbye!") comes before the while-loop. You can add if x == 'q' or x == 'Q': print("Goodbye!") to the bottom of the while loop.
I tryed to put it at the bottom of the while loop, however now it's reprinting the menu again.
I added my edited code to the original post at the bottom, as well as the output I'm now receiving.
Make sure that it is inside the while loop, right after the input
|

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.