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 readswhile 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()
精彩评论