TP 5 d’algorithmique avec CaRMetal en Seconde

lundi 14 décembre 2009
par  Alain BUSSER

Comme le rappelle le document d’accompagnement sur l’algorithmique en Seconde, le calcul de médiane est une bonne occasion pour introduire les algorithmes de tri. Toutefois

  1. Les algorithmes de tri sont complexes et ont peu de chances d’être au programme d’algorithmique dans le futur ;
  2. JavaScript possède déjà un algorithme de tri (quicksort) ;
  3. trier un tableau suppose qu’on manipule un tableau et donc qu’on fasse du « JavaScript de pointe » ; ou qu’on utilise un langage spécialisé dans les tableaux comme Scratch ou SciLab ; et dans ce cas un tableur est préférable.

Par conséquent un « simple » calcul de moyenne a été choisi : Il permet d’éviter l’usage de tableaux.

Pour calculer la somme des distances (numérateur de la moyenne) un exemple avait été donné en DS peu avant [1] :

contrôle pour préparer le TP

Pour un exemple d’utilisation de tableaux en JavaScript, on pourra consulter ce sujet de TP du bac S. Ceci dit, la figure ci-dessous a également été produite par un tableau (pour faire l’histogramme).

Le sujet du TP était le suivant :

le sujet du TP

La figure n’est pas si évidente à construire, mais grâce à CaRMetal, il a été possible d’assujettir un point à évoluer dans un carré sans jamais en sortir (la manip avait été vue dans les exercices de géométrie dans l’espace).

La possibilité de faire bouger le point M dans le carré est également offerte à JavaScript via le script donné dans l’énoncé. Une simulation sur quelques milliers de lancers (c’est long) donne cette figure :

le script de l’histogramme

  1. var histo=new Array();
  2. for(x=3.1;x<=4.4;x=x+0.1){
  3.         n=Math.round((x-3.1)*10);
  4.         histo[n]=0;
  5.         a=Point("A"+n,x-5,0);SetHide(a,true);
  6.         b=Point("B"+n,x-4.9,0);SetHide(b,true);
  7.         c=Point("C"+n,x-4.9,0);SetHide(c,true);
  8.         d=Point("D"+n,x-5,0);SetHide(d,true);
  9.         p=Polygon("Rect"+n,"_a,_b,_c,_d");
  10. }
  11. for(i=1;i<=4000;i++){
  12.         Move("M",3+Math.random(),1+Math.random());
  13.         x=GetExpressionValue("d");
  14.         n=Math.floor((x-3.1)*10);
  15.         histo[n]++;
  16.         for(j=0;j<14;j++){
  17.                 Move("C"+j,3.1-4.9+j/10,histo[j]/i*20);
  18.                 Move("D"+j,3.1-5+j/10,histo[j]/i*20);
  19.         }
  20. }

Télécharger

histogramme

L’histogramme, autant que la densité théorique [2] montre que la fréquence des distances OM possibles est assez complexe !

D’ailleurs la valeur exacte de la distance moyenne sur le carré n’est pas très simple, comme le suggère la réponse donnée par wxmaxima :

Remarque : Ce n’est pas la distance du centre du carré à l’origine, laquelle est environ égale à 3,807886552931954 toujours d’après wxmaxima.


Déroulement du TP

Malgré un certain entraînement lors de séances sur la géométrie dans l’espace, il faut environ 20 minutes pour construire la figure (avec M lié au carré). Ensuite l’écriture du script pour faire bouger M est assez rapide, ce qui laisse une demi-heure pour trouver comment calculer la moyenne des 100 valeurs. La tâche est loin d’être aussi aisée que prévue ! Toutefois, la plupart des élèves comprennent qu’il faut d’abord calculer une somme puis la diviser par 100, et que la difficulté réside dans le calcul de cette somme. Plusieurs ont même vu que pour additionner 100 nombres, il faut commencer par additionner les deux premiers, puis additionner le troisième à la somme partielle, etc. ce qui du point de vue algorithmique est une réussite. Par contre concrétiser cette idée n’est pas si facile, surtout d’ailleurs pour ceux qui l’ont eue...

Quelques attitudes constatées :

  • Javascript est si puissant qu’il doit bien avoir une instruction « somme des 100 nombres » : Alors on essaye de trouver, par tâtonnements, la syntaxe de cette instruction. Fou rire garanti pour le prof.
  • Il suffit d’afficher une volonté pour que celle-ci se réalise : Alors on entre Alert(« somme des 100 nombres ») et on est déçu parce que ça ne fait qu’afficher un texte, et pas réaliser ce qu’il dit. Cela semble résulter d’une confusion entre le langage JavaScript et le métalangage de l’algorithmique.
  • À l’inverse, un élève a réussi à calculer la moyenne mais ne s’en est pas rendu compte parce qu’il a oublié le « Println(somme/100) » final...
  • Plusieurs ont copié le contenu de la fenêtre de sortie (les 100 nombres) et l’ont collé dans l’éditeur de programme. Ils n’ont pas eu le temps d’insérer les 99 signes d’addition... Cette démarche rappelle l’attitude de certains élèves devant un tableur : Calcul de dizaines de données à la main et écriture des résultats l’un après l’autre dans le tableur...

Voici les productions de deux voisines :

  1. var resultat=0;
  2. for(i=0;i<100;i++){
  3. Move("M",3+Math.random(),1+Math.random());
  4. d=GetExpressionValue("d");
  5. resultat=resultat+d;
  6. Println(resultat/100);
  7. }

Télécharger

(juste, mais produit 100 valeurs qui sont les moyennes partielles, et dont seule la dernière est la bonne)

et

  1. var resultat=0;
  2. for(i=0;i<100;i++){
  3. Move("M",3+Math.random(),1+Math.random());
  4. d=GetExpressionValue("d");
  5. resultat=resultat+d;
  6. }
  7. Println(resultat/100);

Télécharger

qui correspond mieux à ce qui était attendu.

Voici la production de l’élève le plus rapide :

  1. var somme=0;
  2. for(i=0;i<101;i++)
  3. {
  4.     Move("M",3+Math.random(),1+Math.random());
  5.     d=GetExpressionValue("d");
  6.     somme += d;
  7. }
  8. Prompt(somme/i);

Télécharger

(l’usage de la notation « somme+=d » et de l’antique « Prompt » au lieu de « Alert » montre que cet élève connaît par cœur la syntaxe de JavaScript vue dans les TP précédents). On constate l’erreur dans la boucle, la somme portant sur 101 valeurs et étant divisée par 100. Une autre erreur intéressante a été faite par un autre élève le week-end suivant : Calcul de la somme au lieu de la moyenne (oubli de la division par 100).

La première partie du TP (recherche des distances minimale et maximale) peut servir à introduire le cours. Il n’y a pas de petit profit... Par ailleurs, l’histogramme des moyennes donné par le tableur de GeoGebra

montre même avec peu de données [3] que les moyennes sont plus tassées que les distances elles-mêmes (les deux bâtons verts représentent les données extrêmes), ce qui plus tard pourra introduire le cours sur la loi des grands nombres (stabilité des moyennes).

Conclusions

  1. Le calcul d’une somme par création d’une variable et boucle est visiblement plus complexe que prévu : L’usage du tableur est nettement plus naturel pour les élèves que celui d’un langage de programmation, même pour ceux qui sont passionnés de programmation...
  2. Par conséquent le calcul de moyenne par algorithme est compliqué en Seconde.
  3. Pour autant, ce TP en valait la peine parce qu’en mettant les élèves en situation active (sollicitation de leur connaissance procédurale sur les moyennes) il consolide la définition d’une moyenne et le sens de l’addition de grandes quantités de termes, notions suffisamment fragiles pour qu’on ait besoin de les consolider...
  4. L’habillage géométrique de cet exercice de statistiques explique grandement le succès de ce sujet de TP (réaction d’un élève : « Ah bon, on peut faire des statistiques en géométrie ? ») au point que l’association géométrie-probabilités justifie à elle seule le choix de l’outil CaRMetal+JavaScript.
  5. L’utilisation d’un algorithme de tri pour calculer une médiane semble exagérée en classe de Seconde...

[1Le corrigé de l’exercice 2 de ce contrôle est ici.

[2donnée ici sous forme d’un lieu et pas de l’expression analytique d’une fonction, trop complexe car donnée sous la forme d’une primitive et en plus, définie par intervalles.

[3dont certaines sont peut-être fausses car limitées à la lecture d’une distance, et non de la distance moyenne


Commentaires