Commit 3d56c561 authored by Olivier Cornu's avatar Olivier Cornu
Browse files

Exemple d'exercice au nouveau format.

Un exercice est sous-classe de TexExercise.
Elle définit:
  - description : description de l'exercice (UI)
  - level       : niveau académique de l'exercice
  - tex_statement() : retourne l'énoncé TeX de l'exercice
  - tex_answer()    : retourne le corrigé TeX de l'exercice
Si elle utilise le hasard (random) pour générer certaines valeurs, elle
doit le faire dans sa méthode __init__().
parent 8cc19889
......@@ -20,84 +20,76 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
from random import randint, shuffle
from pyromaths import ex
from pyromaths.outils.Affichage import decimaux
precision = [u'au millième', u'au centième', u'au dixième', u'à l\'unité',
u'à la dizaine', u'à la centaine', 'au millier',
u'à la dizaine de milliers']
supinf = ['', u' par défaut', u' par excès']
class ArrondirNombreDecimal(ex.TexExercise):
""" Exercice d'arrondis avec les encadrements. """
description = u'Arrondir des nombres décimaux'
level = u'Sixième'
def __init__(self):
hasard = [valide_hasard() for i in range(4)]
choix = [(i,j) for i in range(7) for j in range(3)]
shuffle(choix)
self.choix_precision = [choix[i][0] for i in range(4)]
self.choix_supinf = [choix[i][1] for i in range(4)]
#FIXME
#Arrondir n'est pas synonyme de valeur approchée
#Valeur approchée par excès 
#Valeur approchée par défaut 
#Arrondi = la « meilleure » valeur approchée
#et ne paraît employé ici correctement
self.nombres = [(hasard[0])/(10**(-self.choix_precision[0]+4)),
(hasard[1])/(10**(-self.choix_precision[1]+4)),
(hasard[2])/(10**(-self.choix_precision[2]+4)),
(hasard[3])/(10**(-self.choix_precision[3]+4))]
def tex_statement(self):
exo = ["\\exercice", '\\begin{enumerate}']
for k in range(4):
exo.append( "\\item Arrondir " + decimaux(self.nombres[k]) + " " +
precision[self.choix_precision[k]] + supinf[self.choix_supinf[k]] +
'.' )
exo.append("\\end{enumerate}")
return exo
def tex_answer(self):
cor = ["\\exercice*", '\\begin{enumerate}']
for k in range(4):
arrondi = round(self.nombres[k], -self.choix_precision[k]+3)
if (arrondi > self.nombres[k]):
defaut = arrondi - 10**(self.choix_precision[k]-3)
exc = arrondi
if (arrondi <= self.nombres[k]):
defaut = arrondi
exc = arrondi + 10**(self.choix_precision[k]-3)
if (self.choix_supinf[k] == 0):
solution = arrondi
elif (self.choix_supinf[k] == 1):
solution = defaut
elif (self.choix_supinf[k] == 2):
solution = exc
cor.append( '\\item L\'encadrement de ' + decimaux(self.nombres[k]) + ' ' +
precision[self.choix_precision[k]] + ' est :\\par' )
cor.append( decimaux(defaut) + ' < ' + decimaux(self.nombres[k]) + ' < ' +
decimaux(exc) + '\\par' )
cor.append( u'On en déduit que son arrondi ' +
precision[self.choix_precision[k]] + ' ' + supinf[self.choix_supinf[k]] +
' est : ' + decimaux(solution) + '.')
cor.append("\\end{enumerate}")
return cor
def valide_hasard():
"""renvoie un nombre float non multiple de 10000"""
nbre, unite = randint(1000,100000), randint(1,9)
return float(nbre)*10+unite
def ArrondirNombreDecimal():
"""Crée et corrige un exercice d'arrondis avec les encadrements."""
hasard = [valide_hasard() for i in range(4)]
precision = [u'au millième', u'au centième', u'au dixième', u'à l\'unité',
u'à la dizaine', u'à la centaine', 'au millier',
u'à la dizaine de milliers']
choix = [(i,j) for i in range(7) for j in range(3)]
shuffle(choix)
choix_precision = [choix[i][0] for i in range(4)]
choix_supinf = [choix[i][1] for i in range(4)]
## choix_precision = [randint(0, 7), randint(0, 7), randint(0, 7),
## randint(0, 7)]
## choix_supinf = [randint(0, 2), randint(0, 2), randint(0, 2), randint(0, 2)]
supinf = ['', u' par défaut', u' par excès']
#FIXME
#Arrondir n'est pas synonyme de valeur approchée
#Valeur approchée par excès 
#Valeur approchée par défaut 
#Arrondi = la « meilleure » valeur approchée
#et ne paraît employé ici correctement
nombres = [(hasard[0])/(10**(-choix_precision[0]+4)),
(hasard[1])/(10**(-choix_precision[1]+4)),
(hasard[2])/(10**(-choix_precision[2]+4)),
(hasard[3])/(10**(-choix_precision[3]+4))]
exo = ["\\exercice", '\\begin{enumerate}']
cor = ["\\exercice*", '\\begin{enumerate}']
for k in range(4):
exo.append( "\\item Arrondir " + decimaux(nombres[k]) + " " +
precision[choix_precision[k]] + supinf[choix_supinf[k]] +
'.' )
arrondi = round(nombres[k], -choix_precision[k]+3)
if (arrondi > nombres[k]):
defaut = arrondi - 10**(choix_precision[k]-3)
exc = arrondi
if (arrondi <= nombres[k]):
defaut = arrondi
exc = arrondi + 10**(choix_precision[k]-3)
if (choix_supinf[k] == 0):
solution = arrondi
elif (choix_supinf[k] == 1):
solution = defaut
elif (choix_supinf[k] == 2):
solution = exc
cor.append( '\\item L\'encadrement de ' + decimaux(nombres[k]) + ' ' +
precision[choix_precision[k]] + ' est :\\par' )
cor.append( decimaux(defaut) + ' < ' + decimaux(nombres[k]) + ' < ' +
decimaux(exc) + '\\par' )
cor.append( u'On en déduit que son arrondi ' +
precision[choix_precision[k]] + ' ' + supinf[choix_supinf[k]] +
' est : ' + decimaux(solution) + '.')
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
return (exo, cor)
ArrondirNombreDecimal.description = u'Arrondir des nombres décimaux'
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment