Objectifs du TP
Il s’agissait d’introduire
- La géométrie repérée, l’un des exercices nécessitant la lecture de coordonnées de points sur la figure finie.
- La notion de boucle à nombre prédéterminé d’exécutions.
- Une révision discrète sur les fonctions affines.
Tout ça fait rétrospectivement un peu beaucoup...
Pour commencer, une explication au tableau :
On souhaite tracer le cercle dont le centre a pour coordonnées (0,1 ;0,01) passant par l’origine ; l’ordonnée a été calculée auparavant comme étant le carré de l’abscisse.
Mais on voudrait aussi avoir sur la même figure, le cercle dont le centre a pour coordonnées (0,2 ;0,04) et passant lui aussi par l’origine,
et aussi celui de centre (0,3 ;0,09) passant par l’origine,
etc.
Peut-on faire ceci avec un CarScript ?
En réponse aux soupirs découragés des élèves (« ce serait bien que JavaScript fasse tout ça automatiquement ») les termes de boucle et d’indice ont été introduits, puis le sujet du TP distribué. Le voici [1] :
Première boucle
Le premier exercice, fait correctement, donne ceci :
Mais si un élève oublie un « = » dans la deuxième partie de la déclaration de la boucle, ce qui fait qu’au lieu d’aller jusqu’à 20, i va jusqu’à 19, le résultat, bien que peu visible sur le script lui-même, se voit immédiatement sur le résultat :
La majorité des élèves semble préférer tout taper au clavier que cliquer puis modifier ce qu’ils obtiennent. C’est sans doute dû au fait qu’en l’occurence ils avaient un texte à recopier.
Par contre, très peu d’élèves pensent à cliquer sur le bouton « undo » pour vider la figure avant de réessayer. Il y en a même eu qui effaçaient les points un à un avec l’outil « poubelle » de CaRMetal ! Le fait que lorsqu’on essaye plusieurs fois le script, les objets deviennent de plus en plus nombreux et chargent la mémoire de l’ordinateur, est plutôt bénéfique puisqu’il « punit » ceux qui préfèrent cliquer avant de réfléchir...
Bien qu’ils aient entendu parler de l’instruction « Pause » pour voir ce que donne le script, aucun élève ne l’a utilisée. D’ailleurs peu d’entre eux ont pensé à réduire la fenêtre JavaScript pour voir en « live » l’exécution du script.
Par contre le relevé des coordonnées du point le plus à gauche de la figure a été en général correct, puisque souvent les élèves savaient ce qu’ils étaient censés trouver.
Nuage de points
Bien qu’on sorte ici du cadre des CarScripts, 9 élèves ont trouvé le bon intervalle $[-4 ;4[$ alors que 8 ont donné à la place $[0 ;100[$ et même 8 d’entre eux ont donné $[0 ;+\infty[$ sans doute à cause de la borne supérieure non comprise.
9 élèves ont pensé au lien avec une fonction affine, dont 3 ont su donner la fonction $x \mapsto \frac{x}{2}+1$. Outre les classiques disciples de Jacques II de Chabannes de La Palice (« ils sont alignés car ils sont sur une même droite »), deux élèves ont estimé que « quand il y a un ++, les points sont forcément alignés ». Les mécanismes de création d’erreur sont donc très similaires en programmation et en géométrie.
Tableau de fils
Le tableau de fils était donné sur l’énoncé, avec la tâche de le reproduire. Bien que les enveloppes soient courbes [2], tous les élèves ont vu qu’il s’agissait de tracer une famille de segments, sauf un, qui après coup a fait chez lui ceci :
a=Point(-10,0);{
b=Point(0,-10);
c=Point(0,10);
d=Point(10,0);
f=Point(-10,10);SetHide(f,true);
i=Point(-10,-10);SetHide(i,true);
l=Point(10,10);SetHide(l,true);
m=Point(10,-10);SetHide(m,true);
v=Circle(f,a)
n=Circle(i,b);
u=Circle(m,d);
r=Circle(l,c);
s=Segment(c,b);
s=Segment(a,d);
o=Point(0,0);
for(g=-10,0;g<=0,0;g=g+1);
x=g/10;
y=Math.pow(x,2);
u=Point(x,y);
//à multiplier et à modifier pour obtenir tout les points.
}
La boucle a visiblement été inspirée de l’exercice 1, et on voit surtout la réticence à faire exécuter une boucle (il aurait par exemple été possible de regrouper les 4 cercles dans une boucle). On voit également spontanément apparaître une utilisation des commentaires qui est apparemment classique chez les programmeurs, pour rappeler en quoi le programme (jugé, à juste titre, inachevé par l’élève) doit être amélioré. Le script en question donne la figure suivante :
La difficulté de cet exercice est double :
- Pour tracer les segments, il faut lire les coordonnées de leurs extrémités, à partir de la donnée des coordonnées des points les plus extrêmes de la figure.
- Ensuite il faut trouver comment construire la (les) boucle(s).
Déjà, la première étape fut jugée difficile par les élèves, qui ont vite perçu que les coordonnées des points étaient entières et que l’une d’entre elles était nulle, mais beaucoup d’entre eux confondent l’abscisse et l’ordonnée ou se trompent dans le sens des axes...
Et beaucoup d’entre eux ont dit n’avoir pas bien saisi ce qu’est une boucle.
Le processus d’apprentissage de la notion d’itération est analysé en détail dans cet article qui est un « must » (voir en particulier l’onglet 3).
Une explication possible à cette difficulté de percevoir que l’indice va de -20 à 20, est le fait que les élèves qui ont le plus de difficulté perçoivent mal que, en ajoutant 1 à -20, on obtient -19... Ainsi l’exercice sur le nuage de points faisait appel à des nombres pseudo-aléatoires et n’utilisait pas l’indice. Beaucoup d’élèves ont compris qu’on avait construit 100 points placés aléatoirement et tenté de s’en inspirer pour faire un tableau de fils pseudo-aléatoire...
Ainsi, un exemple typique est celui-ci
o=Point(-10,0);SetHide(o,true);
p=Point(10,0);SetHide(p,true);
s=Segment(o,p)
for (i=0; i<10; i++){
q=Point(0,-10);SetHide(q,true);
r=Point(0,10);SetHide(r,true);
s=Segment(q,r)
}
où on se contente de créer 11 fois le même segment (dont 10 dans la boucle), faute d’avoir songé à utiliser l’indice dans le corps de la boucle...
Voici un exemple de ce qui a été produit par un groupe de deux élèves [3] :
for(i=0;i<=10;i++){
a=Point(i,0);
b=Point(0,i);
s=Segment(a,b)
}
La figure obtenue est la suivante :
avec la nette impression qu’on n’est pas loin de la solution.
Conclusions
Il résulte de cette expérience pas très heureuse que les boucles devraient être vues
- Plus tard dans l’année, non pour une question de maturité mais parce que les généralités doivent être bien maîtrisées par les élèves pour se concentrer sur la difficulté que représente la gestion de l’indice et ce qui en dépend : Une boucle c’est une affectation successive de la variable indice, et ne peut être appréhendée que par un élève qui sait bien ce que signifie le mot « affectation ».
- Dans des exemples presque vides où on se contente d’afficher les valeurs successives de l’indice, éventuellement avec des « Pause ».
Dans cette optique, j’aurais du utiliser l’instruction « Move » de CaRMetal, qui, combinée avec « Pause » et l’affichage des coordonnées du point, aurait permis d’insister à la fois sur l’aspect dynamique des boucles, et sur les coordonnées...
- Après des révisions sur l’addition des relatifs, puisque ce semble être le principal mécanisme de blocage chez les élèves les plus en difficulté...
L’impression qui se dégage de tout ça est que, parce qu’une boucle est une répétition d’affectations dynamiques d’une variable, tout élève qui a mal perçu l’aspect dynamique des modifications de variables, aura aussi du mal à exploiter des boucles. C’est à ce stade que l’hétérogénéité des élèves commence à se manifester, et l’évaluation de l’algorithmique au futur bac STG promet des sueurs froides...
Postface
Le contôle qui a suivi ce TP est téléchargeable ci-dessous (au format pdf). Seul l’exercice 2 portait sur JavaScript. Il est en deux parties, une facile (parce que déjà faite en classe), portant sur l’écriture en ligne, l’autre plus difficile car portant sur les boucles.
Or l’exercice facile a été peu réussi, plusieurs élèves ayant répondu 24 (il y a même eu un -4, ?) et peu d’entre eux ayant pu expliquer pourquoi b=3,3 avec le calcul de fraction qui était demandé.
Quant à la deuxième partie, elle a surtout révélé que la notion de boucle n’est toujours pas saisie. Voici une ébauche de corrigé :
i | x |
1 | 2+2=4 |
2 | 4+4=8 |
3 | 8+6=14 |
Or pas un seul élève n’a trouvé x=14 à la fin. Les causes d’erreurs sont multiples :
- La réponse i=3 a déjà été plus rare que la réponse i=2. Au moins un élève a vu dans "i<=3" un $i<3$ au lieu de $i\leqslant 3$. Au moins un autre a cru au contraire que le plus grand entier inférieur ou égal à 3 est 2, et ignorait donc que $3 \leqslant 3$...
- Souvent i=2 était associé à x=8 mais pas toujours.
- L’instruction x=x+2*i a été parfois vue en-dehors de la boucle ; avec i=3 ça donne x=2+2*3=2+6=8 (énoncé mal conçu : Deux causes différentes d’erreur donnant la même erreur).
- Visiblement le fait que la valeur de x qui est utilisée dans le calcul de la boucle change tout le temps est une difficulté supplémentaire : Celle de trop ?
- Beaucoup d’élèves n’ont même pas compris que quand on arrive à la fin de la boucle on recommence au début, bref le concept même de boucle n’est pas perçu. L’un d’eux a tout de même développé une vision statique de la boucle, comme si i était égal simultanément à 1, 2 et 3. Ce qui ne l’a pas aidé à trouver la valeur de x mais cet élève semble être fait pour programmer en SciLab...
Bref l’utilisation de boucle pour calculer la somme des premiers entiers est loin d’être aussi naturelle que prévue...
L’article qui va sans nul doute devenir un « best downloader »
Commentaires