Opérateurs arithmétiques :
int a = 10, b = 3; int addition = a + b; // 13 (comme ADD en COBOL) int soustraction = a - b; // 7 (comme SUBTRACT en COBOL) int multiplication = a * b; // 30 (comme MULTIPLY en COBOL) int division = a / b; // 3 (division entière!) int modulo = a % b; // 1 (reste de la division) // ATTENTION : division entière si les deux opérandes sont int double divisionReelle = (double) a / b; // 3.333... // En COBOL : // COMPUTE RESULTAT = A + B // ADD A TO B // DIVIDE A BY B GIVING RESULTAT
Opérateurs de comparaison :
int x = 5, y = 10; boolean egal = (x == y); // false (comme IF A = B en COBOL) boolean different = (x != y); // true (comme IF A NOT = B) boolean inferieur = (x < y); // true (comme IF A < B) boolean inferieurEgal = (x <= y); // true (comme IF A NOT > B) boolean superieur = (x > y); // false (comme IF A > B) boolean superieurEgal = (x >= y); // false (comme IF A NOT < B) // Pour les String : UTILISER .equals() PAS == String s1 = "test"; String s2 = "test"; boolean identique = s1.equals(s2); // true // s1 == s2 compare les références, pas le contenu !
Opérateurs logiques :
boolean a = true, b = false; boolean et = a && b; // false (comme AND en COBOL) boolean ou = a || b; // true (comme OR en COBOL) boolean non = !a; // false (comme NOT en COBOL) // Court-circuit : && et || évaluent de gauche à droite // et s'arrêtent dès que le résultat est déterminé
Opérateurs d’incrémentation (NOUVEAUTÉ) :
int compteur = 0; compteur++; // Incrémente de 1 (post-incrémentation) ++compteur; // Incrémente de 1 (pré-incrémentation) compteur += 5; // Ajoute 5 (équivaut à compteur = compteur + 5) compteur -= 3; // Soustrait 3 compteur *= 2; // Multiplie par 2 // En COBOL : // ADD 1 TO COMPTEUR // ADD 5 TO COMPTEUR
Syntaxe de base :
if (condition) { // Instructions si condition vraie } else if (autreCondition) { // Instructions si autreCondition vraie } else { // Instructions si aucune condition vraie } // COMPARAISON COBOL : // IF condition // instructions // ELSE IF autre-condition // instructions // ELSE // instructions // END-IF
Exemple détaillé :
public class ExempleIf { public static void main(String[] args) { int age = 17; double solde = 250.0; // If simple if (age >= 18) { System.out.println("Majeur"); } else { System.out.println("Mineur"); } // If imbriqués if (age >= 18) { if (solde >= 100) { System.out.println("Compte majeur avec solde suffisant"); } else { System.out.println("Compte majeur mais solde insuffisant"); } } else { System.out.println("Compte mineur"); } // Conditions multiples if (age >= 18 && solde >= 1000) { System.out.println("Éligible au crédit"); } else if (age >= 18 && solde >= 100) { System.out.println("Compte standard"); } else { System.out.println("Non éligible"); } } }
Opérateur ternaire (raccourci) :
// Syntaxe : condition ? valeurSiVrai : valeurSiFaux int age = 20; String statut = (age >= 18) ? "Majeur" : "Mineur"; // Équivaut à : String statut; if (age >= 18) { statut = "Majeur"; } else { statut = "Mineur"; }
int jour = 3; String nomJour; switch (jour) { case 1: nomJour = "Lundi"; break; // IMPORTANT : sans break, continue au case suivant case 2: nomJour = "Mardi"; break; case 3: nomJour = "Mercredi"; break; case 4: nomJour = "Jeudi"; break; case 5: nomJour = "Vendredi"; break; default: nomJour = "Weekend"; break; } // COMPARAISON COBOL : // EVALUATE JOUR // WHEN 1 // MOVE "Lundi" TO NOM-JOUR // WHEN 2 // MOVE "Mardi" TO NOM-JOUR // WHEN OTHER // MOVE "Autre" TO NOM-JOUR // END-EVALUATE
Switch moderne (Java 14+) :
// Expression switch (plus concis, pas besoin de break) String nomJour = switch (jour) { case 1 -> "Lundi"; case 2 -> "Mardi"; case 3 -> "Mercredi"; case 4 -> "Jeudi"; case 5 -> "Vendredi"; default -> "Weekend"; };
Boucle for (compteur) :
// Syntaxe : for (initialisation; condition; incrémentation) for (int i = 0; i < 10; i++) { System.out.println("Itération " + i); } // COMPARAISON COBOL : // PERFORM VARYING I FROM 0 BY 1 UNTIL I >= 10 // DISPLAY "Itération " I // END-PERFORM
Boucle while (condition en début) :
int compteur = 0; while (compteur < 5) { System.out.println("Compteur: " + compteur); compteur++; } // COMPARAISON COBOL : // PERFORM UNTIL COMPTEUR >= 5 // DISPLAY "Compteur: " COMPTEUR // ADD 1 TO COMPTEUR // END-PERFORM
Boucle do-while (condition en fin) :
int compteur = 0; do { System.out.println("Compteur: " + compteur); compteur++; } while (compteur < 5); // Exécute AU MOINS UNE FOIS le bloc // COMPARAISON COBOL : // PERFORM WITH TEST AFTER UNTIL COMPTEUR >= 5 // DISPLAY "Compteur: " COMPTEUR // ADD 1 TO COMPTEUR // END-PERFORM
Instructions de contrôle de boucle :
// break : sort de la boucle for (int i = 0; i < 10; i++) { if (i == 5) { break; // Sort de la boucle à i=5 } System.out.println(i); // Affiche 0,1,2,3,4 } // continue : passe à l'itération suivante for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; // Saute les nombres pairs } System.out.println(i); // Affiche 1,3,5,7,9 }
Exercice 1 : Conversion COBOL → Java - Conditions (45min)
Convertir ce programme COBOL :
01 MONTANT PIC 9(7)V99. 01 FRAIS PIC 9(5)V99. 01 CATEGORIE PIC X(10). IF MONTANT < 1000 THEN COMPUTE FRAIS = MONTANT * 0.05 MOVE "BRONZE" TO CATEGORIE ELSE IF MONTANT < 5000 THEN COMPUTE FRAIS = MONTANT * 0.03 MOVE "ARGENT" TO CATEGORIE ELSE COMPUTE FRAIS = MONTANT * 0.01 MOVE "OR" TO CATEGORIE END-IF. DISPLAY "Montant: " MONTANT. DISPLAY "Frais: " FRAIS. DISPLAY "Catégorie: " CATEGORIE.
Corrigé :
public class CalculFrais { public static void main(String[] args) { double montant = 3500.50; double frais; String categorie; if (montant < 1000) { frais = montant * 0.05; categorie = "BRONZE"; } else if (montant < 5000) { frais = montant * 0.03; categorie = "ARGENT"; } else { frais = montant * 0.01; categorie = "OR"; } System.out.println("Montant: " + montant); System.out.println("Frais: " + frais); System.out.println("Catégorie: " + categorie); // Avec montant = 3500.50 : // Frais = 105.015 // Catégorie = ARGENT } }
Exercice 2 : Switch pour codes statut (45min)
Créer un programme qui traduit des codes statut numériques en libellés.
public class TraductionStatut { public static void main(String[] args) { int codeStatut = 2; String libelle; String action; // TODO : // Code 1 : "En attente" → "Aucune action" // Code 2 : "En cours" → "Suivi requis" // Code 3 : "Terminé" → "Archivage" // Code 4 : "Annulé" → "Notification client" // Autre : "Inconnu" → "Vérification manuelle" } }
public class TraductionStatut { public static void main(String[] args) { int codeStatut = 2; String libelle; String action; // Version switch classique switch (codeStatut) { case 1: libelle = "En attente"; action = "Aucune action"; break; case 2: libelle = "En cours"; action = "Suivi requis"; break; case 3: libelle = "Terminé"; action = "Archivage"; break; case 4: libelle = "Annulé"; action = "Notification client"; break; default: libelle = "Inconnu"; action = "Vérification manuelle"; break; } System.out.println("Statut: " + libelle); System.out.println("Action: " + action); // Version moderne (Java 14+) String libelleModerne = switch (codeStatut) { case 1 -> "En attente"; case 2 -> "En cours"; case 3 -> "Terminé"; case 4 -> "Annulé"; default -> "Inconnu"; }; } }
Exercice 3 : Boucles - Calcul d’intérêts (1h)
Simuler le calcul d’intérêts composés sur plusieurs années.
public class CalculInterets { public static void main(String[] args) { // TODO : // Capital initial : 10000 EUR // Taux annuel : 3% // Durée : 5 ans // Afficher le capital à chaque année } }
public class CalculInterets { public static void main(String[] args) { double capitalInitial = 10000.0; double tauxAnnuel = 0.03; // 3% int dureeAnnees = 5; double capital = capitalInitial; System.out.println("=== SIMULATION INTÉRÊTS COMPOSÉS ==="); System.out.println("Capital initial: " + capitalInitial + " EUR"); System.out.println("Taux: " + (tauxAnnuel * 100) + "%"); System.out.println(); // Boucle for classique for (int annee = 1; annee <= dureeAnnees; annee++) { capital = capital * (1 + tauxAnnuel); System.out.println("Année " + annee + ": " + String.format("%.2f", capital) + " EUR"); } double gain = capital - capitalInitial; System.out.println(); System.out.println("Gain total: " + String.format("%.2f", gain) + " EUR"); // COMPARAISON COBOL : // PERFORM VARYING ANNEE FROM 1 BY 1 UNTIL ANNEE > 5 // COMPUTE CAPITAL = CAPITAL * (1 + TAUX-ANNUEL) // DISPLAY "Année " ANNEE ": " CAPITAL // END-PERFORM } }
Exercice 4 : Mini-projet - Validation de code (1h30)
Programme de validation de codes produit avec plusieurs règles.
public class ValidationCodeProduit { public static void main(String[] args) { String codeProduit = "PRD-2024-A123"; boolean estValide = true; String messageErreur = ""; // Règle 1 : Longueur entre 10 et 20 caractères if (codeProduit.length() < 10 || codeProduit.length() > 20) { estValide = false; messageErreur = "Longueur invalide (doit être entre 10 et 20)"; } // Règle 2 : Doit commencer par "PRD-" if (estValide && !codeProduit.startsWith("PRD-")) { estValide = false; messageErreur = "Doit commencer par 'PRD-'"; } // Règle 3 : Contient une année valide (2020-2030) if (estValide) { String anneeStr = codeProduit.substring(4, 8); int annee = Integer.parseInt(anneeStr); if (annee < 2020 || annee > 2030) { estValide = false; messageErreur = "Année invalide (doit être entre 2020 et 2030)"; } } // Règle 4 : Catégorie valide (A, B, C) if (estValide) { char categorie = codeProduit.charAt(9); if (categorie != 'A' && categorie != 'B' && categorie != 'C') { estValide = false; messageErreur = "Catégorie invalide (doit être A, B ou C)"; } } // Affichage résultat System.out.println("Code produit: " + codeProduit); if (estValide) { System.out.println("✓ CODE VALIDE"); // Extraction des informations String annee = codeProduit.substring(4, 8); char categorie = codeProduit.charAt(9); String numero = codeProduit.substring(10); System.out.println(" Année: " + annee); System.out.println(" Catégorie: " + categorie); System.out.println(" Numéro: " + numero); } else { System.out.println("✗ CODE INVALIDE"); System.out.println(" Erreur: " + messageErreur); } } }