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

Reply via email to