Mathématice, intégration des Tice dans l'enseignement des mathématiques  
Sommaire > N°46 - septembre 2015 > Algorithmes et codage au Collège

Algorithmes et codage au Collège
L’affectation dans les manières affaiblit les grâces et la beauté.
Moteur de recherche
Mis en ligne le 27 juillet 2015, par Alain Busser, Patrice Debrabant

Dans les projets de programme du collège, il est prévu que les professeurs de mathématiques enseignent, de la 5e à la 3e, la programmation et l’algorithmique.
C’est dit, mais cela va sans dire, le sujet soulève un certain nombre de questions (voire de boucliers). Dans cet article, on se propose de parcourir ce nouveau continent [1] et d’y poser quelques balises.
La réflexion s’appuiera sur des expériences menées en classe de collège ou lycée dans le passé, ou imaginées dans un futur pas si lointain, la forme choisie étant celle de l’anticipation dans un récit animalier.

Note : Les citations qui ressemblent à des parodies de pédagogisme sont extraites sans modification du projet de programme tel qu’il est rédigé.

Attention : Les fichiers ci-dessous, créés pour l’écriture de cet article, datent un peu, et les logiciels présentés ont évolué vers des versions encore plus adaptées à l’enseignement des algorithmes au collège. CaRMetal a une tortue améliorée et Sofus (cliquer sur "clone or download") dispose de tortues et de fractions, ce qui est inédit en programmation graphique : On peut additionner des fractions en déplaçant des blocs !

interpréteur Sophus CaRMetal 4.1.3
HTML - 27.8 ko
Sophus en ligne
à ouvrir dans un autre onglet pour tester les scripts Sophus
Java Archive - 3.3 Mo
CaRMetal 4.1.3 portable
Archive java (fichier jar) du logiciel sans les bibliothèques

Cet article peut être librement diffusé et son contenu réutilisé pour une utilisation non commerciale (contacter les auteurs pour une utilisation commerciale) suivant la licence CC-by-nc-sa (http://creativecommons.org/licenses/by-nc-sa/3.0/fr/legalcode)

Voir aussi

NB : Sur certains navigateurs, un menu fantôme se balade au gré de ses caprices. C’est la conséquence de l’aspect "multimedium" de cet article. Pour renvoyer ce menu à sa place, n’hésitez pas à recharger la page (ou à « jouer » à enrouler/dérouler les blocs déroulants au dessus de la partie en lecture).


I) Nouveaux programmes

Et ce qui devait arriver arriva : au nom de l’égalité des chances, on avait décidé que tous les animaux de la ferme suivraient un cursus identique au collège unique.

On avait aussi changé les programmes pour être plus en phase avec le monde moderne.
Certains professeurs avaient argué que c’était un peu précipité, et qu’ils n’étaient pas préparés. Qu’à cela ne tienne : le Rectorat avait fixé leur rentrée au 20 août.

Les professeurs de mathématiques étaient promus profs de MeC (maths et codage). Cette promotion n’était accompagnée d’aucun avantage. Elle donnait seulement le droit et l’obligation d’enseigner le codage.
M. Robert Brichemer le cerf, prof de MeC, avait été désigné volontaire [2] pour assurer une formation accélérée sur l’algorithmique et la programmation.
Dans son introduction, il avait décidé d’analyser les nouveaux programmes.

Analyse des nouveaux programmes

Pour commencer, prêtons-nous un instant au petit jeu de « l’analyse lexicométrique » (qui consiste à compter les occurrences d’un mot) :

Dans les nouveaux programmes du collège / cycle 4, les mots algorithme et algorithmique apparaissent 2 fois (hormis le titre), alors que programme, programmer ou programmation apparaissent 5 fois (hors titre toujours).
De même, le mot affectation n’apparaît jamais et le mot variable, qu’une seule fois. Alors que la partie "algorithmique" du programme du lycée cite 16 fois les mots algorithme et algorithmique mais une seule fois le mot programme.
De plus, toujours en lycée, on dit que "Ce qui est proposé dans le programme est une formalisation en langage naturel" et qu’on le fait "en opérant essentiellement sur des nombres entiers" [3].

En résumé, les nouveaux programmes du collège semblent pencher du côté de la programmation plutôt que du côté de l’algorithmique.
Essayons de préciser cette distinction.

  1. Qu’est-ce qu’un algorithme ?
  2. Qu’est-ce qu’un programme, ou plutôt que doit-on entendre dans le verbe programmer ?

Selon wikipedia, "Un algorithme est une suite finie et non ambiguë d’opérations ou d’instructions [4] permettant de résoudre un problème".

Parmi les algorithmes les plus réputés, on peut citer :

  • l’algorithme d’Euclide, qui sert à calculer un pgcd ;
  • l’algorithme de Heron, qui sert à calculer une racine carrée ;
  • l’algorithme de dichotomie, qui sert à résoudre une équation.

Fondamentalement, et historiquement, un algorithme existe pour résoudre un problème.
Et on peut lui imposer de s’arrêter après un nombre fini d’étapes d’exécution.

— « Attends un peu », dit Scipion l’okapi, en rajustant son képi, qui c’est qui définit un algorithme comme ça ?
— Donald…
— Le canard ?
— ...Knuth, LE grand spécialiste de la question.
— C’est un boxeur ton Knuth-l’uppercut ?
— Non il est plutôt virtuose du clavier que du bris de clavicule.
— Parce que pour "vaincre un adversaire en lui imposant une domination corporelle symbolique et codifiée" on utilise un algorithme (sport) qui est défini comme "un ensemble de prescriptions et de règles qui définissent « ce qu’il faut faire » et « dans quel ordre » pour résoudre un problème".
— Tiens c’est marrant, le sport de combat c’est comme les MeC alors.

Cela donne une ligne directrice au concept d’algorithme, même si on peut aussi lui faire endosser une définition plus large et plus souple en se basant plutôt sur sa structure que sur son résultat : un objet organisé comme un algorithme sera lui-même considéré comme un algorithme (au sens large). Cette définition est assez naturelle, on voit bien de quoi il s’agit.

Quand un algorithme (au sens large) est implémenté dans un langage informatique particulier, il se traduit par un programme dans ce langage.
La distinction est assez claire pour le substantif programme.
Mais le verbe programmer induit, lui, un petit glissement de sens. Tout se passe un peu comme si on se mettait dans la situation de celui qui écrit un programme et observe son résultat. L’objectif n’est pas fondamentalement de résoudre un problème, mais plutôt d’explorer un univers régi par des règles.

De notre analyse lexicométrique des nouveaux programmes du collège (et de leur analyse, sur laquelle nous reviendrons), on serait donc tenté de déduire que l’accent sera donné aux activités d’exploration et d’appropriation des outils plutôt qu’aux implémentations d’algorithmes stricts, qui relèveraient plutôt du lycée.
Cette perspective s’inscrit assez naturellement dans la théorie d’apprentissage de Seymour Papert.

Il s’agit probablement là de montrer que lorsque deux "opérations plastiques" sont effectuées l’une après l’autre, l’effet obtenu caractérise une nouvelle opération, qui dépend de l’ordre dans lequel les opérations élémentaires sont effectuées.

Mme Laure Ney la taupe, prof d’arts plastique, assistait à la présentation. Interpelée par le terme "plastique", dont elle se considérait propriétaire, elle susurra :

— Oui oui. Dans notre travail créatif, dans les arts plastiques, on distingue la "transformation de la matière (relations entre matière, outil, geste, forme, fonction dans le processus de réalisation)", de "l’objet comme matériau (transformation, sublimation, citation, détournement ; effets de décontextualisation, recontextualisation)".
Pas besoin d’ordinateur pour programmer. Un petit agenda suffit !

II) Algorithmes en langage naturel

A 12h00, monsieur Brichemer rejoignit M. Scipion Dugard l’okapi au réfectoire.
Scipion Dugard était prof d’EPS et un peu touche à tout. Il voulut savoir ce qu’était un algorithme. M. Brichemer lui donna quelques exemples en langage « naturel ».

Algorithmes en langage naturel

Voici un algorithme écrit en « langage naturel » :

Saisir x
Incrémenter x
Doubler x
Afficher x

Selon un autre « langage naturel », on pourra séparer les instructions par une virgule (et éventuellement un saut de ligne en plus, mais uniquement pour la lisibilité).
Par conséquent, le même algorithme pourra s’écrire :

Saisir x ;
Incrémenter x ; Doubler x ;
Afficher x ;

Cet algorithme affiche le double de la somme du nombre saisi et de 1 (on appelle ce genre de programme de calcul une fonction affine).

La différence entre les deux langages naturels apparaîtra plus clairement si on utilise un bloc d’instructions :

Ainsi, l’algorithme suivant :

Saisir x
Saisir y
Répéter deux fois
        Tripler x
        Incrémenter y
Afficher x
Aficher y

pourra être écrit selon la deuxième syntaxe :

Saisir x ; Saisir y ;
Répéter deux fois {
        Tripler x ;
        Incrémenter y ;
        }
Afficher x ; Afficher y ;

Cet algorithme affiche le nonuple du nombre saisi dans x et la somme du nombre saisi dans y et de 2.

Comme on le verra plus loin, la première syntaxe est proche de celle des langages Python et Sophus tandis que la deuxième syntaxe est proche de celle de JavaScript (et de nombreux autres langages de programmation).

— Tu étais obligé de donner des exemples avec des calculs ?... tu vas me couper l’appétit... soupira monsieur Dugard

— Une recette de cuisine, c’est un algorithme, si tu préfères.

— Ah bon ! Mais il fallait le dire tout de suite.

Monsieur Dugard lança à la cuisinière :

— Il est bon l’algorithme, aujourd’hui ?

III) Langages naturels -> langages de programmation

A) Sans affectation et sans boucle / instruction conditionnelle dans un contexte géométrique

Les algorithmes de monsieur Jourdain

Un certains nombre d’activités proposées traditionnellement au collège peuvent être interprétées comme des activités algorithmiques :

  • Dans le domaine numérique, l’application d’un programme de calcul correspond à l’application d’un algorithme (le problème à résoudre étant le calcul de la fonction).
  • Les "critères de divisibilité" par 2, 3 et 5 sont des algorithmes (destinés à trancher la question de la divisibilité).
  • Dans le domaine géométrique, l’énoncé qui permet de construire une figure est un algorithme (le problème à résoudre étant la construction de la figure). Si on restreint les outils, on peut par exemple s’intéresser aux constructions à la règle et au compas.
    L’exercice peut consister à appliquer l’énoncé, ou à l’écrire en respectant une syntaxe plus ou moins précise.

Les algorithmes plus élaborés (visés implicitement sous le terme d’algorithme) sont ceux qui font appel à un système régulé de répétitions et de branchements conditionnels.

1) Exemples GéoTortue

Une semaine plus tard, c’était la rentrée des élèves.

Lorsque Tom la tortue osa enfin rouvrir timidement un œil, la forme, immobile devant lui, et qui l’avait tant impressionné, lui parut être un simple reflet de sa carapace dans un miroir. En effet, le robot stationné devant des yeux avait une forme vaguement hémisphérique :

JPEG - 181.1 ko

Tom se mit à rire d’un rire reptilien : Il avait, ainsi que tous les élèves du collège Paul Bismuth, déjà aperçu ce robot dans le cours sur les droites graduées.

Droites graduées

Les élèves avaient eu l’occasion de travailler sur la compétence " Utiliser les nombres relatifs pour se situer dans l’espace" avec des droites graduées, qui avaient été dessinées par le robot sur des feuilles de papier qu’on leur avait distribuées pour qu’ils travaillent dessus. Lunel le lynx avait jeté un coup d’œil discret sur le robot pendant qu’il dessinait ces axes, et il avait vu que le programme donné au robot était le suivant [5] :

Ce programme en Logo fait appel à une boucle ("rep" est l’abréviation de "répète") mais cette boucle n’utilisant pas de manière explicite l’indice de la boucle, peut être facilement comprise par des enfants : Pour dessiner 10 graduations, on répète 10 fois l’action de dessiner une graduation. Le dessin d’une graduation (trait horizontal) fait par contre appel au sens de l’orientation et même en ISN, n’est pas aussi facile que la répétition...

Voici une des feuilles imprimées [6] par le robot, récupérée par Monsieur Brichemer le cerf, et encore vierge parce que Bella la belette était absente ce jour-là :

Tom, fait étrange pour une tortue, était en avance au cours de MeC (Maths et Codage), ce nouveau cours qui démarrait en classe de 5e. En effet, de par la lourdeur de sa carapace, il était dispensé de "déplacement de façon autonome dans un milieu aquatique profond standardisé".

— Mais monsieur, je suis une tortue d’eau, avait protesté Tom.

— Peut-être. Mais je ne vois pas comment tu pourrais "construire des points d’appuis efficaces favorisant un déplacement fluide", avait répondu monsieur Scipion Dugard l’okapi, son prof d’EPS.

Tom était donc en avance et attendait les autres, seul avec ce robot qui, petit à petit, lui paraissait de plus en plus familier.

Les autres élèves, ayant fini de "prendre des informations sur soi pour favoriser un déplacement efficace et économique" [7], entrèrent dans la salle de classe, réveillant Tom de ses rêveries.

Il y avait là Juju la poule, Bella la belette, et Diamante la perdrix.
Parmi les garçons, on apercevait Lunel le lynx et Cumulus le mouton.

Addition et soustraction de nombres relatifs

On peut représenter des nombres relatifs par des déplacements de la tortue, la composition des déplacements réalisant une addition [8]. Alors des collégiens trouvent spontanément que

  • Avancer de 20 pixels puis avancer de 30 pixels c’est avancer de 50 pixels ;
  • Avancer de -30 pixels c’est reculer de 30 pixels (notion d’opposé) ;
  • Reculer de -30 pixels c’est avancer de 30 pixels (caractère involutif de l’opposé) ;
  • Soustraire 30 pixels c’est ajouter -30 pixels.
  • L’addition est commutative ;
  • Ce n’était a priori pas évident : L’ordre des opérations aurait pu influencer le résultat, et dans le cas des déplacements ce n’est pas le cas.

Ce genre d’activités menée avec GeoTortue, permet de voir des programmes de 2 instructions, ce qui aide à se familiariser avec la notion de programme et la notion d’instruction. Ainsi que la notion de non-commutativité, car si les deux programmes Logo suivants ont le même effet :

il n’en est pas de même pour ces deux-là (l’un dessine un segment horizontal, l’autre un segment vertical)

Tom était épris de Juju la poule.
Pendant la récréation, celle-ci, qui le trouvait collant, avait appliqué le cours.

— Tu me lâches, stp !

Exemple de transport dans le champ numérique, de la non commutativité

Les deux scripts suivants, programmés en Sophus (présenté plus bas) n’ont pas le même effet :

  1. x := nouvelle Variable 3
  2. doubler x
  3. incrémenter x
  4. montrer x

Télécharger

(donne 7, alors qu’en dessous on a 8)

  1. x := nouvelle Variable 3
  2. incrémenter x
  3. doubler x
  4. montrer x

Télécharger

Ex : Montrer que les deux scripts ci-dessus donnent toujours des résultats ayant une différence de 1.

Remarque : exportés, les scripts ci-dessus donnent ceci :

x = nouvelle variable initialisée à  3
doubler x
incrémenter x
montrer x
x = nouvelle variable initialisée à  3
incrémenter x
doubler x
montrer x

2) Activité CaRMetal sur les algorithmes de construction

Une semaine plus tard, les élèves retrouvaient monsieur Brichemer pour une nouvelle séance de MeC.
Cette fois, ils allaient utiliser le logiciel CaRMetal. Diamante la perdrix avait les yeux qui brillaient.

Ecrire le script d’une figure - parcours progressif d’apprentissage avec CaRMetal (1/2)

La console JavaScript de CaRMetal permet de programmer l’algorithme/l’énoncé d’une figure de façon très claire tout en bénéficiant d’un assistant. L’ensemble est remarquablement intégré : on peut étudier l’interface graphique, puis on passe naturellement aux scripts dans une interface dédiée (la console JS) qui reprend tous les boutons/outils auxquels on s’est habitué.
Dans la version 3.8.7, l’assistant a encore été amélioré pour que cette implémentation soit facilitée pour ceux qui découvrent les scripts CaRMetal. Il y a désormais deux modes (pilotés par un bouton/interrupteur "JS") pour le générateur automatique de CaRCommandes [9]

  • le mode débutant sans JS (mode par défaut)
  • le mode classique avec JS (qui produit une affectation en JavaScript)

Pour faciliter l’apprentissage de la programmation par les élèves de collège francophone, on va utiliser une version modifiée de CaRMetal 3.8.7, nommée CaRMetal 3.8.7-college-fr
Cette version présente les caractéristiques suivantes :

  • un script "classique" de CaRMetal reste opérationnel ;
  • on peut utiliser := plutôt que = pour l’affectation ;
  • on peut utiliser une boucle for simplifiée de la forme suivante : for titi from 2 to 7{} ; ou en français : pour titi allant de 2 à 7{}
  • on peut utiliser une boucle do {} untill () ;
  • on peut utiliser une syntaxe en français ;
  • les CaRCommandes peuvent être écrites en français ;
  • en mode simplifié, l’assistant de script génère une syntaxe en français et des CaRCommandes en français.
  • on dispose de la CaRCommande Point3D (qui sera utilisée plus bas pour réaliser très simplement une figure 3D)

CaRMetal 3.8.7-college-fr est proposé ici sous forme d’un fichier .jar qu’il suffit de télécharger (en cliquant sur l’icône), puis de lancer (java doit être installé sur l’ordinateur).

Java Archive - 3.3 Mo
CaRMetal 4.1.3 portable
Archive java (fichier jar) du logiciel sans les bibliothèques

Avec cette version, on peut par exemple programmer ainsi l’algorithme d’Euclide :

a:=360; b:=150;
faire{
  c:=a;
  a:=b;
  b:=c%b;
} jusqu'à (b==0);
Afficher("PGCD : ");
Afficherligne(a);

Variante plus géométrique :

Point("M",360,150);
MettreMontrerNom("M","vrai");
faire{
   Bouger("M",Y("M"),X("M")%Y("M"));
   Pause(2000);
} jusqu'à (Y("M")==0);

Le mode sans JS permet aussi de bien comprendre le fonctionnement des CaRCommandes, qui est un fonctionnement systématique basé sur les effets de bords [10]
Par exemple, si on appuie sur le bouton "Point", l’assistant génère un code du type suivant :
Point("B",2,5) ;
Ce code peut être interprété comme une instruction informatique : créer un point B en (2,5).
On peut ensuite utiliser ce point B comme centre d’un cercle, par exemple.
On appuie sur le bouton "Cercle-centre-rayon", l’assistant génère un code du type :
CercleRayon("D","G",3) que l’on peut rectifier à la main en CercleRayon("c","B",1.5) ;

Cela permet d’implémenter l’énoncé de la figure de façon simple et précise.
En fait, chaque CaRCommande renvoie le nom de l’objet créé, mais ici on ne récupère pas ce nom dans une variable JavaScript. Car on n’en a pas réellement besoin.
Utiliser une affectation JavaScript est certes commode, mais conceptuellement plus avancé. Il paraît sage et pédagogique de l’éviter au début pour le faire plus tard en conscience.

L’activité suivante a été expérimentée en classe de 6e dans le cadre de l’accompagnement personnalisé (avec CaRMetal version 3.8.7). Elle s’est déroulée sur 10 séances de 55 minutes [11].
L’objectif est de rendre compte d’une figure très simple de géométrie dynamique de quatre façons « équivalentes » :

  • tracé avec les instruments traditionnels ;
  • tracé avec les instruments virtuels ;
  • énoncé de la figure en français ;
  • script CaRMetal de la figure.

On donne une des trois "représentations". L’élève doit construire les autres.
Pour simplifier les choses, le départ de la figure est toujours un triangle ABC, supposé déjà tracé. Cela permet d’éviter une partie répétitive sans intérêt, et surtout le recours aux coordonnées dans le script.

Cette activité est assez "attendue". On peut considérer que l’interface du logiciel TracenPoche, par exemple, invite à la réaliser.
Mais CaRMetal (version 3.8.7-college-fr) permet de lui donner une forme d’accomplissement.

Voici l’activité complète (doc élève) au format pdf [12] :

PDF - 138.5 ko
Activité CaRMetal construction et script

Cette activité permet de pratiquer la géométrie et d’utiliser un logiciel de géométrie dynamique dans un cadre simple. Elle fait le lien entre la géométrie pratiquée de façon traditionnelle et sa transposition dans un espace numérique virtuel.
L’utilité de la rédaction des énoncés en français, souvent considérée comme un peu rébarbative, apparaît ici clairement aux élèves car c’est la base indispensable d’un script réussi.
Cette activité a été appréciée par les élèves (en particulier la partie informatique).

Cette activité peut/va être naturellement prolongée (voir plus loin) pour faire de la programmation dans la même interface, en utilisant (ou pas) les potentialités de la fenêtre de géométrie dynamique.

3) Constructions à la règle et au compas (…)

Dans ce type d’exercice, il s’agit en fait d’écrire un algorithme de construction en respectant certaines contraintes.
On peut le faire en considérant que c’est un cas particulier de l’activité précédente : il suffit de partir de la configuration voulue et de limiter les CaRCommandes que l’on est autorisé à utiliser dans le script.
L’algorithme de construction est un script CaRMetal, que l’on peut valider ou pas.
Pour une construction à la règle et au compas, on imposera d’utiliser exclusivement les CaRCommandes Cercle, Cercle3, Droite, et Intersection.

B) L’affectation est-elle inévitable dans un contexte numérique ? Et dans un contexte géométrique ?

Dans les exemples de programme précédents, associés à un contexte géométrique, on n’a pas écrit d’affectations explicites. Dans un contexte numérique, pourtant plus limité, il apparaît souvent inévitable de faire des affectations, même pour des programmes élémentaires. Comment expliquer ce paradoxe ?

Un programme s’applique à des éléments, et peut créer ces éléments si nécessaire.

  • Dans le cas de Logo, une tortue est un élément. Au départ, on dispose d’une tortue par défaut (Achille), mais on peut en créer d’autres.
  • Dans le cas de CaRMetal, les éléments sont des objets géométriques, que l’on peut créer.

Dans ce contexte, la création est un processus compliqué, masqué à l’utilisateur, qui fait l’objet d’une commande. Et on peut faire des choses intéressantes sans variables.
On a vu précédemment comment écrire le script CaRMetal d’une figure sans faire d’affectation mais de façon comparable. Dans certains cas, on peut même concentrer le script dans une seule CaRCommande.
Ainsi, étant préalablement construits trois points A, B, C, le script suivant construit un orthocentre :

  1. Intersection(Perpendiculaire(Droite("A","B"),"C"), Perpendiculaire(Droite("A","C"),B));

Dans le contexte numérique, les éléments sont des variables, et la création revient à faire une affectation. On est donc tenté de faire de l’affectation une commande centrale, au risque de l’utiliser non plus pour créer un élément mais pour le modifier.
Cette utilisation massive de l’affectation induit une confusion dans le programme et peut générer des erreurs car les variables ainsi manipulées ne sont pas "préservées".

Ou est-ce l’inverse ?

Paradoxalement, on peut aussi soutenir le point de vue contraire.
Les exemples de Sophus montrent que dans le champ numérique on peut faire beaucoup de choses sans affectations : Les affectations de variables numériques servent essentiellement à mémoriser un résultat partiel. Et justement, dans le champ géométrique, cette mémorisation par affectation de variables est vite très pratique. Reprenons par exemple le script CaRMetal « classique » qui permet de construire un orthocentre (ici on mémorise les objets géométriques tout simplement en les nommant) :

  1. Droite("d1","A","B");
  2. Droite("d2","A","C");
  3. Perpendiculaire("d3","d1","C");
  4. Perpendiculaire("d4","d2","B");
  5. Intersection("H","d3","d4");

Télécharger

On pourrait lui préférer son équivalent avec affectation (la mise en mémoire est faite par des créations et initialisations de variables JavaScript) :

  1. d1 := Droite("A","B");
  2. d2 := Droite("A","C");
  3. d3 := Perpendiculaire(d1,"C");
  4. d4 := Perpendiculaire(d2,"B");
  5. H := Intersection(d3,d4);

Télécharger

(C’est un peu moins probant ici car les points A, B, C sont créés dans l’interface et pas par script.)
Le script semble plus simple (mais il faut bien se rendre compte que l’on manipule ici des variables JavaScript qui contiennent des chaînes de caractère) [13].

Pour comparaison, voici un script DrGeo qui ouvre une figure DrGeo initialement vierge, et y place trois points et l’orthocentre :

  1. | maFigure |
  2. maFigure := DrGeoCanvas new.
  3. maFigure segment: 3@3 to: 6@0.
  4. maFigure segment: -3@0 to: 6@0.
  5. maFigure segment: -3@0 to: 3@3.
  6. maFigure
  7. intersectionOf: (maFigure perpendicular: (maFigure segment: 3@3 to: 6@0) at: -3@0)
  8. and: (maFigure perpendicular: (maFigure segment: -3@0 to: 6@0) at: 3@3)

Télécharger

La version avec affectations est évidemment plus simple [14] :

  1. | maFigure A B C d1 d2 H|
  2. maFigure := DrGeoCanvas new.
  3. A := maFigure point: 3@3.
  4. B := maFigure point: 6@0.
  5. C := maFigure point: -3@0.
  6. d1 := maFigure perpendicular: (maFigure segment: A to: B) at: C.
  7. d2 := maFigure perpendicular: (maFigure segment: A to: C) at: B.
  8. H := maFigure intersectionOf: d1 and: d2.

Télécharger

De ce point de vue, les affectations peuvent sembler plus pratiques pour des programmes de construction que pour des programmes de calcul.
Cependant, l’algorithme d’Euclide entre autres, utilise une affectation de variables, et même une affectation simultanée dans la mesure du possible [15].

Le point crucial est de savoir ce que contient la variable.

  • M’sieur, m’sieur ! dit Alain le daim, et comment fait-on en programmation orientée objet ?
  • Les variables sont des objets, donc on affecte un objet à une variable.
  • Oui mais comment on la crée la variable ? N’avez-vous pas dit qu’un objet n’agit que lorsqu’on le lui demande, et que cette demande est faite par l’envoi d’un message ?
  • Effectivement, les programmes du collège parlent d’"échange de messages entre objets", et cette communication est le moyen qui permet d’utiliser un objet et pas seulement de le garder au placard après l’avoir créé.
  • Quel genre de message alors, doit-on envoyer à un objet, pour le créer ?
  • Un message spécial appelé instanciation, qui demande effectivement à l’objet de se créer.
  • Oui mais comment l’objet peut-il entendre ce message s’il n’a pas encore été créé ?
  • Te souviens-tu par exemple du nom de l’entité qui t’as donné l’ordre de venir au monde ?
  • Non, justement, je ne me souviens de rien qui m’ait été dit avant ma naissance.
  • N’as-tu rien appris en SVT à ce sujet ?
  • Si, justement, on nous a appris à "relier le fonctionnement des appareils reproducteurs à partir de la puberté aux principes de la maîtrise de la reproduction" ; je ne suis pas certain d’avoir tout compris d’ailleurs. Mais il me semble que la décision de me faire naître a été prise par mes parents et pas par moi ni qui que ce soit d’autre.
  • Et bien c’est pareil pour la programmation objet : Le message intimant à un objet l’ordre de naître n’est pas envoyé à l’objet lui-même mais à ce qu’on appelle sa classe (informatique).
  • Des classes dans la classe ? C’est très classe, et aussi compliqué que la sexualité avec ses méioses, ses gamètes etc.
  • C’est vrai, et pourtant des langages de programmation très répandus comme Java et Python sont entièrement basés sur cette notion.
  • Logo aussi ?
  • Non, pas Logo, il est trop vieux pour ça.
  • CaRMetal ?
  • Oui, CaRMetal est programmé en Java : Quand on crée un point dans CaRMetal, on crée en réalité une instance de la classe "PointObject".
  • Et Sophus ?
  • Pareil, les variables de Sophus constituent une classe [16], appelée "Variable" (avec une majuscule) et créer une variable se fait en écrivant "nouvelle Variable".
  • Et personne n’a jamais pensé à faire plus simple ?
  • Si, on peut aussi penser à créer un objet au début, qui servira ensuite de prototype et qu’on peut tout simplement copier-coller pour obtenir un objet qui sera personnalisé après sa naissance.
  • Je ne saisis pas la différence.
  • Une classe, c’est un moule ou un gabarit décrivant à quoi ressemble l’objet. Mais la classe n’est pas plus un objet, que la notice de montage d’un meuble n’est un meuble : Essayez de vous asseoir sur la notice de montage ! Par contre en programmation orientée prototype, on ne manipule que des objets, en envoyant au prototype non pas un message de création, mais un message de copie.
  • Y a-t-il un équivalent en SVT ?
  • Oui, la reproduction non sexuée ; dans les deux cas d’ailleurs on parle de clonage.
  • Quel est le rapport entre ces notions abstraites et le cours de maths ?
  • Le programme de maths : "événements liés au déplacement d’un objet, clonage d’un objet"

Pour ne pas être affecté par les affectations

Le langage Sophus a été conçu pour éviter cet écueil (l’utilisation massive des affectations) et induire de bonnes pratiques dans l’écriture d’un programme.
Plutôt que d’affectation, on parlera de définition d’une variable.
Et au lieu d’affectations on privilégiera des opérations "in situ" qui préservent les variables [17]

Voici une séquence possible que permet Sophus ; elle s’inscrit idéalement dans une séquence où des instructions autres que l’affectation ont été utilisées (typiquement des dessins de style "spirographe" en Logo ou le jeu de labyrinthe). Elle est indépendante de la découverte, ou non, des affectations en géométrie parce qu’elle se passe dans le champ numérique sans affectation. On peut tester les scripts avec l’interpréteur en haut de l’article. En cliquant sur "lancer cet algorithme" on effectue le test et en cliquant sur "copier-coller l’algorithme" on obtient une description proche d’un énoncé, que l’on peut après retouche mettre dans son rapport de TP. En effet le CoCon ayant conclu un partenariat avec la firme MicroppleTM, il fallait rentabliliser le contrat en utilisant au maximum, y compris dans les cours de MeC, la suite bureautique iTravailTM, et les élèves devaient rendre sur ENT leur rapport de TP quotidien.

Découverte d’un algorithme

On voudrait savoir combien coûtera un article de 300€ après réduction de 4%. Pour cela on crée une variable de valeur 300, puis on calcule et affiche la remise de 4% :

  1. prix := nouvelle Variable 300 # définition de la variable prix
  2. taux := 4 # définition de la variable taux
  3. multiplier prix par taux pourcents
  4. montrer prix

Télécharger

Cela ne résout pas le problème puisqu’il reste encore à effectuer la soustraction. La variante suivante est donc plus synthétique :

  1. prix := nouvelle Variable 300
  2. taux := 4
  3. diminuer prix de taux pourcents
  4. montrer prix

Télécharger

Pour en faire un algorithme plus classique, on peut ajouter des entrées :

  1. prix := nouvelle Variable
  2. entrer prix
  3. diminuer prix de 4 pourcents
  4. montrer prix

Télécharger

On peut même aider le commerçant à faire toutes ses affiches promotionnelles d’un coup en constituant une liste des prix promotionnels (par empilage successif des prix) :

  1. promos := [ ]
  2. pour p dans [100, 200, 300]
  3. prix := nouvelle Variable p
  4. diminuer prix de 4 pourcents
  5. promos.empiler prix
  6. montrer promos

Télécharger

Monsieur Brichemer était debout devant son bureau. Il impressionnait Tom et les autres élèves non pas parce qu’ils le trouvaient sévère, mais parce qu’ils ne le trouvaient pas très convivial. D’autres profs semblaient partager ce point de vue, en particulier Sue Venance, une vieille chouette, qui enseignait la "production d’une intervention orale continue de cinq à dix minutes" et avait même dit un jour à monsieur Brichemer, en salle des profs : "Robert je ne t’aime pas".
Il faut dire qu’elle était contrariée par la perspective d’avoir à enseigner la "pratique régulière et diversifiée d’écrits, notamment sous une forme numérique" et que ce dernier mot lui donnait des boutons qui ressemblaient à ceci :

Dans un grand silence, alors que les profs regardaient tous Sue et Robert, celui-ci répondit :

« Dans la phrase "Sue n’aime pas Robert, doit-on comprendre
Que Sue n’aime pas la personnalité de Robert ?
Que Sue n’aime pas les mathématiques et étend ce ressentiment à Robert par un raisonnement inductif ?
Cocher la mention correcte. »

Ce qui avait déclenché l’hilarité générale en salle des profs. Monsieur Brichemer était resté de bois.

Exercice hérétique en langage naturel...

Charles le chat avait les pupilles dilatées, il se demandait pourquoi deux scripts qui semblaient identiques n’avaient pas le même effet et s’il devait en tenir compte dans ses algorithmes de chasse aux souris.
Monsieur Brichemer exposait le cours d’une voix inflexible.

Voici un exemple de programme/algorithme chausse-trappe, que l’on s’efforcera d’éviter (l’exercice est théorique et consiste à montrer la chausse-trappe).

Exercice 4 : [18]
On considère l’algorithme [19] suivant, donné en langage naturel :

  1. Saisir x;
  2. Affecter à y la valeur x + 1;
  3. Affecter à y la valeur 2y;
  4. Affecter à y la valeur y – x;
  5. Affecter à y la valeur y – 2;
  6. Afficher y;

Télécharger

1) Traduire cet algorithme en langage naturel par une "procédure de calcul", puis par un programme dans le langage de CaRMetal 3.8.7-college-fr.
2) Tester différentes valeurs et faire une conjecture.
3) Démontrer cette conjecture.

La version Sophus n’est-elle pas plus parlante ?

  1. x = nouvelle Variable
  2. entrer x
  3. y = nouvelle Variable 1*x.valeur
  4. augmenter y de 1
  5. doubler y
  6. diminuer y de x
  7. diminuer y de 2
  8. montrer y

Télécharger

Deuxième jour de soldes avec CaRMetal

Exercice 1 :
Pour les soldes, un commerçant accorde des remises sur ses articles. Il souhaite écrire un algorithme et le programmer pour obtenir le prix réduit.
Voici un algorithme écrit en langage naturel donnant la solution au problème :

Saisir le prix de départ $D$ ;
Saisir le pourcentage de remise $P$ ;
Affecter au montant de la remise R la valeur $D\times\dfrac{P}{100}$ ;
Affecter au nouveau prix N la valeur $D-R$ ;
Afficher N ;

Et voici le programme dans le langage de CaRMetal 3.8.7-college-fr :

  1. D:=Entrer("Prix de départ ?");
  2. P:=Entrer("Pourcentage de réduction ?");
  3. R:=D*P/100;
  4. N:=D-R;
  5. Afficher(N);

Télécharger

Calculer avec ce programme le prix réduit pour un prix de départ de 82 euros et une remise de 34%.

Exercice 2 :
Ecrire l’algorithme en langage naturel et le programme permettant de calculer le pourcentage de réduction connaissant un prix de départ et son prix réduit.

C) Sans boucle / instruction conditionnelle dans un contexte numérique

Aujourd’hui Diamante la perdrix discute avec des anciens élèves du collège Paul Bismuth qui sont maintenant au Lycée Edwy Plenel. Quand elle leur explique que maintenant en MeC on fait des programmes de construction, ils lui disent que ça leur rappelle le brevet des collèges, où il y avait souvent des programmes de calcul.

1) Les programmes de calcul du brevet des collèges avec Sophus

Sujet Polynésie 2015

Tout d’abord, le sujet de Polynésie 2015 :

Voici un programme de calcul.
•Choisir un nombre
•Ajouter 1
•Calculer le carré de cette somme
•Soustraire 9 au résultat.
1.Vérifier qu’en choisissant 7 comme nombre de départ, le résultat obtenu avec ce programme est 55.
2.Lorsque le nombre choisi est −6, quel résultat obtient-on ?
4.Le programme donne 0 pour deux nombres. Déterminer ces deux nombres.

Le plus dur, technologiquement parlant, c’est de trouver comment on fait pour choisir le nombre. Au hasard ? Certes, on peut le faire entrer :

  1. LeNombre = nouvelle Variable
  2. entrer LeNombre
  3. augmenter LeNombre de 1
  4. élever LeNombre au carré
  5. diminuer LeNombre de 9
  6. montrer LeNombre

Télécharger

Pour les questions 1 et 2, les variantes suivantes sont plus simples et évitent l’usage de fenêtres modales :

  1. LeNombre = nouvelle Variable 7
  2. augmenter LeNombre de 1
  3. élever LeNombre au carré
  4. diminuer LeNombre de 9
  5. montrer LeNombre.valeur == 55

Télécharger

  1. LeNombre = nouvelle Variable -6
  2. incrémenter LeNombre
  3. élever LeNombre au carré
  4. diminuer LeNombre de 9
  5. montrer LeNombre

Télécharger

Remarque : Pour simuler la construction de la colonne D du tableau le script suivant fonctionne :

  1. D = [ ]
  2. pour x dans [-0.4..2.4] par pas de 0.2
  3. LeNombre = nouvelle Variable x
  4. incrémenter LeNombre
  5. élever LeNombre au carré
  6. diminuer LeNombre de 9
  7. D.empiler LeNombre.valeur
  8. montrer D

Télécharger

On peut aisément l’enrichir pour qu’il calcule aussi les colonnes A, B et C.

Pour la question 4, Sophus permet de raisonner par tâtonnements en constatant que le tableau du 3 donne déjà une valeur, que celle-là est précédée de valeurs donnant des nombres négatifs, et en se rappelant que -6 donnait un résultat positif : On cherche donc l’autre nombre entre -6 et -0,4 par tâtonnements, en commençant par des valeurs entières pour se faire une idée : Cela s’appelle indifféremment une narration de recherche ou un algorithme... L’activité consistant à traduire en Sophus un programme de calcul est intéressante parce qu’elle révèle les ambigüités du programme de calcul : Ici la deuxième ligne "Ajouter 1" : à qui ? La même ambigüité se trouve dans le sujet du brevet 2015, à la ligne 4 : "enlever 24" d’accord mais à qui ? Et la ligne suivante c’est pareil "enlever le nombre de départ" : à qui ? pour en faire quoi ?

Sujet métropole 2015

Le programme de calcul du brevet 2015 (métropole, juin) est celui-ci :

• Prendre un nombre
• Lui ajouter 8
• Multiplier le résultat par 3
• Enlever 24
• Enlever le nombre de départ

La traduction en Sophus requiert la création d’une copie de la variable de départ, parce que les "opérations plastiques" successives ont tout abîmé la variable de départ :

  1. nombrePris = nouvelle Variable 4
  2. copie = nouvelle Variable nombrePris.valeur
  3. augmenter copie de 8
  4. tripler copie
  5. diminuer copie de 24
  6. diminuer copie de nombrePris
  7. montrer copie

Télécharger

Il a fallu pour mener à bien ce calcul, mémoriser la valeur initiale de la variable : Comme l’avait montré Turing dans son article fondateur de 1936, mener un calcul nécessite souvent une mémoire de travail. Celle-ci est implémentée dans les calculatrices 4 opérations par le bouton M+, et dans les langages de programmation, par une affectation (informatique). Toujours en Sophus, le programme de calcul version affectations devient

  1. x devient 4
  2. y devient x
  3. y devient y+8
  4. y devient 3*y
  5. y devient y-24
  6. y devient y-x
  7. montrer y

Télécharger

Cette notation cache le fait qu’une affectation est une instruction : L’action réalisée par la machine obéissante est de modifier la valeur de x ou y. Par exemple "y devient y+8" est un ordre déguisé : "prends ce qui est dans y, ajoute-lui 8 et remets le résultat dans y". Ce qui se décompose en quatre étapes d’instruction dans la mémoire de travail du programmeur (au lieu de deux si on n’affecte pas) :

  1. extraire (lire) le contenu de la variable ;
  2. se rappeler que c’est 8 qu’on doit lui ajouter ;
  3. effectuer l’addition ;
  4. imposer à y la valeur de la somme obtenue (en fait ça fait deux : Se rappeler qu’on doit faire une affectation et se rappeler quelle variable doit être affectée).

Pour comprendre une affectation, il faut donc beaucoup plus de mémoire de travail que pour effectuer une opération in situ. Ce qui explique peut-être pourquoi la programmation en Sophus a plus de succès même en Terminale, que celle avec d’autres outils... Par contre, stocker en mémoire le nom d’un objet géométrique créé avec CaRMetal sollicite moins la mémoire de travail en raison d’une certaine confusion entre l’objet et son nom, comme on le fait couramment dans le cours avec des "soit la droite d" au lieu de "soit la droite de nom d" ou "soit la droite (AB)" au lieu de "soit la droite passant par A et B" ou plutôt "soit la droite passant par le point de nom A et le point de nom B".

Sujet Maroc 2015

L’exercice 6 du sujet centres étrangers (Maroc) est intéressant parce que, d’une part, les programmes de calcul sont dessinés sous la forme de graphes (similaires aux version CaRMetal et html montrées ci-dessous), d’autre part le second nécessite la mémorisation du nombre choisi, puisqu’on doit multiplier la première somme par le nombre de départ, et qu’avec Sophus celui-ci a été modifié par l’addition de 4. Il y a deux façons plus ou moins naturelles pour faire cela avec Sophus :

1) Créer une copie du nombre de départ avant d’avoir modifié celui-ci. Cette création doit être un clonage et non une simple copie : Si on fait copie = nombre, toute modification ultérieure de la variable nombre se répercutera sur la copie, et ce n’est pas du tout ce que l’on veut. Pour cloner la variable nombre, on doit donc créer une nouvelle variable copie et ensuite l’initialiser à la valeur actuelle de nombre :

  1. copie = nouvelle Variable nombre.valeur

Voici le script correspondant au programme B "façon Sophus" :

  1. #Maroc programme B
  2. nombre = nouvelle Variable 3
  3. copie = nouvelle Variable nombre.valeur
  4. augmenter nombre de 4
  5. multiplier nombre par copie
  6. augmenter nombre de 4
  7. montrer nombre

Télécharger

2) On peut, au lieu de variables, utiliser des nombres, là encore avec copies :

  1. #Maroc programme B
  2. nombre = 3
  3. copie = nombre
  4. nombre devient nombre + 4
  5. nombre devient nombre * copie
  6. nombre devient nombre + 4
  7. montrer nombre

Télécharger

3) On peut dire que le programme B est en réalité une fonction, dont le nombre choisi au départ est l’antécédent, et utiliser une variable locale [20] :

  1. B = (x) ->
  2. y = x
  3. y += 4
  4. y *= x
  5. y += 4
  6. y
  7.  
  8. montrer B(3)

Télécharger

Bien entendu ces problèmes ne concernent pas le premier programme de calcul :

  1. #Maroc programme A
  2. nombre = nouvelle Variable 3
  3. augmenter nombre de 2
  4. élever nombre au carré
  5. montrer nombre

Télécharger

2) Les programmes de calcul du brevet des collèges avec CaRMetal

Voici les mêmes programmes de calcul, mais sans langage de programmation : Il est seulement fait usage des "expressions" de CaRMetal (et notamment les boîtes d’entrée pour le nombre choisi au départ [21]). Il suffit de cliquer sur une des copies d’écran pour la télécharger ce qui permet de l’ouvrir avec CaRMetal :

CarMetal - 3.2 ko
Polynésie 2015
Ouvrir avec CaRMetal pour explorer ce programme de calcul
CarMetal - 3.9 ko
Métropole 2015
ouvrir avec CaRMetal après avoir téléchargé
CarMetal - 2.5 ko
programmes de calcul du brevet Maroc 2015

Soit dit en passant, on peut faire quelque chose de similaire directement en html :

Programme de calcul du brevet Polynésie 2015

  • Choisir un nombre:
  • Ajouter 1:
  • élever la somme au carré:
  • Soustraire 9:

La "page html" ci-dessus réagit au lâcher de clavier, il suffit donc de modifier le nombre choisi au départ à l’aide du clavier pour en voir l’effet immédiat. D’ailleurs Juju la poule, à force de picorer le clavier, a trouvé la réponse à la question 4 en inventant la dichotomie. Essayez, ça va très vite !

3) Les programmes de calcul du brevet version Blockly

Remarque : on anticipe ici la présentation de Blocky et de Scratch, qui sera faite plus bas.

Les corrigés avec Blockly

Les mêmes programmes de calcul avec la version française de Blockly (ouvrir dans un nouvel onglet pour essayer) :

HTML - 7 ko
HTML - 7.4 ko
HTML - 5.7 ko
utilitaire de programmation Blockly
Ouvrir dans un autre onglet et programmer par cliquer-glisser

On peut télécharger ce dossier pour utiliser Blockly en local avec les programmes de calcul préprogrammés :

Zip - 211.3 ko

Voici ce que Charles le chat a fait pour corriger le sujet Polynésie (la poubelle est invisible sur certains navigateurs mais elle est là, en bas à droite du plan de travail) :

On peut programmer en ligne, dans le corps de cet article, d’autres programmes de calcul, tout simplement en vidant le programme actuel dans la corbeille invisible en bas à droite. On voit là deux avantages par rapport à Scratch :

  1. On peut intégrer le résultat directement dans une revue en ligne comme celle-ci, alors que Scratch nécessite l’inscription sur le site, et la publication y est faite aussi sur ce site [22] ;
  2. La manipulation du fichier Blockly en ligne peut se faire sur toutes sortes de machines, même celles qui ne supportent pas Flash : Tom la tortue adore programmer la tortue de Blockly sur son iTampon dernier cri [23].

4) Résumé sur les programmes de calcul

Exercice type

Exercice 3 :
On donne la "procédure de calcul" suivante :

  • Choisir un nombre ;
  • Lui ajouter 1 ;
  • Multiplier cette somme par 3 ;
  • Enlever le double du nombre choisi au départ ;
  • Ajouter 1.

1) Traduire cette "procédure de calcul" par un algorithme en langage naturel, puis par un programme (par exemple dans le langage de CaRMetal 3.8.7-college-fr).
2) Tester différentes valeurs et faire une conjecture.
3) Démontrer cette conjecture.

Voici une séquence liant les programmes de calcul à la divisibilité (de la 5e à la 3e) ; elle n’a jamais été testée en classe et certains choix qui y sont faits sont discutables (notamment le fait d’introduire expérimentalement la définition de la division euclidienne) ; néanmoins on peut en extraire des idées d’activités sans dépendre du reste de la séquence ; en particulier l’exploration des diviseurs communs :

l’article en pdf son source en odt
PDF - 101.8 ko
OpenDocument Text - 14.9 ko

IV) Des langages pour programmer

A) Via une interface graphique : le cas Scratch/Blockly

Scratch est scotchant, Blockly n’est pas bloquant

Les nouveaux programmes du collège (cycle 4, thème E) font référence aux connaissances suivantes :

  • Déclenchement de plusieurs séries d’instructions en parallèle D1
  • Partager ses programmes sur un réseau D2
  • [4e‐ 3e ] Echange de messages entre objets, événements liés au déplacement d’un objet, clonage d’un objet D1

Ce passage a surpris plus d’un lecteur. Il peut sembler incongru dans les programmes du collège, voire carrément ésotérique.
Il y a un secret qui enveloppe ces intitulés, un secret de Polichinelle : c’est une référence au logiciel Scratch (langage), qui met en œuvre ces connaissances dans un cadre simplifié et accessible [24].

Scratch est un outil très sympathique pour les raisons suivantes :

  • Il est issu de recherches menées au MIT sur la programmation accessible aux enfants (Papert, qui est piagetien, croit très fort à la possibilité qu’en apprenant à programmer seuls et en construisant leur savoir de cette manière, des enfants apprennent mieux, et pas seulement à programmer).
  • C’est un logiciel libre [25] ce qui permet notamment d’accéder à son code source en Smalltalk et de se l’approprier (un exemple) ;
  • c’est un logiciel de chorégraphie, donc mieux accessible aux élèves mathophobes (mais ce sont bien les profs de maths qui vont s’en servir) ;
  • On programme en glissant des blocs de commande sur un plan de travail, ce qui le rend accessible à ceux qui sont maladroits avec un clavier (mais le choix de Flash fait que paradoxalement on peut pas utiliser Scratch sous Android).
  • Il est facile de changer la langue de Scratch [26] et même de partager ses programmes avec des enfants du monde entier (au risque de favoriser le copier-coller [27]).
  • Scratch peut s’interfacer avec différents dispositifs technologiques (carte Arduino, Picaxe,...), et il se prête volontiers à être utilisé pour un EPI [28].
  • Scratch permet d’apprendre certaines bases de la programmation dans un cadre ludique et multimédia. Il est particulièrement adapté à l’abord de certaines notions de programmations évenementielle et objet, comme le calcul parallèle par exemple.
  • L’interface de Scratch est très user-friendly, et agrémentée pour plaire à un large public. Elle se présente comme un terrain de jeu et d’expérimentations, et donne accès à des bibliothèques fleuries [29]

On a parlé jusque là de Scratch. Signalons que Google s’est lancé dans un projet « concurrent », à savoir Blocky, qui, contrairement à Scratch, n’est pas basé sur Flash.

Blocky pourrait faire de l’ombre à Scratch en restant dans le même registre. En témoigne déjà cette activité clés en mains, redoutable d’efficacité (et couvrant l’essentiel de ce qu’il est raisonnable d’aborder en 5e, sous un angle ludique qui devrait lui garantir du succès [30]) :

Le fait que Blockly soit programmé en JavaScript permet de l’utiliser sur tablette tactile voire sur smartphone, et ses fonctionnalités statistiques le prédestineraient plus à une utilisation en mathématiques [31].

Bella la belette aimait beaucoup Scratch. Elle avait réalisé un petit programme qui faisait danser des souris et était très fière du résultat.

— Regardez ! Elles dansent le jerk !

Bella pouvait être contente : Elle venait d’avoir 10 sur 10 dans la compétence "Partager ses programmes sur un réseau" [32]. Mais Monsieur Brichemer l’avait d’abord grondée, parce qu’elle avait visiblement copié-collé cette activité d’un ancien. La belette avait rétorqué que ce qu’elle avait fait là n’était jamais que du clonage, qui est officiellement encouragé par l’inspection. Par lassitude, Monsieur Brichemer lui a donc donné 10 sur 10 en "réseau". Mais en précisant que cela ne pouvait lui donner ni la compétence "Reconstituer la logique algorithmique d’un programme" ni la compétence "Documenter ses programmes" [33]...

Lunel le lynx la regardait de biais. Il essayait de faire des calculs de trajectoires avec Scratch et trouvait que ce n’était pas commode.

Zip - 22 ko
interaction entre objets sans envoi de messages explicites
CarMetal - 12.5 ko

On peut télécharger le fichier scratch (à gauche) pour l’utiliser en local (si Scratch est installé), ou la version CaRMetal (à droite) pour voir comment CaRMetal permet

  • la "gestion d’événements déclenchés par le clavier, la souris, etc."
  • le "déclenchement de plusieurs séries d’instructions en parallèle"
  • l’"échange de messages entre objets" (le mieux étant de le faire par mise à jour d’expressions, voir les programmes de calcul ci-dessus) ;
  • les "événements liés au déplacement d’un objet" [34] ;
  • le "clonage d’un objet" [35]

— ça me fatigue de devoir faire des blocs pour les calculs. Ce n’est pas ergoéconomique, grogna-t-il.

Il se mit à dormir discrètement. D’un œil.

B) La syntaxe des langages de programmation vue du ciel

Comparatif de quelques langages

Tableaux comparatifs des syntaxes
Sophus Python CaRMetal3.8.7-college-fr JavaScript GéoTortue
Séparation des instructions saut de ligne saut de ligne ; ; saut de ligne ou ;
Séparation des blocs d'instructions indentation (4 espaces) indentation (4 espaces) {} {} []
Affecter à A la valeur 3 A:=3 A=3 A:=3; A=3; A:=3
Afficher A montrer A print(A) Print(A); alert(A); écris A
Saisir A entrer A A=input('A=') A:=Entrer("A=") A=prompt("A=") none
Si ... alors ... Si ...
    Instruction1
Sinon
    Instruction2
if ... :
    Instruction1
elif:
    Instruction2
else:
    Instruction3
si (…) {... } sinon {... } if (…) {... } else {... } si (...) alors [ ... ] sinon [... ]
pour i allant de 3 à 8
     Faire Instructions
pour i dans [3..8]
     Instructions
for i in range(3,9):
     Instructions
pour i allant de 3 à 8
{... }
for (i=3; i<9; i=i+1)
{... }
rep 6 [...]
rem : pas d'accès à l'indice...
tant que condition
    Faire Instructions
Tant que condition
    Instructions
while condition:
    Instructions
tant que (...) { ... } while (...) { ... } tant_que (...) [...]
Faire Instructions
    jusqu'à condition
Jusqu'à ce que condition
    Instructions
none faire {...} jusqu'à (...); none none

V) Variable vs inconnue : les abus de notation

Thème et variations sur les variables

Introduction :

Avant de définir ce qu’est une variable (mathématiques), on va distinguer deux contextes dans lesquels on utilise des lettres pour représenter des nombres :

  • le calcul littéral (au sens strict)
  • les équations

Dans chaque contexte, le signe = a un sens différent :

  • Dans un contexte de calcul littéral, $2x+1 = x+4$ est faux
  • Dans un contexte d’équations, $2x+1 = x+4$ n’est ni vrai ni faux en soi. C’est une équation, on peut la résoudre et dire qu’elle admet comme solution le nombre 3.

Comment sait-on dans quel contexte on se trouve ? En général, c’est plus ou moins implicite, il faut deviner…
Et on peut glisser allègrement d’un contexte à l’autre.

Dans le contexte du calcul littéral, dans une expression littérale, une variable est un nombre qui, comme son som l’indique, est destiné à varier. On le représente par une lettre [37] (traditionnellement $x$), ce qui justifie rétrospectivement le terme de « calcul littéral » :

Dans le contexte des équations, la même lettre prendra le statut d’inconnue, autrement dit d’un nombre (ou de plusieurs) que l’on ne connaît pas.


Dans ce premier passage, on va se placer dans le contexte du calcul littéral : la lettre $x$ représente un nombre qui peut varier.

On peut remplacer $x$ par un nombre et voir ce que devient l’expression dans ce cas précis.
Ainsi, l’expression littérale $2x+3$ vaut 13 quand $x$ représente le nombre 5 [38].

Les confusions arrivent avec le signe =
Normalement, ce signe devrait dénoter l’égalité constatée entre deux quantités.
On sait que 1+1 = 2.
On peut donc écrire que $2x+3 = x+ x+3\quad$ (en admettant que pour les expressions, l’égalité porte sur le résultat de l’expression) [39].

Jusque là, tout va bien.
Mais le signe = est aussi utilisé avec d’autres significations, ce qui induit des confusions.

Dans les exercices, on introduit souvent les expressions par une formulation du type :
Soit $A= 3x+7$

C’est un abus de notation : dans ce cas précis, le signe = sert à définir A.
On lui préférera la formulation suivante : Soit $A := 3x+7$


Voyons maintenant comment ce problème est transposé dans le cadre informatique :

Selon une image traditionnelle, une variable est une boîte, qui peut contenir une valeur, et que le programme (l’ordinateur) va repérer par une étiquette. Pour avoir accès au contenu de la boîte, il suffit de la désigner par son étiquette. (En réalité il s’agit d’un emplacement de mémoire, repéré par une adresse.)

Pour remplir la boîte avec une certaine valeur, on utilise une affectation, qui est une instruction.
Beaucoup de langages (ceux dérivés du C notamment) utilisent le signe = pour dénoter cette affectation.
On utilisera plutôt := en Sophus et en CaRMetal-3.8.7-college-fr (comme en Pascal et en GéoTortue).

Pour faire une affectation, on écrit :

  • en CaRMetal-3.8.7-college-fr 
    A:= 3 ;
  • en Python
    A=3

Pour rendre compte d’une expression littérale, on écrira en CaRMetal-3.8.7-college-fr 

  1. x:= 5 ;
  2. A:=3*x+7 ;

Télécharger

En fait, A ne traduit pas réellement l’expression littérale. C’est une variable comme une autre, qui n’est pas liée dynamiquement à la variable x.
(Pour réellement traduire une expression littérale avec CaRMetal, il faudrait plutôt utiliser une expression, qui est un objet dynamique de CaRMetal, comme on l’a fait plus haut).

On a pris soin de ne pas utiliser le signe = pour dénoter une affectation.
Mais l’usage est tellement répandu que l’on ne vas pas utiliser = pour dénoter la constation d’une égalité (pour éviter toute confusion, on ne va jamais utiliser le signe = tout seul, qui est trop connoté « affectation »).

Pour dénoter la constation d’une égalité (de valeur), dans quasiment tous les langages, on utilise == (le signe égal est doublé). Ce symbole permet de réaliser une évaluation, qui donne une valeur booléenne (vrai ou faux).

Expériences réponses de Sophus
2 == 3 est faux
7 == 6+1 est vrai

Revenons dans le contexte mathématique. Le signe = est aussi utilisé dans un contexte d’équation, mais il a alors un sens différent, à savoir celui d’une égalité à trou.

Soit l’équation : $x^2+x-7=2x+1$

Dans ce cas, le signe = n’indique ni que $x^2+x-7$ est constaté égal à $2x+1$ ni qu’on lui donne cette « valeur ». En fait il faudrait utiliser un autre symbole comme par exemple ≟.
Ce symbole permet de définir un problème, et n’a pas d’équivalent dans le lexique informatique (où l’on mettra en œuvre un algorithme pour le résoudre).


Pour aller plus loin, on peut signaler que le signe == dénote la constatation d’une égalité, mais d’une égalité de valeur, pas d’une égalité d’objet [40] .

Ainsi, en JavaScript ou en CaRMetal-3.8.7-college-fr, le programme suivant :

  1. x=[1,2,3];
  2. y=[1,2,3];
  3. Print(x==y);

Télécharger

affichera... false (faux).

Exercice :
On voudrait tester si un nombre est solution de l’équation $2x + 14 = 3x + 1$.

Tester le programme CaRMetal 3.8.7-college-fr suivant :

  1. x:=Entrer("Valeur de x à tester");
  2. si (2*x+14==3*x+1){
  3. Afficher(x+" est solution de l'équation.");
  4. } 
  5. sinon {
  6. Afficher(x+" n'est pas solution de l'équation.");
  7. }

Télécharger

Quand on exécute ce programme, la parenthèse (2*x+14==3*x+1) prend la valeur vraie (true) ou la valeur faux (false). Et le programme s’adapte en fonction de cette valeur :
Si c’est vrai, on fait {Afficher(x+" est solution de l’équation.") ;}
sinon, on fait {Afficher(x+" n’est pas solution de l’équation.") ;}

Exercice : Ecrire un programme pour trouver une solution entière de l’équation $x^2+3=2(13x+15)$.

VI) Exercices imposés 

A titre d’exemple, on va programmer un des nombreux jeux de Nim existants, projets phares des nouveaux programmes. Ici il s’agit du jeu dit "de la soustraction", à un seul tas [41]. Les scripts CaRMetal sont très courts, mais demandent déjà une certaine expertise (cliquer sur l’image pour télécharger le fichier CaRMetal, qui peut être utilisé avec n’importe quelle version). L’idée est de cacher les graines qui ont été retirées du tas. La version Sophus [42] représente le tas de graines par des lettres "o" accolées, par exemple 5 graines s’afficheront "ooooo" :

CaRMetal Sophus
CarMetal - 2.2 ko
Jeu de Nim avec CaRMetal
Texte - 1.6 ko
le jeu de Nim en Sophus

Théorie de ce jeu

Voici comment Claude-Gaspard Bachet de Méziriac démontrait en 1624 [43] l’existence d’une stratégie gagnante de ce jeu [44] :

l’article traduit en pdf le source en odt (pour copier-coller)
PDF - 337.4 ko
OpenDocument Text - 748.4 ko

Le jeu décrit par Bachet (et implémenté ici) s’appelle en général jeu de la soustraction ; pour les anglosaxons c’est un cas particulier des jeux de Nim génériques, mais qualifié de "trivial". Le "normal game" se jouant à plusieurs tas et sans limite au nombre de graines à prélever. Ce jeu, étudié par Charles Bouton au début du XXe siècle, a été baptisé par lui du nom de jeux de Nim, se joue donc à plusieurs tas. C’est cette forme (et non le jeu de la soustraction) qui a fait l’objet des premières réalisations informatiques comme le Nimrod (ordinateur). En France, on préfère l’appeler jeu de Marienbad. On peut donc se poser la question du sens de ce nom "Nim" dans les programmes du cycle 4 : S’agit-il (comme on l’a supposé ici) du jeu de la soustraction, ou s’agit-il du jeu de Marienbad ? On peut aussi penser que le mot "Nim" doit être pris dans un sens générique incluant Chomp (jeu) ou le jeu de Grundy...

Voici par exemple un jeu de type nim, appelé "subtract a square", où le nombre de graines qu’on peut enlever est obligatoirement un carré. Le jeu est programmé avec phaser.io en une cinquantaine de lignes de JavaScript (et phaser.io gère parfaitement les évènements de type clic, déplacement d’un objet etc ainsi que le clonage). Pour jouer, ouvrir dans un navigateur internet [45], le fichier index.html :

Zip - 201.9 ko
un jeu de Nim basé sur les carrés parfaits
Pour jouer, ouvrir le fichier index.html ; pour étudier le jeu, examiner le fichier script.js

VII) Exercices libres 

A) numériques

Exercices divers et d’étai en CaRMetal 3.8.7-college-fr

Une question se pose : que programmer en pratique ?
On va s’efforcer de donner une forme plus aboutie aux explications et aux exemples présentés dans cet article mathémaTICE et dans une activité présentée sur le forum.

Commençons par présenter quelques points particuliers du Javascript utilisé dans CaRMetal (version 3.8.7-college-fr), en particulier pour les entrées/sorties :

A – Les sorties

Les « sorties texte » (= les sorties Javascript) se font dans une fenêtre qui s’ouvre en pop up sous l’effet d’une ou plusieurs instructions d’affichage.
Une nouvelle fenêtre est affichée à chaque exécution du script. Cette fenêtre doit être fermée manuellement.

Afficher (ou Print) affiche.
Afficherligne (ou Println (pour Print Line)) affiche puis fait un saut de ligne. La prochaine instruction d’affichage affichera donc sur la ligne suivante.

Remarque : l’opérateur + appliquée aux chaînes de caractères réalise une concaténation de chaînes.

Exemple de script :

  1. x := "Juliette" ;
  2. Afficherligne("Bonjour "+x+ ".") ;
  3. Afficherligne("1 et 1 = "+1+1) ; // premier + entre chaîne et nombre donc concaténation, idem pour le suivant
  4. Afficher("1 et 1 = "+(1+1)) ; // 1+1 = 2 dans la parenthèse puis concaténation

Télécharger

Résultat dans la fenêtre de sortie :

Bonjour Juliette.
1 et 1 = 11
1 et 1 = 2

Remarque : on peut aussi utiliser une fenêtre d’avertissement (qui est modale, autrement dit bloquante) en utilisant l’instruction

  1. Signaler("Message");

B – Les entrées

On peut entrer une donnée (nombre ou chaîne de caractères) de manière interactive en utilisant une instruction de type :

  1. x:=Entrer("message") ;

Il s’agit d’une affectation.
La donnée entrée au clavier est enregistrée dans la variable x et peut être utilisée dans la suite du script.

Exemple : script pour faire calculer le carré + 1 d’un nombre

  1. x:=Entrer("Entrez votre nombre") ;
  2. Afficher("Le résultat est : " +(x*x+1)) ;

Télécharger

Résultat :

Le résultat est ...

C - Programmation numérique avec CaRMetal

Pour illustrer l’intérêt de la programmation dans le cadre numérique, on propose de résoudre l’exercice suivant. (On notera que l’énoncé utilise à dessein une affectation.)

Exercice 1 :
Soit les expressions $A := 4x+7+6x+13\quad$et $B := 10(x+2)$
Programmer $A$ et $B$ pour $x$ variant entre 0 et 100, et faire une conjecture sur les expressions $A$ et $B$.

L’élève pourra alors écrire un programme du type :

  1. pour x allant de 0 à 100 {
  2. Afficher("Pour x:= "+x);
  3. Afficher(", on a : A = "+(4*x+7+6*x+13));
  4. Afficherligne(" et B = "+(10*(x+2)));
  5. }

Télécharger

Le résultat dans la fenêtre de sortie sera :

Et on pourra demander aux élèves les plus avancés de réaliser un test.

------------------------------------------------------------------------------------

Exercice 2 : Même chose pour introduire les identités remarquables.
Soit les expressions $A := (x+3)(x-3)\quad$et $B := x^2-9$…

ou... Soit les expressions $A := (x+5)^2\quad$et $B := x^2+25$...

------------------------------------------------------------------------------------

Exercice 3 :
Mélusine affirme : « Dans l’expression $60 + x\quad$, si on remplace $x$ par un entier (1 ; 2 ; ...) on obtient toujours, comme résultat, un nombre entier ».
Ecrire un script pour confirmer ou infirmer cette affirmation.

------------------------------------------------------------------------------------

Exercice 4 :
Trouver la valeur maximale de l’expression $D = 740x − 10x^2 − 3 687\quad$pour $x$ entier compris entre 0 et 100.
Préciser pour quelle valeur de $x$ elle est obtenue.

------------------------------------------------------------------------------------

B) géométriques

Monsieur Brichemer était très à cheval sur les nouveaux programmes. On lui demandait de la transversalité ? Fort bien. Il avait entamé un dialogue avec sa collègue d’arts plastiques, Laure Ney la taupe, et avait proposé CaRMetal pour aider les collégiens à "se saisir de son propre environnement et prendre une part active à son PEAC par des expériences de création et de rencontre avec l’art qui fonderont une culture artistique ouverte à l’altérité," et à "s’engager dans un processus de création artistique porté par une démarche consciente, une maîtrise des moyens matériels et techniques mobilisés et des effets produits".
Et Mme Nay ayant projeté une sortie scolaire consacrée à Victor Vasarely, il avait saisi le « référentiel bondissant » au vol pour proposer les exercices suivants basés sur les notions d’affectation (informatique) et de "Séquences d’instructions, boucles" (histoire de boucler la boucle) :

CaRMetal 3D

Parcours progressif d’apprentissage avec CaRMetal (2/2) : un soupçon de design génératif.

On peut maintenant faire le lien avec le parcours progressif d’apprentissage avec CaRMetal (1/2).

La première chose à comprendre est que toute CaRCommande constructrice est une fonction qui renvoie le nom (= une chaîne de caractères) de l’objet construit, même si cet objet est nommé automatiquement par CaRMetal.

Remarque : dans l’activité précédente, on a systématiquement nommé explicitement l’objet créé (premier paramètre de la fonction) pour pouvoir le réutiliser, mais ce nommage est facultatif. Si on l’omet (un paramètre de moins, et CaRMetal "comprend" que c’est le nom), alors l’objet est nommé automatiquement par CaRMetal.

Ainsi, si on exécute ce script :

  1. x := Point("A",2,5) ;
  2. y := Point(1,4) ;

Télécharger

alors la variable x contient la chaîne "A" et y contient le nom du deuxième point, nommé automatiquement par CaRMetal. La variable sert ici à stocker le nom, qu’il n’est plus vraiment utile de connaître explicitement (ce nom est dans y si on en a besoin).

Et donc le script :

  1. x := Point("A",2,5) ;
  2. y := Point(1,4) ;
  3. Droite(x ,y) ;

Télécharger

crée la droite voulue.

Le script :

  1. x := Point("A",2,5) ;
  2. y := Point(1,4) ;
  3. z := Droite(x ,y) ;
  4. nouveauPoint := Point(2,1.5) ;
  5. i := Perpendiculaire(z,nouveauPoint);

Télécharger

crée aussi la perpendiculaire voulue à la droite dont le nom est contenu dans z.

Essayons maintenant d’écrire un script pour cette figure :

Commençons par tracer une ligne de disques bleus.
On pourrait penser à utiliser des variables, mais cela conduirait à créer une liste, ce que l’on souhaite éviter ici.
On va donc nommer explicitement les objets sans utiliser d’affectation : le premier point créé sera nommé A1, le suivant A2, etc. Et on fera de même pour les disques : c1, puis c2, etc.

On commence donc par créer un compteur, initialisé à 1.
Puis on crée une boucle de répétition 20 fois :

  1. compteur:= 1;
  2. pour i allant de -10 à 10 {
  3. Point("A"+compteur,i,0);
  4. CercleRayon("c"+compteur,"A"+compteur,0.44);
  5. compteur++;
  6. }

Télécharger

Une concaténation permet de créer le nommage des points et des disques (cercles pour l’instant).

On leur donne ensuite l’aspect voulu (indépendamment des choix par défaut actifs) :

  1. compteur:= 1;
  2. pour i allant de -10 à 10 {
  3. Point("A"+compteur,i,0);
  4. CercleRayon("c"+compteur,"A"+compteur,0.44);
  5. Cacher("A"+compteur);
  6. MettreCouleurRVB("c"+compteur,0,0,255); // ou plus simplement MettreCouleur("c"+compteur,"bleu");
  7. MettreRempli("c"+compteur,vrai);
  8. MettreOpaque("c"+compteur,vrai);
  9. compteur++;
  10. }

Télécharger

Puis on boucle une deuxième fois sur j, et on recommence pour les disques rouges en leur donnant un petit décalage.

  1. compteur:= 1;
  2. pour j allant de -10 à 10 {
  3. pour i allant de -10 à 10 {
  4. Point("A"+compteur,i,j);
  5. CercleRayon("c"+compteur,"A"+compteur,0.44);
  6. Cacher("A"+compteur);
  7. MettreCouleurRVB("c"+compteur,0,0,255); // ou MettreCouleur("c"+compteur,"bleu"); pour un bleu moins éclatant
  8. MettreRempli("c"+compteur,vrai);
  9. MettreOpaque("c"+compteur,vrai);
  10. compteur++;
  11. }
  12. }
  13. pour j allant de -10 à 10 {
  14. pour i allant de -10 à 10 {
  15. Point("A"+compteur,i*0.99,j*0.99);
  16. Cacher("A"+compteur);
  17. CercleRayon("c"+compteur,"A"+compteur,0.44-0.02*(Math.abs(i)+Math.abs(j)));
  18. MettreCouleurRVB("c"+compteur,255,0,0); //ou MettreCouleur("c"+compteur,"rouge");
  19. MettreRempli("c"+compteur,vrai);
  20. MettreOpaque("c"+compteur,vrai);
  21. compteur++;
  22. }
  23. }

Télécharger

Remarque : la gestion de la couleur est un peu particulière dans CaRMetal (l’objectif étant de minimiser les commandes).
Pour un objet plein (par exemple pour les disques tracés), donner un "contour épais" a pour effet de donner au disque entier la couleur du contour. Et l’option de transparence est alors sans effet.
On peut donc proposer un autre rendu pour la figure en appliquant ce traitement aux disques rouges avec le code suivant :

  1. compteur:= 1;
  2. pour j allant de -10 à 10 {
  3. pour i allant de -10 à 10 {
  4. Point("A"+compteur,i,j);
  5. CercleRayon("c"+compteur,"A"+compteur,0.44);
  6. Cacher("A"+compteur);
  7. MettreCouleurRVB("c"+compteur,0,0,255);
  8. MettreRempli("c"+compteur,vrai);
  9. //MettreOpaque("c"+compteur,vrai);
  10. compteur++;
  11. }
  12. }
  13. pour j allant de -10 à 10 {
  14. pour i allant de -10 à 10 {
  15. Point("A"+compteur,i*0.99,j*0.99);
  16. Cacher("A"+compteur);
  17. CercleRayon("c"+compteur,"A"+compteur,0.44-0.02*(Math.abs(i)+Math.abs(j)));
  18. MettreCouleur("c"+compteur,"rouge");
  19. MettreRempli("c"+compteur,vrai);
  20. MettreEpaisseur("c"+compteur,"épais");
  21. //MettreOpaque("c"+compteur,vrai);
  22. compteur++;
  23. }
  24. }

Télécharger

Voici un autre exemple, un peu plus compliqué à réaliser :

Dont voici un script possible :

  1. distance:=0;
  2. Point("O",0,0);Cacher("O");
  3. pour i allant de 1 à 20 {
  4. ecart:=Math.min(i,21-i);
  5. rayon:=ecart*0.44;
  6. distance:=distance+ecart;
  7. nbTours:=Math.floor(distance*2*Math.PI/ecart);
  8. pour j allant de 1 à nbTours {
  9. point:=Point(distance*Math.cos(j*2*Math.PI/nbTours),distance*Math.sin(j*2*Math.PI/nbTours));
  10. Cacher(point);
  11. disque:=CercleRayon(point,rayon);
  12. MettreCouleurRVB(disque,0,255*ecart/10,255*ecart/10);
  13. MettreRempli(disque,"vrai");
  14. }
  15. }

Télécharger

Et voici enfin une figure 3D :

Dont un script possible est :

  1. compteur:= 1;
  2. c=[];
  3. pour k allant de -3 à 3 {
  4. pour j allant de -3 à 3 {
  5. pour i allant de -3 à 3 {
  6. Point3D("A"+compteur,i*0.99,j*0.99,k*0.99);
  7. Cacher("A"+compteur);
  8. c[compteur]=CercleRayon("A"+compteur,0.4-0.03*(Math.abs(i)+Math.abs(j)+Math.abs(k)));
  9. MettreCouleurRVB(c[compteur],255,0,0); //ou MettreCouleur("c"+compteur,"rouge");
  10. MettreRempli(c[compteur],vrai);
  11. MettreEpaisseur(c[compteur],"épais");
  12. MettreOpaque(c[compteur],vrai);
  13. compteur++;
  14. Point3D("A"+compteur,i,j,k);
  15. c[compteur]=CercleRayon("A"+compteur,0.4);
  16. Cacher("A"+compteur);
  17. MettreCouleurRVB(c[compteur],0,0,255); // ou MettreCouleur("c"+compteur,"bleu"); pour un bleu moins éclatant
  18. MettreRempli(c[compteur],vrai);
  19. MettreOpaque(c[compteur],faux);
  20. compteur++;
  21. }
  22. }
  23. }

Télécharger

Cette figure peut « facilement » être animée pour obtenir l’animation présentée plus haut.

Voici le fichier CaRMetal correspondant (à utiliser avec CaRMetal-3.8.7-college-fr : lancer le programme, puis ouvrir le fichier en utilisant le menu Fichier/Ouvrir...).

CarMetal - 4.6 ko
Animation de cube avec CaRMetal
Ce fichier nécessite CaRMetal-3.8.7-college-fr pour fonctionner.

La liberté est laissée à l’utilisateur de construire les figures de son choix, au gré de ses besoins ou de son inspiration.

Conclusion

Aujourd’hui, c’est le dernier cours de MeC : Les révisions du brevet vont bientôt commencer, et les élèves devront, conformément aux nouveaux programmes, présenter un projet Scratch évalué par une grille de compétence dressée par des gens qui en ont, portant soit sur "des applications ludiques (labyrinthes, pong, bataille navale, nim, tic tac toe...)" soit sur des "principes des correcteurs orthographiques (calculs de tables de conjugaison, de pluriels...)" ou autres "calculs de répertoire d’adresses (recherche, recherche inversée...)". Parmi les compétences évaluées se trouvent les commentaires des programmes et leur partage sur un réseau, ce qui prend du temps, et le brevet approche à grand pas...

Bien que ce soit la dernière séance, la voix de Monsieur Brichemer ne trahit toujours pas la moindre émotion. Dans quelques minutes, il aura bouclé son programme. Tout est minuté.
C’est alors qu’un miaulement retentit dans la salle de cours.

Un ange passe.

— Monsieur, on vous a vu sur Sratch !, dit Lunel le lynx.

Monsieur Brichemer se met soudain à bugger et à faire des pirouettes. Cette question n’a pas été prévue par le rectorat...

— Oui, vous êtes dans la bibliothèque des lutins !

Euh oui… Robert Brichemer le cerf est un lutin de Scratch.
Un professeur comme lui, ça n’existe pas. Sauf sur un théâtre de marionnettes.
Vous ne l’aviez pas deviné ? ;)


ps

Le programme de calcul du sujet Polynésie 2015 en html

  1. <html>
  2. <head>
  3. <script>
  4. affichage = function() {
  5. document.getElementById("e1").value = parseFloat(document.getElementById("choisi").value)+1;
  6. document.getElementById("e2").value = Math.pow(parseFloat(document.getElementById("e1").value),2);
  7. document.getElementById("e3").value = parseFloat(document.getElementById("e2").value)-9;
  8. }
  9. </script>
  10. </head>
  11. <body>
  12. <h3>Programme de calcul du brevet Polynésie 2015</h3>
  13. <ul>
  14. <li>Choisir un nombre: <input type="text" id="choisi" value=7 onkeyup="affichage();"></input></li>
  15. <li>Ajouter 1: <input type="text" id="e1" value=8 readonly></li>
  16. <li>élever la somme au carré: <input type="text" id="e2" value=64 readonly></li>
  17. <li>Soustraire 9: <input type="text" id="e3" value=55 style="color: #770000;" readonly></li>
  18. </ul>
  19. </body>
  20. </html>

Télécharger

Le jeu de Nim en Sophus

  1. auHasard = (n) -> Math.ceil Math.random()*n # simulation d'un dé à n faces
  2. dessin = (n) -> ("o" pour i dans [0...n]).join("") # dessine les graines
  3. tas = nouvelle Variable 21 # modifier pour d'autres jeux de Nim
  4. jusqu'à ce que tas.valeur <=0 # quand il n'y a plus de graines à prendre le jeu est fini
  5. jeu = auHasard 3 # l'ordi joue sans stratégie aucune
  6. alert "J'ai enlevé #{dessin jeu} du #{dessin tas.valeur}" # annonce graphique du coup joué
  7. diminuer tas de jeu # Sophus a la science nimphus(e) ;-)
  8. Si tas.valeur <= 0 # le premier à avoir vidé le tas a gagné
  9. alert "j'ai gagné"
  10. Sinon
  11. alert "Il reste donc #{dessin tas.valeur}; combien veux-tu enlever: 1, 2 ou 3?"
  12. réponse = nouvelle Variable 0 # la variable doit être réévaluée
  13. jusqu'à ce que 1 <= réponse.valeur <= 3 # jusqu'à ce que le coup soit valide
  14. entrer réponse
  15. arrondir réponse à 1 près # si le joueur veut enlever 4 tiers de graines on gère
  16. diminuer tas de réponse # Nimphus again ;-)
  17. Si tas.valeur <= 0
  18. alert "Tu as gagné"

Télécharger

Et la version exportée, après quelques retouches :

auHasard = (n)  faire  Math.ceil Math.random()*n
dessin = (n)  faire  ("o" pour i dans [0...n]).join("")
tas = nouvelle variable initialisée à  21
jusqu'à ce que la valeur de tas soit inférieure ou égale à 0
   jeu = auHasard 3
   alert "J'ai enlevé #{dessin jeu} du #{dessin la valeur de tas}"
   diminuer tas de jeu
   Si la valeur de tas est inférieure ou égale à  0
       alert "j'ai gagné"
   Sinon
       alert "Il reste donc #{dessin la valeur de tas}; combien veux-tu enlever: 1, 2 ou 3?"
       réponse = nouvelle variable initialisée à  0
       jusqu'à ce que 1 soit inférieure ou égale à la valeur de réponse, elle-même inférieure ou égale à  3
           entrer réponse
           arrondir réponse à 1 près
       diminuer tas de réponse
       Si la valeur de tas est inférieure ou égale à  0
           alert "Tu as gagné"

Et les programmes de calcul du brevet 2016 (Polynésie et Métropole-Réunion), avec des graphes ou la technologie Tangle :

Polynésie Métropole-Réunion
HTML - 31.8 ko
HTML - 29.7 ko
HTML - 2.4 ko
HTML - 3 ko
notes

[1Ce continent présente des points communs avec l’Atlantide (le quatrième continent selon des rebelles de la numération). L’avenir dira s’il connaît le même sort...

[2on dit aussi "chargé de mission par Monsieur l’IPR"

[3autrement dit, les algorithmes du lycée sont censés être essentiellement numériques et même porter sur l’arithmétique.

[4Ceci pose une autre question : Qu’est-ce qu’une instruction ? On dira ici qu’une instruction est une phrase dont le verbe est à l’impératif comme « avance de 50 pas », « tourne à gauche », « affiche le résultat » ou« affecte la valeur 2 à x ». On voit qu’une affectation est un cas particulier d’instruction, parmi bien d’autres. On admettra ici le raccourci de langage des sujets d’examen, consistant à utiliser l’infinitif comme impératif.

[5pour le logiciel GeoTortue ; voir aussi ici et ...

[6export svg dans le menu "outils" de GeoTortue

[7quand Bella avait posé la question : "qu’est-ce que ça veut dire, monsieur ?", on lui avait répondu : "Tais-toi et nage !"

[8Mathématiquement, il s’agit d’un isomorphisme entre le groupe des translations de vecteurs colinéaires à u, et le groupe des réels. Si on considère le groupe engendré par une seule translation (groupe de frises), l’isomorphisme se fait avec l’ensemble des entiers relatifs.

[9Une CaRCommande est une instruction particulière à CaRMetal, qui n’appartient pas à JavaScript mais s’articule avec lui. Cette instruction étend JavaScript. Par exemple, Point et Cacher/Hide sont des CaRCommandes. Un script CaRMetal est appelé un CaRScript.

[10Une CaRCommande est en fait une fonction JavaScript qui renvoie une chaîne de caractères, le nom de l’objet, ici passé en paramètre. L’essentiel (création de l’objet et association de son nom) est déclenché de façon souterraine, on dit "par effet de bord (informatique)".

[11voir aussi cette vidéo de construction au collège, antérieure à l’activité et réalisée avec une version de CaRMetal sans bouton "JS"

[12Voir la version avec affectations, testée sans ordinateur

[13On constate que le logiciel DGPad combine les deux approches en donnant systématiquement le même nom en JavaScript et dans la figure

[14La meilleure partie de cette utilisation de DrGeo, c’est quand on expérimente un peu avec la langue : Pour créer un point on peut préférer le mot créerPoint au mot point. Alors si on tente quelque chose comme

  1. | dessin A |
  2. dessin := DrGeoCanvas new.
  3. A := dessin créerPoint: 3@2.

Télécharger

on a un message d’erreur disant que créerPoint n’existe pas. Si on choisit d’ouvrir le débogueur puis de cliquer sur "create", on obtient le source de cette nouvelle fonction, qui s’écrit

  1. créerPoint: aPoint
  2. self shouldBeImplemented.

Télécharger

On voit que la variable est déjà prévue pour être un point, et on suggère que créerPoint ait pour effet de créer le point :

  1. créerPoint: aPoint
  2. self point: aPoint.

Télécharger

et le script ci-dessus fonctionne. On peut aussi ajouter, à volonté, des mots comme figure creerParalleleA : s passantPar : 10@8 et analogue pour les perpendiculaires etc. C’est toute la magie de DrGeo : Si on a besoin d’un mot qui n’existe pas par défaut dans le langage, on peut aisément le rajouter...

[15Python est réputé pour cela, mais CoffeeScript l’est moins, qui permet de définir la fonction pgcd de cette manière :

  1. pgcd = (x,y) ->
  2. [x,y]=[y,x%y] until y is 0
  3. x

Télécharger

[16qu’on peut visualiser en exécutant "montrer Variable"

[17En effet les affectations les plus abstraites ne sont pas celles qui consistent à initialiser une variable, mais celles qui consistent à la modifier. Exemple typique, l’incrémentation, nécessaire pour une boucle, mais considérée comme difficile à conceptualiser par des élèves qui préféreraient qu’on n’affecte chaque variable qu’une fois, c’est-à-dire in fine que les variables ne soient plus des variables mais des constantes.

[18Cet exercice est inspiré du très bon site maths et tiques.

[19Ou plutôt "programme" selon l’acception anglo-saxone des algorithmes qui sont en général décrits comme méthodes séquentielles de résolution de problèmes : Il n’y a pas ici de problème à résoudre, si ce n’est l’étude du programme lui-même

[20cette notion n’est pas au programme, pas plus que la notion de fonction...

[21l’équivalent GeoGebra s’appelle champ texte mais il s’agit bien d’entrées numériques ; si on préfère html, il y a les "input" de type "textarea" qui font aussi l’affaire.

[22par contre le téléchargement est plus facile sur le site Scratch, au cas assez improbable où on voudrait utiliser le fichier en local

[23Par contre la tortue de Blockly n’est pour l’instant disponible que dans les jeux de Blockly, pas dans l’utilitaire simplifié ci-dessus

[24N’y a-t-il pas quelque chose de paradoxal à obliger les profs de MeC à utiliser un logiciel libre ?

[25mais programmé en Flash qui ne l’est pas, comprenne qui pourra...

[26Accessoirement c’est aujourd’hui le seul outil permettant de programmer en créole...

[27Cette question n’est pas accessoire, elle porte en filigrane celle des modalités d’évaluation des activités de codage au brevet des collèges qui, si elles sont similaires à celles du projet d’ICN de 2nde, sont soumises à la même difficulté d’évaluation de la sincérité du travail.

[28noter toutefois que ceci n’est plus l’apanage exclusif de Scratch, puisque le concurrent javascriptien Blockly est aussi interfacé avec *duino.

[29On est assez loin de l’ambiance d’une abbaye cistercienne. Les plus mélancoliques devront s’en accommoder.

[30particulièrement en Bretagne, puisque le breton fait partie des langues proposées pour ces "jeux"

[31Voir par exemple son utilisation avec microAlg, et les corrigés de programmes de calcul ci-dessus.

[32le premier jour, juste après la rentrée, tous les élèves ont eu 20 en maths parce qu’ils ont réussi à créer un compte Scratch ; les parents n’en revenaient pas. Les auteurs de cet article n’en reviennent toujours pas...

[33Outre le fait qu’on ne peut "documenter ses programmes" que si on en est l’auteur, comment fait-on pour documenter un programme Scratch ? 15-0 pour Python !

[34que Scratch ne gère pas d’ailleurs, ou du moins pas sans effort et le recours à des variables

[35Mais pour vraiment cloner un point P1, il faut passer par l’exploration de la "construction" avec getC().find("P1") qui renvoie le point P1 sous la forme d’un objet qui, lui, est clonable)

[36C’est ici le moment de rendre hommage à Loïc Le Coq, qui avait réalisé un projet similaire, lui aussi seul, et lui aussi comme logiciel libre : Xlogo qui est toujours utilisable mais plus développé. On regardera particulièrement la gestion de la 3D et du mode multitortues... Merci Loïc !

[37mais on pourrait aussi utiliser un mot, comme on le fait couramment en informatique

[38Remplacer x par un nombre déterminé, cela s’appelle substitution en algèbre et affectation en programmation. Noter qu’avec GeoGebra, l’idée de remplacer x par 5 se note malencontreusement x→5 qui induit une confusion avec l’injection 5→x qui représente souvent l’affectation. Certains autres logiciels de calcul formel utilisent un trait comme 2x+3|x=5 qui a l’avantage d’introduire naturellement la notation des probabilités conditionnelles "sachant que"

[39L’écriture mathématique complète, sans le sous-entendu sur les valeurs de x pour lesquelles cette égalité est vraie, est ∀ x ∈ R, 2x+3 = x+ x+3 ; il s’agit donc d’une infinité d’égalités résumées en une. Une façon plus simple d’écrire cela (mais plus abstraite aussi) est de dire que les deux fonctions sont égales. La confusion ∃ x ∈ R, 2x+3 = x+ x+3 ⇒ ∀ x ∈ R, 2x+3 = x+ x+3 est encouragée par l’utilisation du raisonnement inductif...

[40Si on fait de la POO, on ne doit pas confondre un objet et un de ses clones. Cette subtile notion peut paraître incongrue au collège. Elle est au programme...

[41à ne pas confondre avec le jeu dit "de Marienbad", où on enlève autant d’objets qu’on veut dans le tas qu’on veut. Les deux jeux s’appellent souvent "de Nim" mais on ne sait pas lequel est proposé au programme

[42Avec 21 graines, c’est le cas de la version d’enigma (jeu vidéo) qui s’appelle "enignimm". Soit dit en passant, ce jeu vidéo aisément programmable en Lua est spécialisé dans la programmation évènementielle et les passages de messages entre objets...

[43Dans problèmes plaisants et délectables qui se font par les nombres, un ouvrage largement consacré aux programmes de calcul...

[44Il s’inspirait apparemment de Luca Pacioli in "de viribus quantitatis" (aux alentours de 1500).

[45Avec certains navigateurs comme Chrome, il est nécessaire de lancer un serveur pour que ça fonctionne

Documents associés à l'article
  blockly_compressed.js   |   (Texte - 578.4 ko) bibliothèque Blockly pour insérer du code Blockly dans une page html
  blocks_compressed.js   |   (Texte - 58.9 ko) les blocs de Blockly qui permettent de faire de la programmation en ligne
  javascript_compressed.js   |   (Texte - 40.7 ko) L’utilitaire permettant de traduire en JavaScript un programme Blockly
  fr.js   |   (Texte - 30.7 ko) traduction française de Blockly
     |   (HTML - 31.8 ko)
     |   (HTML - 29.7 ko)
     |   (HTML - 2.4 ko)
     |   (HTML - 3 ko)
Réagir à cet article
Vous souhaitez compléter cet article pour un numéro futur, réagir à son contenu, demander des précisions à l'auteur ou au comité de rédaction...
À lire aussi ici
MathémaTICE est un projet
en collaboration avec
Suivre la vie du site Flux RSS 2.0  |  Espace de rédaction  |  Nous contacter  |  Site réalisé avec: SPIP  |  N° ISSN 2109-9197