Hi All,
The recent discussion regarding fractions compelled me to dig-up a
fraction problem generating script I wrote a couple years ago and post
it in case anyone has use for it. The purpose of the script is to
generate algebraic fraction problems. It might also make a decent
programming assignment to come up with such an algorithm. Just run it
and you'll get 100 good problems dumped to your screen. Change the 2
parameters in the __main__ to adjust number generated and maximum
denominators to use. I've never looked at Fraction.py, so no idea
how this compares or relates, but don't think there's any similarity.
Anyway, FWIW here it is (attached).
All the best to everyone,
Charlie
--
AsymptopiaSoftware|softw...@thelimit
http://www.asymptopia.org
#!/usr/bin/env python
from random import random
"""
steps involved in generating arbitrary fraction equations
of the form: a/d <+,-,*> b/e=c/f
1. generate a,b,d,e; make sure denoms != 0
2. find LCD
3. pose problem (i.e. choose an operation)
4. solve the problem (i.e. determine c,f)
5. reduce "c/f"
6. append to collection of generated equations...?
"""
debug=0
class fracmaker:
def __init__(self,maxnum,maxden):
if(debug):print 'fracmaker.__init__'
self.maxnum=maxnum
self.maxden=maxden
self.LCD=None
self.GCF=None
self.problems=[]
self.op=''
self.a=0
self.b=0
self.c=0
self.d=0
self.e=0
self.f=0
def make1(self):
if(debug):print 'make1()'
self.generate()
self.findLCD()
self.poseProblem()
self.solveProblem()
self.reduce()
self.convert2algebra()
def generate(self):
maxnum=self.maxnum
maxden=self.maxden
self.a=int(maxnum*random())
self.b=int(maxnum*random())
self.d=0
self.e=0
while self.d==0:
self.d=int(maxden*random())
while self.e==0:
self.e=int(maxden*random())
if(debug):print "a=%d b=%d d=%d e=%d"%(self.a,self.b,self.d,self.e)
def findLCD(self):
self.LCD=self.d*self.e
if(debug):print 'LCD=',self.LCD
def poseProblem(self):
ops=['+','-','*']
idx=int(len(ops)*random())
self.op=ops[idx]
if(debug):print self.op
def solveProblem(self):
if(debug):print "solving: %d/%d %s %d/%d = c/f"%(self.a,self.d,self.op,self.b,self.e)
if self.op=='+':
self.c=self.a*self.e+self.b*self.d
self.f=self.LCD
elif self.op=='-':
self.c=self.a*self.e-self.b*self.d
self.f=self.LCD
elif self.op=='*':
self.c=self.a*self.b
self.f=self.d*self.e
if(debug):print "solution: %d/%d %s %d/%d = %d/%d"%(self.a,self.d,self.op,self.b,self.e,self.c,self.f)
def reduce(self):
if self.c==0:return
if self.c<self.f:startval=self.c
else:startval=self.f
if startval<0:startval=startval*-1
for gcf in range(startval,0,-1):
if int(self.c/gcf)==float(self.c)/float(gcf) and int(self.f/gcf)==float(self.f)/float(gcf):
self.GCF=gcf
break
self.c=self.c/self.GCF
self.f=self.f/self.GCF
if(debug):print "reduced solution: %d/%d %s %d/%d = %d/%d"%(self.a,self.d,self.op,self.b,self.e,self.c,self.f)
def convert2algebra(self):
idx=int(random()*6)
if idx==0:
xval=self.a
problem="%d:x/%d %s %d/%d = %d/%d"%(xval,self.d,self.op,self.b,self.e,self.c,self.f)
if idx==1:
xval=self.b
problem="%d:%d/%d %s x/%d = %d/%d"%(xval,self.a,self.d,self.op,self.e,self.c,self.f)
if idx==2:
xval=self.c
problem="%d:%d/%d %s %d/%d = x/%d"%(xval,self.a,self.d,self.op,self.b,self.e,self.f)
if idx==3:
xval=self.d
problem="%d:%d/x %s %d/%d = %d/%d"%(xval,self.a,self.op,self.b,self.e,self.c,self.f)
if idx==4:
xval=self.e
problem="%d:%d/%d %s %d/x = %d/%d"%(xval,self.a,self.d,self.op,self.b,self.c,self.f)
if idx==5:
xval=self.f
problem="%d:%d/%d %s %d/%d = %d/x"%(xval,self.a,self.d,self.op,self.b,self.e,self.c)
if(debug):print problem
self.problems.append(problem)
def dump(self):
for idx in range(len(self.problems)):
print self.problems[idx]
if __name__=='__main__':
x=fracmaker(10,10)
for idx in range(100):
x.make1()
x.dump()
_______________________________________________
Edu-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/edu-sig