Aller au menu - Aller au contenu

Icône Les tests conditionnels

Par Avatar Yno
Mise à jour : 09/07/2010
Difficulté : Facile Facile
170 visites depuis 7 jours, dont 6 sur ce chapitre classé 446/786
Selon les données qu'ils manipulent et qu'ils reçoivent de l'extérieur, nos programmes doivent réagir différemment. Que se passe-t-il si l'utilisateur a oublié de remplir un champ de texte, ou s'il a écrit n'importe quoi lors d'une lecture à l'aide de scanf ? S'il a coché telle case, mais pas telle autre ? Un programme informatique doit être en quelque sorte capable de prendre des décisions sur les instructions à exécuter.

Naturellement, ce sont des instructions que vous aurez décidées avant lui.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Vrai ou faux ?

Ces décisions se baseront toujours sur le même principe : des tests conditionnels, qui évaluent la véracité d'une expression logique. En d'autres termes, votre programme se posera la question de savoir si, à un instant donné, une condition est remplie ou non ; si elle est vraie, ou fausse. Une telle logique est dire binaire, car elle n'admet pas de "peut-être", de "pourquoi pas" ou d'autre réponse. On dit aussi qu'elle est booléenne (du nom de Boole, un mathématicien ayant travaillé sur ces questions).

Supposons un instant que vous soyez un programme (vous ne le prenez pas mal, j'espère). Supposons également que vous souhaitiez sortir de chez vous. Avant toute chose, vous vous demandez si vous êtes habillé, car vous avez horreur de sortir de chez vous nu. Si vous êtes nu, alors vous vous habillez avant de continuer. Sinon, pas la peine de vous habiller à nouveau, vous pouvez continuer à vous exécuter tel quel. Vous vous posez maintenant une nouvelle question : est-ce qu'il pleut ? Si oui, vous prenez des bottes. Sinon, vous mettez vos sandales. Et ainsi de suite...

Traduit en code, cela pourrait ressembler à

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
Si (je_suis_nu) 
{
  je_m'habille();  /* Obligatoire ! */
}
/* Arrivé à ce stade, je suis sûr d'être habillé */
Si (il_pleut)
{
  je_mets_mes_bottes();
}
Sinon
{
  je_mets_mes_sandales();
}


Naturellement, selon qu'il pleut ou non, une seule des deux paires de chaussures sera mise. En termes plus savants, le second test conditionnel n'exécutera qu'un seul des deux blocs de code qui lui est attaché, selon qu'il fasse beau ou pas.

En Vala, ces conditions s'évaluent dans un type de données particulier, à peine effleuré au chapitre précédent : le type bool . Très logiquement, il ne comporte que deux valeurs, qui sont true et false , respectivement "vrai" et "faux". Chaque expression conditionnelle devra donc invariablement produire true ou false .

Pour produire des valeurs de type booléen, nous avons besoin d'une liste d'opérateurs particuliers, qui servent à comparer des données d'autres types (n'importe lesquels). Voici ces opérateurs.

RôleSymbole
Égalité ==
Différence !=
Supérieur à >=
Supérieur strict >
Inférieur à <=
Inférieur strict <


Le test d'égalité est bien un ==, et pas un simple =. En effet, celui-ci sert déjà à l'affectation des variables !


Ainsi, des expressions comme age >= 18 ou a == b sont parfaitement correctes, et renverront true ou false .

Il arrive assez souvent que l'on ait cependant besoin de combiner plusieurs de ces petites expressions pour traiter des cas plus complexes. Par exemple, on veut tester le contraire d'une condition, ou n'exécuter un bloc d'instructions que si une chose et une autre sont vraies, ou enfin si une condition est vraie, ou une autre, mais pas nécessairement les deux.

On utilise pour ça trois nouveaux opérateurs. La négation, notée !, le "et logique" &&, et le "ou logique" ||. Par exemple, si vous n'avez pas de rendez-vous galant à l'extérieur et que le réfrigérateur est plein, vous restez chez vous. Avec ces opérateurs, l'expression conditionnelle serait quelque chose comme (!(rendez_vous)) && (frigo_rempli) .

Prendre une décision

Pour réaliser un test conditionnel, Vala met à notre disposition deux nouveaux mot-clefs, if et else , qui veulent tout simplement dire "si" et "sinon". Le mot if est toujours suivi d'une expression conditionnelle entre parenthèses, puis d'un bloc de code ; else n'a pas de partie conditionnelle, puisqu'il ne s'exécute que si le test précédent a échoué.

Voici un petit exemple pratique et classique :

Code : Vala
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class Main
{
  public static int main (string[] args)
  {
    int age;
    
    stdout.printf("Entrez votre âge :\n");
    stdin.scanf("%d", out age);
    if (age >= 18)
    {
        stdout.printf("Vous êtes majeur !");
    }
    else
    {
        stdout.printf("Vous n'êtes pas majeur !");
    }
    
    return 0;
  }
}


Rien de bien compliqué. Comme nous avons appris à le faire au chapitre précédent, nous lisons un âge au clavier, et nous le comparons à 18. Si vous exécutez ce code, vous verrez la magie à l'oeuvre : seul un des deux printf est exécuté à la fin.

Il est possible de faire suivre un nouveau if après un else : on obtient alors trois actions possibles, ou plus. Par exemple,

Code : Vala
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main
{
  public static int main (string[] args)
  {
    int age;
    
    stdout.printf("Entrez votre âge :\n");
    stdin.scanf("%d", out age);
    if (age >= 18)
    {
        stdout.printf("Vous êtes majeur !");
    }
    else if (0 < age)   /* Simple vérification... */
    {
        stdout.printf("Vous n'êtes pas majeur !");
    }
    else
    {
        stdout.printf("Vous vous moquez de moi ?");
    }
    
    return 0;
  }
}


Vous pouvez tester : un seul des trois blocs est exécuté à chaque fois. D'autres exemples de tests conditionnels sont disponibles à la fin du chapitre, à titre d'exercices.

L'instruction switch

Dans un certain nombre de langages, à commencer par le C, une instruction switch est disponible pour éviter au programmeur de devoir enchaîner des if...else répétitifs. Elle permet d'exécuter un bloc de code particulier suivant la valeur d'une variable ou d'une expression toute entière. Cependant, son usage est assez limité puisqu'elle ne permet de tester que des égalités.

Chaque valeur possible est présentée avec le mot-clef case , suivi de la valeur et de deux points. Plusieurs valeurs peuvent être groupées (nous allons voir comment), mais les blocs doivent tous finir par une instruction spéciale, break . Un bloc particulier, default , permet d'exécuter un code particulier quand aucune égalité n'a été remplie (c'est un peu un else final).

Voici un exemple, qui suppose l'existence d'un entier a (à vous d'écrire le reste du programme) :

Code : Vala
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
switch (a) 
{
case 1:
    stdout.printf("un\n");
    break;
case 2: /* Les valeurs 2 et 3 sont liées */
case 3:
    stdout.printf("deux ou trois\n");
    break;
default:
    stdout.printf("beaucoup !\n");
    break;
}

Quelques exercices

Bon ! Rien de tel que quelques petits exercices pour vérifier que nous avons bien compris tout ce qui précède. Premièrement, introduisons un nouvel opérateur (connu des gens qui pratiquent le C), le modulo, noté % , qui renvoie le reste d'une division euclidienne. Vous vous souvenez des divisions que vous faisiez à l'école primaire ? Hé bien là c'est pareil.

Ainsi, 14 % 4 va être évalué à 2, car 14 = 12 + 2 = 3*4 + 2, et que 2 est plus petit que 4. Cet opérateur est très pratique pour tester la divisibilité d'un nombre par un autre : si un nombre est divisible par un autre, le reste de la division de l'un par l'autre est nul, ce qui se traduit par la condition a % b == 0 .

Voici donc notre premier exercice : écrivez un programme qui demande un nombre à l'utilisateur, et qui vérifie s'il est pair ou pas. Cela n'a rien de compliqué, réutilisez ce que nous avons vu dans le chapitre précédent et dans celui-ci ;) .

Un peu plus élaboré : écrivez un programme qui lit une année (donc un nombre aussi) et vérifie que cette année est bissextile. Vous trouverez les informations nécessaires sur la page Wikipédia sur les années bissextiles. Sur cette page, on trouve une façon d'exprimer qu'une année est bissextile, et une façon d'exprimer qu'elle ne l'est pas. Traduisez donc les deux en Vala !

Enfin, réécrivez l'exemple de switch donné à la fin de la sous-partie précédente à l'aide de if/else. Ça n'est pas bien méchant ;) .
Chapitre précédent Sommaire Chapitre suivant

Partager

4 commentaires pour "Les tests conditionnels"
Note moyenne : 3.63 / 4 (35 votes)
Pseudo Commentaire
Hors ligne naoj # Posté le 23/06/2010 à 21:26:45
Avatar

Ville : Caunes minervois
Pays : France métropolitaine

.
Hors ligne manrugby # Posté le 23/06/2010 à 22:50:51
Avatar

Ville : Rabat
Pays : Maroc
Études : EMSI

Bravo!!
Grâce à vous (aussi à Vala :p ) je peux développer des applications avec GTK+ plus vite qu'en langage C sans trop me fatigué,j'avoue qu'au premier coup d'œil ça ma épaté !!

Bonne continuation!
 
Hors ligne bluestorm # Posté le 25/06/2010 à 10:58:19
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Dans le traitement de switch, vous précisez qu'il s'agit de test d'égalité sur des valeurs, mais vous ne détaillez jamais quelles valeurs sont acceptables. Il me semble que c'est important puisque les différents langages de programmation font des choix différents ici : un utilisateur de Java par exemple voudra savoir si on peut ou non y mettre des chaînes littérales.
 
Hors ligne anonyme # Posté le 25/06/2010 à 14:17:22

bluestorm> J'ai prévu de distiller ce point au fil du tutoriel. Par exemple, je dis explicitement que ça marche pour les chaînes, de même que je dirais explicitement que ça ne fonctionne pas pour des tableaux, puis les autres.

Voir tous les commentaires