getZZ

ZZ Top Logo 2

L'une des nouveautés du bac 2018 est l'apparition d'une nouvelle notation, plus concise que l'ancienne et surtout plus conforme à l'idée d'un algorithme (à distinguer du programme). Inspirée de la notation Z, la fonction getZZ de CaRMetal est dans les faits une anticipation sur cette notation du bac: Disons-le tout de go, un CaRScript une fois passé à la moulinette de getZZ, devient moyennant un tout petit peu de nettoyage, un algorithme tout-à-fait conforme au bac 2018 ! 


À titre d'exemple, on va faire en JavaScript un exercice de ce sujet de bac sur des lointaines cousines de la tortue de CaRMetal: Elles vivent sur une île polynésienne et leur population «diminue de façon inquiétante» selon l'énoncé. On appelle u «le nombre de tortues, en milliers, au début de l’année 2000+n», et comme au départ il y a 300 tortues, la valeur initiale de la variable u est 0,3. On considère, dans cet exercice, que la population normalisée des tortues suit le modèle de Verhulst à temps discret, autrement dit, une suite logistique. Son paramètre étant inférieur à 1 (c'est 0,9 dans l'énoncé), le modèle prévoit effectivement l'extinction de la population de tortues.

 

Il est temps maintenant de voir comment programmer cette suite, et comme la tortue de CaRMetal ne connaît que JavaScript, on va programmer la suite en JavaScript. Tout d'abord, on demande de «Calculer, dans ce modèle, le nombre de tortues au début de l’année 2001 puis de l’année 2002». Pour ce faire, on va, dans CaRMetal, cliquer sur "JavaScript" et là, "nouveau script dans la construction". En cliquant sur le "mode beginner" en haut de la console, on se facilite la vie, surtout si on ne connaît pas (trop) JavaScript. Ensuite on entre u=0.3 pour la valeur initiale de la suite, et là on aimerait bien savoir comment faire pour répéter plusieurs fois le calcul u←0,9u(1-u). En fait ce n'est pas si compliqué que ça puisque CaRMetal nous propose en bas à droite plusieurs structures de contrôle parmi lesquelles "répéter 20 fois":

cmt1

Ceci permet de compléter le script sans trop de difficultés, on devrait alors aboutir à ceci (on a laissé les 20 fois pour, en plus d'avoir les deux premières valeurs, observer l'évolution à plus long terme de la population de tortues):

u = 0.3;
pour n allant de 1 à 20 {
	u = 0.9*u*(1-u);
	Afficherligne(u);
}

Difficile le JavaScript? En exécutant ce script on a l'affichage dans une fenêtre des 20 premières valeurs de la suite et comme ça commence par  0.189 et 0.1379511 on en déduit qu'au début de l'année 2001 il ne restait que 189 tortues alors qu'au début de l'année 2002 il en restait 137,9511 (au passage on aimerait savoir qui a braconné la 0,0489 tortue qui manque). Mais supposons qu'on veuille rédiger l'algorithme dans un corrigé du sujet de bac, pour expliquer comment on a trouvé d'un coup les deux nombres. Pour cela, il suffit de déplacer en dehors de la boucle l'affichage (qui ne fait pas partie de l'algorithme) et afficher, en lieu et place de u, l'algorithme donné par la fonction getZZ():

u = 0.3;
pour n allant de 1 à 20 {
	u = 0.9*u*(1-u);
}
Afficherligne(getZZ());

Du coup, l'affichage dans la fenêtre de sortie ne sera plus les valeurs de u successives, mais l'algorithme, délicieusement autoréférentiel puisque getZZ() est aussi traduit en notation algorithmique:

u ⟵ 0.3;
for (n⟵1;n≤20;n⟵n+1){
	u ⟵ 0.9*u*(1-u);
}
Afficherligne(getZZ());

On peut se livrer à quelques modifications (par exemple enlever la dernière ligne) pour avoir un algorithme tout-à-fait conforme au nouveau bac:

u ⟵ 0,3
Répéter 20 fois
	u ⟵ 0,9u(1-u)
Fin de la boucle

ou

u ⟵ 0,3
Pour n allant de 1 à 20
	u ⟵ 0,9×u×(1-u)
Fin du Pour

Les algorithmes ci-dessus ont été obtenus en copiant-collant la sortie de la fenêtre d'affichage, vers un éditeur de texte. Avec un traitement de texte ça marche aussi!

Ceci dit, dans la suite du sujet, il y a un vrai programme (une trame à compléter, appelée "algorithme" alors qu'il s'agit bien d'un programme): «On souhaite qu’à la fin de son exécution, l’algorithme ci-dessous affiche la dernière année avant laquelle il reste au moins 30 tortues. Recopier et compléter l’algorithme afin qu’il satisfasse cette exigence.»

Pas de vraie difficulté nouvelle, puisqu'ici la boucle est de type "tant que" et que justement il y a une telle structure dans le menu des CaRScripts:

cmt1

Cela permet de compléter le CaRScript, au besoin par des essais-erreurs successifs:

u = 0.3;
n = 0;
tant que (u>=0.03){
	u = 0.9*u*(1-u);
	n=n+1;
}
Afficherligne(n-1);

Là encore, il suffit de remplacer l'affichage final par celui de getZZ() pour avoir l'algorithme :

u ⟵ 0.3;
n ⟵ 0;
while (u≥0.03){
	u ⟵ 0.9*u*(1-u);
	n⟵n+1;
}
Afficherligne(getZZ());

que l'on peut améliorer, par exemple pour avoir ceci :

u ⟵ 0,3
n ⟵ 0
Tant que u≥0.03 faire
	u ⟵ 0,9×u×(1-u)
	n⟵n+1
fin du Tant que

Alors, Messieurs les concepteurs de sujets d'examen, ça ne vous dirait pas de vous mettre à CaRMetal?

Noter que la sortie de getZZ() peut être placée dans une expression de type "texte" directement dans la figure CaRMetal; mais l'export en pdf de cette figure n'est pas satisfaisant. La figure elle-même, si:

les algos directement dans la figure