Les nouvelles technologies pour l’enseignement des mathématiques
Intégration des TICE dans l’enseignement des mathématiques

MathémaTICE, première revue en ligne destinée à promouvoir les TICE à travers l’enseignement des mathématiques.

Programmation et géométrie dynamique
les plaisirs défendus d’un mélange des genres
Article mis en ligne le 26 décembre 2017
dernière modification le 17 avril 2021

par Patrice Debrabant

Et si Python n’était pas la panacée ?
Dans cet article, on va présenter une autre interface de programmation, en français, dans l’esprit des nouveaux programmes du lycée et dans la continuité de ceux du collège.

Cet article peut être librement diffusé et son contenu réutilisé pour une utilisation non commerciale (contacter les auteurs pour une utilisation commerciale) suivant la licence CC-by-nc-sa

Introduction

Comme en témoigne le document d’accompagnement présent sur Eduscol duquel on reprendra les exemples, le langage Python est, officieusement, fortement recommandé pour les activités algorithmiques au lycée.

Cette préférence napoléonienne a le mérite de donner le ton et d’unifier les pratiques.

Outre la préférence pour Python, l’Inspection Générale s’est prononcée pour une évolution de l’écriture des algorithmes dans les sujets de baccalauréat à partir de la session 2018 :

  • suppression de la déclaration des variables, les hypothèses faites sur les variables étant précisées par ailleurs ;
  • suppression des entrées-sorties ;
  • simplification de la syntaxe, avec le symbole ← pour l’affectation.

Au premier abord, cette syntaxe semble de type Python, surtout pour l’indentation.
Mais l’absence de typage des variables évoque plutôt le Javascript. Et le « Fin de boucle » peut apparaître comme un remord (une petite larme en forme d’accolade fermante ?) d’avoir totalement évincé ce dernier.
On va proposer ici une alternative à Python, le pseudo-code de CaRMetal, avec les caractéristiques suivantes :

  • une syntaxe en français ;
  • le respect des conventions adoptées pour l’écriture des algorithmes dans les sujets de baccalauréat ;
  • l’utilisation possible d’une tortue (à comparer avec la bibliothèque turtle de Python) ;
  • l’intégration à un espace de géométrie dynamique.

L’interface que l’on va utiliser est l’interface de scripts de CaRMetal.
Les scripts de CaRMetal (CaRScripts) sont normalement écrits en Javascript. Mais on a écrit un interpréteur qui permet de traduire le pseudo-code en Javascript avant que celui-ci ne soit exécuté. Cette traduction est invisible à l’utilisateur, à moins qu’il en fasse la demande via une CaRCommande [1].

Ecriture du script et lancement du script

1) On lance CaRMetal (version ≥ 4.2.7), puis on crée un nouveau script via le menu Javascript.

2) On donne un nom à ce script.

3) Un script écrit en pseudo-code doit obligatoirement commencer par le mot « pseudo-code ». Cet incipit indique la nature particulière du CaRScript.
On commence donc par écrire pseudo-code.

On remarque que le mot passe en gris plus clair, ce qui indique visuellement que l’on est passé en mode pseudo-code.

4) On coche la case BEGINNER Mode pour que l’assistant de script (qui est un générateur automatique de code) génère une syntaxe (simplifiée) en français.

L’assistant de script est mis en branle par tous les boutons situés à droite. Quand on clique sur un de ces boutons, on génère automatiquement une portion de code à la position du curseur. C’est un aide-mémoire (et accessoirement un économiseur de clics).
Par exemple, si le curseur est à la ligne 2, et que l’on clique sur Faire 20 fois en bas à droite, on génère/obtient ceci :

On peut alors corriger et compléter ce script pour obtenir celui-ci, en pseudo-code :

On a une coloration syntaxique.
L’indentation (qui doit être de 3 espaces) de l’instruction Afficher est obtenue en cliquant 3 fois sur la barre espace ou en cliquant une seule fois sur la touche de tabulation, ce qui a exactement le même effet (la tabulation est automatiquement transformée en 3 espaces).

Les variantes de script suivantes sont également acceptées :


Pour lancer le script, on clique sur le feu tricolore.
Si le script n’est pas instantané, on a des options dans le menu Javascript.

Mais elles sont grisées ici, car le script a été (quasi-)instantané.
L’affichage se fait dans une console en pop-up. On obtient naturellement :

Syntaxe

A) Affectation d’une variable

Elle se fait avec la suite de caractères < et -, qui est automatiquement transformée en ← comme dans certains traitements de texte.

B) Tests d’égalité et différence

Le test d’égalité se fait avec le signe =.
La suite de caractères != est automatiquement transformée en ≠
La suite de caractères <= est automatiquement transformée en ≤
La suite de caractères >= est automatiquement transformée en ≥

C) Opérateurs et séparateur décimal

Le symbole * est transformé automatiquement en sa version française × .
Le symbole de division est au choix / ou : (mais dans une expression entre guillemets, on n’a pas le choix, il faut prendre /)
Le séparateur décimal est le point.

D) Instructions conditionnelles

On dispose du bloc si … , et du bloc si... sinon...

E) Commentaires

Comme en Javascript, un commentaire est annoncé par // et se poursuit jusqu’en fin de ligne.

Exemple : programme pour résoudre une équation du second degré 

Remarque : des fichiers CaRMetal avec tous les scripts sont fournis en fin d’article.

F) Opérateurs et fonctions mathématiques

Les opérations doivent être écrites explicitement.
racine() est la racine carrée.
puissance(a,b) est $a^b$.
ln() est le logarithme népérien.
exp() est la fonction exponentielle.
arrondi() est l’arrondi à l’unité.
troncature() est la troncature à l’unité.
nombre_aleatoire() est un nombre aléatoire entre 0 et 1 (1 exclu).
PI est PI.
abs est la valeur absolue.
On dispose aussi de sin, cos, tan, asin, acos, atan.

G) L’analyseur syntaxique

Il s’agit de l’analyseur Javascript. On a fait en sorte de maintenir une certaine cohérence, mais elle est partielle.
Les augures seront parfois pertinents, parfois abscons...

H) Boucles bornées

On dispose des instructions :
répéter n fois
pour i allant de a à b
pour ([expressionInitiale] ; [condition] ; [expressionIncrément])

L’instruction pour i allant de a à b itère de a (inclus) à b (inclus).

Par exemple le programme suivant permet de calculer la moyenne des 100 premiers nombres entiers impairs.

I) Boucles non bornées

On dispose des boucles :
tant que condition
...
faire

jusqu’à condition

Le programme suivant permet par exemple de chercher l’indice du premier terme d’une suite géométrique supérieur ou égal à 10000.

J) Fonctions

On a vu plus haut la syntaxe pour définir une fonction.
Donnons un autre exemple avec une liste :

On peut remarquer que length n’a pas été traduit (c’est un oubli qui sera réparé dans la prochaine version). Dans ce cas, on utilise le terme anglais, ce qui reste d’ailleurs possible pour les termes qui ont été traduits.

De Scratch au pseudo-code de CaRMetal

Voici un exemple de tracé géométrique en Scratch.

Avec CaRMetal, on peut en donner une version dynamique.
On crée les deux curseurs longueur et angle (en convertissant une expression ou en utilisant un curseur de la palette Contrôles).
Puis on écrit le script :

On rappelle que la tortue dynamique de CaRMetal doit être attachée à un point, que l’on a créé ici dans le script.
On a alors une figure dynamique par rapport à la longueur et l’angle.
Il faut acquérir un peu de virtuosité pour écrire correctement les expressions composées (ici pour écrire triangle(i+ « *longueur »)). Mais on pourrait éviter cette difficulté et se contenter de la figure non dynamique ci-dessous :


Pour aller plus loin, on va quitter le document Eduscol et proposer différents exemples de l’articulation des scripts avec l’espace de géométrie dynamique.

1) Etude dynamique de l’algorithme de Heron

Pour cet exemple, on s’est inspiré de cet article d’Alain Busser sur le site de l’IREM de la réunion.
L’objectif est d’observer dynamiquement la convergence de l’algorithme de Heron définie par :

$u_{n+1} = (u_n+R/u_n)/2$

Dans certaines conditions, cette suite tend vers $\sqrt{R}$.

On part d’un point M libre.
$u_0$ sera égal à y(M).
On construit ensuite une suite de points de coordonnées ($x(M)+n, u_n$).

La courbe de la racine carrée est construite via l’interface. Tout le reste peut être construit par script.

* On peut commencer par construire la courbe de la racine carrée :

* Ensuite on place un point sur l’axe [Ox) qui va jouer le rôle de curseur.

* Enfin, on peut terminer ainsi :


2) Construction d’une approximation de la fonction ln.

Pour cet exemple, on s’est inspiré de cet article d’Alain Busser sur le site de l’IREM de la réunion.
L’objectif est de construire une fonction qui approche la fonction ln.
Pour cela, on utilise uniquement :

  • $ln(x) = 2.ln(rac(x))$
  • $ln(1+x) \approx x $ au voisinage de 0.
  • $x^{0.5n}$ tend vers 1.

Partant d’un nombre X, on prend x $\leftarrow$ X et on itère N fois :
      remplacer x par racine(x)
jusqu’à obtenir x très proche de 1.

x est alors égal à $1+\epsilon$. Donc $ln(x) \approx \epsilon$.
Pour obtenir ln(X), on multiplie $\epsilon$ par $2^N$ .

* On commence par tracer la courbe de la fonction ln via l’interface.

* Puis on écrit le script et on peut fixer via l’interface l’aspect par défaut des points (observer les palettes de droite).

On obtient le résulat suivant quasi-instantanément :


3) Représentation d’une œuvre d’art

En s’inspirant d’une idée de Nathalie Colas, on va réaliser une représentation 2D de la sculpture « Work in progress » de Norman Dilworth :

Et comme on va le faire par script, ça ne coûtera pas plus cher de réaliser cette variante dynamique en A et B :

On a, typiquement, une figure que l’on peut construire par récursivité.

A partir de A et B, on construit les deux quarts de disques, on construit $A_1$ et $B_1$, et on recommence à partir de $A_1$ et $B_1$.

Une méthode très concise consiste à construire une macro qui construit les deux quarts de disque et les points $A_1$ et $B_1$, et renvoie $A_1$ et $B_1$, et à l’appliquer récursivement pa script.

Il y a tout de même une petite subtilité ici, c’est l’orientation par rapport à [AB) : on est alternativement « main droite » puis « main gauche » de [AB). On va donc construire deux macros et appliquer l’une puis l’autre dans la récursion.

La vidéo suivante présente la construction avec la version la plus récente de CaRMetal.

Les commentaires ci-dessous concernant la construction sont antérieurs, la méthode reste valable mais est plus compliquée que dans la vidéo.

On commence par construire le cercle de centre B passant par A, puis les angles $\widehat{AB...}$ de mesure 45, 90, 135° dans le sens trigonométrique puis dans le sens inverse.

On obtient les points C, D, etc puis les point F, J et K par symétrie centrale.
On peut ensuite masquer le cercle et les angles.

On construit alors les quarts de cercle (avec l’outil arc de cercle 3 points) qui seront des finaux de la macro.

On peut alors construire les macros :

  • Dilworth1 a pour initiaux A et B, et pour finaux J, D, $c_2$ , $c_3$
  • Dilworth2 a pour initiaux A et B, et pour finaux K, H, $c_4$ , $c_5$

On fait marcher une fois ExécuterMacro(« Dilworth1 », « A,B » ) pour voir l’ordre des finaux dans le tableau renvoyé par la CaRCommande :

On n’a plus alors qu’à annuler le script et à écrire le script final.


Work in progress (par Norman Dilworth)

Avec ce script très simple, il faut prendre un niveau pair pour obtenir l’orientation souhaitée.
Pour obtenir le même rendu que sur la figure, il faut que les préférences pour les cercles soient les suivantes.

On peut fixer ces préférences dans le script lui-même (et seulement le temps du script) à l’aide de la CaRCommande ClicVirtuel.


4) Construction de la courbe de Polya

On va terminer en construisant la courbe de Polya (dynamique en D).

Cette fois, la macro est une simple projection sur une droite :
 Initiaux = 3 points A, B, C
 Final = projeté orthogonal de C sur (AB)

Il y a un seul final, donc ExecuteMacro le renverra directement, sans passer par un tableau.


Il existe beaucoup d’autres possibilités. Le pseudo-code de CaRMetal permet de mobiliser toutes les fonctionnalités des CaRScripts et d’en comprendre les articulations.
On pourra trouver d’autres exemples sur carmetal.org

Pour finir, voici les fichiers CaRMetal :

classeur avec les scripts du début Heron logarithme népérien Work in progress courbe de Polya