Commit fc549e91 authored by Louis's avatar Louis
Browse files

[doc] Création d'un exercice : Partie 2.5 écrite

parent e3febbd0
......@@ -140,16 +140,13 @@ Nous avons écrit notre premier exercice, qui est intégré à Pyromaths. Par co
Ajout du hasard
===============
Préambule
---------
Dans cette partie, pour générer l'exercice et suivre votre travail, la commande à utiliser est la suivante.
.. code-block:: shell
utils/pyromaths-cli.py generate EquationPremierDegre:0
utils/pyromaths-cli.py generate EquationPremierDegre:1
Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:0`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire.
Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:1`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire.
.. note::
......@@ -159,28 +156,80 @@ Remarquez que par rapport à la commande utilisée dans la partie précédente,
Nous gardons le même système, mais au lieu de commencer à la première décimale de π, nous utilisons désormais sur l'heure courante : si le programme est lancé à 13h37, nous utilisons alors les décimales de π à partir de la 1337e. Ainsi, deux exécutions successives donneront deux exercices différents.
C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:0`` ajouté à la fin de la ligne de commande.
C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:1`` ajouté à la fin de la ligne de commande.
C'est un peu plus compliqué en réalité, mais dans les grande lignes, c'est ainsi qu'un ordinateur génère du hasard. Plus d'informations, par exemple, dans l'article de Wikipédia `Pseudorandom generator <https://en.wikipedia.org/wiki/Pseudorandom_generator>`__.
Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre:0`` en ``EquationPremierDegre:1729``, ``EquationPremierDegre:0123456789``, ou n'importe quel nombre de votre choix.
Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre:1`` en ``EquationPremierDegre:1729``, ``EquationPremierDegre:0123456789``, ou n'importe quel nombre de votre choix.
Code Python
-----------
TODO
Du côté de Python, il faut tirer au hasard quatre nombres entiers entre -10 et 10 (sauf 0), et les rendre disponible depuis le code LaTeX. Cela se fait avec le contexte. Toutes les variables présentes dans ce dictionnaire seront accessibles depuis le `template` jinja2.
.. literalinclude:: ecrire/3/equation.py
:linenos:
:lineno-start: 27
:lines: 27-44
Code LaTeX
----------
TODO
Du côté de LaTeX, nous allons profiter de la bibliothèque jinja2 pour utiliser les variables rendues disponibles dans le contexte.
.. note::
Cette note se veut une courte introduction à Jinja2. Pour aller plus loins, rendez-vous sur `le site du projet <http://jinja.pocoo.org/docs/2.10/templates/>`__.
Un template jinja2 est du code LaTeX qui sera reproduit tel quel dans le document final, sauf que :
- les variables peuvent être évaluées avec des doubles parenthèses. Pour insérer la valeur de la variable ``a`` du contexte, il faut utiliser ``(( a ))`` ;
- des structures de contrôle (condition, boucle) peuvent être utilisées entourées par ``(*`` et ``*)``.
L'énoncé est assez simple : il suffit de faire appel aux variables du contexte.
.. literalinclude:: ecrire/3/EquationPremierDegre-statement.tex
:linenos:
Dans ce code, ``(( a ))`` et ``(( c ))`` sont remplacés par les valeurs des variables ``a`` et ``c`` du contexte, et ``(( "%+d"|format(b) ))`` est remplacé par le résultat du code Python ``"%+d" % b``, ce qui a pour effet d'écrire l'entier ``b`` *avec son signe* (qu'il soit positif ou négatif).
La rédaction du corrigé se fait de la même manière, en remarquant que le code ``(( d - b ))``, par exemple, est remplacé par le résultat du calcul ``d - b``. Notons également l'utilisation de ``(( ((d-b)/(a-c)) | round(2) ))``, qui permet d'arrondir le résultat du calcul ``(d-b)/(a-c)`` à deux chiffres après la virgule. L'ensemble de ces fonctions (``format``, ``round``, etc.), que jinja2 appelle `filters`, est décrit `dans la documentation officielle <http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-filters>`__.
.. literalinclude:: ecrire/3/EquationPremierDegre-answer.tex
:linenos:
Débuggage
---------
Durant cette phase, il est probable que le code LaTeX produit soit un peu compliqué, et contienne des erreurs. Il serait alors pratique de pouvoir observer (si ce n'est plus) ce code avant compilation. C'est possible avec l'option ``--pipe`` de :ref:`pyromaths-cli.py <pyromaths-cli>`.
Cette option permet de définir des commandes (du shell) qui seront executées sur le fichier LaTeX, avant sa compilation. Par exemple :
- ``--pipe cat`` exécute ``cat FICHIER.tex``, et permet d'observer le fichier avant compilation ;
- ``--pipe vim`` exécute ``vim FICHIER.tex``, et permet de modifier le fichier avant compilation ;
- ``--pipe "cp {} draft.tex"`` exécute ``cp FICHIER.tex draft.tex``, et permet d'obtenir une copie du fichier LaTeX, si le problème est trop complexe pour pouvoir être résolu avec les options ci-dessous ;
- et n'importe quelle commande du shell peut-être exécutée, au gré de votre imagination.
Bilan
-----
Nous avons produit l'exercice :download:`exercice.pdf <ecrire/3/exercice.pdf>`. Il fonctionne, mais il y a un petit problème dans le corrigé : le résultat (arrondi) est écrit à l'anglaise, avec un point au lieu d'une virgule.
.. image:: ecrire/3/corrige.png
Cela peut se corriger en utilisant un `filter` personnalisé.
Utilisation de `filters` personnalisées
=======================================
Deux problèmes sont visibles dans le corrigé défini précédemment : le nombre à virgule est écrit avec un point et (cela se voit dans certains cas), dans le cas d'un résultat entier, le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier).
.. currentmodule:: pyromaths.outils.decimaux
Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger cela : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX.
TODO
- Expliquer comment afficher la source avant compilation
Gestion des cas particuliers
============================
......
\exercice*
\begin{align*}
(( a )) x (( "%+d"|format(b) )) &= (( c )) x (( "%+d"|format(d) )) \\
(( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\
(( a - c )) x &= (( d - b )) \\
x &= \frac{(( d - b ))}{(( a - c ))} \\
x &\approx (( ((d-b)/(a-c)) | round(2) ))
\end{align*}
L'unique solution est $x\approx(( ((d-b)/(a-c)) | round(2) ))$.
\exercice
Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$.
Si nécessaire, les solutions seront arrondies au centième.
# -*- 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) 2018 -- 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
#
"""Équations du premier degré"""
import random
from pyromaths.ex import Jinja2Exercice
class EquationPremierDegre(Jinja2Exercice):
description = u"Résolution d'équations du premier degré à coefficients entiers."
level = u'3.Troisième'
def __init__(self):
super(EquationPremierDegre, self).__init__()
self.context = {
"a": random.choice([1, -1]) * (random.choice(range(1, 10))),
"b": random.choice([1, -1]) * (random.choice(range(1, 10))),
"c": random.choice([1, -1]) * (random.choice(range(1, 10))),
"d": random.choice([1, -1]) * (random.choice(range(1, 10))),
}
......@@ -207,9 +207,8 @@ class Jinja2Exercice(TexExercise):
environment.block_end_string = '*)'
environment.variable_start_string = '(('
environment.variable_end_string = '))'
environment.comment_start_string = '(% comment %)'
environment.comment_end_string = '(% endcomment %)'
environment.line_comment_prefix = '%!'
environment.comment_start_string = '(% '
environment.comment_end_string = ' %)'
environment.trim_blocks = True
environment.lstrip_blocks = True
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment