Les structures de sélection en Java

Introduction au flux de contrôle

Le flux de contrôle définit l'ordre dans lequel les instructions d'un programme sont exécutées. Sans structures de contrôle, le code s'exécute de manière séquentielle, de haut en bas. Les structures de sélection permettent de rompre cette linéarité en exécutant des blocs de code spécifiques selon des conditions définies.

L'instruction conditionnelle if

La structure if est la forme la plus fondamentale de contrôle. Elle évalue une expression booléenne.

Types de structures if

  • if simple : Exécute un bloc uniquement si la condition est vraie.
  • if-else : Propose une alternative si la condition est fausse.
  • if-else if-else : Permet de tester plusieurs conditions mutuellement exclusives.
  • if imbriqué : Une structure conditionnelle placée à l'intérieur d'un autre bloc if.

Priorité des opérateurs

Lors de la rédaction de conditions complexes, il est crucial de respecter l'ordre de priorité :

  1. Parenthèses () - Priorité la plus haute
  2. Négation logique !
  3. Opérateurs arithmétiques (*, /, +, -)
  4. Opérateurs de comparaison (>, <, ==, !=)
  5. ET logique &&
  6. OU logique ||
  7. Affectation = - Priorité la plus basse

L'instruction de sélection switch

Le switch est une alternative plus lisible au if-else if multiple lorsqu'il s'agit de comparer une seule varible à plusieurs valeurs constantes (égalité uniquement).

Points clés :

  • L'expression testée peut être de type int, char, String (depuis Java 7) ou une énumération.
  • L'instruction break est essentielle pour sortir du switch. Sans elle, le programme continue l'exécution des cas suivants (fall-through).
  • Le bloc default est optionnel et s'exécute si aucun cas ne correspond.

Comparaison de chaînes de caractères

En Java, la comparaison de chaînes nécessite une attention particulière :

  • L'opérateur == compare les références mémoires (l'adresse).
  • La méthode equals() compare la valeur textuelle des objets.

Exemples pratiques

1. Simulation d'un tirage au sort

Ce programme vérifie si le chiffre des centaines d'un numéro client correspond à un nombre aléatoire généré par le système.

import java.util.Scanner;

public class JeuConcours {
    public static void main(String[] args) {
        Scanner lecteur = new Scanner(System.in);
        System.out.print("Entrez votre numéro de membre (4 chiffres) : ");
        int idClient = lecteur.nextInt();
        
        int chiffreCentaines = (idClient / 100) % 10;
        int numeroGagnant = (int) (Math.random() * 10);
        
        System.out.println("Chiffre extrait : " + chiffreCentaines + " | Numéro tiré : " + numeroGagnant);
        
        if (chiffreCentaines == numeroGagnant) {
            System.out.println("Félicitations, vous avez gagné !");
        } else {
            System.out.println("Désolé, tentez votre chance une prochaine fois.");
        }
    }
}

2. Vérification d'une année bissextile

Une année est bissextile si elle est divisible par 4 mais pas par 100, ou si elle est divisible par 400.

import java.util.Scanner;

public class Calendrier {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Saisissez une année : ");
        int annee = sc.nextInt();
        
        boolean estBissextile = (annee % 4 == 0 && annee % 100 != 0) || (annee % 400 == 0);
        
        if (estBissextile) {
            System.out.println(annee + " est une année bissextile.");
        } else {
            System.out.println(annee + " n'est pas bissextile.");
        }
    }
}

3. Calcul de remise selon la fidélité

Application de remises progressives basées sur un cumul de points de fidélité.

import java.util.Scanner;

public class GestionFidelite {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Montant de l'achat : ");
        double montantInitial = input.nextDouble();
        System.out.print("Points de fidélité accumulés : ");
        int points = input.nextInt();
        
        double ratioRemise = 1.0;
        
        if (points > 8000) {
            ratioRemise = 0.7;
        } else if (points > 4000) {
            ratioRemise = 0.75;
        } else if (points > 2000) {
            ratioRemise = 0.8;
        } else if (points > 0) {
            ratioRemise = 0.9;
        }
        
        System.out.println("Montant après remise : " + (montantInitial * ratioRemise));
    }
}

4. Tarification aérienne saisonnière

Calcul du prix d'un billet selon le mois de voyage et la classse choisie.

import java.util.Scanner;

public class ReservationVol {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Prix de base du billet : ");
        double tarifBase = scanner.nextDouble();
        System.out.print("Mois du voyage (1-12) : ");
        int mois = scanner.nextInt();
        System.out.print("Classe (Premium/Economique) : ");
        String categorie = scanner.next();

        if (mois >= 5 && mois <= 10) { // Haute saison
            if ("Premium".equalsIgnoreCase(categorie)) {
                System.out.println("Tarif Haute Saison (Premium) : " + (tarifBase * 0.9));
            } else {
                System.out.println("Tarif Haute Saison (Economique) : " + (tarifBase * 0.85));
            }
        } else { // Basse saison
            if ("Premium".equalsIgnoreCase(categorie)) {
                System.out.println("Tarif Basse Saison (Premium) : " + (tarifBase * 0.7));
            } else {
                System.out.println("Tarif Basse Saison (Economique) : " + (tarifBase * 0.65));
            }
        }
    }
}

5. Calculateur de surfaces géométriques

Utilisation du switch pour sélectionner une opération de calcul d'aire.

import java.util.Scanner;

public class CalculSurface {
    public static void main(String[] args) {
        Scanner clavier = new Scanner(System.in);
        System.out.println("Calcul d'aire : 1.Rectangle 2.Carré 3.Triangle 4.Cercle");
        int choix = clavier.nextInt();

        switch (choix) {
            case 1:
                System.out.print("Longueur et largeur : ");
                double l = clavier.nextDouble();
                double w = clavier.nextDouble();
                System.out.println("Aire : " + (l * w));
                break;
            case 2:
                System.out.print("Côté : ");
                double cote = clavier.nextDouble();
                System.out.println("Aire : " + (cote * cote));
                break;
            case 3:
                System.out.print("Base et hauteur : ");
                double b = clavier.nextDouble();
                double h = clavier.nextDouble();
                System.out.println("Aire : " + (b * h / 2));
                break;
            case 4:
                System.out.print("Rayon : ");
                double r = clavier.nextDouble();
                System.out.println("Aire : " + (Math.PI * r * r));
                break;
            default:
                System.out.println("Option invalide.");
        }
    }
}

Étiquettes: Java Structures de contrôle Conditionnelles programmation impérative

Publié le 13 septembre à 13h06