source: pyromaths/trunk/fuentes/src/pyromaths/ex/cinquiemes/proportionnalite.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: 8.8 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Pyromaths
4# Un programme en Python qui permet de créer des fiches d'exercices types de
5# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
6# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21#
22from random import randint, randrange
23from pyromaths.outils.decimaux import decimaux
24
25def ncotation(A, B, longueur, couleur=""):
26    """trace une flèche et inscrit horizontalement, dessous, la longueur entre A et B
27    où A et B sont des \node"""
28    linecouleur = ""
29    if couleur != "":
30        linecouleur = ",linecolor = %s" % couleur
31        couleur = "\\color{%s}" % couleur
32    return u"\\ncline[linestyle=dashed, offset = -1.5, linewidth = 0.4pt %s]{<->}{%s}{%s\\Bput{%s %s}" % (linecouleur, A, B, couleur, longueur)
33
34def ncotation_h(A, B, longueur, couleur=""):
35    """idem mais au dessus de la flèche"""
36    linecouleur = ""
37    if couleur != "":
38        linecouleur = ",linecolor = %s" % couleur
39        couleur = "\\color{%s}" % couleur
40    return u"\\ncline[linestyle=dashed, offset = 1.5, linewidth = 0.4pt %s]{<->}{%s}{%s\\Aput{%s %s}" % (linecouleur, A, B, couleur, longueur)
41
42
43def exo_echelles():
44    """À partir d'un plan tracé, déterminer l'échelle et des longueurs déterminées."""
45
46    # Échelle
47    echelle = [ 100, 250, 400, 500, 750, 1000][randrange(6)]
48
49    # figure : un plan d'appartement déssiner en psTricks
50    a, d = randint(40, 60), randint(36, 45)
51    b, c = randint(8, d - 27), randint(9, a - 25)
52    xF = a - c
53    xE = xF - 6
54    yK = b + 9
55    yF = b - 6
56#     yH = b
57    # Calculs des grandeurs réelles en mm !
58    reels = [echelle * a, echelle * b, echelle * c, echelle * d]
59
60    plan = [a, b, c, d]
61    # choix permet de choisir si on donne a, b, c ou d en énoncé
62    choix = randrange(4)
63    reponses = ["a", "b", "c", "d"]
64    enonce = reponses.pop(choix)
65
66    # sur la deuxième ligne du tableau, on écrit en cm, en gras, les nombres calculés
67    tab_reels = [ "\\bf"*(i != choix) + decimaux(reels[i] / 10.0) for i in range(4)]
68
69    # Pour placer les quatre lettres sur le plan
70    cotation_couleur = [["a", ""],
71                        ["b", ""],
72                        ["c", ""],
73                        ["d", ""]]
74        # la longueur donnée est tracée en bleu
75    cotation_couleur[choix][1] = "enonce"
76
77    # figure PSTricks en fonction des paramètres a, d, xE, XF, yF
78    figure = ["\\psset{PointName = none,  PointSymbol = none, unit = 1mm, linewidth = .5pt}",
79              "\\definecolor{enonce}{rgb}{0.11,0.56,0.98}",
80              "\\begin{pspicture}(-10mm, -10mm)(50mm ,50mm)",
81              # le rectangle ABCD
82              "\\pstGeonode[CurveType = polygon, linewidth = 1pt](0, 0)A(%s,0)B (%s, %s)C (0, %s)D" % (a, a, d, d),
83              # les points permettant de placer les cloisons
84              "\\pstGeonode(%s, 0){E1}(%s, %s){E2}(%s, 0){F1}(%s, %s){F2}" % (xE, xE, yF, xF, xF, yF),
85              "\\pstGeonode(%s, %s){G1}(%s, %s){G2}(%s, %s){G3}" % (a, b, xF, b, xF, 25),
86              "\\pstGeonode(%s, %s){H1}(%s, %s){H2}(%s, %s){H3}(%s, %s){H4}" % (xE, b, xE, 25, xE, yK, 15, yK),
87              "\\pstGeonode(0, %s){K2}(7, %s){K1}" % (yK, yK),
88              "\\pstGeonode(%s, %s){J1}(%s, %s){J2}(%s, %s){J3}(%s, %s){J4}" % (xE, d - 7, xE, d, xF, d - 7, xF, d),
89              # trace les cloisons, limitées par des tirets
90              "\\ncline{-|}{E1}{E2}\\ncline{-|}{F1}{F2}",
91              "\\ncline{|-}{J1}{J2}\\ncline{|-}{J3}{J4}",
92              "\\ncline{|-}{K1}{K2}",
93              "\\ncline{G1}{G2}\\ncline{|-|}{G3}{G2}",
94              "\\ncline{|-|}{H1}{H2}\\ncline{-|}{H3}{H4}",
95              # place les cotations sr la figure, l'énoncé en bleu
96              ncotation_h("D", "C", cotation_couleur[0][0], cotation_couleur[0][1]),
97              ncotation("B", "G1", cotation_couleur[1][0], cotation_couleur[1][1]),
98              ncotation("F1", "B", cotation_couleur[2][0], cotation_couleur[2][1]),
99              ncotation_h("A", "D", cotation_couleur[3][0], cotation_couleur[3][1]),
100              "\\end{pspicture}"]
101
102
103    exo = [_(u"\\exercice Sur ce plan, la longueur $%s$ mesure en réalité \\unit[%s]{m} :\n") % (enonce, decimaux(reels[choix] / 1000.0))] \
104          + figure + \
105           ["\\begin{enumerate}",
106           _(u"\\item Déterminer l'échelle de ce plan."),
107           _(u"\\item Déterminer les longueurs réelles $%s$, $%s$ et $%s$.") % (reponses[0], reponses[1], reponses[2]),
108            "\\end{enumerate}"]
109    cor = [_(u"\\exercice* Sur ce plan, la longueur $%s$ mesure en réalité \\unit[%s]{m} : \n") % (enonce, decimaux(reels[choix] / 1000.0))] \
110           + figure + \
111          ["\\begin{enumerate}",
112           _(u"\\item Déterminer l'échelle de ce plan.\\par"),
113           _(u"Sur le plan, je mesure que $%s=\\unit[%s]{cm}$.\\par") % (enonce, decimaux(plan[choix] / 10.0)),
114           _(u"Or on sait que en réalité $%s = \\unit[%s]{m} = \\unit[%s]{cm}$") % (enonce, decimaux(reels[choix] / 1000.0), decimaux(reels[choix] / 10.0)),
115           _(u" et  $%s \\div %s = %s$.\\par") % (decimaux(reels[choix]), decimaux(plan[choix]), decimaux(echelle)),
116           _(u"L'échelle de ce plan est donc $1/%s^e$.") % echelle,
117           _(u"\\item Déterminer les longueurs réelles $%s$, $%s$ et $%s$.\n") % (reponses[0], reponses[1], reponses[2]),
118           _(u"Grâce à la question précédente, je peux compléter le tableau :\n"),
119           "\\begin{tabular}{|l|c|c|c|c|c}",
120           ("\\multicolumn{1}{c}{}" + "&\\multicolumn{1}{c}{$%s$}"*4 + "\\\\") % ("a", "b", "c", "d"),
121           "\\cline{1-5}",
122           _("Sur le plan (en cm)  & %s & %s & %s & %s &\\rnode{plan1}{}\\\\") % tuple(map(lambda n:decimaux(n / 10.0), plan)),
123           "\\cline{1-5}",
124           _(u"En réalité (en cm)  & %s & %s & %s & %s &\\rnode{plan2}{}\\\\") % tuple(tab_reels),
125           "\\cline{1-5}",
126           "\\end{tabular}\n",
127           "\\ncbar{->}{plan1}{plan2}\\Aput{$\\times %s$}" % echelle,
128           _(u"Pour conclure, on convertit ses longueurs en m :\\par"),
129           "$$a = \\unit[%s]{m} \\quad ; \\quad b = \\unit[%s]{m} \\quad ; \\quad c  = \\unit[%s]{m} \\quad ; \\quad d =\\unit[%s]{m}$$"\
130                   % tuple(map(lambda n:decimaux(n / 1000.0), reels)),
131           "\\end{enumerate}"]
132
133    return exo, cor
134
135exo_echelles.description = _(u'Échelles')
136
137
138def exo_fruits():
139    fruit = [_("Cerises"), _("Tomates"), _("Pommes"), _("Poires"), _("Raisin"), _("Oranges")][randrange(6)]
140    while 1:
141        a, b, c = randint(10, 50) / 10.0, randint(10, 50) / 10.0, randint(10, 50) / 10.0
142        if a != b and a != c and b != c:
143            break
144    tarif = randint(20, 50) / 10.0
145    fruits_c = (fruit, a, b, c)
146    fruits_e = (fruit, decimaux(a), decimaux(b), "")
147    prix_c = (_("prix"), decimaux(fruits_c[1] * tarif), decimaux(fruits_c[2] * tarif), decimaux(fruits_c[3] * tarif))
148    prix_e = (_("prix"), decimaux(fruits_c[1] * tarif), "", decimaux(fruits_c[3] * tarif))
149
150    fruits_c = (fruit, decimaux(a), decimaux(b), decimaux(c))
151    tableau_exo = ["\\begin{tabular}{|l|c|c|c|}",
152               "\hline",
153               _(u"%s (en kg) & %s & %s &  %s  \\\\") % fruits_e,
154               "\hline",
155               _(u"%s (en \\euro)  & %s &  %s  & %s \\\\") % prix_e,
156               "\hline",
157               "\\end{tabular}"]
158    tableau_cor = ["\\begin{tabular}{|l|c|c|c|}",
159               "\hline",
160               _(u"%s (en kg) & %s & %s &  \\bf %s  \\\\") % fruits_c,
161               "\hline",
162               _(u"%s (en \\euro)  & %s &  \\bf %s  & %s \\\\") % prix_c,
163               "\hline",
164               "\\end{tabular}"]
165    exo = [_(u"\\exercice Le prix à payer est proportionnel à la masse de fruits achetés.\\par"),
166           _(u"Détermine la valeur des cases vides")]
167    cor = [_(u"\\exercice Le prix à payer est proportionnel à la masse de fruits achetés.\\par"),
168           _(u"Détermine la valeur des cases vides")]
169    exo += ["\n"] + tableau_exo
170    cor += ["\n"] + tableau_cor
171    cor.append("$$\\frac{%s \\times %s}{%s} = %s \\quad;\\qquad" % (prix_e[1], fruits_e[2], fruits_e[1], prix_c[2]))
172    cor.append("\\frac{%s \\times %s}{%s} = %s $$" % (fruits_c[1], prix_c[3], prix_e[1], fruits_c[3]))
173
174    return (exo, cor)
Note: See TracBrowser for help on using the repository browser.