source: pyromaths/trunk/fuentes/src/pyromaths/ex/cinquiemes/statistiques.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: 35.6 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#
23import random
24from math import cos, sin, radians
25from pyromaths.outils.decimaux import decimaux
26from pyromaths.outils.Arithmetique import pgcd
27
28def tableau_tex(titres, larg="c", eff=1, freq=1, val=[[], []], total=1):
29    """Génère le tableau des effectifs (liste val[1]) et fréquences (liste val[2])."""
30    cols = len(titres)
31    tableau_tex = u"\\begin{tabular}{|>{\\bfseries}c|*{" + str(cols - 1) + "}{" + larg + "|}"
32
33    if total:
34        tableau_tex += ">{\\centering\\bfseries\\arraybackslash}p{2cm}|}\n"
35    else:
36        tableau_tex += "}\n"
37
38    tableau_tex += u"\\hline\n"
39
40    for titre in titres:  # Ligne de titre, avec astuce pour éviter le cadre sur la dernière cellule "Total"
41        tableau_tex += u"\\textbf{" + titre + "} & "
42
43    if total:
44        tableau_tex += u"\\textbf{Total} \\\\\\hline\n"
45    else:
46        tableau_tex = tableau_tex[:-2] + u"\\\\\\hline\n"
47
48    if eff:
49        tableau_tex += _("Effectifs")
50        if len(val[0]) > 0:
51            somme = 0
52            for effectif in val[0]:
53                if effectif < 0:
54                    tableau_tex += " & "
55                else:
56                    tableau_tex += " & " + decimaux(effectif)
57                    somme += effectif
58        else:
59            tableau_tex += " & " * (cols - 1)
60            somme = ""
61
62        if total:
63            tableau_tex += " & " + str(somme) + "\\\\\\hline\n"
64        else:
65            tableau_tex += "\\\\\\hline\n"
66
67    if freq:
68        tableau_tex += _(u"Fréquences (\\%)")
69        if len(val[1]) > 0:
70            for frequence in val[1]:
71                somme = "100"
72                if frequence < 0:
73                    tableau_tex += " & "
74                else:
75                    tableau_tex += " & " + decimaux(frequence)
76        else:
77            tableau_tex += " & " * (cols - 1)
78            somme = ""
79
80        if total:
81            tableau_tex += " & " + somme + "\\\\\\hline\n"
82        else:
83            tableau_tex += "\\\\\\hline\n"
84
85    tableau_tex += "\\end{tabular}"
86
87    return tableau_tex
88
89def diagramme_tex(typed=2, val=[[], []], aide=0):
90    """Génère un diagramme en bâtons (type 1), circulaire (type2) ou semi-circulaire (type3) à partir des fréquences (liste val[1]) et son tableau de calculs."""
91    diag = ""
92
93    couleur = ["AliceBlue", "Bisque", "PaleGreen", "Thistle", "LightGray", "Khaki", "LightBlue", "LightSalmon", "PaleGoldenrod", "PapayaWhip", "Plum", "Gainsboro"]
94
95    if typed == 1:  # Diagramme en bâtons
96
97        grad = len(val[1]) + 1
98        diag += u"\\begin{pspicture}(-1,-1)(" + str(grad) + ",11)\n"
99        diag += u"\\psset{xunit=1cm,yunit=1cm}\n"
100        diag += u"\\psgrid[subgriddiv=1,griddots=5,gridlabels=0](" + str(grad) + ",11)\n"
101        diag += u"\\psaxes[Dx=1,dx=1,Dy=10,dy=1]{->}(0,0)(" + str(grad) + ",11)\n"
102
103        for f in range(len(val[1])):
104            diag += u"\\psline[linewidth=0.1,linecolor=green](" + val[0][f + 1] + ",0)(" + val[0][f + 1] + "," + str(val[1][f] / 10.0) + ")\n"
105
106        diag += u"\\rput(0,11.2){\\small Fréquences (\\%)}\n"
107        diag += u"\\rput(" + str(grad + 0.5) + ",0){\\small " + val[0][0] + "}\n"
108        diag += u"\\end{pspicture}\n"
109
110    elif typed == 2:  # Diagramme circulaire
111        grad = len(val[1])
112        diag += u"\\begin{pspicture}(-3,-3)(3,3)\n"
113        diag_texte = ""
114
115        debut = 0
116        fin = round(val[1][0] * 3.6, 0)
117        liste_fin = [fin]  # Pour éviter d'avoir les pointillés superposés sur des lignes
118
119
120        for v in range(len(val[1]) - 1):
121            diag += u"\\pswedge[fillstyle=solid,fillcolor=" + couleur[v % 12] + "](0,0){3}{" + str(debut) + "}{" + str(fin) + "}\n"
122            diag_texte += u"\\rput[r]{" + str((debut + fin) / 2.0) + "}(" + str(3 * round(cos(radians((debut + fin) / 2.0)), 2)) + "," + str(3 * round(sin(radians((debut + fin) / 2.0)), 2)) + "){\\small \\bfseries{" + val[0][v + 1] + "}}\n"
123            debut = fin
124            fin += round(val[1][v + 1] * 3.6, 0)
125            liste_fin.append(fin)
126        diag += u"\\pswedge[fillstyle=solid,fillcolor=" + couleur[(len(val[1]) - 1) % 12] + "](0,0){3}{" + str(debut) + "}{360}\n"
127        diag_texte += u"\\rput[r]{" + str((debut + fin) / 2.0) + "}(" + str(3 * round(cos(radians((debut + fin) / 2.0)), 2)) + "," + str(3 * round(sin(radians((debut + fin) / 2.0)), 2)) + "){\\small \\bfseries{" + val[0][-1] + "}}\n"
128
129        if aide != 0:
130            temp = [int(3.6 * v) for v in val[1]]
131            temp2 = [pgcd(temp[i], temp[i + 1]) for i in range(len(val[1]) - 1)]
132            temp2.sort()
133            ecart = temp2[0]
134            angle = ecart
135
136            while angle < 360:
137                if angle not in liste_fin:
138                    diag += u"\\psline[linestyle=dashed,linecolor=gray](0,0)(" + str(3 * round(cos(radians(angle)), 2)) + "," + str(3 * round(sin(radians(angle)), 2)) + ")\n"
139                angle += ecart
140
141        diag += diag_texte
142        diag += u"\\end{pspicture}\n"
143
144    elif typed == 3:  # Diagramme semi-circulaire
145        grad = len(val[1])
146        diag += u"\\begin{pspicture}(0,0)(3,3)\n"
147        diag_texte = ""
148
149        debut = 0
150        fin = round(val[1][0] * 1.8, 0)
151        liste_fin = [fin]  # Pour éviter d'avoir les pointillés superposés sur des lignes
152
153        for v in range(len(val[1]) - 1):
154            diag += u"\\pswedge[fillstyle=solid,fillcolor=" + couleur[v % 12] + "](0,0){3}{" + str(debut) + "}{" + str(fin) + "}\n"
155            diag_texte += u"\\rput[r]{" + str((debut + fin) / 2.0) + "}(" + str(3 * round(cos(radians((debut + fin) / 2.0)), 2)) + "," + str(3 * round(sin(radians((debut + fin) / 2.0)), 2)) + "){\\small \\bfseries{" + val[0][v + 1] + "}}\n"  # FIX problème hauteur textes superposés
156            debut = fin
157            fin += round(val[1][v + 1] * 1.8, 0)
158            liste_fin.append(fin)
159        diag += u"\\pswedge[fillstyle=solid,fillcolor=" + couleur[(len(val[1]) - 1) % 12] + "](0,0){3}{" + str(debut) + "}{180}\n"
160        diag_texte += u"\\rput[r]{" + str((debut + fin) / 2.0) + "}(" + str(3 * round(cos(radians((debut + fin) / 2.0)), 2)) + "," + str(3 * round(sin(radians((debut + fin) / 2.0)), 2)) + "){\\small \\bfseries{" + val[0][-1] + "}}\n"
161
162        if aide != 0:
163            temp = [int(1.8 * v) for v in val[1]]
164            temp2 = [pgcd(temp[i], temp[i + 1]) for i in range(len(val[1]) - 1)]
165            temp2.sort()
166            ecart = temp2[0]
167            angle = ecart
168
169            while angle < 180:
170                if angle not in liste_fin:
171                    diag += u"\\psline[linestyle=dashed,linecolor=gray](0,0)(" + str(3 * round(cos(radians(angle)), 2)) + "," + str(3 * round(sin(radians(angle)), 2)) + ")\n"
172                angle += ecart
173
174        diag += diag_texte
175        diag += u"\\end{pspicture}\n"
176
177
178    return diag
179
180def tableau_diagramme_tex(typed=2, val=[[], []], larg="c"):
181    """Génère le tableau de calculs des angles ou des longueurs pour le corrigé de la construction des diagrammes."""
182    cols = len(val[0])
183    tab = u"\\begin{tabular}{|>{\\bfseries}c|*{" + str(cols - 1) + "}{" + larg + "|}>{\\centering\\bfseries\\arraybackslash}p{2cm}|}\n"
184    tab += u"\\hline\n"
185
186    for titre in val[0]:  # Ligne de titre, avec astuce pour éviter le cadre sur la dernière cellule "Total"
187        tab += u"\\textbf{" + titre + "} & "
188    tab += u"\\textbf{Total} \\\\\\hline\n"
189
190    tab += _(u"Fréquences (\\%)")
191
192    for frequence in val[1]:
193        tab += " & " + decimaux(frequence)
194
195    tab += " & 100 \\\\\\hline\n"
196
197    if typed == 1:  # Diagramme en bâtons
198        texte = _(u"Comme 10\\% sont représentés par 1cm, il faut diviser chaque fréquence par 10 pour obtenir la longueur (arrondie au dixième) du bâton à dessiner :\\par\n")
199        tab = texte + tab
200        tab += _(u"Hauteur (cm)")
201        for frequence in val[1]:
202            tab += " & " + decimaux(round(frequence / 10.0, 1))
203        tab += " & 10 \\\\\\hline\n"
204
205    elif typed == 2:  # Diagramme circulaire
206        texte = _(u"Comme il y a $360^{\circ}$ dans un cercle pour représenter 100\\%, il faut multiplier chaque fréquence par 3,6 pour connaître son angle (arrondi au degré) de représentation dans le diagramme :\\par\n")
207        tab = texte + tab
208        tab += _(u"Angle (Degrés)")
209        for frequence in val[1]:
210            tab += " & " + decimaux(round(frequence * 3.6, 0))
211        tab += " & 360 \\\\\\hline\n"
212
213    elif typed == 3:  # Diagramme semi-circulaire
214        texte = _(u"Comme il y a $180^{\circ}$ dans un cercle pour représenter 100\\%, il faut multiplier chaque fréquence par 1,8 pour connaître son angle (arrondi au degré) de représentation dans le diagramme :\\par\n")
215        tab = texte + tab
216        tab += _(u"Angle (Degrés)")
217        for frequence in val[1]:
218            tab += " & " + decimaux(round(frequence * 1.8, 0))
219        tab += " & 180 \\\\\\hline\n"
220
221    tab += "\\end{tabular}\n"
222
223    return tab
224
225def exo_pi():
226    """Exercice sur les décimales de Pi."""
227    global exo, cor
228
229    pi = "14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009"  # 2000 décimales de Pi après la virgule
230
231    nb_dec = random.randint(50, 100)
232    idx_dec = random.randint(0, 2000 - nb_dec)
233    dec_str = list(pi[idx_dec:(idx_dec + nb_dec)])
234    dec = [int(d) for d in dec_str]
235    dec_tex = "\\begin{center}\n\\begin{tabular}{|*{20}{p{0.2cm}}|}\n\\hline\n"
236
237    for d in range(len(dec_str)):
238        dec_tex += dec_str[d] + " & "
239        if ((d + 1) % 20 == 0):
240            dec_tex = dec_tex[:-3] + "\\\\\n"
241    dec_tex += " & "*(19 - len(dec_str) % 20) + "\\\\\n"
242    dec_tex += "\\hline\n\\end{tabular}\n\\end{center}"
243
244    effectifs = [dec.count(i) for i in range(10)]
245    frequences = [round(i * 100.0 / nb_dec, 2) for i in effectifs]  # FIX somme pas toujours égale à 100%
246
247    tableau = tableau_tex([_(u"Chiffres"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], ">{\\centering}p{0.5cm}")
248    tableau_cor = tableau_tex([_(u"Chiffres"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], ">{\\centering}p{0.8cm}", 1, 1, [effectifs, frequences])
249
250    exo.append(_(u"Voici une liste de chiffres choisis au hasard dans les décimales de $\\pi$ :\\par"))
251    cor.append(_(u"Voici une liste de chiffres choisis au hasard dans les décimales de $\\pi$ :\\par"))
252    exo.append(dec_tex)
253    cor.append(dec_tex)
254    exo.append("\\begin{enumerate}")
255    cor.append("\\begin{enumerate}")
256    exo.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
257    cor.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
258    exo.append("\\end{enumerate}")
259    exo.append(tableau)
260    exo.append(u"\\par")
261    cor.append(_(u"Chaque effectif se complète en comptant le nombre d'apparition de chaque chiffre dans la liste de l'énoncé."))
262    cor.append(_(u"Comme les chiffres sont rangés par 20, on voit assez rapidement que le nombre total de chiffres est de ") + str(nb_dec) + ".\\par")
263    cor.append(_(u"Pour le calcul des fréquences, on multiplie l'effectif par 100, et on divise par le nombre total de chiffres, puis il ne faut pas oublier d'arrondir au centième.\\par\n"))
264    cor.append(_(u"Par exemple pour la fréquence du chiffre 1 : $\\dfrac{") + decimaux(effectifs[0]) + "\\times 100}{" + str(nb_dec) + "} \\approx " + decimaux(frequences[0]) + "$.\\par")
265    cor.append("\\end{enumerate}")
266    cor.append(tableau_cor)
267    exo.append("\\begin{enumerate}")
268    cor.append("\\begin{enumerate}")
269    exo.append(_(u"\\item[$\\blacktriangleright$\\textbf{2.}] Représenter la répartition des chiffres dans un diagramme en bâtons avec 1~cm pour 10\\%."))
270    cor.append(_(u"\\item[$\\blacktriangleright$\\textbf{2.}] Représenter la répartition des chiffres dans un diagramme en bâtons avec 1~cm pour 10\\%.\\par"))
271    exo.append("\\end{enumerate}")
272    cor.append("\\end{enumerate}")
273
274    diagramme = diagramme_tex(1, [[_(u"Valeurs"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], frequences])
275    diagramme_tableau = tableau_diagramme_tex(1, [[_(u"Valeurs"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], frequences], ">{\\centering}p{0.8cm}")
276
277    cor.append(diagramme_tableau)
278    cor.append("\\bigskip")
279    cor.append(diagramme)
280
281    return False
282
283def exo_notes():
284    """Exercice sur les notes."""
285    global exo, cor
286
287    len_classe = [4, 5][random.randint(0, 1)]  # Classes de longueur 4 ou 5
288    classes = []
289    val = 0
290    while val + len_classe <= 20:
291        classes += [[val, val + len_classe]]
292        val = val + len_classe
293
294    titres = [_(u"Classes de notes")] + [u"$" + str(f[0]) + u" \leq n < " + str(f[1]) + u"$" for f in classes[:-1]] + [u"$" + str(classes[-1][0]) + u" \leq n \leq 20$"]
295
296    exo.append(_(u"Voici un tableau regroupant les notes d'une classe lors d'un contrôle :\\par"))
297    cor.append(_(u"Voici un tableau regroupant les notes d'une classe lors d'un contrôle :\\par"))
298
299    nb_eleves = random.randint(25, 35)
300    notes_tpl = [str(i) for i in range(21)]
301    notes = [random.randint(1, 20) for i in range(nb_eleves)]
302    notes_effectifs = [notes.count(i) for i in range(21)]
303    tableau_notes = tableau_tex([_(u"Notes")] + notes_tpl, ">{\\centering\\arraybackslash}p{0.25cm}", 1, 0, [notes_effectifs, []], 0)
304
305    exo.append(tableau_notes)
306    cor.append(tableau_notes)
307    exo.append(u"\\bigskip")
308    cor.append(u"\\bigskip")
309    exo.append(u"\\begin{enumerate}")
310    cor.append(u"\\begin{enumerate}")
311    exo.append(_(u"\\item Compléter le tableau ci-dessous afin de regrouper les notes par classes et effectuer le calcul des fréquences arrondies au centième :\\par"))
312    cor.append(_(u"\\item Compléter le tableau ci-dessous afin de regrouper les notes par classes et effectuer le calcul des fréquences arrondies au centième :\\par"))
313    exo.append(u"\\end{enumerate}")
314    exo.append(tableau_tex(titres, ">{\\centering\\arraybackslash}p{2.1cm}"))
315
316    classes_effectifs = [0 for f in classes]
317
318    for n in notes:
319        if n == 20:
320            classes_effectifs[-1] += 1
321        else:
322            for c in classes:
323                if c[0] <= n < c[1]:
324                    classes_effectifs[classes.index(c)] += 1
325
326    frequences = [round(i * 100.0 / nb_eleves, 2) for i in classes_effectifs]
327
328    cor.append(_(u"Chaque effectif se complète en comptant le nombre d'apparition de chaque note dans le tableau de l'énoncé."))
329    cor.append(_(u"Le nombre de notes du contrôle, qui est aussi le nombre d'élèves, est donc de ") + str(nb_eleves) + ".\\par")
330    cor.append(_(u"Pour le calcul des fréquences, on multiplie l'effectif par 100, et on divise par le nombre total de notes, puis il ne faut pas oublier d'arrondir au centième.\\par\n"))
331    cor.append(_(u"Par exemple pour la fréquence des notes dans la première classe : $\\dfrac{") + decimaux(classes_effectifs[0]) + "\\times 100}{" + str(nb_eleves) + "} \\approx " + decimaux(frequences[0]) + "$.\\par")
332    cor.append(u"\\end{enumerate}")
333    cor.append(tableau_tex(titres, ">{\\centering\\arraybackslash}p{2.1cm}", 1, 1, [classes_effectifs, frequences]))
334
335    note1_rand = random.randint(0, len(classes) - 2)
336    note1 = classes[note1_rand][1]
337    note2 = 20 - note1
338    note2_rand = len(classes) - 1 - note1_rand
339
340    cor.append(u"\\bigskip")
341    exo.append(u"\\begin{enumerate}")
342    cor.append(u"\\begin{enumerate}")
343    exo.append(_(u"\\item[$\\blacktriangleright$\\textbf{2.}] Combien d'élèves ont une note strictement inférieure à ") + str(note1) + _(u" ? Supérieure ou égale à ") + str(note2) + " ?\\par")
344    cor.append(_(u"\\item[$\\blacktriangleright$\\textbf{2.}] Combien d'élèves ont une note strictement inférieure à ") + str(note1) + _(u" ? Supérieure ou égale à ") + str(note2) + " ?\\par")
345
346    card_note1 = 0
347    card_note2 = 0
348
349    if note1_rand == 0:
350        card_note1 = classes_effectifs[0]
351        card_note2 = classes_effectifs[-1]
352        texte_note1 = str(card_note1)
353        texte_note2 = str(card_note2)
354    else:
355        tmp = 0
356        texte_note1 = ""
357
358        while tmp <= note1_rand:
359            card_note1 += classes_effectifs[tmp]
360            texte_note1 += str(classes_effectifs[tmp]) + " + "
361            tmp += 1
362
363        tmp = note2_rand
364        texte_note2 = ""
365
366        while tmp < len(classes):
367            card_note2 += classes_effectifs[tmp]
368            texte_note2 += str(classes_effectifs[tmp]) + " + "
369            tmp += 1
370
371        texte_note1 = texte_note1[:-3] + " = " + str(card_note1)
372        texte_note2 = texte_note2[:-3] + " = " + str(card_note2)
373
374    cor.append(_(u"D'après le tableau rempli précédemment, le nombre d'élèves ayant une note strictement inférieure à ") + str(note1)
375               + _(u" sont tous les élèves comptés dans les classes situées à gauche de ") + str(note1)
376               + _(u". En effectuant le total des élèves de ces classes, on obtient : ") + texte_note1 + _(u" élèves.\\par"))
377
378    cor.append(_(u"La réponse à la seconde question se fait de même en comptant tous les effectifs des élèves se situant à droite de ") + str(note2) + u".\\par")
379    cor.append(_(u"Le résultat est donc : ") + texte_note2 + _(u" élèves.\\par"))
380
381    exo.append(u"\\end{enumerate}")
382    cor.append(u"\\end{enumerate}")
383
384    return False
385
386def exo_de():
387    """Exercice sur le lancer d'un dé."""
388    global exo, cor
389
390    nb_simul = random.randint(50, 80)
391    simul = []
392    simul_tex = ""
393    for f in range(nb_simul):  # Simulation de nb_simul lancés d'un dé
394        temp = random.randint(1, 6)
395        simul.append(temp)
396        simul_tex += str(temp) + " "
397        if ((f + 1) % 25 == 0):
398            simul_tex += "\\par\n"
399
400    effectifs = [simul.count(i + 1) for i in range(6)]
401    frequences = [round(i * 100.0 / nb_simul, 2) for i in effectifs]  # FIX somme pas toujours égale à 100%
402
403    tableau = tableau_tex([_(u"Valeurs"), "1", "2", "3", "4", "5", "6"], ">{\\centering}p{1cm}")
404    tableau_cor = tableau_tex([_(u"Valeurs"), "1", "2", "3", "4", "5", "6"], ">{\\centering}p{1cm}", 1, 1, [effectifs, frequences])
405
406    exo.append(_(u"Voici une liste des résultats obtenus en lançant plusieurs fois un dé à six faces :\\par"))
407    cor.append(_(u"Voici une liste des résultats obtenus en lançant plusieurs fois un dé à six faces :\\par"))
408    exo.append(simul_tex)
409    cor.append(simul_tex)
410    exo.append(u"\\bigskip")
411    cor.append(u"\\bigskip")
412    exo.append("\\begin{enumerate}")
413    cor.append("\\begin{enumerate}")
414    exo.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
415    cor.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
416    exo.append(tableau)
417    exo.append(u"\\bigskip")
418    cor.append(_(u"Chaque effectif se complète en comptant le nombre d'apparition de chaque chiffre dans la liste de l'énoncé."))
419    cor.append(_(u"Comme les chiffres sont rangés par 25, on voit assez rapidement que le nombre total de chiffres est de ") + str(nb_simul) + ".\\par")
420    cor.append(_(u"Pour le calcul des fréquences, on multiplie l'effectif par 100, et on divise par le nombre total de chiffres, puis il ne faut pas oublier d'arrondir au centième.\\par\n"))
421    cor.append(_(u"Par exemple pour la fréquence du chiffre 1 : $\\dfrac{") + str(effectifs[0]) + "\\times 100}{" + str(nb_simul) + "} \\approx " + decimaux(frequences[0]) + "$.\\par")
422    cor.append(tableau_cor)
423    cor.append(u"\\bigskip")
424    exo.append(_(u"\\item Représenter la répartition des chiffres dans un diagramme en bâtons avec 1cm pour 10\\%.\\par"))
425    cor.append(_(u"\\item Représenter la répartition des chiffres dans un diagramme en bâtons avec 1cm pour 10\\%.\\par"))
426
427    diagramme = diagramme_tex(1, [[_(u"Valeurs"), "1", "2", "3", "4", "5", "6"], frequences])
428    diagramme_tableau = tableau_diagramme_tex(1, [[_(u"Valeurs"), "1", "2", "3", "4", "5", "6"], frequences], ">{\\centering}p{1cm}")
429
430    cor.append(diagramme_tableau)
431    cor.append("\\bigskip")
432    cor.append(diagramme)
433
434    exo.append("\n\\end{enumerate}")
435    cor.append("\n\\end{enumerate}")
436
437    return False
438
439def exo_ages():
440    """Exercice sur la répartition des âges dans une population."""
441    global exo, cor
442
443    # Partitions de 20
444    partitions = [[4, 4, 4, 4, 4], [3, 4, 4, 4, 5], [3, 3, 4, 5, 5], [2, 4, 4, 5, 5], [2, 3, 5, 5, 5], [1, 4, 5, 5, 5],
445                  [3, 3, 4, 4, 6], [2, 4, 4, 4, 6], [3, 3, 3, 5, 6], [2, 3, 4, 5, 6], [1, 4, 4, 5, 6], [2, 2, 5, 5, 6],
446                  [1, 3, 5, 5, 6], [2, 3, 3, 6, 6], [2, 2, 4, 6, 6], [1, 3, 4, 6, 6], [1, 2, 5, 6, 6], [1, 1, 6, 6, 6],
447                  [3, 3, 3, 4, 7], [2, 3, 4, 4, 7], [1, 4, 4, 4, 7], [2, 3, 3, 5, 7], [2, 2, 4, 5, 7], [1, 3, 4, 5, 7],
448                  [1, 2, 5, 5, 7], [2, 2, 3, 6, 7], [1, 3, 3, 6, 7], [1, 2, 4, 6, 7], [1, 1, 5, 6, 7], [2, 2, 2, 7, 7],
449                  [1, 2, 3, 7, 7], [1, 1, 4, 7, 7], [3, 3, 3, 3, 8], [2, 3, 3, 4, 8], [2, 2, 4, 4, 8], [1, 3, 4, 4, 8],
450                  [2, 2, 3, 5, 8], [1, 3, 3, 5, 8], [1, 2, 4, 5, 8], [1, 1, 5, 5, 8], [2, 2, 2, 6, 8], [1, 2, 3, 6, 8],
451                  [1, 1, 4, 6, 8], [1, 2, 2, 7, 8], [1, 1, 3, 7, 8], [1, 1, 2, 8, 8], [2, 3, 3, 3, 9], [2, 2, 3, 4, 9],
452                  [1, 3, 3, 4, 9], [1, 2, 4, 4, 9], [2, 2, 2, 5, 9], [1, 2, 3, 5, 9], [1, 1, 4, 5, 9], [1, 2, 2, 6, 9],
453                  [1, 1, 3, 6, 9], [1, 1, 2, 7, 9], [1, 1, 1, 8, 9], [2, 2, 3, 3, 10], [1, 3, 3, 3, 10], [2, 2, 2, 4, 10],
454                  [1, 2, 3, 4, 10], [1, 1, 4, 4, 10], [1, 2, 2, 5, 10], [1, 1, 3, 5, 10], [1, 1, 2, 6, 10], [1, 1, 1, 7, 10],
455                  [2, 2, 2, 3, 11], [1, 2, 3, 3, 11], [1, 2, 2, 4, 11], [1, 1, 3, 4, 11], [1, 1, 2, 5, 11], [1, 1, 1, 6, 11],
456                  [2, 2, 2, 2, 12], [1, 2, 2, 3, 12], [1, 1, 3, 3, 12], [1, 1, 2, 4, 12], [1, 1, 1, 5, 12], [1, 2, 2, 2, 13],
457                  [1, 1, 2, 3, 13], [1, 1, 1, 4, 13], [1, 1, 2, 2, 14], [1, 1, 1, 3, 14], [1, 1, 1, 2, 15], [1, 1, 1, 1, 16]]
458
459    choix_diagramme = random.randint(0, 1)
460    if choix_diagramme == 0:
461        diagramme_texte = _("circulaire")
462    else:
463        diagramme_texte = _("semi-circulaire")
464    hasard = partitions[random.randint(0, len(partitions) - 1)]
465    frequences = [5 * v for v in hasard]
466    random.shuffle(frequences)
467
468    population = 20 * random.randint(100, 2000)
469
470    diagramme = diagramme_tex(choix_diagramme + 2, [[_(u"Ages"), _(u"<20 ans"), _("20 - 40 ans"), _("40 - 60 ans"), _("60 - 80 ans"), _(u">80 ans")], frequences], 1)
471    exo.append(u"\\begin{center}")
472    cor.append(u"\\begin{center}")
473    exo.append(diagramme)
474    cor.append(diagramme)
475    exo.append(u"\\end{center}")
476    cor.append(u"\\end{center}")
477    exo.append(_(u"Le diagramme ") + diagramme_texte + _(u" ci-dessus représente les différentes fréquences des classes d'âges dans une certaine région.\\par"))
478    cor.append(_(u"Le diagramme ") + diagramme_texte + _(u" ci-dessus représente les différentes fréquences des classes d'âges dans une certaine région.\\par"))
479    exo.append("\\begin{enumerate}")
480    cor.append("\\begin{enumerate}")
481    exo.append(_(u"\\item Calculer les fréquences de chaque classe d'âges."))
482    cor.append(_(u"\\item Calculer les fréquences de chaque classe d'âges.\\par"))
483
484    titres = [_(u"Classes d'âges", u"$0 \\leq n \\leq 20$", u"$20 \\leq n \\leq 40$", u"$40 \\leq n \\leq 60$", u"$60 \\leq n \\leq 80$", u"$80 \\geq n$")]
485
486    liste_pgcd = [pgcd(frequences[i], frequences[i + 1]) for i in range(len(frequences) - 2)]
487    liste_pgcd.sort()
488    pourcent = liste_pgcd[0]
489    parts = 100 / pourcent
490    effectifs = [f * population / 100 for f in frequences]
491
492    cor.append(_(u"Le diagramme ") + diagramme_texte + _(u" est partagé en ") + str(parts) + _(u" parts symbolisées par des lignes grises en pointillés.\\par"))
493    cor.append(_(u"On en déduit que chacune de ces parts représente $\\dfrac{100}{") + str(parts) + "}=" + str(pourcent) + _(u"\\%$, puis en comptant le nombre de parts dans chaque classe, on obtient le tableau suivant :\\par"))
494    cor.append("\\end{enumerate}")
495    cor.append(tableau_tex(titres, ">{\\centering}p{2.2cm}", 0, 1, [[], frequences]))
496    cor.append("\\begin{enumerate}")
497    exo.append(_(u"\\item Sachant que la population étudiée est composée de ") + str(population) + _(u" personnes, calculer les effectifs de chaque classe d'âges."))
498    cor.append(_(u"\\item[$\\blacktriangleright$\\textbf{2.}] Sachant que la population étudiée est composée de ") + str(population) + _(u" personnes, calculer les effectifs de chaque classe d'âges.\\par"))
499
500    cor.append(_(u"Sachant que la classe des moins de vingt ans est composée de ") + str(frequences[0]) + u" \\% de " + str(population) + _(u" personnes, on peut calculer l'effectif concerné :\\par"))
501    cor.append(u"$\\dfrac{" + str(frequences[0]) + u" \\times " + str(population) + u"}{100}=" + str(effectifs[0]) + u"$.\\par")
502    cor.append(_(u"Avec le même type de calcul, on obtient les effectifs des autres classes, résumés dans le tableau ci-dessous :"))
503    cor.append("\\end{enumerate}")
504    cor.append(tableau_tex(titres, ">{\\centering}p{2.2cm}", 1, 1, [effectifs, frequences]))
505
506
507    exo.append("\n\\end{enumerate}")
508
509    return False
510
511
512def exo_vote():
513    """Exercice sur un vote en classe."""
514    global exo, cor
515
516    exo.append("\\begin{enumerate}")
517    cor.append("\\begin{enumerate}")
518    exo.append(_(u"\\item Les données du vote du délégué de classe ont été malheureusement partiellement perdues, mais on a réussi à regrouper les informations du tableau ci-dessous (sachant que chaque élève a voté) :"))
519    cor.append(_(u"\\item Les données du vote du délégué de classe ont été malheureusement partiellement perdues, mais on a réussi à regrouper les informations du tableau ci-dessous (sachant que chaque élève a voté) :\\par"))
520
521    eff1 = random.randint(1, 15)
522    eff2 = random.randint(1, 24 - eff1)
523    freq1 = 4 * random.randint(1, 25 - eff1 - eff2)
524    effectifs = [eff1, eff2, -1, -1]
525    random.shuffle(effectifs)
526    idx = effectifs.index(-1)
527    frequences = []
528
529    for f in range(4):
530        if f == idx:
531            frequences.append(freq1)
532        else:
533            frequences.append(-1)
534    prenoms = [_(u"Vincent"), _(u"Sophia"), _(u"Karim"), _(u"Denise"), _(u"Aline"), _(u"Jonathan"), _(u"Isabelle"), _(u"Thomas"), _(u"Léna"), _(u"Matteo"), _(u"Céline"), _(u"Antoine"), _(u"Julie"), _(u"Rémy"), _(u"Caroline"), _(u"Yann"), _(u"Muriel"), _(u"Patrick"), _(u"Mélanie")]
535    random.shuffle(prenoms)
536    titres = [_(u"Elève")] + prenoms[:4]
537    valeurs = [effectifs, frequences]
538
539    exo.append(tableau_tex(titres, ">{\\centering\\arraybackslash}p{2.1cm}", 1, 1, valeurs, 0))
540    cor.append(tableau_tex(titres, ">{\\centering\\arraybackslash}p{2.1cm}", 1, 1, valeurs, 0))
541    exo.append("\\par")
542    cor.append("\\par")
543    exo.append(_(u"Sachant qu'il y a 25 élèves dans la classe, compléter alors le tableau ci-dessus.\\par"))
544    cor.append(_(u"Sachant qu'il y a 25 élèves dans la classe, compléter alors le tableau ci-dessus.\\par"))
545
546    effectifs[idx] = freq1 / 4
547    idx2 = effectifs.index(-1)
548    effectifs[idx2] = 25 - eff1 - eff2 - freq1 / 4
549    frequences = [ 4 * f for f in effectifs ]
550
551    cor.append("\\par")
552    cor.append(_(u"Comme il y a 25 élèves dans la classe, ce qui représente 100 \\% des votes, il faut diviser la fréquence connue pour trouver l'effectif d'élèves ayant voté pour ") + titres[idx + 1] + _(" et on trouve : "))
553    cor.append(u"$\\dfrac{" + str(freq1) + "}{4}=" + str(freq1 / 4) + _(u"$ élève(s) pour ") + titres[idx + 1] + ".\\par")
554    cor.append(_(u"Ensuite, pour trouver l'effectif d'élèves ayant voté pour ") + titres[idx2 + 1] + _(u", il suffit de soustraire à 25 les effectifs connus :\\par"))
555    cor.append(u"$25 - " + str(eff1) + " - " + str(eff2) + " - " + str(freq1 / 4) + " = " + str(effectifs[idx2]) + _(u"$ élève(s) pour ") + titres[idx2 + 1] + ".\\par")
556    cor.append(_(u"Enfin, pour le calcul des fréquences manquantes, il faut multiplier chaque effectif par 4, ce qui fourni le tableau ci-dessous.\\par"))
557
558    cor.append(tableau_tex(titres, ">{\\centering}p{2.1cm}", 1, 1, [effectifs, frequences]))
559    cor.append("\\par")
560    exo.append(_(u"\\item Représenter la répartition des votes dans un diagramme circulaire de rayon 3 cm.\\par"))
561    cor.append(_(u"\\item Représenter la répartition des votes dans un diagramme circulaire de rayon 3 cm.\\par"))
562
563    diagramme = diagramme_tex(2, [titres, frequences])
564    diagramme_tableau = tableau_diagramme_tex(2, [titres, frequences], ">{\\centering}p{2.1cm}")
565
566    cor.append(diagramme_tableau)
567    cor.append("\\bigskip")
568    cor.append(diagramme)
569
570    exo.append("\\end{enumerate}")
571    cor.append("\\end{enumerate}")
572    return exo, cor
573
574def exo_sport():
575    global exo, cor
576
577    h1 = random.randrange(2) + 5
578    h2 = 8
579    h3 = random.randrange(2) + 7
580    h5 = random.randrange(4) + 1
581    h6 = random.randrange(3)
582    h7 = random.randrange(2) + 1
583    h4 = 30 - h1 - h2 - h3 - h5 - h6 - h7
584    basket = random.randrange(7) + 3
585    tennis = random.randrange(7) + 3
586    judo = random.randrange(7) + 3
587    football = 30 - tennis - basket - judo
588    question1 = \
589        _(u"""\\renewcommand{\\arraystretch}{1.8}
590        \\item On a demandé aux élèves d'une classe de cinquième combien de temps par semaine était consacré à leur sport favori.\\par
591        \\begin{tabular}{|c|c|c|c|c|c|c|c|}\\hline Durée t (en h)&  $0 \\le t < 1$ & $1 \\le t  < 2$ & $2 \\le t  < 3$ & $3 \\le t  < 4$ &  $4 \\le t  < 5$ & $5 \\le t  < 6$ & $6 \\le t  < 7$ \\\\\\hline Effectif & %s & %s & %s & %s & %s & %s & %s \\\\\\hline \\end{tabular}\\par
592        À partir de ce tableau, construire un  histogramme pour représenter ces données.\\par""") % (h1, h2, h3, h4, h5, h6, h7)
593    question2 = \
594        _(u"""\\item On a demandé aux élèves quel était leur sport préféré. %s élèves préfèrent le basket-ball, %s le tennis, %s le football et %s le judo. Construire un diagramme circulaire représentant cette répartion.\\par""") % (basket, tennis, football, judo)
595    exo.append("\\begin{enumerate}")
596    exo.append(question1)
597    exo.append(question2)
598    exo.append("\\end{enumerate}")
599    cor.append("\\begin{enumerate}")
600    cor.append(question1)
601    cor.append(_(u"""\\begin{minipage}{10cm}
602    \\begin{pspicture}(0,-1)(8.5,9.5)
603    \\psaxes[showorigin=false]{->}(7.5,8.5)
604    \\psset{fillstyle=solid, linewidth=0.5pt}
605    \\psframe(0,0)(1,%s)
606    \\psframe(1,0)(2,%s)
607    \\psframe(2,0)(3,%s)
608    \\psframe(3,0)(4,%s)
609    \\psframe(4,0)(5,%s)
610    \\psframe(5,0)(6,%s)
611    \\psframe(6,0)(7,%s)
612    \\rput(-0.2,-0.425){$0$}
613    \\rput(8.3,0){Durée}
614    \\rput(0,8.8){Effectif}
615    \\end{pspicture}
616    \\end{minipage}
617    \\begin{minipage}{6cm}
618    Sur l'axe horizontal, on représente les durées en heures et, sur l'axe vertical, on représente les effectifs.
619    \\end{minipage}""") % (h1, h2, h3, h4, h5, h6, h7))
620    cor.append(question2)
621    cor.append(_(u"L'effectif total est égal à $ %s + %s + %s + %s = 30$. La mesure d'angle d'un secteur circulaire est proportionnelle à l'effectif du sport qu'il représente. Le coefficient de proportionnalité est égal au quotient de l'effectif total par 360\\degre c'est à dire $360 \\div 30=12$.\\par") % (basket, tennis, football, judo))
622    cor.append(_(u"""\\renewcommand\\tabcolsep{10pt}
623    \\begin{tabular}{|l|c|c|c|c|c|c}
624    \\cline{1-6}
625    Sport favori  & Basket-ball & Tennis & Football & Judo & Total &\\rnode{plan1}{}\\\\
626    \\cline{1-6}
627    Effectif & %s & %s & %s & %s & 30 &\\rnode{plan1}{}\\\\
628    \\cline{1-6}
629    Mesure (en degré)  & \\bf%s & \\bf%s & \\bf%s & \\bf%s & 360 &\\rnode{plan2}{}\\\\
630    \\cline{1-6}
631    \\end{tabular}
632    \\ncbar{->}{plan1}{plan2}\\Aput{$\\times 12$}\\par
633    \\begin{minipage}{6cm}
634    En utilisant les mesures d'angles obtenues dans le tableau de proportionnalité, on trace le diagramme circulaire.
635    \\end{minipage}""") % (basket, tennis, football, judo, basket * 12, tennis * 12, football * 12, judo * 12))
636    cor.append(u"""\\begin{minipage}{13cm}
637    \\psset{unit=3cm,fillstyle=solid}
638    \\pspicture(-1.5,-1)(1,1.5)
639    \\pswedge[fillcolor=Bisque]{1}{0}{%s}
640    \\pswedge[fillcolor=LightSalmon]{1}{%s}{%s}
641    \\pswedge[fillcolor=Chocolate]{1}{%s}{%s}
642    \\pswedge{1}{%s}{360}
643    \\rput(.6;%s){Basket}
644    \\rput(.6;%s){Tennis}
645    \\rput(.6;%s){\\white Football}
646    \\rput(.6;%s){Judo}
647    \\endpspicture
648    \\end{minipage}""" % (basket * 12, basket * 12, basket * 12 + tennis * 12, basket * 12 + tennis * 12, basket * 12 + tennis * 12 + football * 12, basket * 12 + tennis * 12 + football * 12, basket * 6, basket * 12 + tennis * 6, basket * 12 + tennis * 12 + football * 6, basket * 6 + tennis * 6 + football * 6 + 180))
649    cor.append(u"\\end{enumerate}")
650    return (exo, cor)
651
652def statistiques():
653    """Construit au hasard l'un des six types d'exos de statistiques."""
654    global exo, cor
655
656    exo = ["\\exercice"]
657    cor = ["\\exercice*"]
658
659    exo.append("\\renewcommand{\\arraystretch}{2}")
660    cor.append("\\renewcommand{\\arraystretch}{2}")
661
662    hasard = random.randint(0, 5)
663    if hasard == 0:
664        exo_pi()
665    elif hasard == 1:
666        exo_notes()
667    elif hasard == 2:
668        exo_de()
669    elif hasard == 3:
670        exo_vote()
671    elif hasard == 4:
672        exo_sport()
673    else:
674        exo_ages()
675
676    return (exo, cor)
677
678statistiques.description = _(u'Statistiques')
Note: See TracBrowser for help on using the repository browser.