Remarque : cet article est une prépublication d'un article à paraître dans MathemaTICE. L'article est terminé. C'est le texte intégral que l'on présente ici en avant-première.


Et si Python n'était pas la panacée ?
Dans cet article, on va présenter en détail le mode de programmation de l'interface en pseudo-code, qui constitue un environnement de programmation, en français, dans l'esprit des nouveaux programmes du lycée et dans la continuité de ceux du collège.
L'article est illustré de nombreux exemples.

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.

On peut lire à ce sujet le document de l’Inspection Générale.

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 la CaRCommande getRealScript().

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.
script3

2) On donne un nom à ce script.
nommerScript2

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.
pseudo code2

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.
beginner2

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 :
script 01b

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 :
variante 1b

variante 2b

variante 3b

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.

options retourb

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  :
console sortie b

 

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 : tous les scripts sont joints à l'article dans des fichiers CaRMetal

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.
moyenne b

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.

indiceMin b

J) Fonctions

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

moyenneVar b

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.

scratchBase 3b

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 :
script multi triangles 2b

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 :

script multi triangles simp b

Exemples

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 :

coube rac

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

heron cuseur b

* Enfin, on peut terminer ainsi :

heron final b


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.

courbeLn

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

scriptLn

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

figure ln final


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 :

WorkinProgress

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 :

WorkInProgressCM

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

macro s 01

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.

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.

macro s 02

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.

macro s 03

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

macro s 04

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 :

macro s 07

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

macro s 05

Work mini

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.
macro s 06b

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).

Courbe Polya

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.

script Polya


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.

Pièce(s) jointe(s):
Télécharger ce fichier (approxLogNeper.zir)approxLogNeper.zir[Approximation de la fonction ln]1 Ko
Télécharger ce fichier (courbe-Polya.zir)courbe-Polya.zir[Courbe de Polya]3 Ko
Télécharger ce fichier (heron.zir)heron.zir[Algorithme de Heron]1 Ko
Télécharger ce fichier (scriptsArticle.zir)scriptsArticle.zir[Classeur avec les scripts du début]2 Ko
Télécharger ce fichier (work-in-progress.zir)work-in-progress.zir[Work in progress (version CaRMetal)]12 Ko