4.    Les instructions de contrôle

4.1    Portée d'un bloc

Un bloc (instruction composée), - groupe d’instructions simples délimitées par une paire d'accolades. Portée des variables. Un bloc peut être imbriqué à l'intérieur d'un autre bloc.


public class Controle {
    public static void main(String[] arg){
        int n= 4;
        {
            int k = 5;
            {
                int m=3;
            }            // m est valable jusqu'ici
        }                // k est valable jusqu'ici
    }
}

public class Controle {
    public static void main(String[] arg){
        int n= 4;
        {
            int k = 5;
            int n;        // erreur - variable existe
        }               
    }
}

4.2    Instructions conditionnelles

Réalistion des choix.   if , if/else et switch

 4.2.1    Instruction conditionnelle if



Fig. 4.1 Organigramme de l'instruction if

public class Controle {
    public static void main(String[] arg){
        int grade = 4;
        if( grade > 3 ) {
            System.out.println("Congratulations!");
            System.out.println("You passed!");
        }   
    }
}

4.2.2    Instruction conditionnelle if/else



Fig. 4.2 Organigramme de l'instruction if/else

public class Controle {
    public static void main(String[] arg){
        int grade = 4;
        if( grade > 3 ) {
            System.out.println("Congratulations!");
            System.out.println("You passed!");
        }
        else {
            System.out.println("Sorry!");
            System.out.println("You failed!");
        }
    }
}

Exemple.  la plus grande valeur des trois nombres

public class Controle {
    public static void main(String[] arg){
        int k,a=8,b=7,c=5;
        if(a>b)
            if(a>c)
                k=a;
            else
                k=c;
        else
            if(b>c)
                k=b;
            else
                k=c;
        System.out.println("max value: "+k);
    }
}



4.2.3    Instruction switch



Fig. 4.3. Organigramme de l'instruction switch

La syntaxe de l'instruction est le suivant:
switch (expression){
    case constante_1 :    [ suite_d instructions_1 ]
    case constante_2 :    [ suite_d instructions_2 ]
    ..............
    case constante_n :    [ suite_d instructions_n ]
    [ default :                suite_d instructions ]
}

Type Expression -  byte, short, char ou int (ou énuméré depuis le Java 5, ou String depuis Java 7). Long - pas possible!


public class Controle {
    public static void main(String[] arg){
        int grade = 4;
        switch (grade) {
        case 0:
        case 1:
        case 2:  System.out.println("You failed!"); break;
        case 3:  System.out.println("with great difficulty!"); break;
        case 4:  System.out.println("You passed!"); break;
        case 5:  System.out.println("You are good");break;
        case 6:  System.out.println("You are very good");break;
        default: System.out.println("This is not possible!");
        }
    }
}

public class Controle {
    public static void main(String[] arg){
        int grade = 4;
        switch (grade) {
        case 0:
        case 1:
        case 2:  System.out.println("You failed!");
        case 3:  System.out.println("with great difficulty!");
        case 4:  System.out.println("You passed!");
        case 5:  System.out.println("You are good");
        case 6:  System.out.println("You are very good");
        default: System.out.println("This is not possible!");
        }
    }
}


4.3    Instructions boucles

Deux types de boucles – ceux qui font le test après le traitement et si qui font le test avant.

4.3.1    L’instruction do... while



Fig. 4.4 Organigramme de l'instruction do…while


public class Controle {
    public static void main(String[] arg){
        int n;
        do{
            n = (int)(Math.random()*3);        //nombre aléatoire dans l'intervalle [0,2]
            System.out.println("n= "+n);
        }
        while(n!=0);
    }
}

4.3.2    L’instruction while



Fig. 4.5 Organigramme de l'instruction while


public class Controle {
    public static void main(String[] arg){
        int n=3;
        while(n>0){
            System.out.println("n= "+n--);
        }
    }
}


4.3.3    Instruction for

for ( [initialisation] ; [condition] ; [incrémentations])
    instruction



Fig. 4.6. Organigramme de l'instruction for

public class Controle {
    public static void main(String[] arg){
        int i,j;
        for(i=5,j=6;j<8;j++,i++)
            System.out.println("i:"+i+"\tj: "+j);
    }
}

public class Controle {
    public static void main(String[] arg){
        for(int i=5,j=6;j<8;j++,i++)
            System.out.println("i:"+i+"\tj: "+j);
    }
}

for (int i=3, double y=7. ; ..... ) // erreur

public class Controle {
    public static void main(String[] arg){
        for(double x =0.;x!=1.5;x+=0.1)        //boucle infinie
            System.out.println("x= "+x);
    }
}

4.4    Instructions d'interruption break et continue

•    L'instruction break quitte le bloc d'instructions
•    L'instruction continue quitte le bloc d'instructions mais reviens au test


Fig.4.7 Interruptions dans boucle do-while

attention avec continue de ne pas arriver à une boucle infinie.

public class Controle {
    public static void main(String[] arg){
        int i =0;
        do{       
            i++;
            if(i==4)break;
            if(i==2)continue;
            System.out.println("i= "+i);       
        }
        while(i<15);
    }
}







Fig. 4.8 Interruptions dans boucle while

Il faut faire attention avec continue de ne pas arriver à une boucle infinie.

public class Controle {
    public static void main(String[] arg){
        int i =-1;
        while(i<15){
            i++;
            if(i==4)break;
            if(i==2)continue;
            System.out.println("i= "+i);
        }
    }
}




Fig. 4.9 Interruptions dans boucle for


public class Controle {
    public static void main(String[] arg){
        for(int i = 0;i<15;i++){
            if(i==4)break;
            if(i==2)continue;
            System.out.println("i= "+i);
        }
    }
}

Remarque:

Les instructions d'interruption ordinaires ont l’inconvénient de n'interrompre que du niveau (boucle ou switch) le plus interne. Dans certains cas, cela s’avère insuffisant. Par exemple, on peut souhaiter sortir de deux boucles imbriquées.

Java permet l'utilisation de ces instructions avec une étiquette qui doit alors figurer devant la structure dont on souhaite sortir (identificateur usuel ).  Les étiquettes doivent être séparées de la structure avec deux points.

Exemples:

Sur quelle ligne et quelle colonne est trouvé pour la première fois la valeur searchNum(dans ce cas 6)

public class Controle {
    public static void main(String arg[]) {
        int[][] numbers = { { 1, 2, 3 }, { 6, 5, 12}, { 6, 8, 18 } };
        int searchNum = 6,i=0,j=0;
        boolean foundNum = false;
        outLoop: for (i=0; i < numbers.length; i++) {
            for (j=0; j < numbers[i].length; j++) {
                if (searchNum == numbers[i][j]) {
                    foundNum = true;
                    break outLoop;
                }
            }
        }
        if (foundNum)
            System.out.println(searchNum + " found on ["+i+","+j+"]");
        else
            System.out.println(searchNum + " not found!");
    }
}


Le deuxième programme cherche à afficher les numéros des lignes ou cette valeur est trouvée

public class Controle {
    public static void main(String arg[]) {
        int[][] numbers = { { 1, 2, 3 }, { 6, 5, 12}, { 6, 8, 18 } };
        int searchNum = 6,i=0,j=0;
        searchLabel: for (i=0; i < numbers.length; i++) {
            for (j=0; j < numbers[i].length; j++) {
                if (searchNum == numbers[i][j]) {
                    System.out.println(searchNum + " found on line:"+i);
                    continue searchLabel;
                }
            }
        }
    }
}