source: pyromaths/trunk/fuentes/src/pyromaths/ex/sixiemes/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: 14.7 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
24import random
25import math
26
27#===============================================================================
28# Fractions partage
29#===============================================================================
30
31
32def dimensions_rectangle():
33    taille_max = 8
34    while True:
35        (l, h) = (random.randrange(4, taille_max), random.randrange(4,
36                  taille_max))
37        div_t = diviseurs(l * h)
38        if len(div_t) > 3:
39            break
40    if l < h:
41        (l, h) = (h, l)
42    return (l, h)
43
44
45def numerateur_denominateur(l, h, cas):
46    """
47
48    @param l: largeur
49    @param h: longueur
50    @param cas:
51        - nid: numerateur < denominateur
52        - un: numerateur = denominateur
53        - nsd: numerateur > denominateur
54    @type cas: string
55    """
56
57    ldiv = diviseurs(l * h)
58    if cas == "un":
59        d = random.randrange(3, l * h)
60    else:
61        while True:
62            d = ldiv[random.randrange(len(ldiv) - 1)]
63            if d > 2:
64                break
65    if cas == "un":
66        n = d
67    elif cas == "nid":
68        n = random.randrange(1, d)
69    else:
70        n = random.randrange(d + 1, d * 2)
71    return (n, d)
72
73
74def trace_rectangle(exo, cor, l, h, cas):
75    exo.append("\\psgrid[gridcolor=Olive,subgriddiv=0,gridlabels=0pt]")
76    cor.append("\\psgrid[gridcolor=Olive,subgriddiv=0,gridlabels=0pt]")
77    exo.append("\\psframe[linewidth=1.5\\pslinewidth,linecolor=Maroon](0,0)(%s,%s)" % (l, h))
78    cor.append("\\psframe[linewidth=1.5\\pslinewidth,linecolor=Maroon](0,0)(%s,%s)" % (l, h))
79    if cas == "nsd":
80        cor.append("\\psframe[linewidth=1.5\\pslinewidth,linecolor=Maroon](%s,0)(%s,%s)" % 
81                (l + 1, 2 * l + 1, h))
82
83def fractions_partage_corrige(l, h, n, d):
84    div_l = diviseurs(l)
85    div_h = diviseurs(h)
86    div_d = diviseurs(d)
87    (lc, hc) = (l, h)
88    if n == d:
89        (lc, hc) = (l, h)
90    elif div_l.count(d):
91        lc = l // d
92    elif div_h.count(d):
93        hc = h // d
94    else:
95        for i in range(len(div_d) - 1):
96            if div_l.count(div_d[i + 1]) and div_h.count(d // div_d[i + 1]):
97                (lc, hc) = (l // div_d[i + 1], (h * div_d[i + 1]) // d)
98                break
99    return (lc, hc)
100
101
102def trace_partage(cor, l, h, lc, hc, cas):
103    if lc < l:
104        cor.append("\\multips(%s,0)(%s,0){%s}{\\psline[linecolor=Maroon](0,0)(0,%s)}" % 
105                 (lc, lc, l // lc - 1, h))
106        if cas == "nsd":
107            cor.append("\\rput(%s,0){\\multips(%s,0)(%s,0){%s}{\\psline[linecolor=Maroon](0,0)(0,%s)}}" % 
108                     (l + 1, lc, lc, l // lc - 1, h))
109    if hc < h:
110        cor.append("\\multips(0,%s)(0,%s){%s}{\\psline[linecolor=Maroon](0,0)(%s,0)}" % 
111                 (hc, hc, h // hc - 1, l))
112        if cas == "nsd":
113            cor.append("\\rput(%s,0){\\multips(0,%s)(0,%s){%s}{\\psline[linecolor=Maroon](0,0)(%s,0)}}" % 
114                     (l + 1, hc, hc, h // hc - 1, l))
115
116
117def coloriage(cor, n, d, l, h, lc, hc):
118    if n == d:
119        cor.append("\\psframe[fillstyle=solid](0,0)(%s,%s)" % 
120                 (l, h))
121    else:
122        (x, y, nfig) = (0, 0, 0)
123        for dummy in range(n):
124            if nfig:
125                cor.append("\\rput(%s,0){\\psframe[fillstyle=solid](%s,%s)(%s,%s)}" % 
126                         (nfig, x, y, x + lc, y + hc))
127            else:
128                cor.append("\\psframe[fillstyle=solid](%s,%s)(%s,%s)" % 
129                         (x, y, x + lc, y + hc))
130            if x + lc < l:
131                x = x + lc
132            elif y + hc < h:
133                (x, y) = (0, y + hc)
134            else:
135                (x, y, nfig) = (0, 0, l + 1)
136
137
138def diviseurs(n):
139    l = []
140    for i in range(1, int(math.sqrt(n)) + 1):
141        if not n % i:
142            l.append(i)
143            if i != n // i:
144                l.append(n // i)
145    l.sort()
146    return l
147
148
149def FractionPartage():
150    exo = ["\\exercice", '\\begin{multicols}{2}', '\\begin{enumerate}']
151    cor = ["\\exercice*", '\\begin{multicols}{2}', '\\begin{enumerate}']
152
153    lcas = ["nid", "un", "nsd", "nid", "nsd"]
154    for i in range(4):
155        cas = lcas.pop(random.randrange(len(lcas)))
156        if cas == "nsd":
157            while True:
158                (l, h) = dimensions_rectangle()
159                if l < 8:
160                    break
161        else:
162            (l, h) = dimensions_rectangle()
163        (n, d) = numerateur_denominateur(l, h, cas)
164        (lc, hc) = fractions_partage_corrige(l, h, n, d)
165
166        exo.append("\\item Colorer $\\frac{%s}{%s}$ de ce rectangle.\\par" % 
167                 (n, d))
168        cor.append("\\item Colorer $\\frac{%s}{%s}$ de ce rectangle.\\par" % 
169                 (n, d))
170        exo.append("\\psset{unit=4mm}")
171        cor.append("\\psset{unit=4mm}")
172        exo.append("\\begin{pspicture}(16,%s)" % h)
173        cor.append("\\begin{pspicture}(16,%s)" % h)
174        (lc, hc) = fractions_partage_corrige(l, h, n, d)
175        coloriage(cor, n, d, l, h, lc, hc)
176        trace_rectangle(exo, cor, l, h, cas)
177        trace_partage(cor, l, h, lc, hc, cas)
178        exo.append("\\end{pspicture}")
179        cor.append("\\end{pspicture}")
180        if i == 1:
181            exo.append("\\columnbreak")
182            cor.append("\\columnbreak")
183
184    exo.append('\\end{enumerate}')
185    exo.append('\\end{multicols}')
186    cor.append('\\end{enumerate}')
187    cor.append('\\end{multicols}')
188    return (exo, cor)
189
190FractionPartage.description = u'Fractions partage'
191
192
193#===============================================================================
194# Fractions et abscisses
195#===============================================================================
196
197
198def valeurs_abscisses():
199    origine = random.randrange(3, 11)
200    nb_divisions = (
201        6,
202        8,
203        9,
204        10,
205        12,
206        14,
207        15,
208        16,
209        18,
210        20,
211        )
212    div = nb_divisions[random.randrange(len(nb_divisions))]
213    nb_subd = diviseurs(div)
214    subd = nb_subd[random.randrange(len(nb_subd) - 2) + 1]
215    while subd < 3:
216        subd = nb_subd[random.randrange(len(nb_subd) - 2) + 1]
217    nb_grad = 58  # nb de graduations sur la demi-droite graduée
218    lpts = [0 for i in range(7)]  # liste des places des points à trouver/placer sur la 1/2 droite graduée
219    lpts[4] = random.randrange(1, nb_grad // div + 1) * div
220    for i in range(2):
221        a = random.randrange(1, nb_grad)
222        while lpts.count(a):
223            a = random.randrange(1, nb_grad)
224        lpts[i] = a
225    for i in range(2):
226        a = random.randrange(1, (nb_grad * subd) // div)
227        while lpts.count((a * div) // subd):
228            a = random.randrange(1, (nb_grad * subd) // div)
229        lpts[i + 2] = (a * div) // subd
230    for i in range(2):
231        a = random.randrange(1, (nb_grad * subd) // div)
232        while lpts.count((a * div) // subd):
233            a = random.randrange(1, (nb_grad * subd) // div)
234        lpts[i + 5] = (a * div) // subd
235
236    # npts=noms_pts(7)
237
238    npts = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
239    lnum = list(range(7))  # liste des numérateurs
240    lnum[0] = origine * div + lpts[0]
241    lnum[1] = origine * div + lpts[1]
242    lnum[2] = origine * subd + (lpts[2] * subd) // div
243    lnum[3] = origine * subd + (lpts[3] * subd) // div
244    lnum[4] = random.randrange(3, div)
245    while diviseurs(div).count(lnum[4]):
246        lnum[4] = random.randrange(3, div)
247    lnum[5] = origine * div + lpts[5]
248    lnum[6] = origine * div + lpts[6]
249    return (origine, div, subd, lpts, npts, lnum)
250
251
252def noms_pts(nb):  # renvoie nb noms de points
253    (listenb, listepts) = ([], [])
254    for i in range(26):
255        listenb.append(i + 65)
256    for i in range(nb):
257        listepts.append(chr(listenb.pop(random.randrange(26 - i))))
258    listepts.sort()
259    return listepts
260
261
262def unites_fractions(exo, cor, origine, div, subd):
263    postf = u'ièmes'
264    lch = [
265        'cinqu',
266        'six',
267        'sept',
268        'huit',
269        'neuv',
270        'dix',
271        'onz',
272        'douz',
273        'treiz',
274        'quatorz',
275        'quinz',
276        'seiz',
277        'dix-sept',
278        'dix-huit',
279        'dix-neuv',
280        'vingt',
281        ]
282    lfr = dict([(i + 5, lch[i] + postf) for i in range(len(lch))])
283    lfr[2] = 'demis'
284    lfr[3] = 'tiers'
285    lfr[4] = 'quarts'
286    exo.append(u'\\item 1 unité = \\ldots %s' % lfr[div])
287    exo.append(u'\\item 1 unité = \\ldots~%s' % lfr[subd])
288    exo.append(u'\\item %s unités = \\ldots~%s' % (origine,
289             lfr[div]))
290    exo.append(u'\\item %s unités = \\ldots~%s' % (origine,
291             lfr[subd]))
292    cor.append(u'\\item 1 unité = %s %s' % (div, lfr[div]))
293    cor.append(u'\\item 1 unité = %s %s' % (subd, lfr[subd]))
294    cor.append(u'\\item %s unités = %s %s' % (origine,
295             origine * div, lfr[div]))
296    cor.append(u'\\item %s unités = %s %s' % (origine,
297             origine * subd, lfr[subd]))
298
299
300def trace_demi_droite(exo, cor, origine, div, subd, lpts, npts, lnum):
301    exo.append("\\psline[arrowscale=2,linecolor=Maroon]{->}(0,0)(18,0)")
302    exo.append("\\rput(2mm,0){%")
303    exo.append("\\multips(0,0)(3 mm,0){58}{\\psline[linecolor=Maroon](0,-.1)(0,.1)}")
304    exo.append("\\multips(0,0)(%s mm,0){%s}{\\psline[linecolor=Maroon](0,-.2)(0,.2)}" % 
305             (div * 3, 58 // div + 1))
306    cor.append("\\psline[arrowscale=2,linecolor=Maroon]{->}(0,0)(18,0)")
307    cor.append("\\rput(2mm,0){%")
308    cor.append("\\multips(0,0)(3 mm,0){58}{\\psline[linecolor=Maroon](0,-.1)(0,.1)}")
309    cor.append("\\multips(0,0)(%s mm,0){%s}{\\psline[linecolor=Maroon](0,-.2)(0,.2)}" % 
310             (div * 3, 58 // div + 1))
311    for i in range(58 // div + 1):
312        exo.append("\\rput[t](%s mm,-3mm){\\centering %s}" % ((i * div) * 
313                 3, origine + i))
314        cor.append("\\rput[t](%s mm,-3mm){\\centering %s}" % ((i * div) * 
315                 3, origine + i))
316    for i in range(2):
317        exo.append("\\rput[t](%s mm,4mm){\\centering $%s$}" % (lpts[i + 
318                 5] * 3 + .1, npts[i + 5]))
319    for i in range(7):
320        cor.append("\\rput[t](%s mm,4mm){\\centering $%s$}" % (lpts[i] * 
321                 3 + .1, npts[i]))
322    exo.append("}")
323    cor.append("}")
324
325
326def ecrit_abscisses(exo, cor, origine, div, subd, lpts, lnum):
327    exo.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[0], div))
328    exo.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[1], div))
329    exo.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[2], subd))
330    exo.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[3], subd))
331    exo.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (origine * 
332             lnum[4] + (lpts[4] // div) * lnum[4], lnum[4]))
333    cor.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[0], div))
334    cor.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[1], div))
335    cor.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[2], subd))
336    cor.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[3], subd))
337    cor.append("\\item $\\left(\\cfrac{%s}{%s}\\right)$" % (origine * 
338             lnum[4] + (lpts[4] // div) * lnum[4], lnum[4]))
339
340
341def trouve_abscisses(exo, cor, div, subd, lnum):
342    exo.append("\\item $F~\\left(\\cfrac{\\ldots}{%s}\\right)$" % div)
343    exo.append("\\item $F~\\left(\\cfrac{\\ldots}{%s}\\right)$" % subd)
344    exo.append("\\item $G~\\left(\\cfrac{\\ldots}{%s}\\right)$" % div)
345    exo.append("\\item $G~\\left(\\cfrac{\\ldots}{%s}\\right)$" % subd)
346    cor.append("\\item $F~\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[5], div))
347    cor.append("\\item $F~\\left(\\cfrac{%s}{%s}\\right)$" % ((lnum[5] * 
348             subd) // div, subd))
349    cor.append("\\item $G~\\left(\\cfrac{%s}{%s}\\right)$" % (lnum[6], div))
350    cor.append("\\item $G~\\left(\\cfrac{%s}{%s}\\right)$" % ((lnum[6] * 
351             subd) // div, subd))
352
353
354def QuestionsAbscisses():
355    exo = ["\\exercice"]
356    cor = ["\\exercice*"]
357    (origine, div, subd, lpts, npts, lnum) = valeurs_abscisses()
358    exo.append("\\begin{enumerate}")
359    exo.append(u"\\item Compléter :")
360    exo.append("\\begin{multicols}{2}")
361    exo.append("\\begin{enumerate}")
362    cor.append("\\begin{enumerate}")
363    cor.append(u"\\item Compléter :")
364    cor.append("\\begin{multicols}{2}")
365    cor.append("\\begin{enumerate}")
366    unites_fractions(exo, cor, origine, div, subd)
367    exo.append("\\end{enumerate}")
368    exo.append("\\end{multicols}")
369    exo.append(u"\\item Sur la demi-droite ci-dessous, placer les points d'abscisse donnée :")
370    exo.append("\\begin{multicols}{5}")
371    exo.append("\\begin{enumerate}")
372    exo.append("\\renewcommand{\\theenumii}{\\Alph{enumii}}")
373    exo.append("\\renewcommand{\\labelenumii}{$\\theenumii$}")
374    cor.append("\\end{enumerate}")
375    cor.append("\\end{multicols}")
376    cor.append(u"\\item Sur la demi-droite ci-dessous, placer les points d'abscisse donnée :")
377    cor.append("\\begin{multicols}{5}")
378    cor.append("\\begin{enumerate}")
379    cor.append("\\renewcommand{\\theenumii}{\\Alph{enumii}}")
380    cor.append("\\renewcommand{\\labelenumii}{$\\theenumii$}")
381    ecrit_abscisses(exo, cor, origine, div, subd, lpts, lnum)
382    exo.append("\\end{enumerate}")
383    exo.append("\\end{multicols}")
384    exo.append(u"\\item Compléter les abscisses des points suivants :")
385    exo.append("\\begin{multicols}{4}")
386    exo.append("\\begin{enumerate}")
387    cor.append("\\end{enumerate}")
388    cor.append("\\end{multicols}")
389    cor.append(u"\\item Compléter les abscisses des points suivants :")
390    cor.append("\\begin{multicols}{4}")
391    cor.append("\\begin{enumerate}")
392    trouve_abscisses(exo, cor, div, subd, lnum)
393    exo.append("\\end{enumerate}")
394    exo.append("\\end{multicols}")
395    exo.append("\\end{enumerate}")
396    exo.append("\\begin{pspicture}(0,-.5)(18,.5)")
397    cor.append("\\end{enumerate}")
398    cor.append("\\end{multicols}")
399    cor.append("\\end{enumerate}")
400    cor.append("\\begin{pspicture}(0,-.5)(18,.5)")
401    trace_demi_droite(exo, cor, origine, div, subd, lpts, npts, lnum)
402    exo.append("\\end{pspicture}")
403    cor.append("\\end{pspicture}")
404    return (exo, cor)
405
406QuestionsAbscisses.description = u'Fractions et abscisses'
Note: See TracBrowser for help on using the repository browser.