Les structures de contrôle

Découvrir les structures de contrôles

Principe des tests conditionnels

En informatique comme en mathématiques, nous appelons « expression » une ligne de calcul. La plupart du temps, ces expressions sont littérales, c’est-à-dire qu’elles contiennent des variables. Par exemple, « 3 + a = 4 » est une expression littérale, dans laquelle « a » est une variable. Si cette variable vaut 1 alors l’égalité est correcte, tandis que si cette variable est différente de la valeur 1 l’égalité est incorrecte. Nous ne pouvons pas savoir à l’avance si une expression sera correcte ou incorrecte. Pour le savoir, l’expression doit être évaluée, c’est-à-dire qu’elle doit être calculée en tenant compte des valeurs des variables. Quand une expression est évaluée comme vraie, on dit qu’elle vaut True, ce qui signifie vrai en anglais. Quand une expression est évaluée comme fausse, on dit qu’elle vaut False, ce qui signifie faux en anglais. Une expression littérale qui est évaluée à True ou False est une expression booléenne. Ces notions ont été travaillées par George Boole au XIXe siècle en Angleterre. Il est considéré comme le père de la logique moderne et son nom est désormais utilisé comme adjectif en informatique en son honneur. Dans ce cours, nous utiliserons des expressions booléennes, c’est-à-dire des expressions qui sont évaluées à True ou False.

Une expression booléenne contient souvent un opérateur de comparaison, comme “==” pour tester l’égalité, ou “<” qui signifie “plus petit que”, ou encore “>” qui signifie “plus grand que”. Vous découvrirez d’autres opérateurs ultérieurement. À l’aide de ces opérateurs de comparaison, nous pouvons réaliser des tests, c’est-à-dire comparer deux éléments entre eux afin d’obtenir en résultat une valeur booléenne True ou False. Ce résultat booléen permet alors de définir une condition. En effet, le principe est de réaliser des actions uniquement SI le résultat du test vaut True. Dans ce contexte, nous parlons de “test conditionnel”.

Évaluer des expressions booléennes

Nous illustrons ce cours avec des captures d’écran du site replit.com en utilisant le langage de programmation PHP. Dans la capture ci-dessous, nous avons écrit sur la gauche un fichier nommé “test.php”. Dans ce fichier, nous avons écrit 6 commandes “var_dump” avec une expression booléenne. La commande “var_dump” en PHP affiche le type d’information – dans ce cas “bool” pour signifier qu’il s’agit d’une valeur booléenne - avec le résultat de l’évaluation – dans ce cas True ou False. À la fin de chaque ligne, à partir du caractère dièse, un commentaire explique la commande indiquée. Enfin, à droite de l’écran, on a exécuté ce fichier dans un panneau “Console”. Vous y voyez donc le résultat de chaque ligne.

Principe du “Si”

En langue française, le mot “si” introduit une condition, et le mot “alors” amène aux conséquences. Voyons quelques exemples d’usage :

Les mots entre “si” et “alors” forment la condition qui est évaluée à Vrai (True) ou Faux (False). Dans le cas où la condition est évaluée à True, les mots après “alors” forment les actions à réaliser.

En informatique, nous utilisons le mot anglais “if” qui correspond à “si”. Le mot “alors” était traduit par “then” dans les anciens langages, mais les langages actuels ont abandonné ce mot-clé par une syntaxe plus épurée. Nous verrons des exemples plus concrets dans la seconde partie de ce cours.

Principe du “Sinon”

L’évaluation d’une expression booléenne lors d’un test conditionnel amène une alternative binaire : soit le résultat est True - et dans ce cas on exécute les actions spécifiques indiquées - soit le résultat est False. Dans ce dernier cas, il est également possible d’exécuter des actions spécifiques. Pour cela, on utilise le mot “sinon”. Voici quelques exemples, en langue française, pour illustrer ce principe :

En informatique, nous utilisons le mot anglais else qui correspond à “sinon”. Quand on définit une condition avec “si” (if), le cas “sinon” (else) est facultatif. Nous verrons des exemples plus concrets dans la seconde partie de ce cours.

Présentation des logigrammes

Un logigramme est un diagramme logique, c’est-à-dire un schéma dans lequel des flèches relient des boîtes. Les flèches représentent le sens d’exécution des actions successives. Les boîtes sont de forme rectangulaire pour représenter des actions, en forme de losange pour représenter des choix (comme nos tests conditionnels), et en forme d’ovale pour désigner les états de départ et d’arrivée de la séquence.

Voici deux premiers exemples de logigrammes :

Voici maintenant deux exemples de logigrammes présentant le cas du “Sinon” : le premier de façon générique, et le second avec notre exemple précédent de la chute de neige.

Principe du “Sinon Si”

Certaines situations ne correspondent pas avec une approche binaire Vrai/Faux, mais requièrent plus de nuances, afin d’avoir des actions adéquates. Dans ce cas, nous utilisons les mots “sinon si”. Voici deux exemples pour illustrer ce principe :

En informatique, nous utilisons les mots anglais "else if” pour exprimer ce concept. Certains langages utilisent une contraction de ces mots avec “elif”. Il est possible de définir autant de “sinon si” que l’on veut, mais le code doit avant tout rester lisible et compréhensible. Nous verrons des exemples plus concrets dans la seconde partie de ce cours.

Le principe du “Sinon Si” peut se représenter selon le logigramme suivant :

Principe du “Selon”

Dans certains cas, une succession de else if peut devenir fastidieuse, surtout s’il s’agit de comparer un unique élément avec différentes valeurs. Dans ce cas, nous utilisons en français le mot “selon”. Voici deux exemples en langue française pour présenter le principe du “selon” :

Vous constatez alors que cette situation permet de prendre en compte toute une liste de valeurs différentes, pour un unique élément (la température pour le premier exemple, et l’initiale pour le second exemple). Le principe du “selon” fonctionne comme un aiguillage, afin de faire prendre un chemin parmi plusieurs chemins possibles. Cet aiguillage se traduit en anglais par le mot switch. Les différents cas possibles sont appelés case en anglais.

En langage PHP et JavaScript, l’implémentation du “selon” utilise les mots “switch” et “case”. Le “switch” introduit l’élément à comparer (dans nos exemples, la température et l’initiale du fruit), tandis que le “case” annonce les différents cas possibles à considérer.

Une particularité du “Selon”, le “Stop”

Lors de l’exécution d’un switch dans un programme informatique, le comportement est de tester les différentes valeurs possibles (les cases) dans l’ordre, du premier au dernier. Si la valeur ne correspond pas, les actions associées à ce “case” ne sont pas exécutées, et le fonctionnement passe au test de la valeur suivante (le case suivant). Si la valeur correspond, alors les actions associées à cette case sont exécutées. Cependant, toutes les actions de tous les cases suivantes sont également exécutées. C’est le comportement normal de ces langages. Or, la plupart du temps, on ne souhaite exécuter que les actions du “case” qui correspond et non toutes les actions de tous les cases suivantes. Pour cela, nous utilisons en français un “stop” dans les actions, qui a pour effet de terminer l’exécution du “switch”. En anglais, et dans les langages de programmation illustrés dans ce cours, le mot-clé pour cela est “break”. En général, nous utilisons la commande break à la fin de chaque case. Cela permet de s’assurer que seules les actions du cas correspondant sont exécutées.

Concret avec Switch, Case, et Break

Pour illustrer ce que nous venons de dire à propos du “Selon” et du “Stop”, vous avez ci-dessous une capture d’écran d’un petit programme PHP écrit dans Replit. Dans le panneau de gauche, un fichier nommé “switch1.php” a été rédigé. Dans le panneau de droite, la console, ce fichier “switch1.php” a été exécuté 6 fois.

Voyons en détail ce que fait ce programme :

Dans le panneau de droite, le programme a été exécuté 6 fois afin de vous faire voir le résultat de chaque “case”.

La commande “break” est ici indispensable. Si elle était absente, le fait de saisir la valeur “0” afficherait les 6 phrases correspondant aux 6 “cases”.

Principe du “Selon” et “Sinon”

Nous avons vu, lors de la présentation du “Si” (if), qu’il est possible de définir une clause “Sinon” (else). Cette dernière est exécutée si aucune des conditions précédentes n’a pu être exécutée. Elle peut être considérée comme le cas échéant.

Dans le cas du “Selon” (switch), il est possible également de définir un cas exécuté si aucun autre “case” n’a été exécuté. Il s’agit du cas par défaut, qui est introduit à l’aide du mot-clé “default”.

Dans la capture d’écran ci-dessous, nous avons complété l’exemple précédent avec un cas par défaut. Nous avons également exécuté le programme dans la console pour vous rendre compte du fonctionnement.

Logigramme du “Switch”

Dans l’illustration ci-dessous, 3 “cases” ont été définis. Ces derniers apparaissent alignés à gauche à la verticale. Lorsqu’un “case” satisfait un test du “switch”, un groupe d’actions est exécuté. Ensuite, si la commande “break” est indiquée, alors le traitement du “switch” est terminé. Mais si la commande “break” est absente, alors les actions des autres “case” sont exécutées. Enfin, si aucun “case” n’a été satisfait, les actions par défaut sont exécutées (si elles ont été définies).

Différences entre “Selon” et “Sinon Si”

De manière générale, une démarche de programmation avec la structure “Sinon Si” est suffisante, c’est-à-dire que la structure du “Selon” n’est pas nécessaire. D’ailleurs, le langage Python qui est plus récent que PHP et JavaScript ne possède pas de structure “Selon”. Il est donc tout à fait possible d’écrire des programmes sans ces structures “Selon”. Cependant, elles font partie des principes de base de la programmation et sont utilisées depuis des décennies. Il est donc utile de vous les faire découvrir.

Il y a 3 différences majeures entre le “switch” et le “if… else if… else” :

Manipuler les structures de contrôles



Principe de cette section

Dans cette seconde partie du cours, nous allons nous entraîner à manipuler les structures de contrôle décrites avant. Nous allons soumettre des situations, en langue française, et vous êtes invité à réfléchir à la manière de conceptualiser ces situations à l’aide des structures de contrôles. Une ou plusieurs solutions sont proposées pour vous permettre de comparer votre démarche.

Manipuler le “if”

Pour ce premier exercice, nous nous plaçons dans le contexte d’un étudiant qui vient d’obtenir sa note pour la délivrance de son diplôme. Nous ne connaissons pas la valeur de sa note, mais nous savons qu’elle est au maximum de 20. Nous représenterons cette note par la lettre N. Lors de l’affichage du résultat, sur écran ou sur listing papier, le libellé “reçu” doit apparaître dès que l’étudiant a obtenu au moins la moyenne, c’est-à-dire une note au moins égale à 10. Prenez maintenant le temps de réfléchir à la structure à utiliser dans ce cas, pour afficher le libellé “reçu”, en utilisant les mots anglais indiqués précédemment.

Voici une réponse qui peut convenir : IF (N supérieur ou égal à 10), Afficher “reçu”. Nous verrons plus loin en vidéo l’implémentation en PHP de ce petit scénario.

Pour le deuxième exercice, nous nous rapprochons du jeu du pendu, qui consiste à trouver un mot, lettre par lettre. Nous nous intéressons plus particulièrement au moment où le joueur a saisi une lettre et que le programme doit tester la présence de cette lettre dans le mot mystère. Si cette lettre est présente, il convient de l’afficher. Nous décidons de désigner le mot mystère avec la lettre M, et la lettre saisie par la lettre L. À vous de réfléchir maintenant à la structure à utiliser, avant de vous proposer une solution.

Voici une réponse qui peut convenir : IF (L appartient à M), Afficher L dans M. Nous verrons ce jeu plus en détail par la suite.

Manipuler le “if… else”

L’exercice suivant consiste à vérifier la disponibilité d’un solde suffisant sur votre compte bancaire pour réaliser un achat à l’aide de votre carte de paiement. Nous considérons qu’il s’agit d’une carte à contrôle de solde, qui ne permet pas d’être à découvert. Nous ne connaissons bien évidemment pas, à l’avance, ni le montant de la transaction ni le solde du compte bancaire au moment du contrôle. Nous représentons le montant par la lettre M et le solde par la lettre S. Si le solde est suffisant, alors le débit est autorisé et l’achat est réalisé. Si le solde est insuffisant, alors l’autorisation de débit est refusée et l’achat n’est pas réalisé. En utilisant les mots décrits précédemment, réfléchissez à la structure à utiliser pour mettre en œuvre la situation décrite.

Voici une réponse qui peut convenir :

IF (S supérieur à M), Autoriser la transaction, ELSE Refuser la transaction.

Dans la capture d’écran ci-dessous, nous avons implémenté cette situation en PHP dans Replit. Pour cette démonstration pédagogique, nous ne réalisons pas l’autorisation bancaire, mais affichons juste un texte qui indique l’action réalisée. Afin d’avoir un code opérationnel pour tout montant d’achat et tout solde bancaire, ces deux informations sont demandées à l’utilisateur au début du programme. Dans le panneau de droite, le programme a été exécuté deux fois : la première fois avec un solde suffisant (600 €) pour le montant saisi (50 €), la deuxième fois avec un solde insuffisant (400) pour le montant spécifié (800 €).

Complément

Voici un nouvel exercice qui se déroule dans un manège. Vous pouvez contextualiser le sujet comme il vous plaît : un simple carrousel pour enfants sur la place du marché de votre quartier, ou une grande attraction pour adulte dans votre parc favori. Le but est d’afficher en permanence le bon message à l’usager, qui doit rester tout le temps en sécurité. Ainsi, quand le manège est en cours d’exécution, il faut absolument rester assis. Tandis que lorsque le manège est à l’arrêt, ce qui signifie que le tour est terminé, il convient de se lever pour céder la place, et quitter l’attraction. Nous pouvons représenter le manège par la lettre M. Vous devez maintenant réfléchir pour formaliser cette situation à l’aide de la structure de contrôle, et afficher un message approprié en fonction de la situation.

Voici une manière qui pourrait convenir :

IF (M a terminé son tour), Afficher “Levez-vous et sortez maintenant”, ELSE Afficher “Restez assis”.

Il est possible, bien évidemment, de l’aborder d’une autre manière, par exemple :

IF (M en cours d’exécution), Afficher “Restez assis”, ELSE Afficher “Quittez l’attraction”.

Il n’y aura jamais une seule façon de solutionner une situation. L’important est d’être méthodique et de conceptualiser votre démarche. Vous pouvez vous aider avec un logigramme pour les situations les plus complexes. Vous finirez toujours par trouver une structure opérationnelle en effectuant des tests fonctionnels.

MéthodeManipuler le “if… else if… else”

L’exemple suivant a été évoqué dans la première partie de ce cours, mais nous allons maintenant l’approfondir. Il consiste précisément à déterminer la mention obtenue lors d’un examen scolaire. Il convient de considérer tous les cas suivants :

Vous devez réfléchir à la structure de contrôle à utiliser, avec les différents tests conditionnels. L’action à implémenter, dans ce cas précis, est simplement un affichage de la mention, comme indiqué ci-dessus entre guillemets. Nous pouvons représenter la note d’examen par la lettre N.

Il y a bien sûr plusieurs manières de faire. Nous vous en présentons deux pour mieux comprendre les différentes approches possibles :

ELSE IF (N<12), Afficher “mention passable”

ELSE IF (N<14), Afficher “mention assez bien”

ELSE IF (N<16), Afficher “mention bien”

ELSE Afficher “mention très bien”

ELSE IF (N>=14), Afficher “mention bien”

ELSE IF (N>=12), Afficher “mention assez bien”

ELSE IF (N>=10), Afficher “mention passable”

ELSE Afficher “non obtenu”

Vous trouverez ci-dessous un logigramme pour cet exemple précis, qui met en œuvre la première approche décrite. Prenez le temps de bien le comprendre, et imaginez-vous en train de l’écrire vous-même.

Nous allons également voir cet exercice en vidéo juste après, avec une implémentation en PHP dans Replit.

if



Manipuler le “Switch” de base

Nous allons maintenant nous entraîner avec la structure de contrôle “switch”, en nous appuyant sur la capture d’écran ci-dessous. Dans cet exemple, nous commençons par demander à l’utilisateur de saisir un nombre parmi 3 choix possibles : 2, 4, ou 12. Nous utilisons ensuite le nombre saisi par l’utilisateur dans un switch, dans lequel chaque choix possible correspond à un “case". Enfin, chaque “case” déclenche l’affichage d’une affirmation à propos du nombre saisi :

Si je vous demandais de réfléchir à l’implémentation de cette situation, avec le nombre saisi représenté par la lettre N, vous imagineriez probablement l’approche suivante, en respectant l’ordre de l’énoncé :

SWITCH (N)

CASE 2, Afficher “Vous avez indiqué un multiple de 2.”, BREAK.

CASE 4, Afficher “Vous avez indiqué un multiple de 4.”, BREAK.

CASE 12, Afficher “Vous avez indiqué un multiple de 3.”, BREAK.

Cependant, le but principal de cet exercice est de ne pas utiliser la commande “break”, mais uniquement “switch” et “case”. Avec cette contrainte supplémentaire, il faut faire preuve d’ingéniosité afin de trouver l’ordre des “case” qui convient. En effet, sans la commande break, les actions des “case” vont s’exécuter les unes à la suite des autres à partir du moment où un “case” est satisfait. Pour bien le comprendre, vous pouvez regarder à nouveau le logigramme du “switch” présenté dans la première partie de ce cours.

Dans la capture ci-dessous, le programme est écrit dans le panneau de gauche. Dans le panneau de droite, le programme a été exécuté 3 fois correspondant à chacun des 3 cas possibles :

Cet exemple vous révèle une particularité du “switch”, apportant la capacité simultanée de distinguer des cas spécifiques tout en permettant d’exécuter du code commun. Il est intéressant d’avoir rencontré ce cas de figure pour votre raisonnement, même si, dans la pratique, le “switch” s’utilise le plus souvent avec le “break”.

Manipuler “break” avec “switch”

Dans ce nouvel exercice, vous allez réfléchir à la syntaxe à utiliser avec l’exemple que nous avons donné plus haut, selon que votre température vaut :

Prenez maintenant quelques secondes pour vous imaginer à rédiger un code qui implémente cette situation, en utilisant la lettre T pour représenter la température.

Vous avez pu, par exemple, imaginer ceci :

SWITCH (T)

CASE 37, Afficher “va bien”, BREAK

CASE 38, Afficher “légèrement fiévreux”, BREAK

CASE 39, Afficher “vraiment fiévreux”, BREAK

CASE 40, Afficher “très fiévreux”, BREAK

L’enjeu de cet exercice était bien évidemment de penser à la commande “break” à la fin de chaque “case”. Si vous les avez oubliés, ce n’est pas bien grave à ce stade : lorsque vous programmerez vous-même en vrai, vous vous rendrez vite compte de vos oublis, et les corrigerez rapidement.

Afin de parfaire cette section, vous trouverez ci-dessous une capture d’écran de l’implémentation de ce contexte en PHP sous Replit. À gauche, le code du programme. À droite, l’exécution du programme, faisant apparaître les 4 cas d’utilisation.

Manipuler “default” avec “switch”

Nous allons maintenant nous intéresser au cas par défaut. Cela est loin d’être anecdotique. En effet, en informatique nous devons toujours être vigilants à tous les scénarios envisageables, même ceux qui sont censés ne jamais se produire. En ce sens, le cas par défaut du “switch” permet aisément de parer à tout comportement, qu’il soit prévu, ou imprévu.

Dans cet exercice, nous souhaitons coder un programme qui indique si l’initiale d’un mot donné commence par une lettre minuscule ou une lettre majuscule. Pour rester dans une approche simpliste, nous allons regarder uniquement les lettres “e” et “E”. Néanmoins, il convient de prendre en compte le cas où le mot saisi ne commence ni par “e” ni par “E”.

En utilisant “switch”, “case” et “default”, et en notant par la lettre I l’initial du mot donné, prenez maintenant quelques secondes pour imaginer la syntaxe du pseudo-code décrivant cette situation.

Vous avez pu, par exemple, imaginer cette approche :

SWITCH (I)

CASE e, Afficher “Votre mot commence par une minuscule.”, BREAK

CASE E, Afficher “Votre mot commence par une majuscule.”, BREAK

DEFAULT, Afficher “Je n’ai pas pu déterminer votre lettre.”

Dans la capture d’écran ci-dessous, un programme correspondant à cet exercice a été écrit dans le panneau de gauche. On commence par demander un mot à l’utilisateur, puis on indique au “switch” la première lettre de ce mot. Dans le panneau de droite, nous avons exécuté 4 fois ce programme.

Pour les deux premières exécutions, nous avons indiqué des mots qui satisfont respectivement chacun des deux cas : en minuscule puis en majuscule. Pour les deux cas suivants, nous avons indiqué des mots avec accent. Il s’agit donc de lettres modifiées, qui ne sont pas reconnues par notre programme, et qui déclenchent par conséquent la clause par défaut. Notez que, dans ce cas simpliste, tout mot commençant par autre chose que “e” et “E” déclenche la clause par défaut. Ces exemples avec les mots ''école'' et ''ÊTRE'' présentent un intérêt particulier, car de premier abord on pourrait être tenté de s’attendre que le programme reconnaisse la minuscule de ''école'' et la majuscule de ''ÊTRE'', mais il n’en est rien. Le cas par défaut a donc son utilité démontrée.