#!/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 acos, asin, atan, pi, sin, cos, tan
from . import fractions
from ..outils.Arithmetique import valeur_alea, pgcd
from ..outils.Geometrie import choix_points
#---------------------------------------------------------------------
#- THÉORÈME DE THALÈS -
#---------------------------------------------------------------------
def cotes_sommets(noms): # renvoie les noms des 3 cotes du triangle en finissant par l'hypotenuse
return (noms[1] + noms[2], noms[0] + noms[2], noms[0] + noms[1])
def nom_triangle(noms): # renvoie le nom du triangle dans un ordre aleatoire
a = random.randrange(3)
b = (random.randrange(2) + 1 + a) % 3
c = (3 - a) - b
return '%s%s%s' % (noms[a], noms[b], noms[c])
def valeurs_thales(valeurmax, type):
"""type est égal à 1 pour la version triangle, -1 pour la version papillon"""
liste = [0, 0, 0, 0, 0, 0, 0, 0]
while liste == [0, 0, 0, 0, 0, 0, 0, 0]:
for i in range(3):
liste[i] = random.randrange(2)
a = random.randrange(liste.count(1))
for i in range(3):
if liste[i]:
if not a:
liste[i + 3] = 1
a = a - 1
else:
liste[i + 3] = 1 # on doit connaitre le numeratuer ou le denominateur
for i in range(2): # AB et AE ou AB et BE ou AE et EB
if liste[i] and liste[i + 3]: # i est le rapport complet. On choisit une des 3 formes ci-dessus
a = random.randrange(2)
liste[i + 6] = 1
liste[i + 3 * a] = 0
rapport = [i + 3 * ((a + 1) % 3), i + 3 * ((a + 2) % 3)]
rapport.sort()
if liste[2] and liste[5]:
rapport = [2, 5]
valeurs = [0, 0, 0, 0, 0, 0, 0, 0]
for i in range(3):
if liste[i]:
valeurs[i] = random.randrange(15, valeurmax) / 10.0
if liste[i + 3] and liste[i]:
valeurs[i + 3] = random.randrange(5, valeurs[i] * 10 - 9) / \
10.0
elif liste[i + 3]:
valeurs[i + 3] = random.randrange(5, valeurmax) / 10.0
if liste[6]:
valeurs[6] = random.randrange(5, valeurmax) / 10.0
if liste[7]:
valeurs[7] = random.randrange(5, valeurmax) / 10.0
valeurs.append((rapport, type))
if test_valeurs_thales(valeurs, rapport, type):
return valeurs
else:
return 0
def test_valeurs_thales(valeurs, rapport, type_thales):
v = [valeurs[i] for i in range(8)]
if rapport[0] // 3 == 0 and rapport[1] // 3 == 2: # On donne AB et EB
v[rapport[0] + 3] = (v[rapport[0]] - v[rapport[1]]) * \
type_thales
elif rapport[0] // 3 == 1 and rapport[1] // 3 == 2:
# On donne AE et EB
v[rapport[0] - 3] = v[rapport[0]] * type_thales + v[rapport[1]]
if v[rapport[0] % 3]: # rapport est AE/AB
rapp = (v[rapport[0] % 3 + 3] * 1.0) / v[rapport[0] % 3]
else:
rapp = 0
for i in range(3):
if not v[i] and rapp:
v[i] = v[i + 3] / rapp
elif not v[i + 3]:
v[i + 3] = v[i] * rapp
if inegalite_triangulaire(v[0:3]) and inegalite_triangulaire(v[3:6]) and \
.3 < rapp < .7:
return v
else:
return 0
def inegalite_triangulaire(a): # renvoie 1 si c'est un triangle, 0 sinon
vrai = 0
coef = 1.2 # evite les triangles trop ecrases
if a[0] > a[1] and a[0] > a[2]:
if a[1] + a[2] > coef * a[0]:
vrai = 1
elif a[1] > a[0] and a[1] > a[2]:
if a[0] + a[2] > coef * a[1]:
vrai = 1
elif a[2] > a[0] and a[2] > a[1]:
if a[0] + a[1] > coef * a[2]:
vrai = 1
return vrai
def thales(exo, cor, quiz):
type = [-1, 1]
random.shuffle(type)
exo.append("\\begin{multicols}{2}")
cor.append("\\begin{multicols}{2}")
for i in range(2):
noms = choix_points(5) # les noms des sommets
while True:
valeurs = valeurs_thales(70, type[i]) # les longueurs en mm
if valeurs:
break
exo.append(tex_enonce_thales(noms, valeurs))
exo.append(tex_fig_thales(noms, valeurs))
cor.append(tex_enonce_thales(noms, valeurs))
cor.append(tex_fig_thales(noms, valeurs) +
"\\dotfill{}\\par\n")
quiz_exo = tex_enonce_thales_quiz(noms, valeurs, type[i]) # NO MOVER DE AQUI
cor.append(tex_resolution_thales0(noms))
cor.append(tex_resolution_thales1(noms, valeurs))
cor.append(tex_resolution_thales2(noms, valeurs))
texte_sol, donnees1, donnees2 = tex_resolution_thales3(noms, valeurs)
cor.append(texte_sol)
quiz_nom = _(u"Théorème de Thales 2")
# Cuando se soluciones bug-quiz-cloze-coma cambiar SHORTANSWER por NUMERICAL y tipo de nombre_quiz
quiz_exo_cor = quiz_exo + _(u'Calcule les arrondissages aux centième de:
\n')
quiz_exo_cor += (u'$$%s =$$ {1:SHORTANSWER:%s100%s%s} $$\\, cm$$
\n$$%s =$$ {1:SHORTANSWER:%s100%s%s} $$\\, cm$$' %
(donnees1[0], "%", "%", nombre_quiz(donnees1[1], 0), donnees2[0], "%", "%", nombre_quiz(donnees2[1], 0)))
quiz_exo_cor += u''
quiz.append([quiz_nom, quiz_exo_cor, ""])
if not i:
exo.append("\\columnbreak")
cor.append("\\columnbreak")
else:
exo.append("\\end{multicols}")
cor.append("\\end{multicols}")
def long_val(noms, valeurs): # renvoie un tuple contenant les noms des segments et leur longueur puis les noms des longueurs a calculer
liste = []
for i in range(8):
if valeurs[i]:
liste.append(creer_noms(noms, i))
liste.append(nombre(valeurs[i]))
for i in range(6):
if not valeurs[i] and valeurs[8][0][0] % 3 != i % 3:
liste.append(creer_noms(noms, i))
return liste
def long_val_quiz(noms, valeurs): # renvoie un tuple contenant les noms des segments et leur longueur puis les noms des longueurs a calculer
liste = []
for i in range(8):
if valeurs[i]:
liste.append(creer_noms(noms, i))
liste.append(nombre_quiz(valeurs[i]))
for i in range(6):
if not valeurs[i] and valeurs[8][0][0] % 3 != i % 3:
liste.append(creer_noms(noms, i))
return liste
def lAB(a): # renvoie AB
return str(a[0]) + str(a[1])
def nombre(a):
texte = str(a).replace('.', ',')
if a >= 1000 or a <= 0.0001:
return '\\nombre{%s}' % texte
else:
if texte.count(',') and len(texte) - texte.find(',0') == 2:
return texte.replace(',', '{,}').replace('{,}0', '')
elif texte.count(','):
return texte.replace(',', '{,}')
else:
return texte
def nombre_quiz(a, mathenv = 0):
texte = str(a)
if mathenv:
return texte
else:
texte = texte.replace('.', ',')
if texte.count(',') and len(texte) - texte.find(',0') == 2:
return texte.replace(',0', '')
else:
return texte
def creer_noms(noms, i):
if i == 0:
return str(noms[0]) + str(noms[1])
elif i == 1:
return str(noms[0]) + str(noms[2])
elif i == 2:
return str(noms[1]) + str(noms[2])
elif i == 3:
return str(noms[0]) + str(noms[3])
elif i == 4:
return str(noms[0]) + str(noms[4])
elif i == 5:
return str(noms[3]) + str(noms[4])
elif i == 6:
return str(noms[3]) + str(noms[1])
elif i == 7:
return str(noms[4]) + str(noms[2])
def tex_enonce_thales(noms, valeurs):
texte = \
_(u'Sur la figure ci-dessous, les droites $(%s)\\text{ et }(%s)$ sont parallèles.\\par\n') % \
(lAB(noms[1:3]), lAB(noms[3:5]))
liste = long_val(noms, valeurs)
texte = texte + \
_(u'On donne $%s=\\unit[%s]{cm},\\quad %s=\\unit[%s]{cm}, \\quad %s=\\unit[%s]{cm}\\quad\\text{et}\\quad %s~=~\\unit[%s]{cm}$.\\par\n') % \
tuple(liste[0:8])
texte = texte + _(u'Calculer $%s\\text{ et }%s$.') % tuple(liste[8:10])
return texte
def tex_enonce_thales_quiz(noms, valeurs, typ):
texte = \
_(u'En la figure, les segments de droite $$(%s)\\,$$ et $$\\,(%s)$$ sont parallèle.
\n') % \
(lAB(noms[1:3]), lAB(noms[3:5]))
liste = long_val_quiz(noms, valeurs)
texte += _(u'Se sait que $$%s=%s\\, cm\\, ;\\, %s=%s\\, cm\\, ;\\, %s=%s\\, cm\\,$$ et $$\\, %s=%s\\, cm$$.\n') % \
tuple(liste[0:8])
texte += '
$$\\fs3\\picture(180,140){' if typ == 1: texte += '(20,15){\\line(140,0)}(20,15){\\line(100,100)}(160,15){\\line(-40,100)}(105,15){\\line(-24,60)}' texte += '(10,0){%s}(155,0){%s}(115,120){%s}(95,0){%s}(70,80){%s}}$$ | ' % tuple(noms[0:5]) else: texte += '(30,50){\\line(120,0)}(30,50){\\line(-10,-30)}(20,20){\\line(150,100)}(150,50){\\line(20,70)}' texte += '(60,35){%s}(150,35){%s}(160,122){%s}(10,50){%s}(5,5){%s}}$$ | ' % tuple(noms[0:5])
return texte
def tex_resolution_thales0(n):
return _(u"""Les points $%s$,~ $%s$,~ $%s$ et $%s$, $%s$, $%s$ sont alignés et les droites $(%s)$ et $(%s)$ sont parallèles.\\par
D'après le \\textbf{théorème de Thalès} :
$\\,\\mathbf{\\cfrac{%s}{%s}=\\cfrac{%s}{%s}=\\cfrac{%s}{%s}}$
""") % \
(
n[0],
n[3],
n[1],
n[0],
n[4],
n[2],
n[1] + n[2],
n[3] + n[4],
creer_noms(n, 0),
creer_noms(n, 3),
creer_noms(n, 1),
creer_noms(n, 4),
creer_noms(n, 2),
creer_noms(n, 5),
)
def tex_resolution_thales1(n, v):
r = v[8][0][0] % 3 # grand rapport
if v[8][1] == 1:
sgn = '+'
else:
sgn = '-'
if v[r] and v[r + 3]: # on connait les deux rapports
donnees = 0
elif v[r + 3]:
# on connait le petit rapport, mais pas le grand
v[r] = v[r + 6] + v[r + 3] * v[8][1]
donnees = (creer_noms(n, r), creer_noms(n, r + 6), sgn,
creer_noms(n, r + 3), nombre(v[r]))
else:
v[r + 3] = (v[r] - v[r + 6]) * v[8][1]
if sgn == '+':
donnees = (creer_noms(n, r + 3), creer_noms(n, r), '-',
creer_noms(n, r + 6), nombre(v[r + 3]))
else:
donnees = (creer_noms(n, r + 3), creer_noms(n, r + 6), '-',
creer_noms(n, r), nombre(v[r + 3]))
if donnees:
return _(u'\\vspace{1ex}\\par\nDe plus $%s=%s%s%s=\\unit[%s]{cm}$') % \
donnees
else:
return ''
def tex_resolution_thales2(n, v):
donnees = []
for i in range(3):
if v[i]:
donnees.append(nombre(v[i]))
else:
donnees.append(creer_noms(n, i))
if v[i + 3]:
donnees.append(nombre(v[i + 3]))
else:
donnees.append(creer_noms(n, i + 3))
return '\\[\\frac{%s}{%s}=\\frac{%s}{%s}=\\frac{%s}{%s}\\]' % \
tuple(donnees)
def nom_ou_valeur(n, v, i):
if v[i]:
return nombre(v[i])
else:
return creer_noms(n, i)
def valeur_exacte(a, approx=3, unit=1):
nb = nombre(a)
if unit:
if nb.count(',') and (len(nb) - nb.find(',')) - 1 > approx:
return '\\simeq\\unit[' + nombre(int(1000.0 * a) / 1000.0) + \
']{cm}'
else:
return '=\\unit[' + nombre(a) + ']{cm}'
else:
if nb.count(',') and (len(nb) - nb.find(',')) - 1 > approx:
return '\\simeq' + nombre(int(1000.0 * a) / 1000.0)
else:
return '=' + nombre(a)
def valeur_exacte_quiz(a, approx=2):
nb = nombre_quiz(a,1)
if nb.count('.') and (len(nb) - nb.find('.')) - 1 > approx:
return nombre_quiz((round(100.0 * a) / 100.0),1)
else:
return nombre_quiz(a,1)
def tex_resolution_thales3(n, v):
r = v[8][0][0] % 3 # grand rapport
donnees = []
for i in range(3):
if i != r:
donnees.extend([nom_ou_valeur(n, v, r), nom_ou_valeur(n, v,
r + 3), nom_ou_valeur(n, v, i), nom_ou_valeur(n,
v, i + 3)])
if v[i]: # on cherche i+3
donnees.extend([creer_noms(n, i + 3), nombre(v[i]),
nombre(v[r + 3]), nombre(v[r]),
valeur_exacte(((v[i] * 1.0) * v[r + 3]) /
v[r]), valeur_exacte_quiz(((v[i] * 1.0) * v[r + 3]) /
v[r])])
else:
donnees.extend([creer_noms(n, i), nombre(v[i + 3]),
nombre(v[r]), nombre(v[r + 3]),
valeur_exacte(((v[r] * 1.0) * v[i + 3]) /
v[r + 3]), valeur_exacte_quiz(((v[r] * 1.0) * v[i + 3]) /
v[r + 3])])
texte = \
_(u'$\\cfrac{%s}{%s}=\\cfrac{%s}{%s}\\quad$ donc $\\quad\\boxed{%s=\\cfrac{%s\\times %s}{%s}%s}$\\par\n') % \
tuple(donnees[0:9])
texte = texte + \
_(u'$\\cfrac{%s}{%s}=\\cfrac{%s}{%s}\\quad$ donc $\\quad\\boxed{%s=\\cfrac{%s\\times %s}{%s}%s}$\\par\n') % \
tuple(donnees[10:19])
return texte, [donnees[4], donnees[9]], [donnees[14], donnees[19]]
def fig_thales(noms, valeurs):
v = test_valeurs_thales(valeurs[0:8], valeurs[8][0], valeurs[8][1])
type_thales = valeurs[8][1]
angle = int(((100.0 * acos(((v[0] ** 2 + v[1] ** 2) - v[2] ** 2) / ((2 *
v[0]) * v[1]))) * 180) / pi) / 100.0
v = [int(v[i] * 100) / 100.0 for i in range(8)]
mini_x = int(100.0 * min(0, v[1] * cos((angle * pi) / 180), v[3] *
type_thales, (v[4] * cos((angle * pi) / 180)) *
type_thales)) / 100.0 - 1.5
mini_y = int(100.0 * min(0, (v[4] * sin((angle * pi) / 180)) *
type_thales)) / 100.0 - 1.5
maxi_x = int(100.0 * max(v[0], v[1] * cos((angle * pi) / 180))) / \
100.0 + 1.5
maxi_y = int((100.0 * v[1]) * sin((angle * pi) / 180)) / 100.0 + .5
echelle = int(400 / max(abs(mini_x) + maxi_x, abs(mini_y) + maxi_y)) / \
100.0
if type_thales == 1:
return (
echelle,
mini_x,
mini_y,
maxi_x,
maxi_y,
225,
angle + 45,
noms[0],
noms[1],
noms[2],
v[0],
v[1],
angle,
-45,
angle + 90,
noms[3],
noms[4],
v[3],
v[4],
angle,
)
else:
return (
echelle,
mini_x,
mini_y,
maxi_x,
maxi_y,
135,
angle + 45,
noms[0],
noms[1],
noms[2],
v[0],
v[1],
angle,
135,
angle + 180,
noms[3],
noms[4],
-v[3],
-v[4],
angle,
)
def tex_fig_thales(noms, valeurs):
donnees = fig_thales(noms, valeurs)
enonce = \
'''\\begin{center}
\\psset{PointSymbol=x,unit=%s}
\\begin{pspicture}(%s,%s)(%s,%s)
\\SpecialCoor
\\pstTriangle[PosAngleA=%s, PosAngleB=-45, PosAngleC=%s, PointNameA=%s, PointNameB=%s, PointNameC=%s](0,0){a}(%s,0){b}(%s;%s){c}
\\pstTriangle[PosAngleB=%s, PosAngleC=%s, PointSymbolA=none, PointNameA=none, PointNameB=%s, PointNameC=%s](0,0){a}(%s,0){b}(%s;%s){c}
\\end{pspicture}
\\end{center}
''' % donnees
return enonce
def tex_thales():
exo = ['\\exercice']
cor = ['\\exercice*']
quiz = ['cloze']
thales(exo, cor, quiz)
return (exo, cor, quiz)
#
# ------------------- RECIPROQUE DU THEOREME DE THALES -------------------
#
def valeurs_reciproque_thales():
while True:
(a, b, c, d) = (random.randrange(2, 50), random.randrange(2, 50),
random.randrange(2, 20), random.randrange(2, 20))
p1 = pgcd(a, b)
(a, b) = (a / p1, b / p1)
if c < d:
(c, d) = (d, c)
if a != b and int(c / d) != (c * 1.0) / d and 10 < a * c < 200 and \
10 < a * d < 200 and 10 < b * c < 200 and 10 < b * d < 200 and \
.3 < (d * 1.0) / c < .7:
break
t = valeur_alea(-1, 1) # -1 si papillon, 1 si triangle
r = random.randrange(5)
while r == 2:
r = random.randrange(5)
angle = random.randrange(15, 105)
valeurs = (
(a * c) / 10.0,
(b * c) / 10.0,
0,
(a * d) / 10.0,
(b * d) / 10.0,
0,
(a * c - (t * a) * d) / 10.0,
(b * c - (t * b) * d) / 10.0,
angle,
t,
r,
)
return valeurs
def fig_rec_thales(noms, v):
type_thales = v[9]
angle = v[8]
mini_x = int(100.0 * min(0, v[1] * cos((angle * pi) / 180), v[3] *
type_thales, (v[4] * cos((angle * pi) / 180)) *
type_thales)) / 100.0 - 1.5
mini_y = int(100.0 * min(0, (v[4] * sin((angle * pi) / 180)) *
type_thales)) / 100.0 - 1.5
maxi_x = int(100.0 * max(v[0], v[1] * cos((angle * pi) / 180))) / \
100.0 + 1.5
maxi_y = int((100.0 * v[1]) * sin((angle * pi) / 180)) / 100.0 + .5
echelle = int(400 / max(abs(mini_x) + maxi_x, abs(mini_y) + maxi_y)) / \
100.0
if type_thales == 1:
return (
echelle,
mini_x,
mini_y,
maxi_x,
maxi_y,
225,
angle + 45,
noms[0],
noms[1],
noms[2],
v[0],
v[1],
angle,
-45,
angle + 90,
noms[3],
noms[4],
v[3],
v[4],
angle,
)
else:
return (
echelle,
mini_x,
mini_y,
maxi_x,
maxi_y,
135,
angle + 45,
noms[0],
noms[1],
noms[2],
v[0],
v[1],
angle,
135,
angle + 180,
noms[3],
noms[4],
-v[3],
-v[4],
angle,
)
def tex_fig_rec_thales(noms, valeurs):
donnees = fig_rec_thales(noms, valeurs)
enonce = \
'''{\\begin{wrapfigure}{r}{4cm}
\\psset{PointSymbol=x,unit=%s}
\\begin{pspicture}(%s,%s)(%s,%s)
\\SpecialCoor
\\pstTriangle[PosAngleA=%s,PosAngleB=-45,PosAngleC=%s,PointNameA=%s,PointNameB=%s,PointNameC=%s](0,0){a}(%s,0){b}(%s;%s){c}
\\pstTriangle[PosAngleB=%s,PosAngleC=%s,PointSymbolA=none,PointNameA=none,PointNameB=%s,PointNameC=%s](0,0){a}(%s,0){b}(%s;%s){c}
\\end{pspicture}
\\end{wrapfigure}\\par
''' % \
donnees
return enonce
def rec_thales(exo, cor, quiz):
noms = choix_points(5) # les noms des sommets
valeurs = valeurs_reciproque_thales()
exo.append(tex_fig_rec_thales(noms, valeurs))
d = enonce_rec_thales(noms, valeurs)
exo.append(tex_enonce_rec_thales(noms, valeurs) + '\\vspace{2cm}}') #le dernier '}' ferme le bloc exercice
cor.append(tex_fig_rec_thales(noms, valeurs))
cor.append(tex_enonce_rec_thales(noms, valeurs) +
"\\par\\dotfill{}\\hspace*{5cm}\\\\}\n")
cor.append(tex_resolution_rec_thales0(noms, valeurs))
cor.append(tex_resolution_rec_thales1(noms, valeurs))
quiz.append(tex_enonce_rec_thales_quiz(noms, valeurs, d))
# cor.append(tex_resolution_rec_thales2(noms, valeurs))
# cor.append(tex_resolution_rec_thales3(noms, valeurs))
def enonce_rec_thales(n, v):
(r, l) = (v[10], [])
for i in range(5):
if i != 2:
if i == r:
l.extend([creer_noms(n, 6 + i % 3), nombre(v[6 + i % 3])])
else:
l.extend([creer_noms(n, i), nombre(v[i])])
l1 = [i for i in range(4)]
l2 = []
for i in range(4):
a = l1.pop(random.randrange(4 - i))
l2.extend([l[2 * a], l[2 * a + 1]])
l2.extend([creer_noms(n, 2), creer_noms(n, 5)])
return tuple(l2)
def tex_enonce_rec_thales(n, v):
d = enonce_rec_thales(n, v)
texte = \
_(u'''Sur la figure ci-contre, on donne $%s=\\unit[%s]{cm}$, $%s=\\unit[%s]{cm}$, $%s=\\unit[%s]{cm}$ et $%s=\\unit[%s]{cm}$.\\par
Démontrer que les droites $(%s)$ et $(%s)$ sont parallèles.
''') % \
d
return texte
def tex_enonce_rec_thales_quiz(n, v, d):
texte = (_(u"De la figure d'en bas ils se connaissent les mesures: $$%s=%s cm$$, $$%s=%s cm$$, $$%s=%s cm$$ et $$%s=%s cm$$. \n") % d[0:8]) texte += '$$\\fs3\\picture(180,140){' if v[9] == 1: texte += '(20,15){\\line(140,0)}(20,15){\\line(100,100)}(160,15){\\line(-40,100)}(105,15){\\line(-24,60)}' texte += '(10,0){%s}(155,0){%s}(115,120){%s}(95,0){%s}(70,80){%s}}$$' % tuple(n[0:5]) else: texte += '(30,50){\\line(120,0)}(30,50){\\line(-10,-30)}(20,20){\\line(150,100)}(150,50){\\line(20,70)}' texte += '(60,35){%s}(150,35){%s}(160,122){%s}(10,50){%s}(5,5){%s}}$$' % tuple(n[0:5]) texte += (_(u"Démontre que les segments $$(%s)$$ et $$(%s)$$ sont parallèle. \n") % d[8:10]) quiz_nom = _(u"Réciproque du Théorème de Thales") quiz_exo_cor = texte d2 = resolution_rec_thales1(n, v) quiz_exo_cor += _(u"Réponse: \n") quiz_exo_cor += (_(u"Faut démontrer la relation du \"Théorème de Thales\":\n")) quiz_exo_cor += '
\n par conséquent les segments $$(%s)$$ et $$(%s)$$ sont parallèle.") % ("%", "%", sol_quiz, d[8], d[9])) return [quiz_nom, quiz_exo_cor, ""] def resolution_rec_thales0(n, v): t = v[9] r = v[10] if t > 0: d = [n[0], n[3], n[1], n[0], n[4], n[2], creer_noms(n, r)] else: d = [n[3], n[0], n[1], n[4], n[0], n[2], creer_noms(n, r)] if r < 2: if t > 0: d.extend([creer_noms(n, r + 6), '+', creer_noms(n, r + 3), nombre(v[r])]) else: d.extend([creer_noms(n, r + 6), '-', creer_noms(n, r + 3), nombre(v[r])]) else: if t > 0: d.extend([creer_noms(n, r - 3), '-', creer_noms(n, r + 3), nombre(v[r])]) else: d.extend([creer_noms(n, r + 3), '-', creer_noms(n, r - 3), nombre(v[r])]) return tuple(d) def tex_resolution_rec_thales0(n, v): return _(u"""Les points $%s$, $%s$, $%s$~ et $%s$, $%s$, $%s$ sont alignés dans le même ordre.\\par De plus $%s=%s%s%s=\\unit[%s]{cm}$.\\par """) % \ resolution_rec_thales0(n, v) def resolution_rec_thales1(n, v): (d, t) = ([], '') for i in range(2): d.extend([creer_noms(n, i), creer_noms(n, i + 3), nombre(v[i]), nombre(v[i + 3])]) if valeur_exacte(v[i] / v[i + 3], approx=5).count('='): d.append(valeur_exacte(v[i] / v[i + 3], approx=5, unit=0)) else: if v[i] != int(v[i]) or v[i + 3] != int(v[i + 3]): p = pgcd(int(v[i] * 10), int(v[i + 3] * 10)) if p == 1: t = '=\\cfrac{%s}{%s}' % (nombre(v[i] * 10), nombre(v[i + 3] * 10)) else: t = _('=\\cfrac{%s_{\\div%s}}{%s_{\\div%s}}') % (nombre(v[i] * 10), p, nombre(v[i + 3] * 10), p) if fractions.simplifie((int(v[i] * 10), int(v[i + 3] * 10))): d.append(t + '=' + fractions.tex_frac(fractions.simplifie((int(v[i] * 10), int(v[i + 3] * 10))))) else: d.append(t + '=' + fractions.tex_frac((int(v[i] * 10), int(v[i + 3] * 10)))) d.extend([creer_noms(n, 0), creer_noms(n, 3), creer_noms(n, 1), creer_noms(n, 4), creer_noms(n, 2), creer_noms(n, 5)]) return tuple(d) def tex_resolution_rec_thales1(n, v): d = resolution_rec_thales1(n, v) return _(u"""$\\left. \\renewcommand{\\arraystretch}{2} \\begin{array}{l} \\bullet\\cfrac{%s}{%s}=\\cfrac{%s}{%s}%s\\\\\n \\bullet\\cfrac{%s}{%s}=\\cfrac{%s}{%s}%s \\end{array} \\right\\rbrace$ Donc $\\cfrac{%s}{%s}=\\cfrac{%s}{%s}$\\,.\\par D'après la \\textbf{réciproque du théorème de Thalès}, \\fbox{les droites $(%s)$ et $(%s)$ sont parallèles.} """) % \ d def tex_reciproque_thales(): exo = ['\\exercice'] cor = ['\\exercice*'] quiz = ["cloze"] rec_thales(exo, cor, quiz) return (exo, cor, quiz) # # ------------------- TRIGONOMETRIE ------------------- # def trigo_init(exo, cor, quiz): s = choix_points(6) n1 = cotes_sommets(s[0:3]) n2 = cotes_sommets(s[3:6]) v = valeurs_trigo() enonce_trigo(exo, cor, quiz, ((s[0:3], n1, v[0]), (s[3:6], n2, v[1]))) def enonce_trigo(exo, cor, quiz, v): (l, lt, lt_m) = ([], [], []) for j in range(2): f = (('\\sin', 1, 0), ('\\cos', 2, 0), ('\\tan', 1, 2))[v[j][2][0]] for i in range(2): l.append(v[j][1][f[i + 1]]) l.append(v[j][2][i + 1]) l.append(tex_angle(v[j][0], 1)) l.append(v[j][2][3]) for j in range(2): (tmp, tmp_m) = ([], []) for i in range(3): if len(l[2 * i + 6 * j]) < 3: if l[2 * i + 6 * j + 1]: lt.append('$%s=\\unit[%s]{cm}$' % (l[2 * i + 6 * j], nombre(l[2 * i + 6 * j + 1]))) lt_m.append(u'%s=%s\\, cm' % (l[2 * i + 6 * j], nombre(l[2 * i + 6 * j + 1]))) else: tmp = _(u'la longueur $%s$') % l[2 * i + 6 * j] tmp_m = _(u'l\'arrondissage aux centième de:\n\n La longueur de $$%s$$') % l[2 * i + 6 * j] elif l[2 * i + 6 * j + 1]: lt.append('$%s=%s\\degres$' % (l[2 * i + 6 * j], l[2 * i + 6 * j + 1])) lt_m.append(u'%s=%s^\\circ' % (l[2 * i + 6 * j], l[2 * i + 6 * j + 1])) else: lt.append(_(u'la mesure de l\'angle $%s$') % l[2 * i + 6 * j]) lt_m.append(_(u'l\'arrondissage aux dixièmes de:\n\n La mesure de l\'angle $$%s$$') % l[2 * i + 6 * j]) if tmp: lt.append(tmp) lt_m.append(tmp_m) exo.append('\\begin{multicols}{2}') exo.append('\\begin{enumerate}') cor.append('\\begin{multicols}{2}') cor.append('\\begin{enumerate}') tr = nom_triangle(v[0][0]) exo.append(_(u'\\item $%s$ est un triangle rectangle en $%s$ tel que :\\par ') % (tr, v[0][0][0])) exo.append(_(u'''%s et %s.\\par Calculer %s.\\par ''') % tuple(lt[0:3])) exo.append(triangle_trig(v[0][0])) quiz_nom = _(u"Trigonométrie: Mesures") quiz_exo = (_(u"$$%s$$ est un triangle rectangle en $$%s$$ avec: ") % (tr, v[0][0][0])) quiz_exo += (_(u"$$%s\\,$$ et $$\\,%s$$\n") % tuple(lt_m[0:2])) quiz_exo += "
|