C1 — Notions de baseDans le dialogue d’impression, choisissez « Enregistrer au format PDF » comme destination.
Retour

Licence 1 · Algorithmique 1

Cours 1Notions de base

Savoir lire un algorithme et suivre son exécution pas à pas.

3 chapitres · 60 min de travail estimé

  1. 1. Qu'est-ce qu'un algorithme ?20 min
  2. 2. Variables et affectation20 min
  3. 3. Conditions et booléens20 min

Chapitre 1 · 20 min

Qu'est-ce qu'un algorithme ?

Reconnaître entrée, traitement et sortie, lire un pseudocode, suivre une trace d'exécution.

Un algorithme est une suite finie d'instructions précises qui transforme des données d'entrée en un résultat. Rien de plus. Pas besoin d'ordinateur : une recette de cuisine, un mode d'emploi de montage, la méthode de la division posée apprise en primaire — ce sont des algorithmes.

Ce qui distingue l'algorithmique d'un simple mode d'emploi, c'est l'exigence de rigueur. Un humain comble les trous d'une consigne floue ; une machine, non.

Les trois exigences

Pour mériter le nom d'algorithme, une méthode doit satisfaire trois conditions. Elles paraissent évidentes tant qu'on ne cherche pas de contre-exemple.

Fini. L'exécution doit s'arrêter, en un nombre d'étapes borné. « Ajouter 1 à un compteur et recommencer » n'est pas un algorithme : ça ne finit jamais.

Précis. Chaque instruction n'admet qu'une seule interprétation. « Assaisonner à votre goût » est une consigne humaine acceptable et une instruction algorithmique nulle : deux exécutants obtiendraient deux résultats différents.

Effectif. Chaque instruction doit être réellement exécutable avec les moyens disponibles. « Prendre le plus petit nombre réel strictement positif » est parfaitement précis, parfaitement fini à énoncer… et impossible à exécuter, car ce nombre n'existe pas.

Quiz · 1 question

« Tant que le résultat ne vous plaît pas, recommencez. » Quelle exigence cette instruction viole-t-elle en premier ?

  • La finitude : rien ne garantit qu'on s'arrête un jour
  • La précision : « vous plaît » n'a pas de sens unique et vérifiable
  • L'effectivité : recommencer est impossible à exécuter

Réponse : Elle viole d'abord la précision : « le résultat vous plaît » n'est pas un test qu'une machine peut évaluer. Elle menace aussi la finitude, mais c'est une conséquence : un test qu'on ne sait pas évaluer ne peut évidemment pas garantir l'arrêt.

Entrée, traitement, sortie

Tout algorithme se lit sur trois temps, et c'est le premier réflexe à acquérir : avant d'écrire une ligne, savoir ce qui entre, ce qu'on en fait, ce qui sort.

TempsQuestionDans le pseudocode
EntréeDe quoi ai-je besoin ?Lire(...)
TraitementQu'est-ce que je calcule ?les affectations, avec
SortieQue dois-je produire ?Écrire(...)

Un algorithme n'invente rien : s'il a besoin de la longueur d'un rectangle, quelqu'un doit la lui fournir. Et s'il ne fait rien sortir, il ne sert à rien — un calcul dont personne ne voit le résultat est du travail perdu.

La structure d'un algorithme

Le pseudocode n'est pas un langage de programmation. C'est une convention d'écriture, à mi-chemin entre le français et le code, qui permet de raisonner sans se battre avec la syntaxe d'un langage particulier. Le même algorithme se traduira ensuite en Python, en C ou en JavaScript.

Algorithme RectangleVariables    longueur, largeur : réels    aire, perimetre : réelsDébut    Lire(longueur)    Lire(largeur)    aire ← longueur × largeur    perimetre ← 2 × (longueur + largeur)    Écrire(aire)    Écrire(perimetre)Fin

Quatre parties, toujours dans cet ordre : un nom, la déclaration des variables avec leur type, puis le corps entre Début et Fin. Déclarer une variable, c'est réserver un casier en mémoire et annoncer ce qu'on va y mettre.

L'affectation

La flèche est le symbole le plus important de tout le cours. aire ← longueur × largeur se lit : calculer ce qui est à droite, puis ranger le résultat dans le casier de gauche.

Elle n'est pas symétrique. aire ← 21 a un sens ; 21 ← aire n'en a aucun. Et elle n'est pas l'égalité mathématique : nous verrons à la leçon suivante que x ← x + 1, absurde en mathématiques, est parfaitement ordinaire en algorithmique.

Suivre une trace d'exécution

Tracer un algorithme, c'est jouer le rôle de la machine : dérouler les lignes une par une en notant, après chaque ligne, le contenu de chaque variable. C'est l'exercice fondamental du semestre — et le seul moyen fiable de trouver pourquoi un algorithme ne fait pas ce qu'on croyait.

Faites défiler l'animation, ou cliquez directement une étape pour y sauter.

Animation · 8 étapes

Trace de l'algorithme Rectangle (longueur = 7, largeur = 3)

  1. Au départ, rien n'est connuLes quatre variables sont déclarées, donc les casiers existent — mais ils ne contiennent aucune valeur utilisable. On note « ? ».
  2. Entrée : on lit la longueurLire fait entrer une valeur venue de l'extérieur (clavier, fichier, capteur). C'est l'entrée de l'algorithme : il ne l'invente pas.
  3. Entrée : on lit la largeurDeuxième et dernière donnée d'entrée. Le reste sera calculé.
  4. Traitement : aire ← 7 × 3La flèche ← calcule d'abord tout ce qui est à sa droite (7 × 3 = 21), puis range le résultat dans le casier de gauche.
  5. Traitement : perimetre ← 2 × (7 + 3)2 × 10 = 20. Les parenthèses ne sont pas décoratives : sans elles, 2 × 7 + 3 donnerait 17.
  6. Sortie : on affiche l'aireÉcrire ne modifie rien en mémoire : aire vaut toujours 21 après. Afficher et calculer sont deux actions distinctes.
  7. Sortie : on affiche le périmètreDeuxième et dernière sortie de l'algorithme.
  8. Fin — l'algorithme s'arrêteHuit lignes, huit étapes, aucune répétition : le nombre d'étapes était connu d'avance. L'exigence de finitude est évidemment respectée.

Trois choses à remarquer dans cette trace. Les variables commencent à ? : déclarée n'est pas initialisée, et lire une variable jamais affectée est une erreur classique. Écrire ne modifie rien en mémoire — afficher et calculer sont deux actions distinctes. Enfin, le nombre d'étapes était connu d'avance : huit lignes, huit étapes, aucune répétition.

Voici la même trace telle que vous l'écririez sur une copie :

LignelongueurlargeuraireperimetreSortie
Lire(longueur)7???
Lire(largeur)73??
aire ← ...7321?
perimetre ← ...732120
Écrire(aire)73212021
Écrire(perimetre)73212021, 20

Quiz · 1 question

Dans la trace, après la ligne Écrire(aire), que vaut la variable aire ?

  • Elle vaut toujours 21 : Écrire lit la variable sans la vider
  • Elle redevient ? : la valeur a été consommée par l'affichage
  • Elle vaut 0 : afficher remet le casier à zéro

Réponse : Écrire est une opération de lecture. Elle copie la valeur vers l'écran et laisse la mémoire intacte — on peut afficher la même variable dix fois de suite.

Quiz · 1 question

Quel est l'ordre d'exécution de aire ← longueur × largeur ?

  • On range d'abord dans aire, puis on calcule longueur × largeur
  • On calcule d'abord longueur × largeur, puis on range le résultat dans aire
  • Les deux se font en même temps

Réponse : Toujours la droite d'abord, puis le rangement à gauche. Cette règle paraît anodine ici ; c'est elle qui rendra lisible x ← x + 1 dans la prochaine leçon.

À vous

Exercice de code

Écrivez les deux traitements de l'algorithme, puis vérifiez la sortie dans la console.

Point de départ

// Traduisez l'algorithme Rectangle en JavaScript.
// Les Lire() sont remplacés par des valeurs fixées : ce n'est pas la saisie
// qu'on travaille ici, c'est le traitement.
const longueur = 7;
const largeur = 3;

let aire = 0;       // à corriger
let perimetre = 0;  // à corriger

console.log(aire);       // attendu : 21
console.log(perimetre);  // attendu : 20

Solution

const longueur = 7;
const largeur = 3;

// La flèche ← du pseudocode devient = en JavaScript : même sens de lecture,
// on calcule la droite et on range le résultat à gauche.
const aire = longueur * largeur;
const perimetre = 2 * (longueur + largeur);

console.log(aire);       // 21
console.log(perimetre);  // 20

À retenir

Flashcards · 2 cartes

Quelles sont les trois exigences d'un algorithme ?
Fini (il s'arrête), précis (une seule interprétation possible), effectif (chaque instruction est réellement exécutable).
Comment se lit l'affectation x ← expression ?
On évalue d'abord l'expression à droite, puis on range le résultat dans le casier x. L'ancienne valeur de x est écrasée.

Chapitre 2 · 20 min

Variables et affectation

Comprendre l'affectation comme un remplacement, et échanger le contenu de deux variables.

Une variable est un casier nommé dans la mémoire. Le nom sert à le désigner, le casier contient une valeur, et cette valeur peut changer au cours de l'exécution — d'où le nom.

Trois choses à ne jamais confondre : le nom (somme), le contenu (42), et le type (entier). Le nom ne change jamais. Le contenu change à chaque affectation. Le type est fixé à la déclaration et engage tout le reste.

Variables    age : entier    taille : réel    nom : chaîne    majeur : booléen

Un casier peut être vide au départ : déclarer réserve la place, cela ne met rien dedans. Utiliser une variable jamais affectée, c'est lire un casier dont on ne sait pas ce qu'il contient — une des sources d'erreur les plus pénibles à diagnostiquer, parce que le programme ne plante pas forcément, il donne juste un résultat faux.

L'affectation est un remplacement, pas une équation

x ← 5 ne signifie pas « x égale 5 » mais « mets 5 dans x ». La nuance est décisive :

x ← 5x ← 8

Après ces deux lignes, x vaut 8. Le 5 n'est plus nulle part. L'affectation écrase : elle ne cohabite pas avec l'ancienne valeur, elle la détruit. Un casier ne contient qu'une chose à la fois.

C'est ce qui rend possible une ligne comme celle-ci, qui n'a aucun sens en mathématiques :

x ← x + 1

Appliquez la règle de la leçon 1 — la droite d'abord. Si x vaut 7 : on évalue 7 + 1, ce qui donne 8, puis on range 8 dans x. La ligne se lit « augmente x de 1 ». Sans la règle de la droite d'abord, elle ressemble à l'équation absurde x=x+1x = x + 1 ; avec elle, elle est limpide.

Quiz · 1 question

Après x ← 5, puis y ← x, puis x ← 8, que vaut y ?

  • 8, car y suit les changements de x
  • 5, car y a reçu une copie de la valeur
  • Rien : y n'a jamais été déclarée

Réponse : y ← x copie la VALEUR de x au moment de l'exécution. Les deux casiers restent indépendants : modifier x ensuite ne touche pas y. Il n'y a aucun lien permanent entre deux variables.

Échanger deux variables

Voici le problème le plus instructif de toute la leçon. On a a = 5 et b = 9, on veut finir avec a = 9 et b = 5. La solution qui vient naturellement est fausse — et la raison de son échec est exactement la propriété d'écrasement qu'on vient de voir.

Animation · 5 étapes

Échanger a et b… sans variable temporaire

  1. a reçoit 5Objectif de l'algorithme : finir avec a = 9 et b = 5.
  2. b reçoit 9État initial en place. Les deux valeurs à échanger sont 5 et 9.
  3. a ← b : le 5 vient d'être écraséL'affectation REMPLACE le contenu du casier. La valeur 5 n'existe plus nulle part, dans aucune variable. Le mal est déjà fait, même si l'erreur ne se verra qu'à l'étape suivante.
  4. b ← a : b reçoit… 9On voulait donner à b l'ancien a. Mais a ne vaut plus 5, il vaut 9. Rien ne bouge à l'écran, et c'est précisément le problème.
  5. Résultat : 9 et 9L'échange a échoué et une donnée a été perdue. On attendait 9 et 5.

Regardez bien l'étape 3. Au moment où a ← b s'exécute, la valeur 5 disparaît de la mémoire. Elle n'est nulle part ailleurs : elle est perdue. L'étape 4 essaie de la rendre à b, mais elle n'existe plus. On finit avec deux fois 9.

La solution demande un troisième casier, dont le seul rôle est de garder la valeur menacée le temps de l'opération.

Animation · 6 étapes

Échanger a et b avec une variable temporaire

  1. a reçoit 5Même point de départ que la version ratée, avec un casier de plus.
  2. b reçoit 9tmp existe mais ne sert pas encore.
  3. tmp ← a : on met 5 à l'abriC'est toute l'astuce. Avant d'écraser a, on en garde une copie ailleurs. Copier ne vide pas la source : a vaut toujours 5.
  4. a ← b : a devient 9Le 5 de a est écrasé, exactement comme dans la version ratée — mais cette fois il est en sécurité dans tmp.
  5. b ← tmp : b récupère l'ancien atmp était le seul endroit où subsistait le 5. On le rend à b.
  6. Résultat : 9 et 5 — échange réussiTrois affectations, jamais moins. Retenir l'ordre : sauvegarder, écraser, restituer.

Retenez le schéma en trois temps, il resservira au chapitre sur les tris : sauvegarder — écraser — restituer.

tmp ← aa ← bb ← tmp

Trois affectations, jamais moins, et l'ordre n'est pas négociable : intervertir deux de ces lignes ramène le bug de la version ratée.

Quiz · 1 question

Pourquoi la version sans variable temporaire échoue-t-elle ?

  • Parce qu'il manque une déclaration de variable
  • Parce que la première affectation détruit la valeur dont la seconde a besoin
  • Parce qu'on ne peut pas affecter une variable à une autre variable

Réponse : a ← b écrase le 5 avant que b ait pu le recevoir. La variable temporaire n'est pas une astuce d'écriture : c'est le seul endroit où la valeur menacée peut survivre à l'écrasement.

Quiz · 1 question

Que vaut somme après : somme ← 0 ; somme ← somme + 3 ; somme ← somme + 4 ?

  • 7les deux ajouts cumulés
  • 0l'initialisation seule
  • 34les chiffres mis bout à bout

Réponse : À chaque ligne, on relit le contenu actuel de somme, on ajoute, on range le total. 0 puis 3 puis 7. C'est le mécanisme de l'accumulateur, la brique centrale de la leçon 4.

Les types

Le type d'une variable détermine les valeurs qu'elle peut contenir et les opérations qui ont un sens sur elle.

TypeContientOpérations typiques
entier0, 42, −7+, , ×, division entière, modulo
réel3.14, −0.5+, , ×, /
chaîne"bonjour"concaténation, longueur
booléenVRAI, FAUXET, OU, NON

Deux pièges valent le détour. D'abord, + ne veut pas dire la même chose partout : 3 + 4 vaut 7, mais "3" + "4" vaut "34" — la même opération sur des chaînes colle les morceaux bout à bout. Ensuite, la division entière n'est pas la division : 7 / 2 vaut 3.5 en réels, et 7 ÷ 2 vaut 3 en entiers. Cette division entière n'est pas un détail technique ; c'est elle qui fera fonctionner la recherche dichotomique à la leçon 6.

À vous

Exercice de code

Échangez a et b avec une variable temporaire. Sans l'échange simultané de JavaScript.

Point de départ

// Échangez le contenu de a et b.
// Interdit : l'écriture [a, b] = [b, a], qui masque justement le mécanisme
// qu'on cherche à comprendre. Trois affectations, pas une de moins.
let a = 5;
let b = 9;

// à compléter

console.log(a, b); // attendu : 9 5

Solution

let a = 5;
let b = 9;

// Sauvegarder — écraser — restituer.
const tmp = a;
a = b;
b = tmp;

console.log(a, b); // 9 5

À retenir

Flashcards · 2 cartes

Quelle est la seule façon d'échanger deux variables sans rien perdre ?
Passer par une troisième variable : tmp ← a, puis a ← b, puis b ← tmp. Sauvegarder, écraser, restituer.
Comment se lit x ← x + 1 ?
On évalue la droite avec la valeur actuelle de x, puis on range le résultat dans x. Autrement dit : augmente x de 1.

Chapitre 3 · 20 min

Conditions et booléens

Écrire des tests corrects, enchaîner les cas, combiner avec ET, OU et NON.

Jusqu'ici, nos algorithmes exécutaient toutes leurs lignes, dans l'ordre, à chaque fois. Un algorithme utile doit pouvoir choisir : afficher un message d'erreur seulement si la saisie est invalide, appliquer une réduction seulement aux adhérents.

Une condition vaut VRAI ou FAUX

C'est le point de départ, et il n'admet aucune nuance. note ≥ 10 n'est pas « la note », n'est pas « 10 » : c'est une expression qui, une fois évaluée, vaut VRAI ou FAUX. Rien d'autre. Pas « à peu près vrai », pas « vrai pour la plupart des étudiants ».

Ces expressions ont même un type, le booléen, et on peut les ranger dans une variable :

majeur ← (age ≥ 18)Si majeur Alors    Écrire("Accès autorisé")FinSi

Attention à ne pas confondre deux symboles qui se ressemblent : affecte, = compare. x ← 5 met 5 dans x ; x = 5 demande si x vaut 5 et répond VRAI ou FAUX. Les langages qui écrivent les deux avec le signe = (comme C ou JavaScript, avec = et ==) causent des bugs par milliers pour cette seule raison.

Les opérateurs de comparaison sont =, , <, >, et . Ils s'appliquent aux nombres, mais aussi aux chaînes (ordre alphabétique).

Si, Sinon, et l'ordre des cas

Si condition Alors    ...instructions si VRAI...Sinon    ...instructions si FAUX...FinSi

Le Sinon est facultatif. Quand il est là, exactement une des deux branches s'exécute — jamais les deux, jamais aucune.

Pour plus de deux cas, on enchaîne avec SinonSi. Et là, l'ordre des tests décide de tout : la cascade s'arrête au premier test vrai et ignore tous les suivants.

Animation · 8 étapes

Attribuer une mention (note = 13)

  1. Avant l'exécutionDeux casiers : un entier lu en entrée, une chaîne à produire.
  2. On lit la note : 13C'est la seule donnée d'entrée. Tout le reste est un choix.
  3. Premier test : 13 ≥ 16 ? FAUXUne condition ne vaut jamais « un peu vrai » : elle vaut VRAI ou FAUX. Ici FAUX, donc on saute le bloc et on descend au SinonSi.
  4. Deuxième test : 13 ≥ 14 ? FAUXToujours pas. La cascade continue vers le test suivant.
  5. Troisième test : 13 ≥ 10 ? VRAICette fois le test réussit. Remarquez qu'on n'a pas eu besoin d'écrire « note ≥ 10 ET note < 14 » : les tests précédents ont déjà éliminé ces cas.
  6. mention reçoit "Passable"Le bloc du premier test VRAI est exécuté, et lui seul.
  7. On saute directement au FinSiLe bloc Sinon n'est même pas examiné. Dans une cascade, exactement un bloc s'exécute — jamais deux, jamais zéro s'il y a un Sinon.
  8. On affiche la mention13 donne bien « Passable ».

Deux enseignements dans cette trace. D'abord, à l'étape 5, on n'a pas eu besoin d'écrire note ≥ 10 ET note < 14 : arriver à ce test signifie déjà que les deux précédents ont échoué. Une cascade bien ordonnée s'écrit avec des conditions plus simples qu'une série de Si indépendants. Ensuite, à l'étape 7, le bloc Sinon n'est même pas examiné : on saute directement au FinSi.

Quiz · 1 question

Avec cette cascade — Si note ≥ 10 Alors « Passable » SinonSi note ≥ 16 Alors « Très bien » — quelle mention obtient un étudiant qui a 18 ?

  • Très bienseuil 16
  • Passableseuil 10
  • Les deux, dans l'ordredeux blocs exécutés

Réponse : 18 ≥ 10 est VRAI, donc le premier bloc s'exécute et la cascade s'arrête là. Le test ≥ 16 n'est jamais atteint : « Très bien » est du code mort. Règle : dans une cascade, du plus exigeant au plus permissif.

ET, OU, NON

Trois opérateurs suffisent à combiner les conditions.

aba ET ba OU bNON a
VRAIVRAIVRAIVRAIFAUX
VRAIFAUXFAUXVRAIFAUX
FAUXVRAIFAUXVRAIVRAI
FAUXFAUXFAUXFAUXVRAI

ET est exigeant : il faut que tout soit vrai. OU est accueillant : il suffit qu'au moins une chose le soit — et c'est un « ou » inclusif, contrairement au français courant où « fromage ou dessert » veut dire l'un ou l'autre mais pas les deux.

Une négation se distribue en inversant l'opérateur. NON(age ≥ 18 ET inscrit) ne signifie pas age < 18 ET NON inscrit, mais age < 18 OU NON inscrit : il suffit qu'une des deux conditions tombe pour que l'ensemble tombe. En cas de doute, le plus sûr reste de laisser le NON devant la parenthèse plutôt que de le distribuer de tête.

Le piège des intervalles

En mathématiques on écrit 0x200 \leq x \leq 20. En algorithmique, c'est faux :

Si 0 ≤ note ≤ 20 Alors     ← à ne pas écrire

Un opérateur de comparaison prend deux opérandes et rend un booléen. La machine évalue donc 0 ≤ note, obtient VRAI ou FAUX, puis essaie de comparer ce booléen à 20 — ce qui n'a aucun sens, et selon le langage produit une erreur ou, pire, un résultat silencieusement faux. Un intervalle s'écrit toujours avec deux comparaisons complètes reliées par ET :

Si note ≥ 0 ET note ≤ 20 Alors    ...FinSi

Quiz · 1 question

Comment traduire « x est en dehors de l'intervalle [0 ; 20] » ?

  • x < 0 ET x > 20
  • x < 0 OU x > 20
  • NON(0 ≤ x ≤ 20)

Réponse : Avec ET, il faudrait que x soit à la fois plus petit que 0 et plus grand que 20 : impossible, la condition serait toujours FAUSSE. Être en dehors, c'est être d'un côté OU de l'autre. C'est exactement la négation de « x ≥ 0 ET x ≤ 20 », le ET devenant OU.

Quiz · 1 question

Quelle est la différence entre x ← 5 et x = 5 ?

  • Aucune, ce sont deux notations pour la même chose
  • La première met 5 dans x ; la seconde demande si x vaut 5 et rend VRAI ou FAUX
  • La première teste, la seconde affecte

Réponse : Affecter modifie la mémoire ; comparer ne modifie rien et produit un booléen. Confondre les deux est l'erreur la plus fréquente au passage vers un vrai langage de programmation.

À vous

Exercice de code

Réparez la cascade pour que les quatre mentions soient atteignables.

Point de départ

// Complétez la cascade. L'ordre des tests décide de tout :
// mettez le test le plus permissif en premier et les autres deviennent
// inatteignables.
function mention(note) {
  if (note >= 10) return "Passable"; // ← ce test est-il au bon endroit ?
  return "Insuffisant";
}

for (const n of [18, 15, 13, 7]) {
  console.log(n, "->", mention(n));
}
// attendu : Très bien / Bien / Passable / Insuffisant

Solution

function mention(note) {
  // Du plus exigeant au plus permissif : chaque test suppose que les
  // précédents ont échoué, ce qui évite d'écrire "note >= 10 ET note < 14".
  if (note >= 16) return "Très bien";
  if (note >= 14) return "Bien";
  if (note >= 10) return "Passable";
  return "Insuffisant";
}

for (const n of [18, 15, 13, 7]) {
  console.log(n, "->", mention(n));
}

À retenir

Flashcards · 2 cartes

Dans quel ordre écrire les tests d'une cascade Si / SinonSi ?
Du plus exigeant au plus permissif. Un test trop permissif placé en premier rend tous les suivants inatteignables.
Comment écrire « x est entre 0 et 20 inclus » ?
x ≥ 0 ET x ≤ 20. Jamais 0 ≤ x ≤ 20 : une comparaison ne prend que deux opérandes.