Le Cahier de Maths

Partie 4 · Algorithmique et programmation · Chapitre 20

Du langage naturel à Python

Traduire un algorithme dans les deux sens.

Les trois derniers chapitres du programme ne demandent pas de nouvelles mathématiques : ils demandent de savoir écrire et lire un programme. Au baccalauréat, l’algorithmique n’est jamais un exercice isolé, elle s’invite dans les autres questions : chercher le rang à partir duquel une suite dépasse un seuil, simuler un échantillon, calculer une intégrale par des rectangles. Ce chapitre pose le vocabulaire, les deux suivants l’exploitent.

Qu’est-ce qu’un algorithme ?

Définition : Algorithme

Un algorithme est une suite finie d’instructions non ambiguës qui, à partir de données, produit un résultat en un nombre fini d’étapes.

Un programme est la traduction d’un algorithme dans un langage compris par la machine. Ici, ce sera Python.

Remarque : trois exigences

  • Non ambigu : « prendre un nombre à peu près grand » n’est pas une instruction.
  • Fini : l’algorithme doit s’arrêter. Une boucle qui tourne sans fin n’est pas un algorithme.
  • Ordonné : les instructions s’exécutent l’une après l’autre, de haut en bas.

Exemple

« Multiplier un nombre par lui-même, puis afficher le résultat » est un algorithme. En Python :

n = 6carre = n * nprint(carre)

Ce que le programme affiche

36

Les variables et l’affectation

Définition : Variable et affectation

Une variable est un nom qui désigne un emplacement de la mémoire, dans lequel on range une valeur. L’instruction n = 7\texttt{n = 7} est une affectation : elle range la valeur 77 dans la variable n\texttt{n}.

Une affectation remplace l’ancienne valeur : celle-ci est définitivement perdue.

n7n = n + 3n10l’ancienne valeur est écrasée
Effet de l’instruction n = n + 3 : la machine calcule d’abord n + 3, puis range le résultat dans n, ce qui écrase la valeur précédente.

Méthode : lire une affectation de droite à gauche

  • La machine calcule d’abord le membre de droite, avec les valeurs actuelles des variables.
  • Puis elle range ce résultat dans la variable du membre de gauche.
  • Le signe =\texttt{=} ne signifie donc pas « est égal à ». L’instruction n = n + 3\texttt{n = n + 3} n’est pas une équation, c’est un ordre.

Exemple

Suivons ces trois lignes :

n = 7n = n + 3print(n)

Ce que le programme affiche

10

À la ligne 2, le membre de droite n + 3\texttt{n + 3} vaut 7+3=107 + 3 = 10 ; c’est cette valeur qui est rangée dans n\texttt{n}. Le 77 n’existe plus.

Remarque : nommer ses variables

Un nom de variable commence par une lettre, ne contient ni espace ni accent, et distingue les majuscules des minuscules : n\texttt{n} et N\texttt{N} sont deux variables différentes. Un nom parlant, comme somme\texttt{somme} ou compteur\texttt{compteur}, rend le programme lisible.

Calculer : les opérateurs

Python connaît les opérations usuelles, plus deux opérateurs très utiles en arithmétique.

OpérateurEffetExempleRésultat
+\texttt{+} -\texttt{-} *\texttt{*}somme, différence, produit5 * 3\texttt{5 * 3}1515
/\texttt{/}quotient décimal7 / 2\texttt{7 / 2}3,53{,}5
//\texttt{//}quotient entier de la division euclidienne7 // 2\texttt{7 // 2}33
%\texttt{\%}reste de la division euclidienne7 % 2\texttt{7 \% 2}11
**\texttt{**}puissance2 ** 10\texttt{2 ** 10}10241024

Méthode : l’opérateur reste, à connaître absolument

n % 2\texttt{n \% 2} vaut 00 si nn est pair et 11 si nn est impair. Plus généralement, n % k == 0\texttt{n \% k == 0} teste si nn est un multiple de kk. C’est le test de divisibilité de tous les exercices.

Exemple

print(17 // 5, 17 % 5)print(2 ** 10)print(7 / 2)

Ce que le programme affiche

3 2
1024
3.5

On retrouve la division euclidienne : 17=5×3+217 = 5 \times 3 + 2. Noter que Python écrit les décimaux avec un point, jamais une virgule.

Communiquer : entrer et afficher

Définition : Les deux instructions d’échange

  • print(...)\texttt{print(...)} affiche une valeur à l’écran.
  • input(...)\texttt{input(...)} demande une valeur à l’utilisateur, et la renvoie toujours sous forme de texte.

Comme input\texttt{input} renvoie du texte, il faut convertir : int(...)\texttt{int(...)} pour un entier, float(...)\texttt{float(...)} pour un décimal.

Exemple

Un programme qui demande un entier et affiche son double :

n = int(input("Entrez un entier : "))print("Le double vaut", 2 * n)

Sans le int\texttt{int}, la variable n\texttt{n} contiendrait le texte "5"\texttt{"5"}, et 2 * n\texttt{2 * n} afficherait 55\texttt{55} au lieu de 1010 : Python répéterait le texte deux fois au lieu de doubler un nombre.

Remarque : au bac, la valeur est le plus souvent donnée

Les sujets écrivent rarement input\texttt{input} : ils fixent la valeur dans le programme, ou la reçoivent en paramètre d’une fonction, ce que l’on verra au chapitre suivant. Cela rend le programme reproductible, donc corrigible.

Les instructions conditionnelles

Définition : Si… alors… sinon

Une instruction conditionnelle exécute un bloc d’instructions seulement si une condition est vraie. En Python, elle s’écrit avec if\texttt{if}, éventuellement elif\texttt{elif} et else\texttt{else} :

if condition:    instructions exécutées si la condition est vraieelse:    instructions exécutées sinon

Propriété : Deux règles de syntaxe à ne jamais oublier

  • La ligne du if\texttt{if} se termine par un deux-points.
  • Le bloc qui suit est indenté de quatre espaces. En Python, c’est l’indentation, et elle seule, qui délimite les blocs : une ligne non indentée n’appartient plus au if\texttt{if}.
ConditionSignification
a == b\texttt{a == b}aa est égal à bb (double signe égal)
a != b\texttt{a != b}aa est différent de bb
a < b\texttt{a < b} et a <= b\texttt{a <= b}a<ba < b et aba \leqslant b
a > b\texttt{a > b} et a >= b\texttt{a >= b}a>ba > b et aba \geqslant b
and\texttt{and}, or\texttt{or}, not\texttt{not}et, ou, non
débutn % 2 == 0 ?ouinonpairimpairfin
Organigramme d’une instruction conditionnelle : le losange porte le test, chaque branche exécute son bloc, puis les deux branches se rejoignent.

Exemple

n = 7if n % 2 == 0:    print("pair")else:    print("impair")

Ce que le programme affiche

impair

Exemple : trois cas avec elif

x = 0if x > 0:    print("positif")elif x < 0:    print("négatif")else:    print("nul")

Ce que le programme affiche

nul

Les cas sont examinés dans l’ordre et un seul bloc est exécuté : dès qu’une condition est vraie, les suivantes ne sont même pas testées.

Les deux façons de répéter

Répéter des instructions se fait de deux manières, selon que l’on connaît ou non à l’avance le nombre de tours.

Définition : Boucle bornée et boucle non bornée

  • La boucle bornée for\texttt{for} répète un nombre de fois connu à l’avance.
  • La boucle non bornée while\texttt{while} répète tant qu’une condition est vraie, sans savoir combien de tours cela prendra.

Exemple

Compter jusqu’à 33, une fois avec chaque boucle :

for i in range(4):    print(i)

Ce que le programme affiche

0
1
2
3
i = 0while i <= 3:    print(i)    i = i + 1

Ce que le programme affiche

0
1
2
3

Les deux affichent la même chose, mais la seconde exige d’initialiser i\texttt{i} avant la boucle et de l’incrémenter dedans. Oublier la ligne 4 ferait tourner le programme sans fin.

débuti < 5 ?ouii = i + 1nonfin
Organigramme d’une boucle « tant que » : après le corps, la flèche rouge revient AVANT le test, qui est donc évalué de nouveau à chaque tour.

Méthode : choisir sa boucle

  • « Calculer les 2020 premiers termes » : le nombre de tours est connu, donc for\texttt{for}.
  • « Chercher le premier rang où la suite dépasse 10001000 » : on ignore combien de tours il faudra, donc while\texttt{while}.

Traduire dans les deux sens

Le programme demande de savoir passer du langage naturel à Python et de Python au langage naturel. Voici le dictionnaire à connaître.

Langage naturelPython
nn prend la valeur 55n = 5\texttt{n = 5}
Demander un entier nnn = int(input())\texttt{n = int(input())}
Afficher nnprint(n)\texttt{print(n)}
nn prend la valeur n+1n + 1n = n + 1\texttt{n = n + 1}
Si nn est pair, alors… sinon…if n % 2 == 0:\texttt{if n \% 2 == 0:}else:\texttt{else:}
Pour ii allant de 00 à n1n - 1for i in range(n):\texttt{for i in range(n):}
Tant que u>103u > 10^{-3}while u > 10 ** (-3):\texttt{while u > 10 ** (-3):}

Exemple : du langage naturel à Python

« SS prend la valeur 00. Pour kk allant de 11 à 1010, ajouter k2k^2 à SS. Afficher SS. »

S = 0for k in range(1, 11):    S = S + k ** 2print(S)

Ce que le programme affiche

385

Attention au 11\texttt{11} : range(1, 11)\texttt{range(1, 11)} parcourt 1,2,,101,\, 2,\, \dots,\, 10, la borne de droite étant exclue. Ce point est détaillé au chapitre suivant.

Exemple : de Python au langage naturel

u = 1n = 0while u < 100:    u = 3 * u    n = n + 1print(n)

Ce que le programme affiche

5

En français : « uu vaut 11 et nn vaut 00. Tant que uu reste strictement inférieur à 100100, on triple uu et on compte un tour de plus. On affiche enfin le nombre de tours. » Ce programme cherche donc **le plus petit entier nn tel que 3n1003^n \geqslant 100**, et affiche 55, car 34=81<1003^4 = 81 < 100 et 35=2431003^5 = 243 \geqslant 100.

Suivre un programme pas à pas

C’est l’exercice le plus fréquent au baccalauréat : on donne un programme, on demande ce qu’il affiche. La seule méthode fiable est le tableau d’exécution, où l’on note la valeur de chaque variable après chaque ligne.

Méthode : construire un tableau d’exécution

  • Une colonne par variable, une ligne par instruction exécutée.
  • Recopier la valeur d’une variable tant qu’elle ne change pas.
  • Pour une boucle, une ligne par tour : ne pas sauter de tour, c’est là que se glissent les erreurs.
  • Vérifier la condition d’arrêt avant chaque tour pour un while\texttt{while}.

Exemple

Que fait ce programme ?

a = 3b = 5a = a + bb = a - ba = a - bprint(a, b)

Ce que le programme affiche

5 3
Ligne exécutéea\texttt{a}b\texttt{b}
a = 3\texttt{a = 3}33
b = 5\texttt{b = 5}3355
a = a + b\texttt{a = a + b}8855
b = a - b\texttt{b = a - b}8833
a = a - b\texttt{a = a - b}5533

Le tableau révèle l’intention du programme : il échange les contenus de a\texttt{a} et b\texttt{b}, sans utiliser de troisième variable.

Remarque : l’échange naïf ne marche pas

a = 3b = 5a = bb = aprint(a, b)

Ce que le programme affiche

5 5

À la ligne 3, la valeur 33 est écrasée : elle n’existe plus nulle part, et la ligne 4 ne peut que recopier 55. Pour échanger simplement, il faut une variable temporaire : t = a\texttt{t = a}, puis a = b\texttt{a = b}, puis b = t\texttt{b = t}.

Erreurs classiques à éviter

  • Confondre =\texttt{=} et ==\texttt{==}.

    =\texttt{=} affecte une valeur, ==\texttt{==} teste une égalité. Un test s’écrit toujours if n == 0:\texttt{if n == 0:}, jamais if n = 0:\texttt{if n = 0:}, qui est une erreur de syntaxe.

  • Lire n = n + 1\texttt{n = n + 1} comme une équation.

    Ce n’est pas une équation, c’est un ordre : « calculer n+1n + 1, puis ranger le résultat dans nn ». Comme équation, elle n’aurait aucune solution.

  • Oublier le deux-points en fin de ligne.

    Toute ligne ouvrant un bloc (if\texttt{if}, else\texttt{else}, for\texttt{for}, while\texttt{while}, def\texttt{def}) se termine par :\texttt{:}. Sans lui, Python refuse d’exécuter le programme.

  • Négliger l’indentation.

    En Python, l’indentation est la syntaxe : elle seule dit quelles lignes appartiennent au bloc. Décaler une ligne d’un cran change le sens du programme.

  • Oublier de convertir le résultat de input\texttt{input}.

    input\texttt{input} renvoie toujours du texte. Sans int(...)\texttt{int(...)} ou float(...)\texttt{float(...)}, 2 * n\texttt{2 * n} répète le texte au lieu de doubler un nombre.

  • Écrire les décimaux avec une virgule.

    Python écrit 3.5\texttt{3.5}, avec un point. Une virgule sépare deux valeurs distinctes : print(3, 5)\texttt{print(3, 5)} affiche deux nombres.

  • Oublier d’incrémenter la variable dans un while\texttt{while}.

    Si aucune instruction du corps ne rapproche de la condition d’arrêt, la boucle tourne indéfiniment. Vérifier systématiquement que quelque chose progresse à chaque tour.

  • Utiliser une variable avant de l’avoir créée.

    Toute variable doit recevoir une valeur avant d’être lue. Un compteur ou une somme se déclarent avant la boucle, par S = 0\texttt{S = 0} ou n = 0\texttt{n = 0}.

Et maintenant

Le cours est lu ? Vérifie qu’il est acquis : le QCM repère les trous, les exercices confirment en conditions réelles, les flashcards ancrent les formules.