Mathématice, intégration des Tice dans l'enseignement des mathématiques  
Sommaire > N°58 - en cours d’élaboration - janvier 2018 > Sur la nouvelle notation "algorithmique" aux (...)

Sur la nouvelle notation "algorithmique" aux examens
Moteur de recherche
Mis en ligne le 16 novembre 2017, par Alain Busser, Benjamin Clerc

Plan :

  1. Exemples : Les algorithmes du bac général et technologique 2017
  2. Différence entre procédures et fonctions
  3. Différence entre programmes et algos
  4. Inconvénients des entrées de données
  5. Notation des affectations
  6. Indifférence entre initialisation et traitement

Dans un objectif de simplicité et de cohérence, il est proposé une évolution de l’écriture des algorithmes dans les sujets de baccalauréat obéissant aux principes suivants :

  • suppression de la déclaration des variables, les hypothèses faites sur les variables étant précisées par ailleurs ;
  • suppression des entrées-sorties ;
  • simplification de la syntaxe, avec le symbole ← pour l’affectation.

Ceci a pour conséquence une écriture un petit peu différente des algorithmes mais aussi des énoncés puisqu’il n’y a plus d’entrées-sorties ...
Voici un document de l’Inspection Générale qui donne des exemples de ce que cela donne dans les séries ES - S - STI2D - STLbio et STMG :

PDF - 887 ko
évolution écriture algorithmes bac 2018

Bien qu’il ne s’agisse nullement de créer un pseudo-code normatif spécial "examens", dans le présent article, nous allons essayer une notation homogène et notamment ne pas utiliser le mot "faire" après "tant que" (comme cela est proposé dans la page sur le sujet STL Bio). Chaque enseignant restant évidemment libre de ses choix rédactionnels.

1 Exemples : Les algorithmes du bac général et technologique 2017

En terminale S :

  • Pondichery Avril 2017 : L’algorithme est dans l’exercice 3 Partie B 3), il serait alors proposé sous cette forme :
    S ← 0
    Pour k variant de 1 à n
      R ← 2,5/n * f(2,5/n * k)
      S ← S+R
    Fin Pour

    avec quelques modifications de l’énoncé dues au fait qu’il n’y a plus d’entrées-sorties, il faudrait donc supprimer la dernière ligne du tableau et ne demander que 5 valeurs à compléter, d’où :

OpenDocument Text - 35.2 ko
Pondichery avril 2017
PDF - 51.4 ko
Pondichery avril 2017
OpenDocument Spreadsheet - 15 ko
Pondichery 2017
  • Amérique du Nord Juin 2017 : L’algorithme est dans l’exercice 3 question 3, il serait alors proposé sous cette forme :
    s ← u
    Pour i allant de 1 à n
      u ← ...
      s ← ...
    Fin Pour

    Aucune modification de l’énoncé, autre que l’algorithme, n’est nécessaire ici :

OpenDocument Text - 17.7 ko
Amérique du Nord 2017
PDF - 29.1 ko
Amérique du Nord 2017
OpenDocument Spreadsheet - 16.8 ko
Amérique du Nord 2017
  • Liban Juin 2017 : L’algorithme est dans l’exercice 4 Spécialité, il serait alors proposé sous cette forme :
    I ← 0
    P ← 0
    R ← 0
    Pour k allant de 0 à 7
      R ← reste de la division euclidienne de 2a_{2 k + 1} par 9
      I ← I +R
    Fin Pour
    Pour k allant de 1 à 7
      P ← P + a_{2 k}
    Fin Pour
    S ← I +P +c

    Aucune modification de l’énoncé, autre que l’algorithme, n’est nécessaire ici :

OpenDocument Text - 47.4 ko
Liban 2017
PDF - 57.2 ko
Liban 2017
OpenDocument Spreadsheet - 18.7 ko
Liban 2017
  • Centres étrangers Juin 2017 : L’algorithme est dans l’exercice 4, Partie C, Question 3, il serait alors proposé sous cette forme :
    n ← 4
    Tant que √(2/(n*sin(2*pi()/n)))> 0,58
       n ← n + 1
    Fin Tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 14.4 ko
Centres étrangers 2017
PDF - 35.2 ko
Centres étrangers 2017
Zip - 253 octets
Centres étrangers 2017 - script Python
OpenDocument Text - 13.6 ko
Asie Juin 2017
PDF - 35.9 ko
Asie Juin 2017
Zip - 243 octets
Asie Juin 2017 - Script python
  • Antilles—Guyane septembre 2017 : pas d’algorithme.
  • Polynésie septembre 2017 : L’algorithme est dans l’exercice 4, Partie A 3), il serait alors proposé sous cette forme :
    u ← 0,3
    n ← 0
    Tant que ...


    Fin Tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 13.1 ko
Polynésie - Septembre 2017
PDF - 28.3 ko
Polynésie - Septembre 2017
Zip - 279 octets
Polynésie - Septembre 2017 - Script python
  • Métropole—La Réunion septembre 2017 : L’algorithme est dans l’exercice 1, Partie A 2)b), il serait alors proposé sous cette forme :
    C ← 0
    Pour k variant de 1 à N
      X ← nombre aléatoire entre 0 et 2
      Y ← nombre aléatoire entre 0 et 1
      Si Y <= exp(−X²) alors
         C ← C +1
      Fin Si
    Fin Pour
    F ← C/N

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 27.1 ko
Métropole - Septembre 2017
PDF - 43.3 ko
Métropole - Septembre 2017
Zip - 284 octets
Métropole - Septembre 2017 - Script Python
  • Nouvelle Calédonie Novembre 2017 : Pas d’algorithme en obligatoire, en spécialité, l’algorithme est dans l’exercice 5, question 2, il serait alors proposé sous cette forme :
    N ← 0
    B ← 1000
    C ← 1500
    Tant que B > 2 ou C > 2
      N ← N+1
      R ← B
      B ← 0,3R + 0,5C
      C ← −0,5R + 1,3C
    Fin Tant Que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 28.1 ko
Nouvelle Calédonie Novembre 2017
PDF - 53.2 ko
Nouvelle Calédonie Novembre 2017
Zip - 284 octets
Nouvelle Calédonie Novembre 2017 - Script Python

En terminale STMG :

  • Pondichéry avril 2017 : L’algorithme est dans l’exercice 2 3), il serait alors proposé sous cette forme :
    u ← 542000
    n ← 0
    Tant que u < 625000
      u ← 1,03×u
      n ← n +1
    Fin Tant que

    Aucune modification de l’énoncé, autre que l’algorithme, n’est nécessaire ici :

OpenDocument Text - 14.1 ko
Pondichéry - Avril 2017 - STMG
PDF - 34.5 ko
Pondichéry - Avril 2017 - STMG
Zip - 245 octets
Pondichéry - Avril 2017 - Script python - STMG
  • Centres étrangers juin 2017 : Les algorithmes sont dans l’exercice 4 3), ils seraient alors proposés sous cette forme (avec une modification majeure pour le d) puisqu’il était focalisé sur une erreur d’affichage) :
a)
a ← 55200
n ← 0
Tant que n>80000
  a ← a×0,85+15000
  n ← n+1
Fin Tant que
b)
n ← 0
Tant que a<80000
  a ← 55200
  a ← a×0,85+15000
  n ← n+1
Fin Tant que
c)
n ← 0
a ← 55200
Tant que a<80000
  a ← a×0,85+15000
  n ← n+1
Fin Tant que
d)
a ← 0
n ← 55200
Tant que a<80000
  a ← a×0,85+15000
  n ← n+1
Fin Tant que

avec quelques modifications de l’énoncé dues au fait qu’il n’y a plus d’entrées-sorties, notamment un remplacement de l’algorithme d) qui n’avait plus de sens :

OpenDocument Text - 20.8 ko
Centres étrangers 2017 - STMG
PDF - 88.4 ko
Centres étrangers 2017 - STMG
Zip - 284 octets
Centres étrangers 2017 - STMG - script python
  • Polynésie juin 2017 : L’algorithme est dans l’exercice 3 Partie C 1) et 2), il serait alors proposé sous cette forme :
    X ← 0
    H ← 17865
    F ← 13324
    Tant que ... < ...
      X ← X+1
      H ← 0,25*X^3+2*X^2+318*X +17865
      F ← 0,6*X^3−13*X^2+470*X +13324
    Fin Tant que
    A ← 1990 + ...

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 30.7 ko
STMG Polynésie juin 2017
PDF - 39.4 ko
STMG Polynésie juin 2017
Zip - 277 octets
STMG Polynésie juin 2017 - Script Python
OpenDocument Text - 12.9 ko
STMG Métropole juin 2017
PDF - 28.8 ko
STMG Métropole juin 2017
Zip - 253 octets
STMG Métropole juin 2017 - Script python
  • Antilles—Guyane juin 2017 : L’algorithme est dans l’exercice 1 Partie B 3), il serait alors proposé sous cette forme :
    n← 2013
    u← 470000
    Tant que u > 0
      n← n +1
      u← u*1,015−35000
    Fin Tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 12.9 ko
STMG Antilles-Guyane juin 2017
PDF - 28.9 ko
STMG Antilles-Guyane juin 2017
Zip - 267 octets
STMG Antilles-Guyane juin 2017 - Script python
  • Antilles—Guyane septembre 2017 : L’algorithme est dans l’exercice 4 (un QCM) 3), il serait alors proposé sous cette forme :
    S← 1000
    Pour k allant de 1 à 4
      S← 1.02*S +50
    Fin Pour

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 13.2 ko
STMG Antilles-Guyane Septembre 2017
PDF - 24.4 ko
STMG Antilles-Guyane Septembre 2017
Zip - 312 octets
STMG Antilles-Guyane Septembre 2017 - script python
  • Polynésie septembre 2017 : L’algorithme est dans l’exercice 4 Partie A 4), il serait alors proposé sous cette forme :
    U ← 35
    N ← 1
    Tant que U > ...
      U ←  …
      N ← N +1
    Fin Tant Que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 13.2 ko
STMG Polynésie septembre 2017
PDF - 23.3 ko
STMG Polynésie septembre 2017
Zip - 311 octets
STMG Métropole septembre 2017 - script python
  • Métropole-La Réunion septembre 2017 : L’algorithme est dans l’exercice 4 Partie B 2), il serait alors proposé sous cette forme :
    n ← 2
    v ← 5000
    Pour i allant de 1 à n
      v ← 1.12 * v −500
    Fin Pour

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 27.9 ko
STMG Métropole septembre 2017
PDF - 36.9 ko
STMG Métropole septembre 2017
Zip - 248 octets
STMG Métropole septembre 2017 - Script python
  • Nouvelle Calédonie novembre 2017 : L’algorithme est dans l’exercice 3 Partie B 5), il serait alors proposé sous cette forme :
    V ← 54
    N ← 0
    Tant que V<70
      V ← 1,025×V
      N ← N+1
    Fin Tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 12.7 ko
Nouvelle Calédonie Novembre 2017
PDF - 46.1 ko
Nouvelle Calédonie Novembre 2017
Zip - 251 octets
Nouvelle Calédonie Novembre 2017 - Script Python

En terminale ES :

En cours d’écriture

U ← 150
N ← 0
Tant que U>=200
  U ← 0,8×U+45
  N ← N+1
Fin Tant que
U ← 150
N ← 0
Tant que U<200
  U ← 0,8×U+45
  N ← N+1
Fin Tant que

avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 28.3 ko
TES Pondichéry juin 2017
PDF - 33.3 ko
TES Pondichéry juin 2017
  • Amérique du Nord juin 2017 : L’algorithme est dans l’exercice 2 3), il serait alors proposé sous cette forme :
    L1   n ← 0
    L2   U ← 27500
    L3   Tant que U <= ......
    L4      U ←  ...
    L5      n ←  ...
    L6   Fin Tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 23.4 ko
ES Amérique du Nord Juin 2017
PDF - 60.6 ko
ES Amérique du Nord Juin 2017
  • Liban juin 2017 : L’algorithme est dans l’exercice 2 Partie B 5), il serait alors proposé sous cette forme :
    1   U ← 41
    2   n ← 0
    3   Tant que ......
    4      U ←  ...
    5      n ← n+1
    6   Fin Tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 54.1 ko
ES Liban Juin 2017
PDF - 84.4 ko
ES Liban Juin 2017
  • Centres étrangers juin 2017, L’algorithme est dans l’exercice 3 2), il serait alors proposé sous cette forme :
    L1   U ←  ...
    L2   N ←  0
    L3   Tant que . ......
    L4      U ←  ....... .
    L5      N ←  N+1
    L6   Fin tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

OpenDocument Text - 49.7 ko
ES Centres étrangers Juin 2017
PDF - 87.2 ko
ES Centres étrangers Juin 2017
  • Antilles-Guyane juin 2017, [L’algorithme est dans l’exercice 2 5), il serait alors proposé sous cette forme :
    L1   U ← 75
    L2   N ←  0
    L3   Tant que U .....
    L4      U ←  ....... .
    L5      N ←  N+1
    L6   Fin tant que

    avec une petite modification de l’énoncé due au fait qu’il n’y a plus d’entrées-sorties :

  • Polynésie juin 2017
  • Métropole—La Réunion juin 2017
  • Asie juin 2017
  • Métropole (copies volées) juin 2017
  • Antilles-Guyane septembre 2017
  • Polynésie septembre 2017
  • Métropole-La Réunion septembre 2017

En terminale STI2D

En cours d’écriture

  • Polynésie STI2D & STL SPCL juin 2017
  • Métropole—La Réunion STI2D & STL SPCL juin 2017
  • Antilles—Guyane STI2D & STL SPCL juin 2017
  • Métropole—La Réunion STI2D & STL SPCL septembre 2017
  • Polynésie STD2A juin 2017
  • Métropole—La Réunion STD2A juin
  • Antilles—Guyane STD2A juin 2017
  • Métropole—La Réunion STD2A septembre 2017

En terminale STLbio

En cours d’écriture

  • Polynésie juin 2017
  • Antilles-Guyane juin 2017
  • Métropole-La Réunion juin 2017
  • Métropole-La Réunion septembre 2017

La suite de cet article est une interprétation très personnelle de la recommandation de l’inspection générale, à voir peut-être comme un plaidoyer pour cette recommandation, plus que comme des explications du "pourquoi".

2) Procédures et fonctions

Triple ou tripler ?

Une question assez délicate pour le créateur de Sofus c’est la toute banale en apparence

  • Mais qu’est-ce qu’il a donc de si spécial ce Sofus ?

Une réponse rapide est la suivante :

  • C’est à ma connaissance le seul langage de programmation qui possède une instruction « tripler ».
  • Mais c’est rien ça, on peut définir très facilement une fonction « triple » :
  • Oui mais c’est pas pareil.
  • Je ne comprends pas où est le problème.
  • Très bien supposons que la variable V vaille actuellement 10 et je voudrais qu’elle vaille 30. Bref, je voudrais la tripler. Comment je fais ? Comment je colle ces deux blocs [1] ?
  • Ben comme ça :
  • Oui mais je préfère cette version [2] :

La différence c’est que triple est une fonction (linéaire, celle qui à un nombre associe son triple) alors que tripler est une procédure : En demandant à Sofus de tripler V, je donne un ordre qui, une fois exécuté, aboutit à ce que V soit effectivement triplé. Alors que la fonction triple ne fait qu’effectuer un calcul, et à l’issue de ce calcul, j’ai le nombre 30 mais que faire ensuite de ce nombre ? [3] Il faut bien alors effectuer une action qui est de pousser le 30 (résultat du calcul) dans la variable V, écrasant ainsi son ancien contenu.

Voici l’exposé de la première théorie mathématique des programmes,élaborée au début des années 1970 par Christopher Strachey et Dana Scott. Elle propose notamment une définition mathématique d’un programme, pas très simple, mais apte à mieux montrer, peut-être, la différence avec un algorithme :

l’article en pdf le source en odt
PDF - 841.1 ko
OpenDocument Text - 845.4 ko

Quelques définitions

Voici les définitions qu’en donne wikipedia :

  • Un programme informatique est un ensemble d’opérations destinées à être exécutées par un ordinateur ;
  • Un algorithme est une suite finie et non ambiguë d’opérations ou d’instructions permettant de résoudre un problème ou d’obtenir un résultat ;
  • Une procédure ne retourne aucune valeur, réalise une tâche bien déterminée
  • Une fonction retourne une et une seule valeur, conformément à la définition mathématique de fonction.

Le document d’accompagnement définit un algorithme de cette manière :

Un algorithme est une procédure de résolution de problème, abstraction faite des caractéristiques spécifiques qu’il peut revêtir...
Un algorithme s’applique à une famille d’instances d’un problème et produit, en un nombre fini d’étapes constructives, effectives, non-ambigües et organisées, la réponse à un problème pour toute instance de cette famille.
... un algorithme s’appuie sur un ensemble très réduit de constructions : l’affectation d’une variable, la séquence d’instructions, l’instruction conditionnelle, les boucles (bornées ou non bornées), les fonctions.

Cette citation, un peu longue mais incomplète, a pour but de montrer que ni les affichages de résultats, ni les entrées de données, ne font partie des "constructions" sur lesquelles s’appuie un algorithme.

Et le cours d’informatique de l’X propose de

concevoir un algorithme de résolution et en proposer une implémentation correcte

ce qui laisse penser que l’algorithme diffère de son implémentation (le programme).

Ceci semble aller dans le sens d’une plus ou moins grande synonymie entre, d’une part, procédure et programme (actions), d’autre part, fonction et algorithme (relation entre entrée et sortie). Cette opinion est loin de faire l’unanimité, essentiellement parce que la distinction entre procédures et fonctions est souvent vécue comme surannée. Sur cette distinction, citons Gilles Dowek, dans le cas particulier de CamL qui est un langage basé sur la programmation fonctionnelle :

A function can on one hand cause an action to be performed, such as outputting a value or altering memory, and on the other hand can return a value. Functions that do not return a value are called procedures.
In Caml, a procedure is simply a function that returns a value of type unit. Like its name implies, unit is a singleton type that contains only one value, written (). In Caml, a procedure always returns the value (), which communicates no information.
In general, no matter what the language, it is considered good form to separate functions and procedures. Functions return a value, and do not perform actions such as outputting a value, and are used as expressions. Procedures do not return a value, can perform actions, and are used as statements

Pour Gilles Dowek, une procédure est donc une fonction qui ne renvoie rien. C’est aussi le cas en Python, les procédures se terminant par return None ou return tout simplement.

En Python

En Python, les procédures et les fonctions se déclarent de la même manière, par le mot-clé def suivi du nom de la procédure/fonction puis de celui de la variable sur laquelle elle agit et du corps de la procédure/fonction après un double-point :

  1. def triple(x):
  2. return 3*x

Télécharger

C’est la présence d’une valeur après le return qui caractérise une fonction : Elle retourne quelque chose (l’image de l’antécédent par la fonction). Alors qu’une procédure ne retourne rien (ou alors on ne considère pas la valeur retournée). Ce qui est important avec une procédure, c’est ce qu’elle fait entre le def et le return. Ce qu’on appelle effet de bord (informatique) est le résultat de ces actions. Il y a au bac (jusqu’à 2017) 3 sortes d’effets de bord :

  1. les entrées de données
  2. les affichages de valeurs
  3. les affectations.

Or les deux premières sont considérées comme ne faisant pas partie [4] de l’algorithme : Celui-ci sert à calculer quelque chose, pas à l’afficher.

3) Programmes et algorithmes

Par exemple l’algorithme d’Euclide sert à calculer un pgcd. Il accepte en entrée deux nombres entiers (ceux dont on veut connaître le pgcd) et après avoir fait varier quelques variables, il retourne le pgcd. Pour rédiger cet algorithme, le groupe Algol ferait quelque chose comme

Algorithme d’Euclide
Variables d’entrée : a et b, deux entiers
tant que b ≠ 0
a, b ← b, a modulo b
fin du Tant que
Retourner a (c’est le pgcd)

On voit bien dans cette notation (outre la notation pour l’affectation, voir plus bas) que l’algorithme est vu globalement comme une manière d’associer à deux entiers (les variables d’entrée) un autre entier (la valeur retournée). Voici un extrait du code source de Python :

  1. def gcd(a, b):
  2. while b:
  3. a, b = b, a%b
  4. return a

Télécharger

Là encore, on voit que l’implémentation de l’algorithme d’Euclide est une fonction nommée gcd. La raison en est que des calculs de pgcd, on en a besoin régulièrement, et pas seulement pour les afficher ! Ici on est dans le module fractions.py et c’est pour simplifier des fractions que l’algorithme d’Euclide est utile (on divise numérateur et dénominateur par leur pgcd).

4) Entrées et sorties

Voici deux programmes ayant le même but : Calculer et afficher le pgcd de deux nombres :

Version Algobox Version html5
HTML - 37.7 ko
HTML - 1 ko

Quel que soit celui de ces deux programmes qu’on préfère, il faut bien reconnaître qu’ils sont très différents alors qu’ils implémentent tous deux l’algorithme d’Euclide, et que les entrées de données du premier n’ont pas plus leur place dans l’algorithme, que les curseurs du second.

Ergonomie

Maintenant essayez d’imaginer que l’« algorithme » que vous avez devant vous est le code source d’un logiciel de calcul intégral. Achèteriez-vous ce logiciel ? Comment évalueriez-vous l’expérience utilisateur du logiciel ? Apprécieriez-vous longtemps de passer l’essentiel de votre temps à choisir N=106 dans une fenêtre bloquante ?

Quant aux affichages, eux non plus, de par leur aspect procédural plus que fonctionnel [5], ils ne font pas réellement partie des algorithmes eux-mêmes : L’algorithme d’Euclide sert à calculer le pgcd, pas à l’afficher !

5) La flèche indique un mouvement

Histoire de notations

Lorsque le langage de programmation FLOW-MATIC a été créé au milieu des années 1950, l’affectation des variables y a été notée en anglais « move 3 to V » (en français, mettre 3 dans V). Cette notation, très naturelle, est grammaticalement un peu complexe, puisqu’on a une phrase sans sujet explicite (la phrase est à l’impératif) mais avec deux compléments :

  • Qu’est-ce qu’on bouge ?
  • Où est-ce qu’on le met ?

Il est très possible que Grace Hopper (qui a inventé ce genre de langages) se soit inspirée d’une autre programmeuse, Ada Lovelace, qui, une centaine d’années avant, écrivait :

we see that the collection Variables may be regarded as a store of numbers, accumulated there by the mill, and which, obeying the orders transmitted to the machine by means of the cards, pass alternately from the mill to the store and from the store to the mill, that they may undergo the transformations demanded by the nature of the calculation to be performed.

Pour Lady Lovelace, "mill" (« usine ») est l’équivalent du processeur, et "store" (« magasin » [6]) est l’équivalent de la mémoire.

Aussi lorsque la firme Texas Instruments a mis sur le marché les premières calculatrices programmables, ce sont les trois lettres STO (abréviation de "store" soit « stocker » en anglais) qui ont été écrites sur le bouton servant à effectuer les affectations. On remarque quand même une simplification grammaticale par rapport au style de Grace Hopper, puisque l’expression algébrique devient sujet de la phrase, l’unique complément étant le nom de la variable. En français, « mettre 3 dans V » devient « 3 va dans V ». Ce qui semble satisfaire les japonais de Casio qui pour l’affectation utilisent le symbole "→". Et une synthèse semble s’être faite par la suite entre Ti et Casio, le bouton des Ti actuelles portant "sto→" (qui donne d’ailleurs la seule flèche dans la mémoire programme). Soit dit en passant, matériellement parlant, une affectation se fait bel et bien par un mouvement : Un courant électrique qui charge ou décharge électriquement un élement de mémoire.

Mais à l’époque de Grace Hopper, a été développé Fortran qui, pour des raisons algébriques, s’est vu doté du symbole "=" pour dénoter l’affectation. C’est un choix malheureux, pour au moins les deux raisons suivantes :

  • Ce symbole est symétrique par rapport à un axe vertical, ce qui le place alors dans une catégorie choisie par l’AMS pour noter des relations symétriques, ce que n’est pas l’affectation (ne serait-ce que parce que le nom de la variable à affecter et l’expression algébrique ne sont pas de même type) ;
  • ce symbole ne colporte pas l’idée de mouvement qu’il y a dans une affectation.

En plus, en Fortran, le nom de la variable est écrit avant son futur contenu, faisant de lui le sujet de la phrase : Ce n’est plus "mettre 3 dans V" mais "V reçoit 3" qui est plus descriptif qu’impératif. On retrouvera ça avec le "prend la valeur" d’Algobox.

C’est en partie pour réagir contre cette notation qu’a été créé le groupe Algol (langage), auteur, entre autres, du langage de programmation du même nom, et d’une préconisation consistant à utiliser (dans le pseudocode) le symbole "←" et là, « mettre 3 dans V » devient tout simplement "V←3", la flèche "←" pouvant être traduite en français par le verbe "reçoit". Le problème pour le langage de programmation est que les claviers des ordinateurs de l’époque n’avaient pas de touche donnant "←" ; il a fallu imaginer une combinaison de touches pour suggérer ce "←". Trois choix semblent relativement naturels :

  • La plus logique est "<-", d’ailleurs utilisée aujourd’hui dans le langage R ;
  • Une ressemblance peut être vue avec " :-" mais ce choix n’a pas été fait par Algol, mais plus tard pour Prolog [7]
  • Mais c’est le choix de " :=" qui a été fait, probablement à cause de sa ressemblance avec Algol.

Ce choix a été retrouvé ensuite dans Pascal, Smalltalk puis d’autres langages de programmation comme Xcas. Mais le succès de Fortran a été tel que le symbole d’égalité pour désigner l’affectation a été repris dans Basic, C/C++, Java, JavaScript, Ruby, Python même R !

Comme une affectation de variable se fait par un mouvement (virtuel, d’un objet dans une boîte sur laquelle est collée une étiquette ; ou réel, d’électrons et de trous dans une cellule de la RAM), il est donc logique de la représenter par un symbole évoquant ce mouvement. Depuis quasiment les débuts de l’algorithmique, c’est le symbole "←" qui est utilisé, en particulier par Donald Knuth qui est l’auteur faisant référence en matière d’algorithmique. Comme Donald Knuth est aussi le créateur de TeX, ce symbole existe aussi en LaTeX, sous le doux nom de \leftarrow. Il présente aussi l’avantage sur l’ancienne notation du bac, d’être plus rapide à lire que les trois mots « prend la valeur » devenus presque la norme [8]. Et des « Digital Natives » ont souvent tendance à très rapidement parcourir un texte plutôt que le lire vraiment ; leur présenter un texte léger et aéré augmente les chances qu’ils le lisent.

6) Au commencement il n’y a rien

Dans le corps de l’algorithme, il y a donc beaucoup de flèches vers la gauche représentant des affectations. Celles-ci peuvent modifier une variable existante, mais aussi, dans un langage interprété comme R, JavaScript ou Python, créer une variable et l’initialiser.

Comme l’initialisation n’est qu’une affectation comme tant d’autres, il n’y a donc plus lieu de séparer les initialisations du reste de l’algorithme. Par contre, les premières lignes de l’algorithme peuvent remplacer, dans le langage des fonctions, les valeurs d’entrée de la fonction. Ainsi le script Python

  1. def pgcd(a, b):
  2. while b != 0:
  3. a, b = b, a%b
  4. return a
  5.  
  6.  
  7. print(pgcd(24,32))

Télécharger

peut être remplacé par cette version non fonctionnelle :

Python

  1. a = 24
  2. b = 32
  3. while b != 0:
  4. a, b = b, a%b
  5.  
  6. print(a)

Télécharger

puis, à l’aide de cet outil, moyennant quelques retouches, à :

a ← 24
b ← 32
Tant que b ≠ 0
       a, b ← b, a%b
fin du Tant que

JavaScript

CaRMetal permet, depuis plusieurs mois maintenant, de « fabriquer » du pseudocode à partir du JavaScript, avec getZZ().

Le CaRScript suivant

  1. a = 24;
  2. b = 32;
  3. while (b != 0) {
  4. c = b;
  5. b = a%b;
  6. a = c;
  7. }
  8. Println(getZZ());

Télécharger

donne via l’affichage de getZZ(), ce « pseudocode » :

a ⟵ 24;
b ⟵ 32;
while (b ≠ 0) {
        c ⟵ b;
        b ⟵ a%b;
        a ⟵ c;
}

qu’on peut améliorer (remplacer « while » par « tant que », l’accolade fermante par « fin tant que »).

Avec JavaScript on peut faire très court :

  1. for(a = 24,b=32;b!=0;c=b,b=a%b,a=c);
  2. Afficher(a);

Télécharger

ce qui donne ce pseudocode, peu lisible :

for(a ⟵ 24,b⟵32;b≠0;c⟵b,b⟵a%b,a⟵c);

Mais outre l’aspect peu lisible, ce code sépare (via la condition de sortie) l’initialisation du traitement, ce qui est désormais à éviter.

Algobox

Le programme de calcul de pgcd (avec entrée texte) ci-dessus avait été exporté en html depuis Algobox, avec ce fichier :

AlgoBox - 1.9 ko

Une fois ouvert avec Algobox,on peut l’exporter en texte. Ce texte, une fois chargé dans l’utilitaire, devient après clic sur « convertir »,

tant_que (b ≠ 0) faire
debut_tant_que
c ← a%b
a ← b
b ← c
fin_tant_que

D’autres exemples de codes « nouvelle notation » figurent dans la partie 1 de cet article.


ps

Références :

notes

[1Le bloc triple est en vert, couleur qui dans Snap ! désigne les fonctions, et effectivement le triple rapporte (c’est le vocabulaire de Snap !) un nombre. Le programme Snap ! est une suite de commandes l’une en-dessous de l’autre et on ne peut pas, pour des raisons syntaxiques, coller un rapporteur sous une commande.

[2Sofus, les autres étaient faits avec Snap ! dont la version française a hérité du malheureux prend la valeur d’Algobox : Malheureux parce que v prend la valeur 30 exprime un souhait et non la manière d’exaucer ce souhait, alors que v←30 montre comment on fait pour que v soit égal à 30 : On met 30 dans v

[3L’hésitation traduite par cette question n’est pas le fruit d’un caprice de prof de maths pointilleux, mais celui d’une constatation récurrente en TP, en bac blanc et lors de la correction de copies de bac : Beaucoup d’élèves de Terminale ne savent pas quoi faire du résultat d’un calcul algébrique, après avoir mené ce calcul. Au début de cet article on peut lire des "perles du bac" montrant que souvent l’incrémentation se réduit à un "calculer n+1" puis à un blocage, le candidat ne sachant pas trop quoi faire de la somme.

[4Voir aussi l’opinion de Yann Salmon sur la question.

[5En Python 3, print est devenu une fonction (d’où l’obligation de mettre des parenthèses), mais si on veut savoir quelle valeur est calculée par cette fonction, on doit faire quelque chose comme print(print(30)) qui affiche 30 (ça c’est l’effet de bord) puis None qui est la valeur calculée : Lorsqu’on fait appel à print, c’est bien à l’effet de bord qu’on s’intéresse, et pas à la valeur calculée. Voir ici pour en savoir plus

[6Noter qu’en japonais, le magasinier, donc celui qui travaille dans la mémoire de l’ordinateur selon Ada Lovelace, s’appelle sokoban ce qui est le nom d’un jeu dont il est le héros, et que l’on peut donc imaginer comme un modèle informatique, au demeurant Turing complet.

[7et en plus, pour noter la flèche de l’implication "⇐" et non "←"

[8Une exception est le sujet du BTS groupement D 2017 où on "met dans la variable" comme ci-dessus.

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