David wrote:
[snip]
My suggestion (untested):
MAX = 12
NQ = 20 # of questions to ask
# create a 2 dimensional array of 1's
row = [1]*MAX
pool = [row[:] for i in range(MAX)]
incorrect = [] # store incorrectly answered combos here
def askQuestions(): # generate and ask questions:
for i in range(NQ):
while 1: # loop till we get an unused combo
x, y = [random.randint(1,MAX) for i in 'ab']
if mtable[x][y] == 1: # combo is available
break
askQuestion(x,y)
# indicate asked
mtable[x][y] = 0
mtable[y][x] = 0
showStats()
def askQuestion(x,y):
solution = x*y
# take answer from user
ok = user answer == solution
if ok:
correct += 1
else:
incorrect.append((x,y))
return ok
def askFaultyAnswers():
answer = raw_input("Try again the incorrect questions? (y/n) ")
if answer == "y":
correct = 0
for x,y in incorrect:
ok = askQuestion(x,y)
# could use ok to remove combo from incorrect list.
showStats()
askQuestions()
askFaultyAnswers()
print "good-bye!"
</CODE>
I think it is sensible to
* first create all possible solutions, then
* kick out doublettes, and only then
* ask questions
I have some questions though:
Is the overall structure and flow of this program okay? What are the
main problems you can spot immediately
Calculating kicking randomizing is overkill. My code uses a 2 dimension
array to track which x,y combos are available.
break is only valid within a loop.
Recursively calling askQuestions is not a good idea. Save recursion for
when it is is meaningful. Use a loop instead.
There is no need for an incorrect counter. we can calculate it later
(incorrect = NQ -correct)
In the very end I would like to take this code as a basis for a
wxPython program. Are there any structural requirements I am violating
here?
Not that I can see. It is common practice to separate logic from display.
If I want to limit the number of questions asked, say to 20, would I
operate with slicing methods on the randomised pool?
My solution does not use a randomized pool. Just a loop over range(NQ)
How would you go about showing stats for the second run (i.e. the
FaultyAnswers)? Right now I am thinking of setting the global
variables correct and incorrect to 0 from _within_ askFaultyAnswers;
then I would run showStats() also from _within_ askFaultyAnswers. Good
idea?
Yes indeed. That is what I did before reading your comment! Great minds
think alike.
--
Bob Gailer
919-636-4239
Chapel Hill NC
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor