开发者

Python program debugging: infinite loop

Background: for my computer science class, we were asked to create a program that would help elementary school children learn basic math.

They would select which operation they would like to learn (addition, subtraction, multiplication, or division), or choose random which would choose one of these operations at random.

Once an operation is selected, the user will be asked a question and then to input the answer, if correct the program would ask another question, up to 4 questions total, and then the program would return to the menu.

If the answer is incorrect, it asks the user to input the answer again, up to three times, if the answer is still incorrect, the correct answer would be displayed, then another question would be asked (if the 4 question quota was not met) or return to the menu if there are no other questions.

The Problem: I have everything written out, and when I run the program in IDLE everything appears to be working, but after an operation 开发者_如何学JAVAis selected for some reason the program is stuck on an infinite loop and wont return to the menu after 4 questions has been asked.

I first used a for loop to meet the 4 question quota and that did not work, so then I tried a while loop which reads while x<4: etc etc, defining x as x=0 before the while loop and then at the end of the function adding x=x+1.

again from reading the code, it appears like it should work for each function, but after running it i'm still stuck in an infinite loop.

heres the code:

def show_instructions():
    """
    Displays a greeting to the user and provides instructions on how to use the
    program.        [PURPOSE]
    """
    print " "
    print "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-"
    print "                             Math Mania"
    print " "
    print "Welcome to Math Mania! This program is designed to help you learn basic"
    print "math skills in addition, subtraction, multiplication, and division."
    print "-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-"
    print " "
    print "To learn a skill, type the first letter of that skill."
    print " "
    print "a for addition"
    print "s for subtraction"
    print "m for multiplication"
    print "d for division"
    print "r for random"
    print "q to quit"
    print " "


def add():
    """
    generates display two random numbers and sums them, then prompts the user
    to input the correct sum, if the input is incorrect, it prompts the user
    to try again.
    [PURPOSE]
    """

    x=0
    while x<4:
        num1 = random.randint(1,20)
        num2 = random.randint(1,20)
        print num1, "+", num2, '= ?'
        answer = input ('Enter your answer: ')
        count1=0
        while answer != num1+num2 and count1<3:
            count1=count1 +1
            print 'Incorrect, please try again.'
            print
            print num1, '+', num2, '= ?'
            answer = input ('Enter your answer: ')
        if count1==3:
            print "Sorry, that's incorrect."
            print "The correct answer is ",num1+num2 
        else:
            print "That's correct!"
        print
        x=x+1



def sub():
    """
    generates and displays two random numbers and subtracts the smaller of the
    two from the larger one. It then prompts the user to input the correct
    answer, if the input is incorrect, it prompts the user to try again.
    [PURPOSE]
    """
    x=0
    while x<4:
        num1 = random.randint(1,20)
        num2 = random.randint(1,20)
        if num1>num2:
            print num1, "-", num2, '= ?'
            answer = input('Enter your answer: ')
            count1=0
            while answer != num1 - num2 and count1<3:
                count1=count1+1
                print 'Incorrect, please try again.'
                print
                print num1, "-", num2, '= ?'
                answer = input ('Enter your answer: ')
            if count1==3:
                print "Sorry, that's incorrect."
                print "The correct answer is ",num1-num2
            else:
                print "That's correct!"
            print
            x=x+1
        else:
            print num2, "-", num1, '= ?'
            answer = input ('Enter your answer')
            count1=0
            while answer!= num2-num1 and count1<3:
                count1=count1+1
                print 'Incorrect, please try again.'
                print
                print num2, "-", num1, '= ?'
                answer = input ('Enter your answer: ')
            if count1==3:
                print "Sorry, that's incorrect."
                print "The correct answer is ",num2-num1
            else:
                print 'Thats correct!'
            print
            x=x+1

def mult():
    """
    generates and displays two random numbers and finds the product of the two.
    It then prompts the user to input the correct product of the two numbers, if
    the input is incorrect, it prompts the user to try again.
    [PURPOSE]
    """
    x=0
    while x<4:
        num1 = random.randint(1,20)
        num2 = random.randint(1,20)
        print num1, "x", num2, '= ?'
        answer = input ('Enter your answer: ')
        count1=0
        while answer != num1*num2 and count1<3:
            count1=count1+1
            print 'Incorrect, please try again.'
            print
            print num1, 'x', num2, '= ?'
            answer = input ('Enter your answer: ')
        if count1==3:
            print "Sorry, that's incorrect."
            print "The correct answer is ", num1*num2
        else:
            print "That's correct!"
        print
        x=x+1


def div():
    """
    generates and displays the quotient of two numbers, and then prompts the
    user to input the correct answer, if the input is incorrect, it then prompts
    the user to try again.
    [PURPOSE]
    """

    x=0
    while x<4:
        num1 = random.randint(1,20)
        num2 = random.randint(1,20)

        while (num1%num2!=0):
            num2 = random.randint(1,20)
            num1 = random.randint(1,20)
        print num1, "/", num2, '= ?'
        answer = input ('Enter your answer: ')


        count1=0
        while answer != num1/num2 and count1<3:
            count1=count1 +1
            print 'Incorrect, please try again.'
            print num1, '/', num2, '= ?'
            answer = input ('enter your answer:')
        if count1==3:
            print "Sorry, that's incorrect."
            print "The correct answer is ",num1/num2 
        else:
            print "That's correct!"
        print
        x=x+1
def rand():
    """
    picks a arithmetic function at random for the user to to try
    [PURPOSE]
    """
    num=random.randint(1,4)
    if num==1:
        add()
    if num==2:
        sub()
    if num==3:
        mult()
    if num==4:
        div()

def main():
    """
    main function that brings it all together
    [PURPOSE]
    """
    show_instructions()
    selection = raw_input ('Please select the skill you want to learn: ')
    while selection != "q":
        if selection == "a":
            add()
        elif selection == "s":
            sub()
        elif selection == "m":
            mult()
        elif selection == "d":
            div()
        elif selection == "r":
            rand()
    print "The program will now quit."
    quit()
main()`

Thank you in advance for any assistance that anyone here can provide!


You need to put the raw_input within the while loop.

Change main to this:

def main():
    """
    main function that brings it all together
    [PURPOSE]
    """
    show_instructions()
    selection = None
    while selection != "q":
        selection = raw_input ('Please select the skill you want to learn: ')
        if selection == "a":
            add()
        elif selection == "s":
            sub()
        elif selection == "m":
            mult()
        elif selection == "d":
            div()
        elif selection == "r":
            rand()
    print "The program will now quit."

The issue here is that raw_input was called once, before the while loop. However, it was never called again. Instead the loop would continue on, but it would continue to use the same selection value it retrieved in the first (and only) call to raw_input.

Also, you don't need quit() at the end of your main function. You can just let the function return. Although that has nothing to do with your bug.


This will generate problems based on random numbers and operations.

from string import lower
from operator import add, sub, mul
from random import randint, choice

ops = { '+': add, '-': sub, '*': mul}
MAXTRIES = 2

def doprob():
    op = choice('+-*')
    nums = [randint(1,10), randint(1,10)]
    nums.sort();nums.reverse()
    ans = apply(ops[op], nums)
    pr = '%d %s %d = ' % (nums[0], op, nums[1])
    oops = 0
    while True:
        try:
            if int(raw_input(pr)) == ans:
                print 'correct'
                break
            if oops == MAXTRIES:
                print 'answer\n%s%d'%(pr, ans)
            else:
                print 'incorrect... try again'
                oops = oops + 1
        except (KeyboardInterrupt, EOFError, ValueError):
            print 'invalid input... try again'

def main():
    while True:
        doprob()
        try:
            opt = lower(raw_input('Again? ' ))
        except (KeyboardInterrupt, EOFError):
            print ; break
        if opt and opt[0] == 'n':
            break

if __name__ == '__main__':
    main()

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜