Les nouvelles technologies pour l’enseignement des mathématiques
Intégration des TICE dans l’enseignement des mathématiques

MathémaTICE, première revue en ligne destinée à promouvoir les TICE à travers l’enseignement des mathématiques.

Sur la nouvelle notation « algorithmique » aux examens

Les algorithmes seront notés de manière plus simple et plus « algorithmique » à partir de la session 2018 du bac. Après avoir abordé la question du « pourquoi », on se penchera sur celle du « comment ».

Article mis en ligne le 16 novembre 2017
dernière modification le 26 avril 2018

par Alain Busser, Benjamin Clerc

Cet article peut être librement diffusé à l’identique suivant la license CC-by-nd

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 :

é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 : Traduction de tous 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ù :

Pondichery avril 2017
Pondichery avril 2017
Pondichery 2017
  • Amérique du Nord Juin 2017 : L’algorithme est dans l’exercice 3 question 3, il serait alors proposé sous cette forme :
    Un ← 3
    somme ← Un
    Pour i allant de 1 à n
      Un ← ...
      somme ← ...
    Fin Pour

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

Amérique du Nord 2017
Amérique du Nord 2017
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 :

Liban 2017
Liban 2017
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 :

Centres étrangers 2017
Centres étrangers 2017
Centres étrangers 2017 - script Python
Asie Juin 2017
Asie Juin 2017
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 :

Polynésie - Septembre 2017
Polynésie - Septembre 2017
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 :

Métropole - Septembre 2017
Métropole - Septembre 2017
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 :

Nouvelle Calédonie Novembre 2017
Nouvelle Calédonie Novembre 2017
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 :

Pondichéry - Avril 2017 - STMG
Pondichéry - Avril 2017 - STMG
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 :

Centres étrangers 2017 - STMG
Centres étrangers 2017 - STMG
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 :

STMG Polynésie juin 2017
STMG Polynésie juin 2017
STMG Polynésie juin 2017 - Script Python
STMG Métropole juin 2017
STMG Métropole juin 2017
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 :

STMG Antilles-Guyane juin 2017
STMG Antilles-Guyane juin 2017
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 :

STMG Antilles-Guyane Septembre 2017
STMG Antilles-Guyane Septembre 2017
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 :

STMG Polynésie septembre 2017
STMG Polynésie septembre 2017
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 :

STMG Métropole septembre 2017
STMG Métropole septembre 2017
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 :

Nouvelle Calédonie Novembre 2017
Nouvelle Calédonie Novembre 2017
Nouvelle Calédonie Novembre 2017 - Script Python

En terminale ES :

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 :

TES Pondichéry juin 2017
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 :

ES Amérique du Nord Juin 2017
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 :

ES Liban Juin 2017
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 :

ES Centres étrangers Juin 2017
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 :

ES Antilles-Guyane Juin 2017
ES Antilles-Guyane Juin 2017
  • Polynésie juin 2017, L’algorithme est dans l’exercice 3 2) (le sujet sur le site de l’APMEP n’est as correct), il serait alors proposé sous cette forme :
    U ←  4000
    N ←  2015
    ......
      .......
      .......
    .......

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

ES Polynésie Juin 2017
ES Polynésie Juin 2017
  • Métropole—La Réunion juin 2017, L’algorithme est dans l’exercice 2 Partie B 1), cet exercice est traité dans le document de l’Inspection Générale. A noter qu’il ne précise pas qu’il faut changer l’énoncé alors que celui-ci demande « compléter l’algorithme de façon qu’il affiche le montant total des cotisations de l’année 2017. », que l’on pourra remplacer par « compléter l’algorithme de façon qu’il calcule le montant total des cotisations de l’année 2017. ».
  • Asie juin 2017, L’algorithme est dans l’exercice 4 4), il serait alors proposé sous cette forme :
    P ←  0.2
    N ←  ....
    Pour I allant de 2 à N
      P ←  0.5P+0.2
    Fin Pour

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

ES Asie Juin 2017
ES Asie Juin 2017
  • Métropole (copies volées) juin 2017, L’algorithme est dans l’exercice 2 4), il serait alors proposé sous cette forme :
    A ←  0.92
    N ←  0
    Tant que ....
      N ←  ....
      A ←  ....
    Fin Tant que

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

ES Métropole (copies volées) Juin 2017
ES Métropole (Copies volées) Juin 2017
V ← 10
S ← 10
N ← 0
Tant que S<=50
  V ← 1,05×V
  S  ← S +V
  N ← N +1
Fin Tant que

algorithme 1

V ← 10
S ← 10
Pour K allant de 1 à 4
  V ← 1,05×V
  S  ← S +V
Fin Pour

algorithme 2

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

ES Antilles-Guyane Septembre 2017
ES Antilles-Guyane Septembre 2017
  • Polynésie septembre 2017, Les algorithmes sont dans l’exercice 3, ils seraient alors proposés sous cette forme :
    Pour la première question :
    U ← ....
    Pour N allant de 1 à 24
      U ← ....
    Fin Pour

    Pour la seconde question :

S ← 0
Pour N allant de 0 à 24
  S ← S+50×0,9^N
Fin Pour

algorithme 1

S ← 0
Pour N allant de 0 à 24
  S ← 50×0,9^N
Fin Pour

algorithme 2

S ← 50
Pour N allant de 0 à 24
  S ← S+50×0,9^N
Fin Pour

algorithme 3

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

ES Polynésie Septembre 2017
ES Polynésie Septembre 2017
  • Métropole-La Réunion septembre 2017, Il est question d’algorithme dans l’exercice 3 4)c. en obligatoire et dans l’exercice 3 Partie B 3)a. en spécialité. Dans les deux sujets, l’algorithme est à proposer par le candidat dans sa totalité.
    Pour le sujet obligatoire on peut proposer de remplacer « Proposer un algorithme affichant le tirage moyen journalier, à partir de 2007 jusqu’à l’année (2007+n), pour un nombre d’années n saisi par l’utilisateur. » par « Proposer un algorithme affichant le tirage moyen journalier l’année (2007+n). »
    Pour le sujet de spécialité on peut proposer de remplacer « Proposer un algorithme affichant la proportion des enfants de la commune inscrits à cet éveil musical à partir de 2013 jusqu’à l’année (2013 + n), pour un nombre d’années n saisi par l’utilisateur. » par « Proposer un algorithme calculant la proportion des enfants de la commune inscrits à cet éveil musical l’année (2013 + n). »
  • Amérique du Sud novembre 2017, L’algorithme est dans l’exercice 2 3), il serait alors proposé sous cette forme :
    A ←  20000
    B ←  20000
    N ←  0
    Tant que A<=B
      A ←  1.04*A
      B ←  1.025*B+330
      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 :

ES Amérique du Sud Novembre 2017
ES Amérique du Sud Novembre 2017
  • Nouvelle Calédonie novembre 2017 Il est question d’algorithme dans l’exercice 3 4), l’algorithme est à proposer par le candidat dans sa totalité. On peut proposer de remplacer « 4. a. Proposer un algorithme affichant la superficie (en millions d’hectares) occupée par les forêts sur la Terre, pour chaque année de 2013 à 2029. » par « 4. a. Proposer un algorithme calculant la superficie (en millions d’hectares) occupée par les forêts sur la Terre, pour chaque année de 2013 à 2029. »

En terminale STI2D

Initialisation
a prend la valeur 0
b prend la valeur 5
Traitement
Tant que |b−a|>0,2
   m prend la valeur (a+b)/2
   Si f(m) > 80
       a prend la valeur m
   Sinon
       b prend la valeur m
   Fin si
Fin Tant que
Sortie
Afficher a, b
a ← 0
b ← 5
Tant que |b−a|>0,2
   m ← (a+b)/2
   Si f(m) > 80
       a ← m
   Sinon
       b ← m
   Fin Si
Fin Tant que
Algorithme initial Algorithme Bac 2018

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

STI2D Polynesie Juin 2017
STI2D Polynésie Juin 2017
Variables
A un nombre réel
P un nombre réel
Début
A prend la valeur 0
P prend la valeur 1013,25
Tant que … faire
   A prend la valeur A+0,1
   P prend la valeur ...
Fin tant que
Afficher ..
Fin
a ← 0
p ← 1013,25
Tant que …
   a ← a+0,1
   p ← ...
Fin Tant que
Algorithme initial Algorithme Bac 2018

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

STI2D Antilles-Guyane Juin 2017
STI2D Antilles-Guyane Juin 2017
  • Métropole—La Réunion STI2D & STL SPCL septembre 2017, Les algorithmes sont dans l’exercice 1 4) (QCM) (Il y a une erreur dans l’énoncé, nous faisons l’hypothèse que c’est 450, et non 405, la bonne valeur). L’un des algorithmes initialement proposé ne peut plus l’être car son existence repose sur l’affichage qui est supprimé, nous en proposons un autre :
STI2D Métropole Septembre 2017
STI2D Métropole Septembre 2017

En terminale STLbio

Variables :
u et S réels
Initialisation :
u prend la valeur 30
S prend la valeur 30
Traitement :
Pour i allant de 1 à 5
   u prend la valeur 0,97×u
   S prend la valeur S +u
Fin Pour
Sortie
Afficher S
u ← 30
S ← 30
Pour i allant de 1 à 5
   u ← 0.97*u
   S ← S+u
Fin Pour
Algorithme initial Algorithme Bac 2018

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

STL - Biotechnologies - Polynésie Juin 2017
STL - Biotechnologies - Polynésie Juin 2017
K ← 1
Pour i allant de 1 à 5
   K ←  0,97∗K
Fin Pour
K ← 1
i ← 0
Tant que K > 0,5
   i ← i+1
   K ← 0,97∗K
Fin Pour

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

STL - Biotechnologies - Antilles-Guyane Juin 2017
STL - Biotechnologies - Antilles-Guyane Juin 2017
STL - Biotechnologies - Métropole Septembre 2017
STL - Biotechnologies - Métropole 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

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

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 :

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.