Conditions et booléensDans le dialogue d’impression, choisissez « Enregistrer au format PDF » comme destination.
Retour

Algorithmique 1 · C1 Notions de base · 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.