4.    Les instructions de contrôle

4.1    Portée d'un 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

 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!");
        }
    }
}

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 ]
}

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);
        }
    }
}

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;
                }
            }
        }
    }
}