While Loop Fail - Caesar Cipher

风格不统一 提交于 2019-12-12 05:27:57

问题


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: 

回答1:


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' :



回答2:


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'



来源:https://stackoverflow.com/questions/13575426/while-loop-fail-caesar-cipher

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!