source: pyromaths/trunk/fuentes/src/pyromaths/ex/quatriemes/fractions.py @ 423

Last change on this file since 423 was 423, checked in by mabarracus, 4 years ago

add sources from pyromaths 15.10

File size: 18.0 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# Pyromaths
5# Un programme en Python qui permet de créer des fiches d'exercices types de
6# mathématiques niveau collége ainsi que leur corrigé en LaTeX.
7# Copyright (C) 2006 -- Jéréme Ortais (jerome.ortais@pyromaths.org)
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22#
23
24from pyromaths.outils import Arithmetique
25from pyromaths.outils.Priorites3 import texify, priorites
26import random
27# from pyromaths.classes.Fractions import Fraction  # Classe Fractions de pyromaths
28
29def valeurs_somme_positive():
30    """Travail sur les sommes de fractions en quatrième"""
31    l = []
32
33    op = "+-"[random.randrange(2)]
34    n2, d2 = random.randrange(1, 11), random.randrange(2, 11)
35    if op == "-" and 1 - n2 / d2 > 0:
36        l.append('1 %s Fraction(%s, %s)' % (op, n2, d2))
37    else:
38        l.append('Fraction(%s, %s) %s 1' % (n2, d2, op))
39
40    op = "+-"[random.randrange(2)]
41    n1 = random.randrange(2, 11)
42    n2, d2 = random.randrange(1, 11), random.randrange(2, 11)
43    if op == "-" and n1 - n2 / d2 > 0:
44        l.append('%s %s Fraction(%s, %s)' % (n1, op, n2, d2))
45    else:
46        l.append('Fraction(%s, %s) %s %s' % (n2, d2, op, n1))
47
48    op = "+-"[random.randrange(2)]
49    n1 = random.randrange(1, 9) + random.randrange(1, 9) / 10.
50    n2, d2 = random.randrange(1, 11), random.randrange(2, 11)
51    if op == "-" and n1 - n2 / d2 > 0:
52        l.append('%s %s Fraction(%s, %s)' % (n1, op, n2, d2))
53    else:
54        l.append('Fraction(%s, %s) %s %s' % (n2, d2, op, n1))
55
56    op = "+-"[random.randrange(2)]
57    n1 = random.randrange(1, 11)
58    n2, d2 = random.randrange(1, 11), random.randrange(2, 11)
59    if op == "-" and n1 - n2 > 0:
60        l.append('Fraction(%s, %s) %s Fraction(%s, %s)' % (n1, d2, op, n2, d2))
61    else:
62        l.append('Fraction(%s, %s) %s Fraction(%s, %s)' % (n2, d2, op, n1, d2))
63
64    op = "+-"[random.randrange(2)]
65    n1, d1 = random.randrange(1, 11), random.randrange(2, 11)
66    n2, d2 = random.randrange(1, 11), random.randrange(2, 11) * d1
67    if op == "-" and n1 / d1 - n2 / d2 > 0:
68        l.append('Fraction(%s, %s) %s Fraction(%s, %s)' % (n1, d1, op, n2, d2))
69    else:
70        l.append('Fraction(%s, %s) %s Fraction(%s, %s)' % (n2, d2, op, n1, d1))
71
72    for dummy in range(3):
73        op = "+-"[random.randrange(2)]
74        d1, d2 = 2, 2
75        lepgcd = Arithmetique.pgcd(d1, d2)
76        while lepgcd == d1 or lepgcd == d2:
77            n1, d1 = random.randrange(1, 11), random.randrange(2, 11)
78            n2, d2 = random.randrange(1, 11), random.randrange(2, 11)
79            lepgcd = Arithmetique.pgcd(d1, d2)
80        if op == "-" and n1 / d1 - n2 / d2 > 0:
81            l.append('Fraction(%s, %s) %s Fraction(%s, %s)' % (n1, d1, op, n2, d2))
82        else:
83            l.append('Fraction(%s, %s) %s Fraction(%s, %s)' % (n2, d2, op, n1, d1))
84
85    random.shuffle(l)
86    return l
87
88def sommes_fractions_positives():
89    exo = ["\\exercice",
90           u"Calculer en détaillant les étapes. Donner le résultat sous la forme d'une fraction la plus simple possible (ou d'un entier lorsque c'est possible).",
91           "\\begin{multicols}{4}", \\begin{enumerate}"]
92    cor = ["\\exercice*",
93           u"Calculer en détaillant les étapes. Donner le résultat sous la forme d'une fraction la plus simple possible (ou d'un entier lorsque c'est possible).",
94           "\\begin{multicols}{4}", \\begin{enumerate}"]
95    lexo = valeurs_somme_positive()
96    for question in lexo:
97        solve = [question]
98        exo.append("\\item $\\thenocalcul = " + texify(solve)[0] + "$")
99        cor.append("\\item $\\thenocalcul = " + texify(solve)[0] + "$")
100        solve = priorites(question)
101        solve = texify(solve)
102        for e in solve:
103            cor.append("\\[\\thenocalcul = " + e + "\\]")
104        exo.append("\\stepcounter{nocalcul}")
105        cor.append("\\stepcounter{nocalcul}")
106    exo.extend([\\end{enumerate}", "\\end{multicols}"])
107    cor.extend([\\end{enumerate}", "\\end{multicols}"])
108    return (exo, cor)
109
110sommes_fractions_positives.description = u'Sommes de positifs en écriture fractionnaire'
111
112#===============================================================================
113# def sommes_fractions_4e(op, level):
114#     '''Choisit des valeurs aléatoires pour effectuer une somme ou une différence
115#     de fractions en fonction du niveau de difficulté souhaité (de 1 é 4) et renvoie
116#     l'énoncé et le corrigé au format TeX
117#
118#     @param op: '+' ou '-'
119#     @param level: niveau de difficulté :
120#                   1- Fractions positives et dénominateur de l'une multiple de l'autre
121#                   2- Fractions positives et dénominateurs non multiples
122#                   3- Fractions avec des nombres relatifs
123#                   4- Fractions avec des nombres relatifs et résultats simplifiable
124#     '''
125#
126#     while True:
127#         (n1, d1, n2, d2) = (2, 2, 2, 2)
128# #        import pdb; pdb.set_trace()
129#         while True:
130#             if level == 1:
131#                 n1 = random.randrange(1, 16)
132#                 d1 = random.randrange(1, 9)
133#                 n2 = random.randrange(1, 16)
134#                 d2 = d1*random.randrange(2, 11)
135#                 if random.randrange(2):
136#                     d1, d2 = d2, d1
137#             elif level == 2:
138#                 n1 = Arithmetique.valeur_alea(1, 16)
139#                 d1 = Arithmetique.valeur_alea(1, 40)
140#                 n2 = Arithmetique.valeur_alea(1, 16)
141#                 d2 = Arithmetique.valeur_alea(1, 40)
142#             else:
143#                 while True:
144#                     neg=[(-1,1)[random.randrange(2)] for x in range(4)]
145#                     if neg[0]<0 or neg[1]<0 or neg[2]<0 or neg[3]<0:
146#                         break
147#                 n1 = random.randrange(1, 16)*neg[0]
148#                 d1 = random.randrange(1, 40)*neg[1]
149#                 n2 = random.randrange(1, 16)*neg[2]
150#                 d2 = random.randrange(1, 40)*neg[3]
151#             fr1 = Fractions(n1, d1)
152#             fr2 = Fractions(n2, d2)
153#             if Arithmetique.pgcd(fr1.n, fr1.d) == 1 and \
154#                 Arithmetique.pgcd(fr2.n, fr2.d) == 1 and \
155#                 (level == 1 or (Arithmetique.pgcd(fr1.d, fr2.d) != abs(fr1.d) \
156#                                 and Arithmetique.pgcd(fr1.d, fr2.d) != abs(fr2.d))):
157#                 if op == "+":
158#                     simplifiable = abs(fr1.d * fr2.d) != \
159#                                         abs(Fractions.simplifie(fr1 + fr2).d)
160#                 else:
161#                     simplifiable = abs(fr1.d * fr2.d) != \
162#                                         abs(Fractions.simplifie(fr1 - fr2).d)
163#                 if level == 1 or (simplifiable and level == 4) or \
164#                                             (not simplifiable and level < 4):
165#                     break
166#
167#         l = [fr1, op, fr2]
168#         (cor, res, niveau) = OperateurPrioritaire(l, 4, solution=[])
169#         if niveau >= 4:
170#             break
171#     fr1 = Fractions(n1, d1)
172#     fr2 = Fractions(n2, d2)
173#     return ([fr1, op, fr2], cor, res)
174#
175# def produits_fractions_4e(op, level):
176#     '''Choisit des valeurs aléatoires pour effectuer un produit ou un quotient de
177#     fractions en fonction du niveau de difficulté souhaité (de 1 é 4) et renvoie
178#     l'énoncé et le corrigé au format TeX
179#
180#     @param op: '*' ou '/'
181#     @param level: niveau de difficulté :
182#                   1- Fractions positives non décomposables
183#                   2- Fractions avec des nombres relatifs non décomposables
184#                   3- Fractions positives é décomposer
185#                   4- Fractions avec des nombres relatifs é décomposer
186#     '''
187#
188#     while True:
189#         (n1, d1, n2, d2) = (2, 2, 2, 2)
190#         while True:
191#             n1=d1=n2=d2=a=b=2
192#             if level == 3 or level == 4:
193#                 while Arithmetique.pgcd(a,b)>1:
194#                     a=random.randrange(2,11)
195#                     b=random.randrange(2,11)
196#             else:
197#                 a, b = 1, 1
198#             if op == "*":
199#                 if level == 1 or level == 3:
200#                     while Arithmetique.pgcd(n1*a,d1*b)>1:
201#                         n1=random.randrange(1,11)
202#                         d1=random.randrange(2,11)
203#                     while Arithmetique.pgcd(n2*b,d2*a)>1:
204#                         n2=random.randrange(1,11)
205#                         d2=random.randrange(2,11)
206#                 elif level == 2 or level == 4:
207#                     while True:
208#                         neg=[(-1,-1,1)[random.randrange(3)] for x in range(4)]
209#                         if neg[0]<0 or neg[1]<0 or neg[2]<0 or neg[3]<0:
210#                             break
211#                     while Arithmetique.pgcd(n1*a,d1*b)>1:
212#                         n1=random.randrange(1,11)*neg[0]
213#                         d1=random.randrange(2,11)*neg[1]
214#                     while Arithmetique.pgcd(n2*b,d2*a)>1:
215#                         n2=random.randrange(1,11)*neg[2]
216#                         d2=random.randrange(2,11)*neg[3]
217#                 fr1 = Fractions(n1*a, d1*b)
218#                 fr2 = Fractions(n2*b, d2*a)
219#                 simplifiable = abs(fr1.d * fr2.d) != Fractions.simplifie(fr1 *
220#                                                                          fr2).d
221#             else:
222#                 if level == 1 or level == 3:
223#                     while Arithmetique.pgcd(n1*a,d1*b)>1:
224#                         n1=random.randrange(1,11)
225#                         d1=random.randrange(2,11)
226#                     while Arithmetique.pgcd(n2*a,d2*b)>1:
227#                         n2=random.randrange(1,11)
228#                         d2=random.randrange(2,11)
229#                 else:
230#                     while Arithmetique.pgcd(n1*a,d1*b)>1:
231#                         n1=random.randrange(-11,11)
232#                         d1=random.randrange(2,11)*(-1,1)[random.randrange(2)]
233#                     while Arithmetique.pgcd(n2*a,d2*b)>1:
234#                         n2=random.randrange(1,11)*(-1,1)[random.randrange(2)]
235#                         d2=random.randrange(2,11)*(-1,1)[random.randrange(2)]
236#                 fr1 = Fractions(n1*a, d1*b)
237#                 fr2 = Fractions(n2*a, d2*b)
238#                 simplifiable = abs(fr1.d * fr2.n) != \
239#                                             Fractions.simplifie(fr1 / fr2).d
240#             if (simplifiable and level>2) or (not simplifiable and level<=2):
241#                 break
242#         l = [fr1, op, fr2]
243#
244#         (cor, res, niveau) = OperateurPrioritaire(l, 4, solution=[])
245#         if niveau >= 4:
246#             break
247#     return (l, cor, res)
248#
249#
250# def valeurs_priorites_fractions(nb, entier=1):  # renvoie les 2 listes contenant les opérateurs et les opérandes.
251#     listoperateurs = [
252#         "+",
253#         "*",
254#         "-",
255#         "/",
256#         '(',
257#         '(',
258#         '(',
259#         '(',
260#         ')',
261#         ')',
262#         ')',
263#         ')',
264#         ]
265#     loperateurs = []
266#     loperandes = []
267#     i = 0  #nombre d'opérateurs créés
268#     p = 0  #nombre de parenthéses ouvertes
269#     cpt = 0  #compteur pour éviter que le programme ne boucle.
270#     while i < nb - 1:
271#         cpt = cpt + 1
272#         if cpt > 10:  #On recommence
273#             (cpt, i, p, loperateurs) = (0, 0, 0, [])
274#         if p:
275#             if loperateurs[-1] == '(':  # On n'écrit pas 2 parenthéses é suivre
276#                 operateur = listoperateurs[random.randrange(4)]
277#             else:
278#                 operateur = listoperateurs[random.randrange(12)]
279#         elif loperateurs == []:
280#
281#             # On ne commence pas par une parenthése
282#
283#             operateur = listoperateurs[random.randrange(4)]
284#         else:
285#             operateur = listoperateurs[random.randrange(8)]
286#         if nb > 3:
287#             test = ('-*/').find(operateur) >= 0 and loperateurs.count(operateur) < \
288#                 1 or operateur == "+" and loperateurs.count(operateur) < \
289#                 2
290#         else:
291#             test = ('-*/+').find(operateur) >= 0 and loperateurs.count(operateur) < \
292#                 1
293#         if test:
294#
295#             #On n'accepte pas plus de 1 produit, différence, quotient et de 2 sommes ou parenthéses par calcul.
296#
297#             if i == 0 or loperateurs[-1] != '(' or ('*/').find(operateur) < \
298#                 0:  #pas de * ou / dans une parenthése.
299#                 i = i + 1
300#                 loperateurs.append(operateur)
301#         elif operateur == '(' and (')+').find(loperateurs[-1]) < 0:
302#
303#             #Il ne peut y avoir de ( aprés une ) ou aprés un +
304#
305#             p = p + 1
306#             loperateurs.append(operateur)
307#         elif operateur == ')':
308#             p = p - 1
309#             loperateurs.append(operateur)
310#     while p > 0:
311#         loperateurs.append(')')
312#         p = p - 1
313#     loperandes = []
314#     for i in range(nb):
315#         (n, d) = (2, 2)
316#         while Arithmetique.pgcd(n, d) != 1 or abs(d) == 1:
317#             n = Arithmetique.valeur_alea(-16, 16)
318#             d = -Arithmetique.valeur_alea(-40, 40)
319#         loperandes.append(Fractions(n, d))
320#     exercice = [loperandes[0]]
321#     i = 1
322#     j = 0
323#     while i < len(loperandes) or j < len(loperateurs):
324#         if j < len(loperateurs):
325#             exercice.append(loperateurs[j])
326#             j = j + 1
327#         while j < len(loperateurs) and (loperateurs[j] == '(' or
328#                 loperateurs[j - 1] == ')'):
329#             exercice.append(loperateurs[j])
330#             j = j + 1
331#         if i < len(loperandes):
332#             exercice.append(loperandes[i])
333#             i = i + 1
334#     return exercice
335#
336#
337# def exo_sommes_fractions():
338#     exo = ["\\exercice",
339#            u"Effectuer les calculs suivants et donner le résultat sous la forme d'une fraction simplifiée :",
340#            "\\begin{multicols}{4}", "  \\noindent%"]
341#     cor = ["\\exercice*",
342#            u"Effectuer les calculs suivants et donner le résultat sous la forme d'une fraction simplifiée :",
343#            "\\begin{multicols}{4}", "  \\noindent%"]
344#     op = ["+", "-","+", "-","+", "-","+", "-"]
345#     for i in range(8):
346#         if i%2:
347#             (l, sol, res) = sommes_fractions_4e(op.pop(0), i//2+1)
348#         else:
349#             (l, sol, res) = sommes_fractions_4e(op.pop(random.randrange(2)),
350#                                                 i//2+1)
351#         exo.append("\\[\\thenocalcul = %s\\]" % Affichage(l))
352#         cor.append("\\[\\thenocalcul = %s\\]" % Affichage(l))
353#         for l in sol:
354#             if l == sol[-1]:
355#                 cor.append("\\[\\boxed{\\thenocalcul = %s}\\]" % l)
356#             else:
357#                 cor.append("\\[\\thenocalcul = %s\\]" % l)
358#         exo.append("\\stepcounter{nocalcul}%")
359#         cor.append("\\stepcounter{nocalcul}%")
360#     exo.append("\\end{multicols}\n")
361#     cor.append("\\end{multicols}\n")
362#     return (exo, cor)
363#
364# exo_sommes_fractions.description = u'Sommes de fractions'
365#
366#
367# def exo_produits_fractions():
368#     exo = ["\\exercice",
369#            u"Effectuer les calculs suivants et donner le résultat sous la forme d'une fraction simplifiée :",
370#            "\\begin{multicols}{4}", "  \\noindent%"]
371#     cor = ["\\exercice*",
372#            u"Effectuer les calculs suivants et donner le résultat sous la forme d'une fraction simplifiée :",
373#            "\\begin{multicols}{4}", "  \\noindent%"]
374#     op = ["*", "/","*", "/","*", "/","*", "/"]
375#     for i in range(8):
376#         if i%2:
377#             (l, sol, res) = produits_fractions_4e(op.pop(0), i//2+1)
378#         else:
379#             (l, sol, res) = produits_fractions_4e(op.pop(random.randrange(2)), i//2+1)
380#         exo.append("\\[\\thenocalcul = %s\\]" % Affichage(l))
381#         cor.append("\\[\\thenocalcul = %s\\]" % Affichage(l))
382#         for l in sol:
383#             if l == sol[-1]:
384#                 cor.append("\\[\\boxed{\\thenocalcul = %s}\\]" % l)
385#             else:
386#                 cor.append("\\[\\thenocalcul = %s\\]" % l)
387#         exo.append("\\stepcounter{nocalcul}%")
388#         cor.append("\\stepcounter{nocalcul}%")
389#     exo.append("\\end{multicols}\n")
390#     cor.append("\\end{multicols}\n")
391#     return (exo, cor)
392#
393# exo_produits_fractions.description = u'Produits et quotients de fractions'
394#
395#
396# def exo_priorites_fractions():
397#     exo = ["\\exercice",
398#            u"Effectuer les calculs suivants et donner le résultat sous la forme d'une fraction simplifiée :",
399#            "\\begin{multicols}{3}", "  \\noindent%"]
400#     cor = ["\\exercice*",
401#            u"Effectuer les calculs suivants et donner le résultat sous la forme d'une fraction simplifiée :",
402#            "\\begin{multicols}{3}", "  \\noindent%"]
403#     for i in range(6):
404#         while True:
405#             l = valeurs_priorites_fractions(3)
406#             (sol, res, niveau) = OperateurPrioritaire(l, 4, solution=[])
407#             if niveau >= 4:
408#                 break
409#         exo.append("\\[\\thenocalcul = %s\\]" % Affichage(l))
410#         cor.append("\\[\\thenocalcul = %s\\]" % Affichage(l))
411#         for l in sol:
412#             if l == sol[-1]:
413#                 cor.append("\\[\\boxed{\\thenocalcul = %s}\\]" % l)
414#             else:
415#                 cor.append("\\[\\thenocalcul = %s\\]" % l)
416#         exo.append("\\stepcounter{nocalcul}%")
417#         cor.append("\\stepcounter{nocalcul}%")
418#     exo.append("\\end{multicols}\n")
419#     cor.append("\\end{multicols}\n")
420#     return (exo, cor)
421#
422# exo_priorites_fractions.description = u'Fractions et priorités'
423#
424#
425# exo_sommes_fractions()
426#===============================================================================
Note: See TracBrowser for help on using the repository browser.