#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Pyromaths
# Un programme en Python qui permet de créer des fiches d'exercices types de
# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
import random
from math import cos, sin, radians
from ..outils.decimaux import decimaux, decimaux_quiz
from ..outils.Arithmetique import pgcd
def tableau_tex(titres, larg="c", eff=1, freq=1, val=[[],[]],total=1):
"""Génère le tableau des effectifs (liste val[1]) et fréquences (liste val[2])."""
cols = len(titres)
tableau_tex = u"\\begin{tabular}{|>{\\bfseries}c|*{"+str(cols-1)+"}{"+larg+"|}"
if total:
tableau_tex += ">{\\centering\\bfseries\\arraybackslash}p{2cm}|}\n"
else:
tableau_tex += "}\n"
tableau_tex += u"\\hline\n"
for titre in titres: # Ligne de titre, avec astuce pour éviter le cadre sur la dernière cellule "Total"
tableau_tex += u"\\textbf{"+titre+"} & "
if total:
tableau_tex += _(u"\\textbf{Total} \\\\\\hline\n")
else:
tableau_tex = tableau_tex[:-2]+u"\\\\\\hline\n"
if eff:
tableau_tex += _(u"Effectifs")
if len(val[0])>0:
somme = 0
for effectif in val[0]:
if effectif < 0:
tableau_tex += " & "
else:
tableau_tex += " & "+decimaux(effectif)
somme += effectif
else:
tableau_tex += " & " * (cols-1)
somme = ""
if total:
tableau_tex += " & "+str(somme)+"\\\\\\hline\n"
else:
tableau_tex += "\\\\\\hline\n"
if freq:
tableau_tex += _(u"Fréquences ( \\% )")
if len(val[1])>0:
for frequence in val[1]:
somme = "100"
if frequence < 0:
tableau_tex += " & "
else:
tableau_tex += " & "+decimaux(frequence)
else:
tableau_tex += " & " * (cols-1)
somme = ""
if total:
tableau_tex += " & "+somme+"\\\\\\hline\n"
else:
tableau_tex += "\\\\\\hline\n"
tableau_tex += "\\end{tabular}"
return tableau_tex
def tableau_tex_quiz(titres, eff=1, freq=1, val=[[],[]], total=1, quiz=[1,1]):
"""Génère le tableau des effectifs (liste val[1]) et fréquences (liste val[2])."""
tableau_tex = u'
\n'
for i in range(len(titres)):
tableau_tex += ('$$%s$$ | \n'%
titres[i])
if total:
tableau_tex += (u'$$\\text{Total}$$ | \n')
tableau_tex += u'
\n'
if eff:
tableau_tex += u'\n'
somme = 0
if eff == 1:
tableau_tex += (_(u'$$\\text{Effectifs}$$ | \n'))
elif eff == 2:
tableau_tex += (_(u'$$\\text{N^o de r\\acute{e}ponses}$$ | \n'))
for effectif in val[0]:
if quiz[0] and effectif > -1:
tableau_tex += ('{1:NUMERICAL:=%s} | \n'%
(decimaux_quiz(effectif)))
elif effectif > -1:
tableau_tex += ('$$%s$$ | \n'%
(decimaux_quiz(effectif)))
else:
tableau_tex += (' | \n')
somme += effectif
if total:
if quiz:
tableau_tex += ('{1:NUMERICAL:=%s} | \n'%
(decimaux_quiz(somme)))
else:
tableau_tex += ('$$%s$$ | \n'%
(decimaux_quiz(somme)))
tableau_tex += u'
\n'
if freq:
tableau_tex += u'\n'
if freq == 1:
tableau_tex += (_(u'$$\\text{Fr\\acute{e}quences}(\percent)$$ | \n'))
elif freq == 2:
tableau_tex += (_(u'$$\\text{Mesure (en degr\\acute{e}s)}$$ | \n'))
for frequence in val[1]:
if quiz[1] and frequence > -1:
tableau_tex += ('{1:SHORTANSWER:%s100%s%s} | \n'%
("%", "%", decimaux_quiz(frequence)))
elif frequence > -1:
tableau_tex += ('$$%s$$ | \n'%
(decimaux_quiz(frequence)))
else:
tableau_tex += (' | \n')
if total == 1:
tableau_tex += ('$$100$$ | \n')
elif total == 2:
tableau_tex += ('$$360$$ | \n')
tableau_tex += u'
\n'
tableau_tex += "
"
return tableau_tex
def diagramme_tex(typed=2,val=[[],[]],aide=0):
"""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."""
diag = ""
couleur = ["AliceBlue", "Bisque", "PaleGreen", "Thistle", "LightGray", "Khaki", "LightBlue", "LightSalmon", "PaleGoldenrod", "PapayaWhip", "Plum", "Gainsboro"]
if typed == 1: # Diagramme en bâtons
grad = len(val[1])+1
diag += u"\\begin{pspicture}(-1,-1)("+str(grad)+",11)\n"
diag += u"\\psset{xunit=1cm,yunit=1cm}\n"
diag += u"\\psgrid[subgriddiv=1,griddots=5,gridlabels=0]("+str(grad)+",11)\n"
diag += u"\\psaxes[Dx=1,dx=1,Dy=10,dy=1]{->}(0,0)("+str(grad)+",11)\n"
for f in range(len(val[1])):
diag += u"\\psline[linewidth=0.1,linecolor=green]("+val[0][f+1]+",0)("+val[0][f+1]+","+str(val[1][f]/10.0)+")\n"
diag += _(u"\\rput(0,11.2){\\small Fréquences (\\%)}\n")
diag += u"\\rput("+str(grad+0.5)+",0){\\small "+val[0][0]+"}\n"
diag += u"\\end{pspicture}\n"
elif typed == 2: # Diagramme circulaire
grad = len(val[1])
diag += u"\\begin{pspicture}(-3,-3)(3,3)\n"
diag_texte = ""
debut = 0
fin = round(val[1][0]*3.6,0)
liste_fin = [fin] # Pour éviter d'avoir les pointillés superposés sur des lignes
for v in range(len(val[1])-1):
diag += u"\\pswedge[fillstyle=solid,fillcolor="+couleur[v%12]+"](0,0){3}{"+str(debut)+"}{"+str(fin)+"}\n"
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"
debut = fin
fin += round(val[1][v+1]*3.6,0)
liste_fin.append(fin)
diag += u"\\pswedge[fillstyle=solid,fillcolor="+couleur[(len(val[1])-1)%12]+"](0,0){3}{"+str(debut)+"}{360}\n"
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"
if aide != 0:
temp = [int(3.6*v) for v in val[1]]
temp2 = [pgcd(temp[i],temp[i+1]) for i in range(len(val[1])-1)]
temp2.sort()
ecart = temp2[0]
angle = ecart
while angle < 360:
if angle not in liste_fin:
diag += u"\\psline[linestyle=dashed,linecolor=gray](0,0)("+str(3*round(cos(radians(angle)),2))+","+str(3*round(sin(radians(angle)),2))+")\n"
angle += ecart
diag += diag_texte
diag += u"\\end{pspicture}\n"
elif typed == 3: # Diagramme semi-circulaire
grad = len(val[1])
diag += u"\\begin{pspicture}(0,0)(3,3)\n"
diag_texte = ""
debut = 0
fin = round(val[1][0]*1.8,0)
liste_fin = [fin] # Pour éviter d'avoir les pointillés superposés sur des lignes
for v in range(len(val[1])-1):
diag += u"\\pswedge[fillstyle=solid,fillcolor="+couleur[v%12]+"](0,0){3}{"+str(debut)+"}{"+str(fin)+"}\n"
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
debut = fin
fin += round(val[1][v+1]*1.8,0)
liste_fin.append(fin)
diag += u"\\pswedge[fillstyle=solid,fillcolor="+couleur[(len(val[1])-1)%12]+"](0,0){3}{"+str(debut)+"}{180}\n"
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"
if aide != 0:
temp = [int(1.8*v) for v in val[1]]
temp2 = [pgcd(temp[i],temp[i+1]) for i in range(len(val[1])-1)]
temp2.sort()
ecart = temp2[0]
angle = ecart
while angle < 180:
if angle not in liste_fin:
diag += u"\\psline[linestyle=dashed,linecolor=gray](0,0)("+str(3*round(cos(radians(angle)),2))+","+str(3*round(sin(radians(angle)),2))+")\n"
angle += ecart
diag += diag_texte
diag += u"\\end{pspicture}\n"
return diag
def tableau_diagramme_tex(typed=2,val=[[],[]],larg="c"):
"""Génère le tableau de calculs des angles ou des longueurs pour le corrigé de la construction des diagrammes."""
tab = ""
cols = len(val[0])
tab = u"\\begin{tabular}{|>{\\bfseries}c|*{"+str(cols-1)+"}{"+larg+"|}>{\\centering\\bfseries\\arraybackslash}p{2cm}|}\n"
tab += u"\\hline\n"
for titre in val[0]: # Ligne de titre, avec astuce pour éviter le cadre sur la dernière cellule "Total"
tab += u"\\textbf{"+titre+"} & "
tab += u"\\textbf{Total} \\\\\\hline\n"
tab += _(u"Fréquences ( \\% )")
for frequence in val[1]:
tab += " & "+decimaux(frequence)
tab += " & 100 \\\\\\hline\n"
if typed == 1: # Diagramme en bâtons
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")
tab = texte + tab
tab += _(u"Hauteur ( cm )")
for frequence in val[1]:
tab += " & "+decimaux(round(frequence/10.0,1))
tab += " & 10 \\\\\\hline\n"
elif typed == 2: # Diagramme circulaire
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")
tab = texte + tab
tab += _(u"Angle ( Degrés )")
for frequence in val[1]:
tab += " & "+decimaux(round(frequence*3.6,0))
tab += " & 360 \\\\\\hline\n"
elif typed == 3: # Diagramme semi-circulaire
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")
tab = texte + tab
tab += _(u"Angle ( Degrés )")
for frequence in val[1]:
tab += " & "+decimaux(round(frequence*1.8,0))
tab += " & 180 \\\\\\hline\n"
tab += "\\end{tabular}\n"
return tab
def exo_pi():
"""Exercice sur les décimales de Pi."""
global exo, cor, quiz
pi = "14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009" # 2000 décimales de Pi après la virgule
nb_dec = random.randint(50,100)
idx_dec = random.randint(0,2000-nb_dec)
dec_str = list(pi[idx_dec:(idx_dec+nb_dec)])
dec = [int(d) for d in dec_str]
dec_tex = "\\begin{center}\n\\begin{tabular}{|*{20}{p{0.2cm}}|}\n\\hline\n"
dec_tex_quiz = "\n$$\\begin{tabular}{|cccccccccccccccccccc|}\\hline"
for d in range(len(dec_str)):
dec_tex += dec_str[d] + " & "
dec_tex_quiz += dec_str[d] + " & "
if ((d+1) % 20 == 0):
dec_tex = dec_tex[:-3]+"\\\\\n"
dec_tex_quiz = dec_tex_quiz[:-3]+"\\\\"
dec_tex += " & "*(19-len(dec_str)%20)+"\\\\\n"
dec_tex_quiz += " & "*(19-len(dec_str)%20)+"\\\\"
dec_tex += "\\hline\\end{tabular}\\end{center}"
dec_tex_quiz += "\\hline\\end{tabular}$$\n
\n"
effectifs = [dec.count(i) for i in range(10)]
frequences = [round(i*100.0/nb_dec,2) for i in effectifs] # FIX somme pas toujours égale à 100%
tableau = tableau_tex([_(u"Chiffres"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],">{\\centering}p{0.5cm}")
tableau_cor = tableau_tex([_(u"Chiffres"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],">{\\centering}p{0.8cm}",1,1,[effectifs,frequences])
exo.append(_(u"Voici une liste de chiffres choisis au hasard dans les décimales de $\\pi$ :\\par"))
cor.append(_(u"Voici une liste de chiffres choisis au hasard dans les décimales de $\\pi$ :\\par"))
exo.append(dec_tex)
cor.append(dec_tex)
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
exo.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
cor.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
exo.append("\\end{enumerate}")
exo.append(tableau)
exo.append(u"\\par")
cor.append(_(u"Chaque effectif se complète en comptant le nombre d'apparition de chaque chiffre dans la liste de l'énoncé."))
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")
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"))
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")
cor.append("\\end{enumerate}")
cor.append(tableau_cor)
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
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\\%."))
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"))
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
diagramme = diagramme_tex(1,[[_(u"Valeurs"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],frequences])
diagramme_tableau = tableau_diagramme_tex(1,[[_(u"Valeurs"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],frequences],">{\\centering}p{0.8cm}")
cor.append(diagramme_tableau)
cor.append("\\bigskip")
cor.append(diagramme)
quiz_nom = _(u"Statistique: Problème numéro Pi")
quiz_exo_cor = _(u"On a choisi au hasard une séquence des chiffres décimaux du numéro $$\\pi$$:
\n")
quiz_exo_cor += dec_tex_quiz
quiz_exo_cor += _(u"Complète la planche d'en bas, sachant que les fréquences doivent être arrondies aux centième.
\n")
quiz_exo_cor += tableau_tex_quiz([_(u"\\text{Chiffres}"), "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],1,1,[effectifs,frequences])
quiz.append([quiz_nom, quiz_exo_cor, ""])
return False
def exo_notes():
"""Exercice sur les notes."""
global exo, cor, quiz
len_classe = [4,5][random.randint(0,1)] # Classes de longueur 4 ou 5
classes = []
val = 0
while val+len_classe <= 20:
classes += [[val,val+len_classe]]
val = val+len_classe
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$"]
exo.append(_(u"Voici un tableau regroupant les notes d'une classe lors d'un contrôle :\\par"))
cor.append(_(u"Voici un tableau regroupant les notes d'une classe lors d'un contrôle :\\par"))
nb_eleves = random.randint(25,35)
notes_tpl = [str(i) for i in range(21)]
notes = [random.randint(1,20) for i in range(nb_eleves)]
notes_effectifs = [notes.count(i) for i in range(21)]
tableau_notes = tableau_tex([_(u"Notes")]+notes_tpl,">{\\centering\\arraybackslash}p{0.25cm}",1,0,[notes_effectifs,[]],0)
exo.append(tableau_notes)
cor.append(tableau_notes)
exo.append(u"\\bigskip")
cor.append(u"\\bigskip")
exo.append(u"\\begin{enumerate}")
cor.append(u"\\begin{enumerate}")
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"))
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"))
exo.append(u"\\end{enumerate}")
exo.append(tableau_tex(titres,">{\\centering\\arraybackslash}p{2.1cm}"))
classes_effectifs=[0 for f in classes]
for n in notes:
if n == 20:
classes_effectifs[-1] += 1
else:
for c in classes:
if c[0] <= n < c[1]:
classes_effectifs[classes.index(c)] += 1
frequences = [round(i*100.0/nb_eleves,2) for i in classes_effectifs]
cor.append(_(u"Chaque effectif se complète en comptant le nombre d'apparition de chaque note dans le tableau de l'énoncé."))
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")
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"))
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")
cor.append(u"\\end{enumerate}")
cor.append(tableau_tex(titres,">{\\centering\\arraybackslash}p{2.1cm}",1,1,[classes_effectifs,frequences]))
note1_rand = random.randint(0,len(classes)-2)
note1 = classes[note1_rand][1]
note2 = 20 - note1
note2_rand = len(classes)-1-note1_rand
cor.append(u"\\bigskip")
exo.append(u"\\begin{enumerate}")
cor.append(u"\\begin{enumerate}")
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")
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")
card_note1 = 0
card_note2 = 0
if note1_rand == 0:
card_note1 = classes_effectifs[0]
card_note2 = classes_effectifs[-1]
texte_note1 = str(card_note1)
texte_note2 = str(card_note2)
else:
tmp = 0
texte_note1 = ""
while tmp <= note1_rand:
card_note1 += classes_effectifs[tmp]
texte_note1 += str(classes_effectifs[tmp]) + " + "
tmp += 1
tmp = note2_rand
texte_note2 = ""
while tmp < len(classes):
card_note2 += classes_effectifs[tmp]
texte_note2 += str(classes_effectifs[tmp]) + " + "
tmp += 1
texte_note1 = texte_note1[:-3]+" = "+str(card_note1)
texte_note2 = texte_note2[:-3]+" = "+str(card_note2)
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)
+_(u" sont tous les élèves comptés dans les classes situées à gauche de ")+str(note1)
+_(u". En effectuant le total des élèves de ces classes, on obtient : ")+texte_note1+_(u" élèves.\\par"))
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")
cor.append(_(u"Le résultat est donc : ")+texte_note2+_(u" élèves.\\par"))
exo.append(u"\\end{enumerate}")
cor.append(u"\\end{enumerate}")
quiz_nom = _(u"Statistique: Problème de Notes")
quiz_exo_cor = _(u"Se tient une planche où se sont rassemblés les notes sur 20 de l'examen d'un cours:
\n")
quiz_exo_cor += tableau_tex_quiz([_(u"\\text{Notes}")]+notes_tpl,1,0,[notes_effectifs,[]],0, quiz=[0,0])
quiz_exo_cor += _(u"Complète la planche d'en bas avec les notes du cours et effectue le calcul des fréquences les arrondissant aux centième.
\n")
titres_quiz = [_(u"\\text{Notes du cours}")]+[str(f[0])+u" \\leq n < "+str(f[1]) for f in classes[:-1]]+[str(classes[-1][0])+u" \\leq n \\leq 20"]
quiz_exo_cor += tableau_tex_quiz(titres_quiz,1,1,[classes_effectifs,frequences])
quiz_exo_cor += _(u"\nRépond:
\n")
quiz_exo_cor += (_(u"•Combien élèves ont une note strictement inférieure à %s ? {1:NUMERICAL:=%s} élèves
\n")%
(note1, card_note1))
quiz_exo_cor += (_(u"•Et supérieur ou égal à %s ? {1:NUMERICAL:=%s} élèves")%
(note2, card_note2))
quiz.append([quiz_nom, quiz_exo_cor, ""])
return False
def exo_de():
"""Exercice sur le lancer d'un dé."""
global exo, cor
nb_simul = random.randint(50,80)
simul = []
simul_tex = ""
for f in range(nb_simul): # Simulation de nb_simul lancés d'un dé
temp = random.randint(1,6)
simul.append(temp)
simul_tex += str(temp) + " "
if ((f+1) % 25 == 0):
simul_tex += "\\par\n"
effectifs = [simul.count(i+1) for i in range(6)]
frequences = [round(i*100.0/nb_simul,2) for i in effectifs] # FIX somme pas toujours égale à 100%
tableau = tableau_tex([_(u"Valeurs"), "1", "2", "3", "4", "5", "6"],">{\\centering}p{1cm}")
tableau_cor = tableau_tex([_(u"Valeurs"), "1", "2", "3", "4", "5", "6"],">{\\centering}p{1cm}",1,1,[effectifs,frequences])
exo.append(_(u"Voici une liste des résultats obtenus en lançant plusieurs fois un dé à six faces :\\par"))
cor.append(_(u"Voici une liste des résultats obtenus en lançant plusieurs fois un dé à six faces :\\par"))
exo.append(simul_tex)
cor.append(simul_tex)
exo.append(u"\\bigskip")
cor.append(u"\\bigskip")
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
exo.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
cor.append(_(u"\\item Compléter le tableau ci-dessous, sachant que les fréquences doivent être arrondies au centième.\\par"))
exo.append(tableau)
exo.append(u"\\bigskip")
cor.append(_(u"Chaque effectif se complète en comptant le nombre d'apparition de chaque chiffre dans la liste de l'énoncé."))
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")
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"))
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")
cor.append(tableau_cor)
cor.append(u"\\bigskip")
exo.append(_(u"\\item Représenter la répartition des chiffres dans un diagramme en bâtons avec 1cm pour 10\\%.\\par"))
cor.append(_(u"\\item Représenter la répartition des chiffres dans un diagramme en bâtons avec 1cm pour 10\\%.\\par"))
diagramme = diagramme_tex(1,[[_(u"Valeurs"), "1", "2", "3", "4", "5", "6"],frequences])
diagramme_tableau = tableau_diagramme_tex(1,[[_(u"Valeurs"), "1", "2", "3", "4", "5", "6"],frequences],">{\\centering}p{1cm}")
cor.append(diagramme_tableau)
cor.append("\\bigskip")
cor.append(diagramme)
exo.append("\n\\end{enumerate}")
cor.append("\n\\end{enumerate}")
quiz_nom = _(u"Statistique: Problème de Donné")
quiz_exo_cor = _(u"Se tient une liste des résultats obtenus au lancer différentes fois un dé de six visages:
\n")
quiz_exo_cor += "\n$$" + simul_tex.replace("par\n","\\ ") + "$$
\n"
quiz_exo_cor += _(u"Complète la planche d'en bas, sachant que les fréquences doivent être arrondies aux centième.
\n")
quiz_exo_cor += tableau_tex_quiz([_(u"\\text{Valeurs}"), "1", "2", "3", "4", "5", "6"],1,1,[effectifs,frequences])
quiz.append([quiz_nom, quiz_exo_cor, ""])
return False
def exo_ages():
"""Exercice sur la répartition des âges dans une population."""
global exo, cor, quiz
# Partitions de 20
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],
[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],
[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],
[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],
[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],
[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],
[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],
[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],
[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],
[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],
[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],
[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],
[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],
[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]]
choix_diagramme = random.randint(0,1)
if choix_diagramme == 0:
diagramme_texte = _(u"circulaire")
else:
diagramme_texte = _(u"semi-circulaire")
hasard = partitions[random.randint(0,len(partitions)-1)]
frequences = [5*v for v in hasard]
random.shuffle(frequences)
population = 20*random.randint(100,2000)
titres = [_(u"Moins de 20 ans"), _(u"Entre 20 et 40 ans"), _(u"Entre 40 et 60 ans"), _(u"Entre 60 et 80 ans"), _(u"Plus de 80 ans")]
diagramme = diagramme_tex(choix_diagramme+2,[[_(u"Ages"), _(u"<20 ans"),_(u"20 - 40 ans"),_(u"40 - 60 ans"),_(u"60 - 80 ans"),_(u">80 ans")],frequences],1)
exo.append(u"\\begin{center}")
cor.append(u"\\begin{center}")
exo.append(diagramme)
cor.append(diagramme)
exo.append(u"\\end{center}")
cor.append(u"\\end{center}")
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"))
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"))
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
exo.append(_(u"\\item Calculer les fréquences de chaque classe d'âges."))
cor.append(_(u"\\item Calculer les fréquences de chaque classe d'âges.\\par"))
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$"]
liste_pgcd = [pgcd(frequences[i],frequences[i+1]) for i in range(len(frequences)-2)]
liste_pgcd.sort()
pourcent = liste_pgcd[0]
parts = 100 / pourcent
effectifs = [f*population/100 for f in frequences]
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"))
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" ))
cor.append("\\end{enumerate}")
cor.append(tableau_tex(titres,">{\\centering}p{2.2cm}",0,1,[[],frequences]))
cor.append("\\begin{enumerate}")
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."))
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"))
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"))
cor.append(u"$\\dfrac{"+str(frequences[0])+_(u" \\times ")+str(population)+u"}{100}="+str(effectifs[0])+u"$.\\par")
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 :"))
cor.append("\\end{enumerate}")
cor.append(tableau_tex(titres,">{\\centering}p{2.2cm}",1,1,[effectifs,frequences]))
exo.append("\n\\end{enumerate}")
quiz_nom = _(u"Statistique: Problème d'Âges")
titres_quiz = [_(u"\\text{Groupes d'\\hat{a}ge}"), 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"]
quiz_exo_cor = (_(u"Complète la planche de fréquence sachant que la population étudiée est composée de ")+str(population)+_(u" personnes.
\n"))
quiz_exo_cor += tableau_tex_quiz(titres_quiz,1,1,[effectifs,frequences],quiz=[1,0])
quiz.append([quiz_nom, quiz_exo_cor, ""])
return False
def exo_vote():
"""Exercice sur un vote en classe."""
global exo, cor, quiz
exo.append("\\begin{enumerate}")
cor.append("\\begin{enumerate}")
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é ) :"))
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"))
eff1 = random.randint(1,15)
eff2 = random.randint(1,24-eff1)
freq1 = 4*random.randint(1,25-eff1-eff2)
effectifs = [eff1,eff2,-1,-1]
random.shuffle(effectifs)
idx = effectifs.index(-1)
frequences = []
for f in range(4):
if f == idx:
frequences.append(freq1)
else:
frequences.append(-1)
prenoms = [_(u"Vincent"), _(u"Sophia"), _(u"Karim"), _(u"Denise"), _(u"Aline"), _(u"Jonathan"), _(u"Isabelle"), _(u"Thomas"), _(u"L\\acute{e}na"), _(u"Matteo"), _(u"C\\acute{e}line"), _(u"Antoine"), _(u"Julie"), _(u"R\\acute{e}my"), _(u"Caroline"), _(u"Yann"), _(u"Muriel"), _(u"Patrick"), _(u"M\\acute{e}lanie")]
random.shuffle(prenoms)
titres = [_(u"El\\grave{e}ve")] + prenoms[:4]
valeurs = [effectifs,frequences]
valeurs_quiz = (tuple(effectifs), tuple(frequences))
exo.append(tableau_tex(titres,">{\\centering\\arraybackslash}p{2.1cm}",1,1,valeurs,0))
cor.append(tableau_tex(titres,">{\\centering\\arraybackslash}p{2.1cm}",1,1,valeurs,0))
exo.append("\\par")
cor.append("\\par")
exo.append(_(u"Sachant qu'il y a 25 élèves dans la classe, compléter alors le tableau ci-dessus.\\par"))
cor.append(_(u"Sachant qu'il y a 25 élèves dans la classe, compléter alors le tableau ci-dessus.\\par"))
effectifs[idx] = freq1 / 4
idx2 = effectifs.index(-1)
effectifs[idx2] = 25 - eff1 - eff2 - freq1 / 4
frequences = [ 4 * f for f in effectifs ]
cor.append("\\par")
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]+_(u" et on trouve : "))
cor.append(u"$\\dfrac{"+str(freq1)+"}{4}="+str(freq1/4)+_(u"$ élève(s) pour ")+titres[idx+1]+".\\par")
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"))
cor.append(u"$25 - "+str(eff1)+" - "+str(eff2)+" - "+str(freq1/4)+" = "+str(effectifs[idx2])+_(u"$ élève(s) pour ")+titres[idx2+1]+".\\par")
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"))
cor.append(tableau_tex(titres,">{\\centering}p{2.1cm}",1,1,[effectifs,frequences]))
cor.append("\\par")
exo.append(_(u"\\item Représenter la répartition des votes dans un diagramme circulaire de rayon 3 cm.\\par"))
cor.append(_(u"\\item Représenter la répartition des votes dans un diagramme circulaire de rayon 3 cm.\\par"))
diagramme = diagramme_tex(2,[titres,frequences])
diagramme_tableau = tableau_diagramme_tex(2,[titres,frequences],">{\\centering}p{2.1cm}")
cor.append(diagramme_tableau)
cor.append("\\bigskip")
cor.append(diagramme)
exo.append("\\end{enumerate}")
cor.append("\\end{enumerate}")
quiz_nom = _(u"Statistique: Problème de Votes")
quiz_exo_cor = _(u"Malheureusement se sont perdus une partie des données de l'élection du délégué de classe et seul on a obtenu récupérer l'information de la planche d'en bas (se sait en outre que chaque élève a voté):
\n")
quiz_exo_cor += tableau_tex_quiz(titres,1,1,valeurs_quiz,0,quiz=[0,0])
quiz_exo_cor += _(u"Sachant qu'il y est 25 élèves dans la classe, complète dite planche.
\n")
quiz_exo_cor += tableau_tex_quiz(titres,1,1,[effectifs,frequences])
quiz.append([quiz_nom, quiz_exo_cor, ""])
return exo,cor,quiz
def exo_sport():
global exo, cor, quiz
h1 = random.randrange(2) + 5
h2 = 8
h3 = random.randrange(2) + 7
h5 = random.randrange(4) + 1
h6 = random.randrange(3)
h7 = random.randrange(2) + 1
h4 = 30 - h1 - h2 - h3 - h5 - h6 - h7
basket = random.randrange(7) + 3
tennis = random.randrange(7) + 3
judo = random.randrange(7) + 3
football = 30 - tennis - basket - judo
question1 = \
_(u"""\\renewcommand{\\arraystretch}{1.8}
\\item On a demandé aux élèves d'une classe de cinquième combien de temps par semaine était consacré à leur sport favori.\\par
\\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
À partir de ce tableau, construire un histogramme pour représenter ces données.\\par""") % (h1, h2, h3, h4, h5, h6, h7)
question2 = \
_(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)
exo.append("\\begin{enumerate}")
exo.append(question1)
exo.append(question2)
exo.append("\\end{enumerate}")
cor.append("\\begin{enumerate}")
cor.append(question1)
cor.append(_(u"""\\begin{minipage}{10cm}
\\begin{pspicture}(0,-1)(8.5,9.5)
\\psaxes[showorigin=false]{->}(7.5,8.5)
\\psset{fillstyle=solid, linewidth=0.5pt}
\\psframe(0,0)(1,%s)
\\psframe(1,0)(2,%s)
\\psframe(2,0)(3,%s)
\\psframe(3,0)(4,%s)
\\psframe(4,0)(5,%s)
\\psframe(5,0)(6,%s)
\\psframe(6,0)(7,%s)
\\rput(-0.2,-0.425){$0$}
\\rput(8.3,0){Durée}
\\rput(0,8.8){Effectif}
\\end{pspicture}
\\end{minipage}
\\begin{minipage}{6cm}
Sur l'axe horizontal, on représente les durées en heures et, sur l'axe vertical, on représente les effectifs.
\\end{minipage}""") % (h1, h2, h3, h4, h5, h6, h7))
cor.append(question2)
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))
cor.append(_(u"""\\renewcommand\\tabcolsep{10pt}
\\begin{tabular}{|l|c|c|c|c|c|c}
\\cline{1-6}
Sport favori & Basket-ball & Tennis & Football & Judo & Total &\\rnode{plan1}{}\\\\
\\cline{1-6}
Effectif & %s & %s & %s & %s & 30 &\\rnode{plan1}{}\\\\
\\cline{1-6}
Mesure (en degré) & \\bf%s & \\bf%s & \\bf%s & \\bf%s & 360 &\\rnode{plan2}{}\\\\
\\cline{1-6}
\\end{tabular}
\\ncbar{->}{plan1}{plan2}\\Aput{$\\times 12$}\\par
\\begin{minipage}{6cm}
En utilisant les mesures d'angles obtenues dans le tableau de proportionnalité, on trace le diagramme circulaire.
\\end{minipage}""") % (basket, tennis, football, judo, basket*12, tennis*12, football*12, judo*12))
cor.append(_(u"""\\begin{minipage}{13cm}
\\psset{unit=3cm,fillstyle=solid}
\\pspicture(-1.5,-1)(1,1.5)
\\pswedge[fillcolor=Bisque]{1}{0}{%s}
\\pswedge[fillcolor=LightSalmon]{1}{%s}{%s}
\\pswedge[fillcolor=Chocolate]{1}{%s}{%s}
\\pswedge{1}{%s}{360}
\\rput(.6;%s){Basket}
\\rput(.6;%s){Tennis}
\\rput(.6;%s){\\white Football}
\\rput(.6;%s){Judo}
\\endpspicture
\\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 ))
cor.append(u"\\end{enumerate}")
quiz_nom = _(u"Statistique: Problème de Sport")
quiz_exo_cor = (_(u"A été demandé aux élèves quel c'est son sport favori. %s élèves préfère le basket-ball, %s le tennis, %s le football et %s le judo.
\n") % (basket, tennis, football, judo))
quiz_exo_cor += _(u"Complète la planche qu'il indique la mesure des angles pour la construction de son diagramme de secteurs:
\n")
titres = [_("\\text{Sport favori}"), _("\\text{Basket-ball}"), _("\\text{Tennis}"), _(u"\\text{Football}"), _("\\text{Judo}")]
quiz_exo_cor += tableau_tex_quiz(titres,2,2,[[basket, tennis, football, judo],[basket*12, tennis*12, football*12, judo*12]],2)
quiz.append([quiz_nom, quiz_exo_cor, ""])
return (exo, cor, quiz)
def statistiques():
"""Construit au hasard l'un des six types d'exos de statistiques."""
global exo, cor, quiz
exo = ["\\exercice"]
cor = ["\\exercice*"]
quiz = ["cloze"]
exo.append("\\renewcommand{\\arraystretch}{2}")
cor.append("\\renewcommand{\\arraystretch}{2}")
hasard = random.randint(0,5)
if hasard == 0:
exo_pi()
elif hasard == 1:
exo_notes()
elif hasard == 2:
exo_de()
elif hasard == 3:
exo_vote()
elif hasard == 4:
exo_sport()
else:
exo_ages()
return (exo, cor, quiz)