TP 2 d’algorithmique avec CaRMetal en Seconde

vendredi 11 septembre 2009
par  Alain BUSSER

Le TP 2 a été placé juste au début du cours sur les fonctions, et fut l’occasion de présenter les fonctions d’une et de deux variables sous l’angle « algorithmique ».

Voici l’énoncé du TP :

l’énoncé du TP

Le début du TP a été consacré à de brèves explications sur les commentaires (les choses qu’on peut écrire dans le programme en demandant explicitement à CaRMetal de ne pas les exécuter) et à un format type d’en-tête, avec référence explicite à la licence libre CeCILL. Un des élèves, à qui on ne la fait pas, a spontanément choisi de mettre son programme sous licence libre GPL, choix d’ailleurs très logique.

Ensuite les élèves ont sauvegardé leur en-tête sous le nom nomdelélève1.js pour usage éventuel ultérieur. Il sera désormais possible de mettre en ligne leurs productions, ce qui pour l’instant présente peu d’intérêt vu la brièveté de leur production, mais encore une fois, les bonnes habitudes se prennent tôt...


Fonction d’une variable

Dans le premier exercice, il s’agissait de créer un programme qui, après avoir demandé à l’utilisateur un rayon, calcule et affiche le volume de la boule correspondante. Il se déroule donc en trois étapes :

  1. Entrer une donnée. Il s’agit d’une affectation de variable qui n’est plus faite dans le corps du programme mais après une opération d’entrée.
  2. Calculer le volume à partir de cette donnée. C’est, algébriquement parlant, l’étape la plus intéressante.
  3. Afficher le résultat. Cette opération avait déjà été réalisée lors du TP précédent.

Le fait qu’une opération d’entrée est une affectation de variable a été difficilement perçu par certains élèves. Le choix du texte qui accompagne l’entrée de donnée a été souvent particulièrement pertinent quoique parfois entaché de coquilles... De ce point de vue, l’outil informatique est nettement plus pratique que la calculatrice graphique, dont l’outil texte est si pénible qu’on hésite à s’en servir.

Le calcul de volume me semblait a priori l’étape la plus difficile du TP, la syntaxe de JavaScript n’étant pas la plus simple. Une élève a par exemple essayé de taper

  1. v=4*Math.PI*r^3/3

car cette notation lui semblait plus naturelle que

  1. v=4*Math.PI*Math.pow(r,3)/3;

attendue. En réalité c’était visiblement l’étape la plus facile du TP. Ceci est dû à ce que malgré la relative complexité du langage, les élèves n’ont eu qu’à cliquer sur des icônes très parlantes et ne leur restait à faire qu’une retouche sur un texte. Plusieurs élèves ont eu du mal à saisir que le calcul devait correspondre à une affectation de variable (la partie « v= ») et le nom le plus souvent choisi pour la variable contenant le volume a été result ce qui est finalement logique vu le rôle joué par cette variable dans le corps de la fonction. Les erreurs de syntaxe ont été vite corrigées par moi mais ont semblé parfois très mystérieuses pour les élèves. Deux exemples :

  • L’oubli du facteur 4 dans le produit est signalé comme une « erreur de syntaxe » sans plus de détail (mais le numéro de la ligne est donné). Il a fallu que je signale que le signe de multiplication est censé être précédé, et pas seulement suivi, d’un facteur...
  • L’oubli du symbole de multiplication entre 4 et Math.pi donne comme message « il manque » ;« après une instruction », qui là aussi nécessite un peu d’entraînement préalable (au moins à l’algèbre !)

Plusieurs élèves ont été surpris que l’exécution du programme, pourtant sans message d’erreur, ne produise pas d’effet visible : Ils avaient oublié la troisième étape, et s’attendent donc à ce que les affichages de résultat par les programmes soient automatiques... On note que l’oubli de l’affectation d’une variable v (il manque le « v= » au début de la ligne) ne donne aucun signe visible, puisqu’il n’y a pas d’erreur de syntaxe. À cet égard, l’obligation de déclarer des variables comme dans Algobox est une bonne chose (les élèves évoluent dans un cadre restreint qui empêche l’apparition de ce genre d’erreur).

Une erreur non prévue : En cliquant sur « Prompt », l’exemple proposé par CaRMetal est l’affichage d’une chaîne de caractères, entre guillemets. Le remplacement de cette chaîne par « v » (avec les guillemets) provoque alors l’affichage, non pas de v, mais du mot d’une lettre « v », ce qui n’est pas ce que désirait l’élève ! Il y a une distinction à faire entre le nom d’une variable (le texte gravé sur le tiroir) et son contenu (ce qu’il y a dans le tiroir, ici un nombre).

Les élèves qui avaient fait le choix d’utiliser la même variable pour stocker le rayon, le volume et même le résultat de l’affichage (inutile) ont eu du mal à s’en dépêtrer. Le choix de r ou x pour le rayon et V (ou result) pour le volume s’est montré le plus efficace.

Voici un exemple d’une production d’élève, obtenue presque sans aide faute de temps de ma part :

  1. /* Programme volume
  2. Auteur:Noéline
  3. Date:11/09/09
  4. Ce programme est placé sous license CeCILL
  5. Le texte de cette licence peut se lire ici:
  6. http://www.cecill.info/License CeCILL V2-fr.html */
  7. //fonction d'une variable
  8. x=Input("Entrer le rayon d'une sphère");
  9. v=4*Math.PI*Math.pow(x,3)/3;
  10. Prompt(v);

Télécharger

(le commentaire est une production spontanée de l’élève).


Fonction de deux variables

Le seul solide classique dont le volume s’obtient à partir d’une seule variable est la boule, en raison de son extrême symétrie. Pour le cas d’un cône, le TP commençait par une question de cours [1] puis un travail analogue au précédent mais avec l’entrée de deux variables. Mais pris par le temps, la moitié des élèves n’ont pas pu faire cette partie du TP. Voici ce que l’un des rapides à réussi à faire :

  1. r=Input("entrer un rayon r, en centimètres");
  2. h=Input("entrer un autre nombre, une hauteur h, en centimètre");
  3. v=Math.PI*Math.pow(r,2)*h/3
  4. Prompt(v);

Télécharger

La notion de fonction de deux variables a paru très naturelle en cours, où j’ai signalé que le pgcd est une fonction des deux entiers auxquels on s’intéresse.


Évaluation du TP

L’évaluation par compétences de ce TP a été suffisamment simple pour être faite pendant le déroulement même du TP, en cochant des cases sur un fichier au format OpenOfficeCalc (tableur). Ce qui a notamment permis de rédiger ce compte-rendu le soir même du TP. Mais le temps ayant manqué pour faire la deuxième partie du TP, seuls l’exercice 1 et la question de cours ont été notés.

Avec ça le diagramme en bâtons des notes est plutôt flatteur :

Le corrigé du TP figure partiellement dans le cours sur les fonctions. La notion de concaténation de chaînes n’a pas encore été abordée, faute de temps.


Conclusion

Ce TP est un peu trop long (il faudrait compter environ une heure 5 ou une heure 10, ou enlever les remarques sur l’en-tête). Il serait intéressant de comparer avec la durée d’un TP analogue à celui-ci sur calculatrice.

L’aspect algébrique, particulièrement important dans ce contexte [2], a été bien géré par les élèves.

La notion d’affectation de variables est visiblement plus complexe à appréhender que prévu, le simple changement de contexte ayant tendance à faire oublier qu’un calcul en JavaScript, est avant tout la modification d’une variable.

Il se montre nécessaire de faire des TP courts et de s’entraîner avant à gérer les erreurs de syntaxe. Le même problème s’était posé les années précédentes avec les calculatrices graphiques, où les messages d’erreurs se terminent systématiquement par un choix entre « GoTo » et « Cancel », les élèves optant sans hésiter pour la deuxième option, et préférant appeler le prof que d’essayer de trouver ce qui ne va pas.

Les deux principaux buts de ce TP (révision des formules de volume, et présentation des fonctions comme machines à transformer un nombre en un autre nombre) ont été atteints de façon plutôt satisfaisante.

La meilleure illustration de l’enthousiasme des élèves pour ce TP est cette question posée par l’un d’eux : Comment trouve-t-on le code unicode pour le symbole de l’infini ?


Pour comparer

Voici la version Algobox de la solution du premier exercice, donnée ici à titre de comparaison :

Présentation de l'algorithme :

Version Algobox du premier des deux exercices ci-dessus.

Tester l'algorithme :


(cliquer sur le bouton ci-dessus pour lancer ou relancer l'exécution de l'algorithme)
Remarque : si les messages "Algorithme lancé" et "Algorithme terminé" n'apparaissent pas au bout d'un moment dans la zone ci-dessous, c'est que l'algorithme contient une erreur.

Résultat :

Code de l'algorithme :
VARIABLES
  rayon EST_DU_TYPE NOMBRE
  volume EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
  LIRE rayon
  volume PREND_LA_VALEUR 4*Math.PI*pow(rayon,3)/3
  AFFICHER volume
FIN_ALGORITHME

le TP suivant (numéro 4)


[1Les ordinateurs de la salle où s’est déroulé le TP n’étaient pas connectés à Internet

[2exemples d’exercices faits en module : calculer $\frac{1+\frac{1}{5}}{1+\frac{1}{4}}$, ou dire ce que contient la variable x=2+3*4


Commentaires