Exemple
On voudrait par une boucle, calculer la somme des 10 premiers nombres entiers. Par exemple, en initialisant une somme avec la valeur zéro, puis en lui ajoutant la valeur courante de l’indice à chaque passage dans la boucle. Voici la version AlgoBox :
2 indice EST_DU_TYPE NOMBRE
3 somme EST_DU_TYPE NOMBRE
4 DEBUT_ALGORITHME
5 POUR indice ALLANT_DE 1 A 10
6 DEBUT_POUR
7 somme PREND_LA_VALEUR somme+indice
8 FIN_POUR
9 AFFICHER somme
10 FIN_ALGORITHME
Et maintenant la version JavaScript (sous CaRMetal) :
somme=0;
for(indice=1;indice<=10;indice=indice+1){
somme=somme+indice;
}
Println(somme);
L’ennui c’est que beaucoup d’élèves réalisent que la boucle est parcourue 10 fois mais ne perçoivent pas bien ce qui se passe lors de chacun de ces 10 passages. Dans ce cas il est souhaitable
- qu’ils essayent avec le papier-crayon, de simuler le fonctionnement de la boucle, ce qu’ils seront de toute façon bien obligés de faire le jour du contrôle ;
- à défaut, qu’ils aient le temps de voir ce qui se passe à l’intérieur de la boucle.
Pour cela il faut un affichage des variables pertinentes, mais aussi un moyen de ralentir l’exécution du programme.
Affichage des variables
En plaçant l’instruction d’affichage « Println » à l’intérieur de la boucle, on peut visualiser son fonctionnement, surtout si on sait concaténer des chaînes de caractères :
somme=0;
for(indice=1;indice<=10;indice=indice+1){
somme=somme+indice;
Println("L'indice vaut "+indice+" et la somme vaut "+somme);
}
L’exécution de ce script ouvre une fenêtre d’affichage dans laquelle CaRMetal écrit presque instantanément ceci :
L’indice vaut 1 et la somme vaut 1L’indice vaut 2 et la somme vaut 3L’indice vaut 3 et la somme vaut 6L’indice vaut 4 et la somme vaut 10L’indice vaut 5 et la somme vaut 15L’indice vaut 6 et la somme vaut 21L’indice vaut 7 et la somme vaut 28L’indice vaut 8 et la somme vaut 36L’indice vaut 9 et la somme vaut 45L’indice vaut 10 et la somme vaut 55
qui donne une vision synthétique et statique de l’exécution du programme. Une vision dynamique est préférable, car la boucle étant parcourue plusieurs fois, l’exécution revêt forcément un caractère dynamique (le temps est mesuré par la valeur de l’indice).
Affichage séquentiel dans la figure
D’une part, il est tout-à-fait possible de dessiner un tableau en CarScript, avec l’instruction « Expression » dont les deux dernières variables sont des coordonnées. Mais pour afficher séquentiellement des variables (pour voir comment elles varient dans le temps), il est plus simple de les utiliser comme alias de points : En créant deux points I (comme indice) et S (comme somme) et en ajoutant dans la boucle une instruction « Pause(1000) », les valeurs de I et S sont actualisées toutes les secondes :
somme=0;
for(indice=1;indice<=10;indice=indice+1){
somme=somme+indice;
SetAlias("I",indice);
SetAlias("S",somme);
Pause(1000);
}
Las ! On ne voit les valeurs de I et S qu’à la fin (10 et 55). La fonction « Pause » est donc plus utile avec des objets graphiques (mise à jour de coordonnées). Et de toute façon, si le temps d’attente est toujours le même, la méthode manque de souplesse, certains élèves ayant besoin de réfléchir plus longtemps que d’autres à ce qui se passe.
La meilleure façon de marcher, c’est de mettre un pied devant l’autre...
Alors on a besoin d’un mode pas-à-pas où l’exécution de la boucle s’arrête jusqu’à ce que l’utilisateur décide de la relancer. Pour ce faire, on a besoin d’un bouton « OK » à cliquer pour passer à la boucle suivante. En CarScript on peut faire ça avec l’instruction « Alert » mais aussi en créant un point qui s’appelle « OK » et qui ne sert qu’à être sélectionné. La figure ressemble à ceci :

Le script précédent est assez facile à modifier, il suffit de remplacer la ligne avec « Pause » par celle avec « InteractiveInput » :
somme=0;
for(indice=1;indice<=10;indice=indice+1){
somme=somme+indice;
SetAlias("I",indice);
SetAlias("S",somme);
v=InteractiveInput("Cliquer sur OK","Point");
}
Pour passer à la valeur suivante, l’utilisateur du programme n’a qu’à cliquer sur le point « OK » comme c’est demandé dans la barre qui est au bas de la fenêtre. En cours d’exécution (après avoir cliqué 6 fois sur « OK ») l’utilisateur voit ceci :

qui évoque un peu les programmes sous Scratch.
On est très proche de la perfection (un mode pas-à-pas facile à créer et fonctionnel). Cependant pour passer à la valeur suivante de l’indice, l’utilisateur peut cliquer sur n’importe quel point, pas nécessairement sur « OK ». Ce n’est d’ailleurs absolument pas gênant mais on peut quand même exiger que le point cliqué soit « OK » et pas un autre.
... et de recommencer
Il suffit pour cela d’initialiser (et de réinitialiser régulièrement) la variable v à une chaîne vide, et d’exiger que non seulement elle soit le nom d’un point sélectionné, mais aussi que ce nom soit « OK » :
var somme=0, v="";
for(indice=1;indice<=10;indice=indice+1){
somme=somme+indice;
SetAlias("I",indice);
SetAlias("S",somme);
while (v!="OK"){
v=InteractiveInput("Cliquer sur OK","Point");
}
v="";
}
Commentaires