source: pyromaths/trunk/fuentes/src/pyromaths/ex/quatriemes/litteral.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: 15.2 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#----------------------------------------------------------------------
24# Pyromaths : Initiation au calcul littéral
25#----------------------------------------------------------------------
26from pyromaths.outils.Priorites3 import texify, priorites, splitting
27from random import randrange, shuffle
28
29def valeurs_reduire():
30    """Travail sur les bases du calcul littéral en quatrième"""
31    var = "atxy"
32    var = var[randrange(len(var))]
33    op = "+*-*"[randrange(4)]
34    if op == "*":
35        deg1 = randrange(3)
36        if deg1 == 2: deg2 = 0
37        elif deg1 == 1: deg2 = randrange(2)
38        else: deg2 = randrange(1, 3)
39    else:
40        deg1 = randrange(1, 3)
41        deg2 = [i for i in range(3)]
42        deg2.extend([deg1] * 7)
43        shuffle(deg2)
44        deg2 = deg2.pop(randrange(len(deg2)))
45    a1, a2 = 0, 0
46    while not a1 or not a2:
47        a1 = randrange(-10, 11)
48        a2 = randrange(-10, 11)
49    p1 = "Polynome(\"%s%s^%s\", details=3)" % (a1, var, deg1)
50    p2 = "Polynome(\"%s%s^%s\", details=3)" % (a2, var, deg2)
51    return p1 + op + p2
52
53def reduire():
54    """Travail sur les bases du calcul littéral en quatrième"""
55    exo = ["\\exercice", u"Réduire, si possible, les expressions suivantes :",
56           "\\begin{multicols}{3}\\noindent", \\begin{enumerate}"]
57    cor = ["\\exercice*", u"Réduire, si possible, les expressions suivantes :",
58           "\\begin{multicols}{3}\\noindent", \\begin{enumerate}"]
59    for dummy in range(9):
60        a = valeurs_reduire()
61        solve = [a]
62        exo.append("\\item $\\thenocalcul = " + texify(solve)[0] + "$")
63        cor.append("\\item $\\thenocalcul = " + texify(solve)[0] + "$")
64        solve = priorites(a)
65        solve.insert(0, a)
66        solve = texify(solve)
67        if len(solve) > 1:
68            for e in solve[1:]:
69                cor.append("\\[\\thenocalcul = " + e + "\\]")
70        exo.append("\\stepcounter{nocalcul}")
71        cor.append("\\stepcounter{nocalcul}")
72    exo.extend([\\end{enumerate}", "\\end{multicols}"])
73    cor.extend([\\end{enumerate}", "\\end{multicols}"])
74    return (exo, cor)
75
76reduire.description = u'Bases du calcul littéral'
77
78def distributivite():
79    """Crée un exercice permettant de s'entrainer sur la distributivité
80    """
81    lcalc, expr = [], []
82    for i in range(2):
83        tmp = ['Polynome([[%s, 1]], details=3)' % randrange(2, 10), 'Polynome([[%s, 0]], details=3)' % randrange(2, 10)]
84        shuffle(tmp)
85        lcalc.append(["*".join(tmp)])
86        lcalc[i].extend(priorites(lcalc[i][0]))
87        lcalc[i][0] = splitting(lcalc[i][0])
88        expr.append(texify(lcalc[i]))
89    tmp = [0, 1, 2]
90    for i in range(2, 5):
91        k = 'Polynome([[%s, 0]], details=3)' % randrange(2, 11)
92        if i > 1:
93            a = valeurs_reduire_somme(2)
94        else:
95            sgn = (-1) ** randrange(2)
96            a = [[sgn, 1] for dummy2 in range(randrange(2, 5))]
97            a.append([randrange(1, 11) * (-1) ** randrange(2), 0])
98            a = 'Polynome(%s, var=\'x\', details=3)' % a
99        exp = tmp.pop(randrange(len(tmp)))
100        if exp != 2:
101            b = 'Polynome([[%s, %s]], details=3)' % (randrange(1, 11) * (-1) ** randrange(3), exp)
102        else:
103            b = valeurs_reduire_somme(2)
104
105        lpoly = [a, k]
106        shuffle(lpoly)
107        if randrange(2):lpoly.insert(0, b)
108        else:lpoly.append(b)
109        if b == lpoly[0]:
110            lcalc.append(['%s+%s*%s' % (lpoly[0], lpoly[1], lpoly[2])])
111        else:
112            lcalc.append(['%s*%s+%s' % (lpoly[0], lpoly[1], lpoly[2])])
113        lcalc[i].extend(priorites(lcalc[i][0]))
114        lcalc[i][0] = splitting(lcalc[i][0])
115        expr.append(texify(lcalc[i]))
116    exo = ["\\exercice", u"Développer et réduire chacune des expressions littérales suivantes :"]
117    exo.append("\\begin{multicols}{2}")
118    cor = ["\\exercice*", u"Développer et réduire chacune des expressions littérales suivantes :"]
119    cor.append("\\begin{multicols}{2}")
120
121    for i in range(len(lcalc)):
122        cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
123        cor.append('\\\\')
124        cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
125    exo.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][0]) for i in range(len(expr))]))
126    exo.append("\\end{multicols}")
127    cor.append("\\end{multicols}")
128    return exo, cor
129
130distributivite.description = u'Distributivité'
131
132def double_distributivite():
133    """Crée un exercice permettant de s'entrainer sur la double distributivité
134    """
135    lcalc, expr = [], []
136    for i in range(2):
137        tmp = ['Polynome([[%s, 1]], details=3)' % ([1, randrange(2, 10)][i]), 'Polynome([[%s, 1]], details=3)' % randrange(2, 10)]
138        shuffle(tmp)
139        lcalc.append(["*".join(tmp)])
140        lcalc[i].extend(priorites(lcalc[i][0]))
141        lcalc[i][0] = splitting(lcalc[i][0])
142        expr.append(texify(lcalc[i]))
143    tmp = [0, 1, 2]
144    for i in range(2, 5):
145        a = valeurs_reduire_somme(2)
146        b = valeurs_reduire_somme(2)
147        exp = tmp.pop(randrange(len(tmp)))
148        if exp != 1:
149            c = 'Polynome([[%s, %s]], details=3)' % (randrange(1, 11) * (-1) ** randrange(3), exp)
150        else:
151            c = valeurs_reduire_somme(2)
152        lpoly = [a, b]
153        if randrange(2): lpoly.insert(0, c)
154        else: lpoly.append(c)
155        if c == lpoly[0]:
156            lcalc.append(['%s+%s*%s' % (lpoly[0], lpoly[1], lpoly[2])])
157        else:
158            lcalc.append(['%s*%s+%s' % (lpoly[0], lpoly[1], lpoly[2])])
159        lcalc[i].extend(priorites(lcalc[i][0]))
160        lcalc[i][0] = splitting(lcalc[i][0])
161        expr.append(texify(lcalc[i]))
162    exo = ["\\exercice", u"Développer et réduire chacune des expressions littérales suivantes :"]
163    exo.append("\\begin{multicols}{2}")
164    cor = ["\\exercice*", u"Développer et réduire chacune des expressions littérales suivantes :"]
165    cor.append("\\begin{multicols}{2}")
166    for i in range(len(lcalc)):
167        if i == 2: cor.append("\\end{multicols}")
168        cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
169        cor.append('\\\\')
170        cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
171    exo.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][0]) for i in range(len(expr))]))
172    exo.append("\\end{multicols}")
173    return exo, cor
174
175double_distributivite.description = u'Double distributivité'
176
177def soustraction():
178    """Réduction d'expressions du type 5a+3-(5+a)
179    """
180    lcalc, expr = [], []
181    sgn = ['-', '-', '-', '-', '+', '+']
182    for i in range(len(sgn)):
183        a = valeurs_reduire_somme(2)
184        b = 'Polynome([[%s,0]], var=\'x\', details=3)' % (randrange(2, 11) * (-1) ** randrange(2))
185        c = 'Polynome([[%s,1]], var=\'x\', details=3)' % (randrange(2, 11) * (-1) ** randrange(2))
186        poly = [a, b, c]
187        shuffle(poly)
188        signe = sgn.pop(randrange(len(sgn)))
189        poly.insert(poly.index(a), signe)
190        if signe == '+':
191            poly.insert(poly.index(a), '(')
192            poly.insert(poly.index(a) + 1, ')')
193        poly.insert(poly.index(b), '+')
194        poly.insert(poly.index(c), '+')
195        if poly[0] == '+': del poly[0]
196        lcalc.append(["".join(poly)])
197        lcalc[i].extend(priorites(lcalc[i][0]))
198        lcalc[i][0] = splitting(lcalc[i][0])
199        expr.append(texify(lcalc[i]))
200    exo = ["\\exercice", u"Réduire chacune des expressions littérales suivantes :"]
201    exo.append("\\begin{multicols}{2}")
202    cor = ["\\exercice*", u"Réduire chacune des expressions littérales suivantes :"]
203    cor.append("\\begin{multicols}{2}")
204    for i in range(len(lcalc)):
205        cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
206        cor.append('\\\\')
207        cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
208    exo.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][0]) for i in range(len(expr))]))
209    exo.append("\\end{multicols}")
210    cor.append("\\end{multicols}")
211    return exo, cor
212
213soustraction.description = u'Soustraire une expression entre parenthèses'
214
215def valeurs_reduire_somme(nbval=4):
216    """Réduire une somme de quatre monômes de degrés 0 et 1"""
217    var = "x"
218    #===========================================================================
219    # var = var[randrange(len(var))]
220    #===========================================================================
221    l = [[randrange(1, 11) * (-1) ** randrange(2), (i + 1) % 2] for i in range(nbval)]
222    return "Polynome(%s, var=\"%s\", details=3)" % (l, var)
223
224def exo_comptable():
225    """Exercice tiré de l'excellent ouvrage Des maths ensemble et pour chacun quatrième
226    """
227    exo = ["\\exercice", u"Le principe est le suivant : l'extrémité de chaque flèche indique la somme de la ligne ou de la colonne correspondante. Compléter, sachant que $x$ représente un nombre quelconque et que le contenu des deux cases grises doit être le même.\\par"]
228    cor = ["\\exercice*", u"Le principe est le suivant : l'extrémité de chaque flèche indique la somme de la ligne ou de la colonne correspondante. Compléter, sachant que $x$ représente un nombre quelconque et que le contenu des deux cases grises doit être le même.\\par"]
229    lexo = [valeurs_reduire_somme(2) for dummy in range(8)]
230    lcalc = [["%s+%s" % (lexo[4], lexo[0])], ["%s+%s" % (lexo[5], lexo[1])], ["%s+%s" % (lexo[6], lexo[2])], ["%s+%s" % (lexo[7], lexo[3])], \
231             ["%s+%s+%s+%s" % tuple(lexo[0:4])], [ "%s+%s+%s+%s" % tuple(lexo[4:])]]
232    for i in range(6):
233        sol = priorites(lcalc[i][0])
234        lcalc[i].extend(["".join(sol[j]) for j in range(len(sol))])
235    lcalc.append(["%s+%s+%s+%s" % (lcalc[0][-1], lcalc[1][-1], lcalc[2][-1], lcalc[3][-1])])
236    lcalc.append(["%s+%s" % (lcalc[4][-1], lcalc[5][-1])])
237    for i in range(6, 8):
238        sol = priorites(lcalc[i][0])
239        lcalc[i].extend(["".join(sol[j]) for j in range(len(sol))])
240    for i in range(8):
241        for j in range(len(lcalc[i])):
242            lcalc[i][j] = splitting(lcalc[i][j])
243    expr = [texify(lcalc[i]) for i in range(8)]
244    # expr = [texify([splitting(lexo[i])]) for i in range(8)]
245    txt = []
246    # txt.append(r"\psset{xunit=1.1cm,yunit=1.5cm}")
247    txt.append(r"\begin{center}")
248    txt.append(r"\begin{pspicture}(16,6)")
249    txt.append(r"\psframe[fillstyle=solid,fillcolor=Gray](0,0)(2,1)")
250    txt.append(r"\psframe[fillstyle=solid,fillcolor=Gray](14,5)(16,6)")
251    txt.append(r"\psframe(14,2)(16,3)")
252    txt.append(r"\psframe(14,3)(16,4)")
253    txt.append(r"\multido{\i=4+2}{4}{")
254    txt.append(r"\rput(\i,0){\psframe(0,0)(2,1)\psline[linewidth=2pt]{<-}(1,1.2)(1,1.8)}")
255    txt.append(r"\rput(\i,2){\psframe(0,0)(2,1)}")
256    txt.append(r"\rput(\i,3){\psframe(0,0)(2,1)}}")
257    txt.append(r"\psline[linewidth=2pt]{<-}(2.2,.5)(3.8,.5)")
258    txt.append(r"\psline[linewidth=2pt]{->}(12.2,2.5)(13.8,2.5)")
259    txt.append(r"\psline[linewidth=2pt]{->}(12.2,3.5)(13.8,3.5)")
260    txt.append(r"\psline[linewidth=2pt]{<-}(15,4.8)(15,4.2)")
261    txt.append(r"\rput(5,2.5){$%s$}" % texify([splitting(lexo[0])])[0])
262    txt.append(r"\rput(7,2.5){$%s$}" % texify([splitting(lexo[1])])[0])
263    txt.append(r"\rput(9,2.5){$%s$}" % texify([splitting(lexo[2])])[0])
264    txt.append(r"\rput(11,2.5){$%s$}" % texify([splitting(lexo[3])])[0])
265    txt.append(r"\rput(5,3.5){$%s$}" % texify([splitting(lexo[4])])[0])
266    txt.append(r"\rput(7,3.5){$%s$}" % texify([splitting(lexo[5])])[0])
267    txt.append(r"\rput(9,3.5){$%s$}" % texify([splitting(lexo[6])])[0])
268    txt.append(r"\rput(11,3.5){$%s$}" % texify([splitting(lexo[7])])[0])
269    exo.extend(txt)
270    txt.append(r"\rput(5,.5){$%s$}" % expr[0][-1])
271    txt.append(r"\rput(7,.5){$%s$}" % expr[1][-1])
272    txt.append(r"\rput(9,.5){$%s$}" % expr[2][-1])
273    txt.append(r"\rput(11,.5){$%s$}" % expr[3][-1])
274    txt.append(r"\rput(15,2.5){$%s$}" % expr[4][-1])
275    txt.append(r"\rput(15,3.5){$%s$}" % expr[5][-1])
276    txt.append(r"\rput(1,.5){$%s$}" % expr[6][-1])
277    txt.append(r"\rput(15,5.5){$%s$}" % expr[7][-1])
278    cor.extend(txt)
279    exo.append("\\end{pspicture}\n\\end{center}")
280    cor.append("\\end{pspicture}\n\\end{center}")
281    cor.append(u"\\subsubsection*{Ligne du bas :}")
282    cor.append(u"\\begin{multicols}{4}")
283    for i in range(4):
284        cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
285        cor.append('\\\\')
286        cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
287    cor.append(u"\\end{multicols}")
288    cor.append(u"\\subsubsection*{Colonne de droite :}")
289    cor.append(u"\\begin{multicols}{2}")
290    for i in range(4, 6):
291        cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
292        cor.append('\\\\')
293        cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
294    cor.append(u"\\end{multicols}")
295    cor.append(u"\\subsubsection*{Cases grises :}")
296    cor.append(u"\\begin{multicols}{2}")
297    for i in range(6, 8):
298        cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
299        cor.append('\\\\')
300        cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
301    cor.append(u"\\end{multicols}")
302
303    return exo, cor
304exo_comptable.description = u'Réduire des expressions littérales'
305#===============================================================================
306#
307# def reduire_expressions():
308#     """Fait double emploi avec l'exercice du comptable"""
309#     """Travail sur les bases du calcul littéral en quatrième"""
310#     exo = ["\\exercice", u"Réduire les expressions littérales suivantes :",
311#            "\\begin{multicols}{2}"]
312#     cor = ["\\exercice*", u"Réduire les expressions littérales suivantes :",
313#            "\\begin{multicols}{2}"]
314#     lexo = [valeurs_reduire_somme() for dummy in range(4)]
315#     expr = [texify([splitting(lexo[i])]) for i in range(4)]
316#     for i in range(4):
317#         expr[i].extend(texify(priorites(lexo[i])))
318#         exo.append('\\\\\n$%s=%s$' % (chr(i + 65), expr[i][0]))
319#         cor.append('\\\\\n'.join(['$%s=%s$' % (chr(i + 65), expr[i][j]) for j in range(len(expr[i]) - 1)]))
320#         cor.append('\\\\')
321#         cor.append('\\fbox{$%s=%s$}\\\\\n' % (chr(i + 65), expr[i][-1]))
322#     exo.append("\\end{multicols}")
323#     cor.append("\\end{multicols}")
324#     return exo, cor
325#
326# # eduire_expressions.description = u'Réduire des expressions littérales'
327#===============================================================================
Note: See TracBrowser for help on using the repository browser.