ICS3U

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

Écrire des conditions

Survol et attentes

Un programme peut prendre des décisions et, ainsi, devenir plus intelligent. Comme tout dans un ordinateur, ces décisions sont à base binaire, c’est-à-dire qu’elles sont basées sur des conditions qui sont soit vraies, soit fausses. Dans cette leçon, nous allons apprendre à écrire des conditions en Java. Nous allons aussi apprendre à utiliser des opérateurs logiques pour combiner des conditions.

Définitions

Les conditions sont utilisées pour sélectionner une branche d’instructions parmi un choix de branches. Elles sont aussi utilisées pour déterminer si une boucle doit se répéter ou se terminer. Il y a d’autres utilisations, comme décider si une méthode se termine ou non, mais toutes ces applications seront vues dans des leçons séparées.

Condition
une expression booléenne, soit une expression qui s’évalue à true ou false. On peut penser à des conditions comme une façon formelle de poser une question oui/non à un ordinateur.
boolean
type de valeur Java qui stocke la valeur true ou false. On peut utiliser ce type de valeur dans des variables qui indiquent l’état de différentes choses dans le programme.
Opérateur de comparaison
un opérateur qui compare deux valeurs et retourne un booléen. Les opérateurs de comparaison sont ==, !=, <, <=, >, >=.
Méthodes de comparaison
des méthodes qui comparent des objets et retournent un booléen. Par exemple, .equals pour les String et .hasNextInt pour un Scanner.
Opérateurs logiques
des opérateurs qui combinent des conditions. Les opérateurs logiques sont && (ET), || (OU) et ! (PAS).

Objectifs d’apprentissage

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

Critères de succès

Variables booléennes (type boolean)

L’expression booléenne la plus simple est une valeur littérale booléenne : soit true (vrai), soit false (faux). On peut utiliser ces valeurs littérales directement ou assignées à des variables, par exemple, boolean repeat = true;.

Une variable booléenne est pratique pour représenter l’état de quelque chose, par exemples : repeat ci-dessus qui peut indiqur s’il faut répéter une action ou non ou boolean isOn = true; qui peut représenter si une fonctionnalité est activée ou non. Ce type d’usage des valeurs booléennes s’appelle un drapeau. On peut regarder son état dans des conditions ou modifier son état dans le code, par exemple isOn = false; pour éteindre l’ampoule.

Opérations de comparaison

Un autre type d’expression booléenne est une opération de comparaison. Une opération de comparaison compare deux valeurs et retourne une valeur booléenne. Par exemple, x == y est une expression de comparaison qui retourne true si x est égal à y et false sinon. Les opérateurs de comparaison sont :

  • == (égal),
  • != (différent/pas égal),
  • < (inférieur),
  • <= (inférieur ou égal),
  • > (supérieur)
  • et >= (supérieur ou égal).

Voici quelques exemples à tester dans une session jshell :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5 == 5; // notez : comparer l'égalité utilise deux "=", soit "=="
5 != 5;
5 < 5;
5 <= 5;
5 > 5;
5 >= 5;

int x = 4; // notez : assigner utilise un seul "="
int y = 5;
x == y;
x != y;
x < y;
x <= y;
x > y;
x >= y;
Quel sera le résultat de la comparaison suivante? 5 >= 6

false. L’opérateur de comparaison représente “plus grand ou égale à”

Considérant les valeurs de x et y ci-dessus cette comparaison donne quoi? (x + y) < (2 * x)

false. On évalue les parenthèses en premier, donnant 9 < 8 qui est faux.

Méthodes de comparaison

Il y a aussi des méthodes de comparaison, généralement utilisées pour comparer différents objets du même type. On doit utiliser une méthode de comparaison pour comparer des objets de type String. Par exemple, "abc".equals("abc") retourne true et "abc".equals("def") retourne false. Il y a quatre méthodes de comparaison pour les String :

  • equals (égal), par exemple "abc".equals("abc")
  • equalsIgnoreCase (égal, sans tenir compte de la casse), par exemple "abc".equalsIgnoreCase("ABC") retourne true
  • compareTo (inférieur, égal ou supérieur), qui retourne une valeur négative si la première valeur est inférieur, zéro si les deux valeurs sont égales et une valeur positive si la première valeur est supérieure. Par exemple "abc".compareTo("def") retourne une valeur négative (-3).
  • compareToIgnoreCase (inférieur, égal ou supérieur, sans tenir compte de la casse)

La raison pourquoi la comparaison directe d’objets comme des String ne fonctionne pas est expliquée dans le cours ICS4U. C’est en lien avec la représentation de ces valeurs en mémoire versus la façon dont les valeurs primitives (comme des int) sont représentées en mémoire.

Voici quelques exemples de comparaisons de String à tester dans une session jshell :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"abc".equals("abc");
"abc".equals("def");
"abc".equals("ABC");
"abc".equalsIgnoreCase("ABC");

"abc".compareTo("def"); // donne un chiffre
"abc".compareTo("def") == 0; // tester l'égalité (donne un booléen)
"abc".compareTo("def") < 0; // tester si "abc" est inférieur à "def"
"abc".compareTo("def") > 0; // tester si "abc" est supérieur à "def"

// La comparaison se fait à la base de la valeur Unicode des caractères
// et les majuscules sont AVANT les minuscules dans la table Unicode
"abc".compareTo("ABC"); // donne un chiffre positif
"abc".compareTo("ABC") > 0; // tester la supériorité (donne un booléen)
"abc".compareToIgnoreCase("ABC"); // donne un chiffre
"abc".compareToIgnoreCase("ABC") == 0; // tester l'égalité (donne un booléen)

Notez que pour utiliser les méthodes compareTo comme conditions, il faut utiliser le chiffre retourné par la méthode dans une expression de comparaison afin d’obtenir un résultat true ou false.

Quelle lettre est plus "grande" du point de vu d'un ordinateur, 'a' ou 'A'?

C’est 'a'! Sa valeur ASCII de 97 est 32 de plus que la valeur ASCII de 'A' (65). Et oui, les minuscules sont “plus grandes que” les majuscules dans le tableau ASCII.

Quel est le résultat de "oui"e.equals("Oui") ?

false. Les minuscules et les majuscules sont des caractères distinctes pour un ordinateur.

Quel est le résultat de "oui".equalsIgnoreCase("Oui") ?

true. La méthode spéciale .equalsIgnoreCase ignore les différences de case des lettres.

Opérateurs logiques - combiner des conditions

On peut combiner le résultat d’expressions booléennes avec les opérateurs logiques ET (&&) et OU (||). On peut aussi inverser le résultat d’une expression booléenne en le précédant avec l’opérateur PAS (!).

Comme avec d’autres opérateurs, il y a un ordre de priorité. L’opérateur PAS a la priorité la plus élevée, suivi de ET et, finalement, OU. On peut utiliser des parenthèses pour changer l’ordre d’évaluation.

Voici quelques exemples à tester dans une session jshell :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// exemples pour voir les opérateurs
true && true; // ET
true && false;
false && true;
false && false;
false || true; // OU
!true; // PAS
!false;
!true && true;
!(true && true); // effet des parenthèses

// exemples plus réalistes
int x = 5;
(x > 0) && (x < 10); // entre 0 et 10
(x < 0) || (x > 10); // en dehors de 0 à 10

// déterminer si je mange au restaurant utilisant deux variables booléennes
amHungry && restaurantOpen;

// l'équivalent de != pour la méthode de comparaison .equals()
!"abc".equals("def");
Quel est le résultat de l'opération !true ?

false. ! est l’opérateur “non” ou “inverse”, donnant toujours le contraire de la valeur qui le suit.

Quel est le résultat de l'opération "false || false || false || true" ?
tldr;
true. L’opérateur || signifie “ou”. Seulement une valeur dans la chaîne doit être vraie pour que tout soit vrai.
détails de l’évaluation
Parce que toutes les opérations sont les mêmes (||) l’évaluation progresse simplement de gauche à droite donnant : (false) || false || true ensuite (false) || true et finalement (true).
Quel est le résultat de l'opération "!false && false && true || false" sachant que l'ordre des opérations est : ! avant && avant || ?

false. L’opérateur && signifie “et” et donne vrai seulement si les deux valeurs sont vraies.

Voici l’ordre d’évaluation de l’expression :

  1. !false devient true
  2. Parce que && précède ||, on continue avec le premier && : (true) && false qui donne false
  3. Le deuxième && : (false) && true qui donne encore false
  4. Finalement le || (ou) : (false) || false donne aussi false.

Exercices

📚 Tester la compréhension

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

🛠️ Pratique

A. Exemples à développer

Écrire des conditions appropriées pour donner true dans les situations suivantes. Utilisez des noms de variables appropriées si la valeur n’est pas fournie explicitement.

  1. Le choix de l’utilisateur est "a" (String).
  2. Le choix de l’utilisateur est 'a' (char). Indice 1 : on peut obtenir le premier caractère d’une réponse (p. ex.: pick) avec pick.charAt(0).Indice 2 : un char est un type primitif comme int.
  3. Il est tard mais je ne suis pas fatigué. Utilisez l’opérateur ! dans l’expression.
  4. Le nombre de points est plus grand que 21.
  5. Le nombre de vies est moins que 1.
  6. Je suis en vie et j’ai l’objet magique et j’ai battu le grand boss.
  7. Je veux écouter un texte de méditation et le son des vagues mais pas le son des oiseaux.

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

Démarrer sur ce site

Codinbat est un site qui offre des problèmes de logique à résoudre avec Java ou Python. C’est donc excellent pour pratiquer les conditions.

  1. Vous rendre sur le site codingbat.com/java
  2. En haut à droite, cliquer le lien pour créez un compte. Utiliser un courriel de votre choix et un mot de passe. Votre courriel est votre nom d’utilisateur et sert à la récupération du mot de passe. Aucune autre information personnelle n’est requise.
  3. Dans la section prefs sous “Teacher Share” ajoutez mon adresse courriel. Vous pouvez le trouver dans le Classroom ou dans votre Gmail de l’école dans la liste des contacts. Je pourrai alors voir vos progrès.
  4. Pour traduire la page, utilisez les outils de Chrome. MISE EN GARDE : à utiliser seulement pour comprendre la description du problème car la traduction affecte aussi le code de démarrage, brisant la syntaxe Java. Assurez-vous de changer la langue de traduction à “English” après avoir lu la description.

Astuces pour travailler dans CodingBat :

Exercices avec les conditions

C’est fort possible que vous ayez de la difficulté avec plusieurs de ces casse-têtes. C’est normal! Si vous avez de la difficulté, essayez de comprendre la solution fournie et de la réécrire vous-même. Le but est de vous familiariser avec les conditions et les opérateurs logiques afin que vous puissiez les utiliser dans des contextes de votre choix pas dans le contexte de problèmes de logique.

  1. Faire les problèmes suivants : les solutions à ces problèmes utilisent uniquement des comparaisons et des opérateurs de logique (&&, ||, !), en plus de quelques opérations mathématiques ou sur les String à l’occasion. Les problèmes à tenter sont dans la section Warmup-1 :
    • sleepIn
    • monkeyTrouble
    • makes10
    • nearHundred (utilise aussi la méthode Math.abs)
    • missingChar (utilise aussi la méthode substring)
    • backAround (utilise aussi les méthodes charAt et substring)
    • or35 (utilise l’opérateur modulo % pour trouver le reste de la division par 3 ou 5)
    • startHi (attention! la condition est assez complexe ici; utilise les méthodes length et substring)
    • icyHot (utilise aussi les méthodes Math.min et Math.max)
    • in1020
    • hasTeen (la condition est longue ici, avec plusieurs opérateurs logiques)
    • mixStart (utilise aussi les méthodes length, substring et equals)
    • lastDigit (utilise aussi l’opérateur modulo % pour trouver le reste de la division par 10)

Certaines solutions officielles à ces problèmes utilisent la sélection avec if et else pour résoudre les problèmes, mais si le problème est dans la liste ci-dessus, vous êtes capable de remplacer cet embranchement en utilisant les opérateurs logiques ET && et OU || pour produire une seule expression équivalente.