ICS3U

Accueil > Programmer avec Java > Structures de contrôle >

📚 Sélection

Survol et attentes

La sélection est un concept fondamental de la programmation. Elle permet au programme d’adapter son comportement selon l’état de différentes conditions. Bref, le programme devient plus intelligent. Dans cette leçon, nous allons voir comment utiliser la sélection en Java.

Définitions
Séléction
concept de programmation qui permet d’exécuter du code seulement si une condition est vraie. Cela crée plusieurs embranchements dans le code au lieu d’une seule séquence.
if et else
mots-clés utilisés pour la sélection en Java. Le bloc if déclare une condition et exécute son code si cette condition est vraie. Le bloc else suit un bloc if et exécute son code seulement si la condition du if était fausse.
Losange
forme utilisée pour représenter une condition dans un diagramme de flux. Son étiquette représente une question avec une réponse oui/non ou true / false, et il y a deux flèches qui quittent le bloc, une pour chaque réponse possible. Cela donne la représentation visuelle claire de l’embranchement.

Objectifs d’apprentissage

À la fin de cette leçon vous devrez être en mesure de :

Critères de succès

Sélection conditionnelle avec if et else

La sélection permet d’exécuter du code seulement si une condition est vraie. La condition est n’importe quelle expression booléenne, soit une expression qui s’évalue à true ou false :

1
2
3
if (condition) {
    // code à exécuter si la condition est vraie
}

if

On a aussi l’option d’exécuter du code si la condition est fausse en ajoutant un bloc else immédiatement après le bloc if :

1
2
3
4
5
if (condition) {
    // code à exécuter si la condition est vraie
} else {
    // code à exécuter si la condition est fausse
}

if_else

Plusieurs cas exclusifs avec else if

Si on a plusieurs cas exclusifs (des cas où seulement un cas peut être est vrai) à vérifier, on peut immédiatement déclarer un bloc if suivant le mot-clé else afin de poser la prochaine condition :

1
2
3
4
5
6
7
8
9
if (condition1) {
    // code à exécuter si la condition1 est vraie
} else if (condition2) {
    // code à exécuter si la condition2 est vraie
} else if (condition3) {
    // code à exécuter si la condition3 est vraie
} else {
    // code à exécuter si aucune des conditions précédentes n'est vraie
}

Chaque else représente ce qui se passe si le if précédant est faux. On peut enchaîner autant de blocs else if que nécessaire. Le bloc else final est optionnel, mais est souvent utile pour définir un cas par défaut, comme un message d’erreur.

cas_exclusifs

Cette façon d’enchaîner les conditions assure que seulement un bloc sera exécuté. Il faut donc faire attention de bien écrire les conditions afin de représenter tous les cas possibles et de ne pas en oublier. C’est un bon exemple de situation où faire des tests pour chaque cas, notamment les cas limites, est important.

Voici un exemple de code qui utilise plusieurs cas exclusifs dans le fichier LinkedConditions.java :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.*;

void main() {
    Scanner console = new Scanner(System.in);
    System.out.println("Quel est votre âge? ");
    int age = console.nextInt();

    if (age < 4) {
        System.out.println("Enfant préscolaire");
    } else if (age <= 11) {
        System.out.println("Enfant d'école élémentaire");
    } else if (age <= 14) {
        System.out.println("Adolescent d'école intermédiaire.");
    } else if (age <= 18) {
        System.out.println("Adolescent d'école secondaire.");
    } else {
        System.out.println("Adulte.");
    }
}

catégories d'âge

Quelle sera la sortie si l'utilisateur saisit la valeur 8?

À part l’invite de réponse, ce sera :

1
Enfant d'école élémentaire

La variable age prendra la valeur 8, donc la première condition (age < 4) sera fausse. On passe donc au else qui le suit qui déclare immédiatement une autre condition (age <= 11) qui est vraie. On entre alors dans ce bloc de code et affiche son message.

C'est quoi le diagramme de séquence d'exécution (suite des numéros de lignes exécutées) si l'utilisateur saisit la valeur 17?

On fait les 6 premières lignes en séquence pour ensuite arriver à ceci :

1
2
3
4
5
6
7
8
9
10
...
6
7
8
10
12
14
15
16
19
  • Notez surtout qu’on saute des lignes (les lignes 9, 11, et 13) : celles qui correspondent aux autres branches avec des conditions fausses
  • Notez aussi qu’on doit évaluer chacune de ces conditions (les lignes 8, 10 et 12) pour savoir sur quelle branche continuer (le côté false dans ce cas) …
  • Jusqu’à ce qu’on passe par le côté true d’une branche (la ligne 15). Son bloc se termine avec l’accolade fermante à la ligne 16 mais le reste de cette ligne et de la “cascade” est ignorée.
  • Le code se termine avec l’accolade fermante de main.

Plusieurs cas indépendants

Si on a plusieurs cas indépendants (des cas où plusieurs cas peuvent être vrais), on peut utiliser plusieurs blocs if :

1
2
3
4
5
6
7
8
9
if (condition1) {
    // code à exécuter si la condition1 est vraie
}
if (condition2) {
    // code à exécuter si la condition2 est vraie
}
if (condition3) {
    // code à exécuter si la condition3 est vraie
}

Chaque bloc if est indépendant des autres et un, plusieurs ou aucun bloc if peut être exécuté selon les conditions.

cas_indépendants

Voici un exemple de code qui utilise plusieurs cas indépendants dans le fichier IndependantConditions.java :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String input(String prompt) {
    System.out.print(prompt + " > ");
    return System.console().readLine(); 
                // plus simple mais moins puissante qu'un Scanner
}

void main() {
    String favColour = input("Couleur préférée");
    String favSeason = input("Saison préférée");
    int favNumber = Integer.parseInt(input("Nombre entier préférée")); 
        // on converti le String en int dans une 2ème opération

    if (favColour.equals("bleu")) {
        System.out.println("Le bleu est ma couleur préférée aussi!");
    }
    if (favSeason.equals("été")) {
        System.out.println("L'été est ma saison préférée aussi!");
    }
    if (favNumber == 7) {
        System.out.println("7 est mon nombre préféré aussi!");
    }
}

comparaison indépendantes

Si la condition est vraie à la ligne 13 (comparer les couleurs) est-ce qu'on continue avec les lignes de 16 à 20 ou est-ce qu'on les ignore?

On les fait quand même! Si le premier if est vrai ou faux on passe sur ces lignes tout de même parce qu’elles ne sont pas sur une branche else.

Exercices

📚 Tester la compréhension

Répondre aux questions insérées dans les notes après les exemples.

🛠️ Pratique

A. Exemples à développer

Structure du fichier et code de démarrage dans un nouveau fichier : Selection.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*;

final Scanner IN = new Scanner(System.in);

void calc() {
  // #1 : à développer
}

void dice() {
  // #2 : à développer
}

void main() {
  // appeler les autres méthodes pour les tester
}
  1. calc() : Demander deux valeurs de type double à l’utilisateur. Ensuite lui demander quelle opération qu’elle veut faire ("+", "-", "*", ou "/"). Utiliser la sélection (if, else if et else) pour afficher le résultat du calcul approprié.
    • Bonus : si l’utilisateur choisit "/" faire une sélection additionnelle (if) pour vérifier si le deuxième nombre est 0 et afficher un message d’erreur au lieu de faire le calcul.
  2. dice() : Utiliser l’opération (int)(Math.random() * 6 + 1) pour générer des valeurs aléatoires entre 1 et 6 (les valeurs d’une dé). Stocker trois de ces valeurs dans des variables de type int.
    • Utiliser la sélection pour vérifier si chaque valeur individeulle est un 6 (3 if). Pour chaque dé, afficher un message dans ce cas, mais ne faites rien dans le cas contraire.
    • Ensuite, utiliser une seule sélection pour voir si un nombre se répète (deux valeurs sont identiques) au moins une fois (1 if avec opérations logiques) et afficher un message approprié dans ce cas.
    • Finalement, vérifier si les trois valeurs sont identiques (1 if avec opérations logiques) et afficher un message approprié dans ce cas.

B. Problèmes de logique sur le site CodingBat (Enrichissement)

Comme avec la leçon précédente, c’est fort possible que vous ayez de la difficulté avec plusieurs de ces casse-têtes. Si un problème vous cause trop d’ennuis, vous pouvez passer à un autre. Il y en a beaucoup! Rappelez-vous que le but est de vous familiariser avec la sélection if-else afin que vous puissiez l’utiliser dans des contextes de votre choix pas dans le contexte de problèmes de logique.

  1. Tenter le reste des problèmes de Warmup-1. Ces autres problèmes utilisent des conditions et opérateurs logiques comme la liste précédente mais doivent aussi utiliser la sélection avec if et else. Les problèmes sont :
    • sumDouble
    • diff21
    • parrotTrouble
    • posNeg
    • notString
    • frontBack
    • front3
    • front22
    • loneTeen
    • delDel
    • startOz
    • intMax
    • close10
    • in3050
    • max1020
    • stringE
    • endUp

Le problème “everyNth” utilise aussi une boucle, ce qui sera vue dans la prochaine leçon.