Adloun

Instructions de contrôle

Cours · programmation Java (école d'ingénieur), chapitre 3 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun

Les programmes des deux premiers chapitres exécutent leurs instructions dans l'ordre, une fois chacune, de la première à la dernière. Ils ne savent ni choisir (« si la note est au moins 10, afficher admis »), ni répéter (« additionner les cent premiers entiers », « redemander tant que la réponse est invalide »). Or presque tout calcul intéressant demande l'un ou l'autre.

Les instructions de contrôle modifient l'ordre d'exécution : les conditionnelles (if, switch) choisissent quelles instructions exécuter, les boucles (while, do, for) les répètent. Avec elles, on dispose de tout ce qu'il faut pour écrire n'importe quel calcul : le reste du livre n'ajoute que des moyens de l'organiser.

Objectifs du chapitre

  • Écrire des conditionnelles if/else, des cascades de cas, des switch classiques et modernes.
  • Écrire des boucles while, do et for, et choisir la bonne.
  • Connaître les schémas classiques : somme, comptage, maximum, recherche avec drapeau ; savoir lire des valeurs jusqu'à une sentinelle.
  • Éviter les pièges : point-virgule après un for, oubli de break, else mal rattaché, boucle infinie, erreur d'une unité dans les bornes.

3.1 Blocs et portée

Un bloc est une suite d'instructions entre accolades { … }. Partout où Java attend une instruction, on peut mettre un bloc. Une variable déclarée dans un bloc n'existe que dans ce bloc : c'est sa portée.


public class Portee {
    public static void main(String[] args) {
        int n = 10;
        if (n > 5) {
            int carre = n * n;
            System.out.println(carre);
        }
        System.out.println(carre);
    }
}

Portee.java:8: error: cannot find symbol
        System.out.println(carre);
                           ^
  symbol:   variable carre
  location: class Portee
1 error

carre est déclarée dans le bloc du if : elle disparaît à l'accolade fermante. Pour l'utiliser après, il faut la déclarer avant le if.

3.2 La conditionnelle if

3.2.1 if et else

Définition 3.1Instruction if

if (condition) instruction1 else instruction2 évalue la condition, qui doit être un boolean. Si elle est vraie, seule instruction1 est exécutée ; sinon, seule instruction2. La partie else est facultative.

Les parenthèses autour de la condition sont obligatoires. Même quand une branche ne contient qu'une instruction, on l'entoure d'accolades : c'est plus lisible, et cela évite le piège du paragraphe suivant.

3.2.2 Cascades de cas

Pour choisir entre plusieurs cas, on enchaîne des else if. Les conditions sont testées dans l'ordre ; la première vraie l'emporte, et les suivantes ne sont pas examinées.


public class Mention {
    public static void main(String[] args) {
        double note = 14.5;
        if (note >= 16) {
            System.out.println("Très bien");
        } else if (note >= 14) {
            System.out.println("Bien");
        } else if (note >= 12) {
            System.out.println("Assez bien");
        } else if (note >= 10) {
            System.out.println("Passable");
        } else {
            System.out.println("Ajourné");
        }
    }
}

Bien

Inutile d'écrire note >= 14 && note < 16 dans la deuxième condition : si on y arrive, c'est que la première était fausse, donc note < 16. L'ordre des tests est essentiel : en commençant par note >= 10, toutes les notes au-dessus de seraient « Passable ».

3.2.3 Le piège du else pendant


public class SinonPendant {
    public static void main(String[] args) {
        int x = -5;
        if (x > 0)
            if (x > 100)
                System.out.println("grand");
        else
            System.out.println("négatif ?");
        System.out.println("fin");
    }
}

fin

L'indentation suggère que le else répond au premier if. Mais le compilateur ignore l'indentation :

Proposition 3.2Rattachement du else

Un else se rattache au if le plus proche qui n'a pas encore de else.

Ici, le else appartient au if (x > 100), qui n'est exécuté que si x > 0. Comme , rien n'est affiché avant fin. Avec des accolades, l'ambiguïté disparaît : on écrit ce que l'on veut dire.

3.2.4 L'opérateur conditionnel

L'expression condition ? valeur1 : valeur2 vaut valeur1 si la condition est vraie, valeur2 sinon. C'est un if qui produit une valeur, commode pour les cas simples.


int a = 7, b = 12;
int max = (a > b) ? a : b;
System.out.println("max = " + max);
int n = 3;
System.out.println(n + " élève" + (n > 1 ? "s" : ""));

max = 12
3 élèves

3.3 Le switch

Quand on compare une même valeur à une liste de constantes, un switch est plus clair qu'une cascade de if. Il en existe deux formes.

3.3.1 Le switch classique


public class JourClassique {
    public static void main(String[] args) {
        int jour = 6;
        switch (jour) {
            case 1:
                System.out.println("lundi");
                break;
            case 6:
                System.out.println("samedi");
            case 7:
                System.out.println("dimanche");
                break;
            default:
                System.out.println("jour de semaine");
        }
    }
}

samedi
dimanche

L'exécution saute au case égal à la valeur (ou à default si aucun ne l'est), puis continue jusqu'au prochain break. Ici, le case 6 n'a pas de break : l'exécution « tombe » dans le case 7 et affiche aussi dimanche.

Attention

L'oubli d'un break dans un switch classique ne provoque aucune erreur de compilation : c'est une erreur de logique silencieuse, et l'une des plus fréquentes. C'est la raison d'être de la forme moderne.

La suite du cours est sur Adloun

Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.

Lire la suite du cours

En accès libre, sans inscription.

Exercices corrigés de ce chapitre

Lire la suite du cours →