Les tests

Dans le chapitre précédent, nous avons vu les expressions mettant en place des opérateurs, de calcul, de comparaison ou booléens. Ces opérateurs et expressions trouvent leur sens dans les branchements conditionnels. Selon qu’une expression évaluée est vraie ou fausse, le programme fera une chose ou l’autre. c’est le principe de la condition.

Reprenons le cas de notre « programmation algorithmique du touriste égaré ». Normalement, l’algorithme ressemblera à quelque chose comme : « Allez tout droit jusqu’au prochain carrefour, puis prenez à droite et ensuite la deuxième à gauche, et vous y êtes ».

Mais en cas de doute légitime de votre part, cela pourrait devenir : « Allez tout droit jusqu’au prochain carrefour et là regardez à droite. Si la rue est autorisée à la circulation, alors prenez la et en-suite c’est la deuxième à gauche. Mais si en revanche elle est en sens interdit, alors continuez jusqu’à la prochaine à droite, prenez celle-là, et ensuite la première à droite ».

Ce deuxième algorithme a ceci de supérieur au premier qu’il prévoit, en fonction d’une situation pouvant se présenter de deux façons différentes, deux façons différentes d’agir. Cela suppose que l’interlocuteur (le touriste) sache analyser la condition que nous avons fixée à son comportement (« la rue est-elle en sens interdit ? ») pour effectuer la série d’actions correspondante.

Cette structure logique répond au doux nom de test. Toutefois, ceux qui tiennent absolument à briller en société parleront également de structure alternative.

Qu’est-ce qu’un test ?

Il est important de préciser qu’un test est avant tout une affirmation, qui peut être vraie ou fausse. Une condition est souvent une comparaison, composée de 3 éléments :

  • une première valeur, variable ou scalaire ;
  • un opérateur de comparaison ;
  • une seconde valeur, variable ou scalaire (de même type que la première)

Les opérateurs s’appliquent à toutes formes de données, y compris les string. Du moins en pseudo-code, car tester l’équivalence sur des chaînes de caractères est un peu plus complexe dans la pratique.

Les différents opérateurs sont :

  • l’égalité ( = en peudo-code) ;
  • la différence (<> ou !=) ;
  • l’inférieur (<) ;
  • le supérieur (>) ;
  • l’inférieur ou équivalent ( ou <=) ;
  • le supérieur ou équivalent ( ou >= ).

Attention ! En langage courant, il est fréquent de noter une affirmation telle que 1<n<10, signifiant « choisir n entre 1 et 10 ». Cependant, en algorithmique, l’expression va donner des résultats inattendus.

Prenons l’exemple de n=15. La première partie de l’affirmation, 1< 15, est évaluée : elle est vraie. Le langage de programmation va donc transformer l’évaluation. En effet, si la première partie est vraie, le programme penser vrai > 15. Et souvent, cette affirmation sera vraie ! Donc, 1<n<10, avec n=15 sera vrai, alors que normalement cela devrait être faux. Embêtant, non ?

Dans un programme, il faudra diviser en deux affirmations :

1 < n AND n<10. Ainsi, chaque évaluation sera traitée, donnant comme résultat : vrai AND faux. Et nous verrons un peu plus loin comment traiter ce genre d’affirmation.

Structure d’un test

En algorithmique, l’instruction du test est « IF », qui prend cependant deux formes : la simple et la complexe.

Structure simple

testLa structure simple se présente comme ceci :

…
IF boolean THEN
    instructions
ENDIF
…

Le booléen est la condition à tester.

Structure complexe

Dans le cas où il faudrait exécuter des instructions si la condition est fausse, il faut passer par la forme complexe du test. La forme complexe n’a de complexe que le nom. Il s’agit simplement d’ajouter une clause au test :

…
IF boolean THEN
    instructions
ELSE
    instructions
ENDIF
…

Notez que le flowchart reflète la structure complexe avec ses deux branches de sorties.

Les tests imbriqués

Graphiquement, on peut très facilement représenter un SI comme un aiguillage de chemin de fer (ou un aiguillage de train électrique, cest moins lourd à porter). Un IF ouvre donc deux voies, correspondant à deux traitements différents. Mais il y a des tas de situations où deux voies ne suffisent pas. Par exemple, un programme devant donner l’état de leau selon sa température doit pouvoir choisir entre trois réponses possibles (solide, liquide ou gazeuse).

Une première solution serait la suivante :

ALGORITHM Water1
VARIABLE
    temp : Number
BEGIN
    PRINT "Entrez la température de l’eau :"
    INPUT temp
    IF temp =< 0 THEN
        PRINT "C’est de la glace"
    ENDIF
    IF temp > 0 AND temp < 100 THEN
        PRINT "C’est du liquide"
    ENDIF
    IF temp > 100 THEN
        PRINT "C’est de la vapeur"
    ENDIF
END

Vous constaterez que cest un peu laborieux. Les conditions se ressemblent plus ou moins, et surtout on oblige la machine à examiner trois tests successifs alors que tous portent sur une même chose, la température de l’eau (la valeur de la variable Temp). Il serait ainsi bien plus rationnel dimbriquer les tests de cette manière  :

ALGORITHM Water2
VARIABLE
    temp : Number
BEGIN
    PRINT "Entrez la température de l’eau :"
    INPUT temp
    IF temp =< 0 THEN
        PRINT "C’est de la glace"
    ELSE IF temp < 100 THEN
        PRINT "C’est du liquide"
    ELSE 
        PRINT "C’est de la vapeur"
    ENDIF
END

Nous avons fait des économies : au lieu de devoir taper trois conditions, dont une composée, nous navons plus que deux conditions simples. Mais aussi, et surtout, nous avons fait des économies sur le temps d’exécution de lordinateur. Si la température est inférieure à zéro, celui-ci écrit dorénavant « C’est de la glace » et passe directement à la fin, sans être ralenti par lexamen dautres possibilités (qui sont forcément fausses).

Cette deuxième version nest donc pas seulement plus simple à écrire et plus lisible, elle est également plus performante à l’exécution.

Les structures de tests imbriqués sont donc un outil indispensable à la simplification et à l’optimisation des algorithmes.

Choix multiples

Si les tests imbriqués facilitent la vie, ils deviennent rapidement trop lourd lorsqu’il y a une quantité importante de tests. Certains langages de programmation ont trouvé une parade à ce problème en proposant une structure de test appropriées. Plutôt que de faire une suite de IF/ELSE IF/ELSE, il suffit d’indiquer quoi faire quand telle valeur est atteinte. Le pseudo-code de cette procédure est le SWITCH/CASE.

ALGORITHM moisEnLettre
VARIABLE
    month:Number
BEGIN
    PRINT "Entrez le chiffre du mois"
    INPUT month
    SWITCH month
        CASE 1 : PRINT "janvier"
        CASE 2 : PRINT "février"
        CASE 3 : PRINT "mars"
        CASE 4 : PRINT "avril"
        CASE 5 : PRINT "mai"
        CASE 6 : PRINT "juin"
        CASE 7 : PRINT "juillet"
        CASE 8 : PRINT "août"
        CASE 9 : PRINT "septembre"
        CASE 10 : PRINT "octobre"
        CASE 11 : PRINT "novembre"
        CASE 12 : PRINT "décembre"
        ELSE : PRINT "n’est pas un nombre valide"
    END SWITCH
END

Exercices

Exercice 1

Concevez un algorithme qui permet d’afficher la valeur absolue d’un nombre demandé au clavier (pseudo-code et flowchart).

Exercice 2

Écrire un algorithme qui demande un nombre à l’utilisateur, et l’informe ensuite si ce nombre est positif ou négatif (on laisse de côté le cas où le nombre vaut 0).

Exercice 3

Écrire un algorithme qui demande un nombre à l’utilisateur, et linforme ensuite si ce nombre est positif ou négatif (on inclut cette fois le traitement du cas où le nombre vaut zéro).

Exercice 4

Écrire un algorithme qui demande deux nombres à l’utilisateur et linforme ensuite si le produit est négatif ou positif (on inclut cette fois le traitement du cas où le produit peut être nul). Attention toutefois, on ne doit pas calculer le produit !

Exercice 5

Ecrire un algorithme qui demande l’âge d’un enfant à l’utilisateur. Ensuite, il l’informe de sa catégorie :

  • « Poussin » de 6 à 7 ans
  • « Pupille » de 8 à 9 ans
  • « Minime » de 10 à 11 ans
  • « Cadet » après 12 ans

Exercice 6

Tracer le flowchart de l’exemple « water2 » ci-dessus.

Exercice 7

Concevez un algorithme permettant de calculer les racines d’une équation du second degré. Pour rappel :

  • une équation du second degré est de la forme ax²+bx+c=0.
  • Pour résoudre cette équation, il faut d’abord calculer le discriminant [pmath]b^2-4ac[/pmath]
    • si ∆ >0, il y a deux solutions ([pmath]{-b + sqrt { Delta }} / {2a}[/pmath]et [pmath]{-b – sqrt{ Delta }} / {2a}[/pmath])
    • si ∆ =0, il y a une solution [pmath]{-b }/ {2a}[/pmath]
    • si ∆ < 0, l’équation n’a pas de solution.

L’utilisateur devra entrer successivement a, b et c. Le programme devra afficher la (les) solution(s).
Écrivez le pseudo-code et tracez le flowchart.

Exercice 8

Écrivez un algorithme capable :

  • de demander l’heure, les minutes et les secondes à l’utilisateur ;
  • de demander le nombre de secondes à ajouter à l’heure précédemment entrées ;
  • d’afficher la nouvelle heure.
Print Friendly, PDF & Email