Conditions et boucles en Java

Apprends comment un programme Java prend des décisions et répète des tâches. Écris des conditions avec des opérateurs de comparaison et des opérateurs logiques, choisis un chemin d’exécution avec if, des enchaînements de else if et des expressions switch, puis répète des instructions avec des boucles while, do-while et for, en utilisant break et continue lorsqu’ils sont utiles. Applique ensuite les schémas de boucle courants pour compter, calculer une somme ou une moyenne, trouver la plus grande valeur, effectuer une recherche et afficher des tables, puis vérifie tes boucles en suivant leur exécution à chaque passage.

DébutantUnité 2 sur 11 de la formation Formation : Java orienté objet : classes, collections, héritage et tests

Ce que tu vas apprendre

  1. Construis des conditions vraies ou fausses à partir de comparaisons et combine-les avec des opérateurs logiques pour qu’un programme teste exactement la situation voulue.
    • Compare des valeurs et stocke les résultats sous forme de booléens
      Utilise les six opérateurs de comparaison sur des nombres et des caractères, conserve les résultats dans des variables boolean et compare correctement les chaînes et les nombres décimaux.
    • Combine des conditions avec &&, || et !
      Relie et nie des conditions avec les opérateurs logiques, prévois leurs résultats à l’aide de tables de vérité et utilise l’évaluation en court-circuit et les lois de De Morgan pour écrire des tests corrects et lisibles.
  2. Fais exécuter différentes instructions à un programme selon des conditions, depuis un simple if jusqu’aux enchaînements de else if, à l’opérateur conditionnel et à switch.
    • Exécute du code sous condition avec if et else
      Écris des instructions if et if-else avec des blocs corrects, évite les erreurs classiques d’accolades, de point-virgule et de portée, et imbrique des décisions ou choisis une valeur avec l’opérateur conditionnel.
    • Choisis un cas parmi plusieurs avec des enchaînements de else if
      Utilise des enchaînements de else if pour choisir exactement un résultat parmi plusieurs, ordonne correctement les conditions et teste les limites pour qu’aucune valeur ne soit oubliée ou incluse dans deux cas.
    • Sélectionne un cas selon une valeur avec switch
      Utilise des instructions switch et des expressions switch pour choisir selon la valeur d’une variable, avec des cas à flèche, plusieurs étiquettes par cas, default et yield, et reconnais l’enchaînement des cas dans l’ancienne forme avec deux-points.
  3. Écris des boucles while, do-while et for qui s’exécutent le bon nombre de fois et s’arrêtent quand elles le doivent, et contrôle-les avec break et continue.
    • Répète des instructions tant qu’une condition est vraie avec while
      Écris des boucles while qui démarrent, se mettent à jour et s’arrêtent correctement, utilise while (true) avec break pour une répétition sans durée prédéfinie et suis l’exécution d’une boucle passage par passage.
    • Exécute le corps de la boucle au moins une fois avec do-while
      Utilise la boucle do-while lorsque le corps doit s’exécuter avant le premier test, comme pour les vérifications de saisie et les menus, et évite ses pièges liés à la portée et au point-virgule.
    • Parcours des intervalles de valeurs avec des boucles for
      Écris des boucles for qui comptent en montant, en descendant et par pas, prévois leur nombre d’exécutions, évite les erreurs de décalage d’une unité et choisis le type de boucle adapté à une tâche.
    • Quitte une boucle ou passe à l’itération suivante avec break et continue
      Mets fin à une boucle de façon anticipée avec break, saute le reste d’un passage avec continue, quitte des boucles imbriquées avec un break étiqueté et garde les boucles à sortie anticipée faciles à suivre.
  4. Reconnais et combine les schémas de boucle courants : compter et calculer des sommes, trouver des extrema, effectuer des recherches, traiter des chiffres et imbriquer des boucles, puis vérifie les boucles en suivant et en testant leur exécution.
    • Compte des valeurs et calcule leur somme et leur moyenne
      Utilise des compteurs et des accumulateurs avec une saisie contrôlée par une sentinelle, calcule des moyennes et des pourcentages sans erreur de division entière et protège tes calculs contre une saisie vide et un dépassement de capacité.
    • Trouve des extrema, effectue des recherches et traite des chiffres
      Suis la plus grande ou la plus petite valeur rencontrée jusque-là, effectue une recherche avec un indicateur booléen ou une sortie anticipée, vérifie si une valeur au moins ou toutes les valeurs respectent une condition et décompose les nombres chiffre par chiffre.
    • Imbrique des boucles, puis suis leur exécution et teste-les
      Écris des boucles imbriquées pour produire des tables et des motifs, prévois le nombre d’exécutions du corps interne, suis l’exécution des boucles dans un tableau et teste-les avec des cas limites pour trouver les erreurs de décalage d’une unité et les boucles infinies.

Conditions et boucles en Java : cours

4 chapitres

1

Construis des conditions vraies ou fausses

Une condition transforme une question sur les données du programme en une valeur vraie ou fausse. Les comparaisons permettent de demander si un nombre atteint une limite ou si un texte correspond à une commande ; les opérateurs logiques permettent de relier ces tests. Lis les parties d’une condition dans l’ordre où Java les évalue, puis vérifie le résultat combiné. Tu peux ainsi exprimer un intervalle, une exception ou une condition de garde pour une division sans laisser une petite erreur d’opérateur modifier la règle.

1.1 Comparaisons et valeurs booléennes

Une condition est de type boolean : elle produit true ou false. Java a besoin de ce résultat explicite dans une condition de if ou de boucle. Un entier seul n’est pas une condition, donc while (count) ne compile pas ; count > 0 pose une question claire dont la réponse est vraie ou fausse.

Compare des nombres et des caractères
OpérateurQuestion
<La valeur de gauche est-elle plus petite ?
<=Est-elle plus petite ou égale ?
>Est-elle plus grande ?
>=Est-elle plus grande ou égale ?
==Les valeurs sont-elles égales ?
!=Les valeurs sont-elles différentes ?

Avec int a = 7; et int b = 10;, a < b et a != b valent true, tandis que a >= b vaut false. Des types numériques différents peuvent être comparés : 3 == 3.0 vaut true après que Java a converti l’entier en double par conversion élargissante.

Une comparaison de char utilise les numéros de code Unicode. Par exemple, 'a' < 'b' vaut true. C’est aussi le cas de 'Z' < 'a' : leurs codes sont 90 et 97. Dans cet ordre, toutes les lettres majuscules ASCII de A à Z précèdent les lettres minuscules de a à z.

Stocke une réponse utile
int age = 17;
boolean isAdult = age >= 18;
System.out.println(isAdult);

La comparaison donne false, qui est stocké dans isAdult puis affiché. Un nom qui a un sens permet au code suivant d’écrire directement if (isAdult).

Distingue l’affectation de la comparaison. = stocke une valeur ; == compare des valeurs. Pour un entier, if (x = 5) échoue, car l’affectation produit un entier. Pour un booléen, if (done = true) compile, affecte true à done et exécute la branche. Pour tester l’indicateur existant, écris if (done).

Compare du texte et des nombres décimaux calculés

Utilise command.equals("quit") pour comparer les caractères d’une chaîne. Le texte saisi « quit » correspond ; « Quit » ne correspond pas. Utilise equalsIgnoreCase lorsque la casse ne doit pas compter et !command.equals("quit") pour vérifier que le texte est différent. L’opérateur == vérifie si les chaînes désignent le même objet : il ne convient donc pas pour comparer le contenu d’une saisie utilisateur.

La représentation binaire en virgule flottante ne permet pas de stocker exactement de nombreuses fractions décimales. 0.1 + 0.2 produit 0.30000000000000004, donc 0.1 + 0.2 == 0.3 vaut false. Une comparaison avec tolérance vérifie l’écart entre les valeurs calculées :

double sum = 0.1 + 0.2;
boolean closeEnough = Math.abs(sum - 0.3) < 1e-9;

Ici, Math.abs rend la différence positive ou nulle ; la très petite différence est inférieure à 1e-9, donc closeEnough vaut true. Choisis une tolérance adaptée à la précision requise par le calcul. Les comparaisons exactes de valeurs int ne présentent pas de problème d’arrondi en virgule flottante.

Teste la divisibilité et les intervalles

n % 3 == 0 vérifie si un entier est divisible par 3. Pour les nombres impairs, utilise n % 2 != 0 : le test inclut les valeurs impaires négatives, puisque -7 % 2 vaut -1.

Écris séparément chaque partie d’un test d’intervalle : 0 < x && x < 10. Java ne peut pas lire 0 < x < 10 comme une chaîne de comparaisons mathématiques : la première comparaison produit déjà un booléen, qui ne peut pas être comparé à 10.

Points clés

  • Une condition doit produire un boolean.
  • Utilise = pour affecter une valeur et == pour comparer des valeurs numériques.
  • Compare le contenu des chaînes avec equals ou equalsIgnoreCase.
  • Compare les nombres décimaux calculés avec une tolérance adaptée.
  • Utilise n % 2 != 0 pour les entiers impairs, y compris les négatifs.

1.2 Conditions composées et évaluation en court-circuit

Les opérateurs logiques combinent des conditions complètes, vraies ou fausses. Lis une condition composée comme une règle portant sur les données, puis teste des valeurs qui devraient la respecter et d’autres qui ne devraient pas la respecter.

Relie et nie des tests

&& signifie et : les deux parties doivent être vraies. || signifie ou : au moins une partie doit être vraie, y compris lorsque les deux le sont. ! signifie non et inverse une valeur booléenne.

| p | q | p && q | p || q | | --- | --- | --- | --- | | true | true | true | true | | true | false | false | true | | false | true | false | true | | false | false | false | false |

Pour une température confortable de 18 à 24 °C inclus, il faut tester les deux bornes : temp >= 18 && temp <= 24. Être hors de cet intervalle signifie temp < 18 || temp > 24. Relier les bornes de l’intervalle avec || accepte tous les nombres : en dessous de 18, le test de la borne supérieure est vrai, et au-dessus de 24, le test de la borne inférieure est vrai.

Chaque opérande doit être une expression booléenne. Écris x == 1 || x == 2, car x == 1 || 2 place un entier là où un booléen est requis. Pour un entier, !x > 5 n’est pas valide ; !(x > 5) nie toute la comparaison.

Évalue uniquement ce qui est nécessaire

Java évalue && et || de gauche à droite et court-circuite l’évaluation lorsque la partie gauche détermine le résultat. Avec &&, un côté gauche faux fait ignorer le côté droit. Avec ||, un côté gauche vrai le fait ignorer.

int total = 36;
int count = 0;
boolean largeAverage = count != 0 && total / count > 10;

La première comparaison est fausse, donc la division est ignorée et largeAverage prend la valeur false. Inverse les opérandes et la division a lieu avant la condition de garde ; une division entière par zéro lève une ArithmeticException. Place la vérification de sécurité avant le calcul qu’elle protège.

Rends le regroupement visible

De la plus forte à la plus faible, les priorités des opérateurs concernés sont : !, les comparaisons d’ordre (<, <=, >, >=), les comparaisons d’égalité (==, !=), &&, puis ||. Ainsi, a || b && c se regroupe sous la forme a || (b && c). Lorsque a est vrai et que b et c sont faux, cette expression est vraie ; (a || b) && c est fausse. Les parenthèses montrent la règle voulue.

Les lois de De Morgan déplacent une négation à travers une condition composée :

  • !(p && q) équivaut à !p || !q.
  • !(p || q) équivaut à !p && !q.

Nie chaque partie et intervertis l’opérateur qui les relie. Appliqué à l’intervalle de température, cela donne !(temp >= 18 && temp <= 24) équivalent à temp < 18 || temp > 24.

Exprime une règle avec une exception

Dans le calendrier grégorien, une année bissextile est divisible par 4, sauf qu’une année séculaire doit être divisible par 400 :

boolean leap = (year % 4 == 0 && year % 100 != 0)
        || year % 400 == 0;

La première partie accepte 2024. Elle rejette 1900 parce que 1900 est une année séculaire ; le dernier test accepte 2000 parce qu’elle est divisible par 400. L’année 2026 ne satisfait aucune des deux parties.

Des booléens nommés facilitent la lecture des tests plus longs, comme isWeekend || isHoliday. Pour deux booléens, ^ est le OU exclusif : un seul opérande doit être vrai, comme avec !=. Les opérateurs simples & et | calculent aussi le et et le ou booléens, mais évaluent les deux opérandes ; utilise && et || pour les conditions évaluées en court-circuit.

Points clés

  • && exige que les deux conditions soient vraies ; || exige qu’au moins l’une d’elles le soit.
  • Une condition de garde évaluée en court-circuit se place avant l’expression qu’elle protège.
  • && est prioritaire sur || ; les parenthèses peuvent changer le résultat.
  • Les lois de De Morgan nient les deux parties et intervertissent && et ||.
  • Chaque côté d’un opérateur logique doit être une expression booléenne complète.
  • Les opérateurs simples & et | évaluent les deux opérandes.
2

Choisis le chemin suivi par un programme

Une décision dirige l’exécution vers un chemin choisi. Un seul test peut déclencher une action, deux branches peuvent choisir entre deux actions et un enchaînement peut affecter un résultat parmi plusieurs intervalles. Lorsque le choix dépend des valeurs exactes d’une variable, switch offre une autre forme claire. Suivre le chemin consiste à vérifier quelles conditions sont atteintes, quelle branche s’exécute et quelles variables restent disponibles ensuite.

2.1 Branches, blocs et choix de valeurs

Un if exécute un bloc lorsque sa condition est vraie. Un if avec un else choisit exactement l’un de deux blocs. Une fois le bloc choisi terminé, l’exécution continue avec l’instruction suivante.

Choisis un chemin
int age = 16;
if (age >= 18) {
    System.out.println("Adult ticket");
} else {
    System.out.println("Youth ticket");
}
System.out.println("Next customer");

La condition est fausse, donc la sortie est « Youth ticket », suivi de « Next customer ». La dernière instruction n’appartient à aucune des deux branches. Place la condition booléenne entre parenthèses et les instructions de chaque branche entre accolades.

Sans accolades, seule l’instruction suivante appartient à un if. L’indentation ne regroupe pas le code. Dans cet exemple incorrect, le deuxième message apparaît pour chaque score :

if (score < 50)
    System.out.println("Not passed");
    System.out.println("Try again");

Des accolades autour des deux instructions d’affichage rendent les deux conditionnelles. Une autre erreur consiste à placer un point-virgule immédiatement après la condition : if (x > 10); a un corps vide. Un bloc qui le suit s’exécute indépendamment et un else placé après ce bloc indépendant n’a pas de if correspondant.

Garde un résultat disponible

Une variable déclarée dans un bloc n’est visible qu’à l’intérieur de ce bloc. Déclare un résultat avant les branches lorsque le code suivant en a besoin :

String ticket;
if (age >= 18) {
    ticket = "Adult ticket";
} else {
    ticket = "Youth ticket";
}
System.out.println(ticket);

Les deux chemins possibles affectent une valeur à ticket, donc son affichage ensuite est valide. Si seule la branche correspondant à la condition vraie lui affectait une valeur, Java rejetterait sa lecture ultérieure : la variable pourrait ne pas avoir été initialisée. Déclarer ticket séparément dans chaque branche ne laisserait pas non plus de ticket disponible après la décision.

Place une décision dans une autre

Un if imbriqué n’exécute son test que lorsque l’exécution atteint la branche qui le contient :

if (hasTicket) {
    if (age < 12) {
        System.out.println("Child seat");
    } else {
        System.out.println("Standard seat");
    }
} else {
    System.out.println("Buy a ticket first");
}

Une personne sans billet atteint le else externe ; la vérification de l’âge est ignorée. Si les deux tests imbriqués ne font que protéger la même action et qu’aucun des deux n’a de else, ils peuvent devenir if (hasTicket && age < 12).

La règle du else pendant rattache un else au if le plus proche qui n’a pas encore de branche alternative. Sans accolades, l’aligner visuellement sur un if externe ne change pas cette règle. Pour un test externe vérifiant que x est positif, suivi d’un test interne vérifiant que y est positif, le else suivant appartient au test de y. Des accolades autour de toute la décision interne sont nécessaires lorsque le else doit appartenir au test externe.

Choisis une valeur avec ?:

L’opérateur conditionnel choisit l’une de deux valeurs :

int n = 7;
String label = n % 2 == 0 ? "even" : "odd";

La condition est fausse, donc l’expression donne « odd ». Sa forme est condition ? valueIfTrue : valueIfFalse. Utilise-le pour un choix court entre deux valeurs ; utilise un if lorsque les branches effectuent plusieurs actions. Des expressions conditionnelles imbriquées rendent rapidement le chemin choisi difficile à suivre.

Points clés

  • Les accolades regroupent toutes les instructions qui appartiennent à une branche.
  • Un else se rattache au if le plus proche qui n’a pas encore de branche alternative.
  • Un résultat nécessaire après une décision doit être accessible et avoir reçu une valeur sur chaque chemin qui mène à son utilisation.
  • ?: choisit une valeur parmi deux expressions.

2.2 Cas ordonnés et valeurs aux limites

Un enchaînement de else if teste les conditions dans l’ordre et sélectionne la première qui est vraie. Une fois cette branche exécutée, les conditions restantes sont ignorées. Un else final traite les valeurs restantes ; sans lui, l’enchaînement peut n’effectuer aucune action.

Ordonne des seuils qui se chevauchent

Pour des scores de 0 à 100, teste d’abord la note la plus élevée :

String grade;
if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else if (score >= 70) {
    grade = "C";
} else if (score >= 60) {
    grade = "D";
} else {
    grade = "F";
}

Pour 85, le premier test échoue et le deuxième réussit. Le programme affecte « B » sans vérifier les seuils restants. Atteindre score >= 80 signifie déjà que le score est inférieur à 90 : une borne supérieure supplémentaire est donc inutile.

Si score >= 60 apparaissait en premier, chaque score permettant de réussir recevrait « D ». Va du cas correspondant le plus restrictif vers les cas plus larges. Cet ordre compte, car plusieurs conditions peuvent être vraies même si une seule branche s’exécute.

Traite d’abord le cas combiné

FizzBuzz comporte un cas particulier où deux règles se chevauchent : les multiples de 3 et de 5 doivent donner « FizzBuzz ». Teste ce cas avant chacun des tests de divisibilité pris séparément :

if (n % 15 == 0) {
    System.out.println("FizzBuzz");
} else if (n % 3 == 0) {
    System.out.println("Fizz");
} else if (n % 5 == 0) {
    System.out.println("Buzz");
} else {
    System.out.println(n);
}

Le test % 15 == 0 accepte 30 ; 9 mène à « Fizz », 10 à « Buzz » et 7 à la branche finale. Commencer par % 3 == 0 accepterait 30 trop tôt et n’afficherait que « Fizz ».

Choisis un résultat ou plusieurs actions

Des instructions if distinctes sont des décisions indépendantes. Avec x = 15, un if (x > 10) peut afficher « big » et un if (x > 0) placé ensuite peut aussi afficher « positive ». Les relier avec else if rend le second test inaccessible chaque fois que le premier est vrai. Utilise des tests indépendants lorsque les deux actions peuvent être nécessaires ; utilise un enchaînement pour sélectionner un seul résultat.

Vérifie les bornes et les valeurs invalides

Un enchaînement pour une température entière avec temp < 10, puis temp > 10 && temp < 25, puis temp >= 25 oublie 10 exactement. Remplace le deuxième test par temp < 25 : l’atteindre signifie déjà que le premier test a échoué, donc que la valeur est au moins égale à 10. Un else final traite alors 25 et les valeurs supérieures.

Pour chaque seuil, essaie la valeur juste en dessous, le seuil lui-même et la valeur juste au-dessus. Pour l’enchaînement des scores, 89, 90 et 91 révèlent si la borne de A est correctement incluse. Teste aussi les limites globales.

Valide un score avant de lui attribuer une note : place score < 0 || score > 100 en premier et signale « Invalid score » dans ce cas. Les branches suivantes ne traitent alors que des scores valides ; 150 ne peut pas recevoir « A » par accident. La validation est un premier cas distinct, et non une correction après le choix de la note.

Points clés

  • La première condition vraie d’un enchaînement sélectionne la seule branche qui s’exécute.
  • Place les cas plus restreints qui se chevauchent avant les cas plus larges.
  • Utilise des instructions if distinctes lorsque plusieurs actions peuvent s’appliquer.
  • Teste les valeurs à chaque seuil et juste à côté.
  • Rejette les saisies invalides avant de classer les saisies valides.

2.3 Cas switch et résultats d’expression

Un switch sélectionne un cas en comparant une valeur à des étiquettes fixes. Il convient aux commandes nommées et aux choix numérotés. Utilise un enchaînement de else if lorsque le choix dépend d’un intervalle ou de plusieurs variables.

Fais correspondre des valeurs exactes

Un switch sur une valeur accepte des sélecteurs char, byte, short, int, leurs types enveloppes, String et les types énumérés. Sans fonctionnalités expérimentales, les sélecteurs long, float, double et boolean ne sont pas pris en charge. Les étiquettes doivent être des constantes : une condition comme score >= 90 n’est pas une étiquette de valeur.

switch (day) {
    case 1, 2, 3, 4, 5 -> System.out.println("Weekday");
    case 6, 7 -> System.out.println("Weekend");
    default -> System.out.println("Invalid day");
}

Un cas avec flèche n’exécute que son propre code, sans enchaînement vers le cas suivant. Les virgules regroupent plusieurs étiquettes pour une action. Un jour égal à 6 affiche « Weekend » ; un jour égal à 9 ne correspond à aucune valeur listée et affiche « Invalid day ».

Les étiquettes de chaînes correspondent à un contenu exact, sensible à la casse. Une commande « Start » ne correspond pas à case "start". Une étiquette en double provoque une erreur de compilation, et un même switch ne peut pas mélanger des cas avec flèche et des cas avec deux-points.

Produis une valeur

Une expression switch calcule un résultat :

int days = switch (month) {
    case 1, 3, 5, 7, 8, 10, 12 -> 31;
    case 4, 6, 9, 11 -> 30;
    case 2 -> 28;
    default -> 0;
};

Dans une année non bissextile, le mois 9 donne 30, le mois 2 donne 28 et le mois invalide 13 donne 0. Le point-virgule après l’accolade fermante termine la déclaration de la variable.

Une expression doit être exhaustive : chaque valeur possible du sélecteur doit avoir un résultat. Pour ces exemples avec int et String, inclus default. Une instruction switch sur une valeur peut omettre default ; une valeur sans correspondance n’exécute alors aucun cas. Une expression qui produit une valeur ne peut pas simplement omettre de produire son résultat.

Donne un résultat à un bloc avec yield

Un cas qui effectue un calcul avant de choisir sa valeur nécessite un bloc :

int days = switch (month) {
    case 2 -> {
        boolean leap = (year % 4 == 0 && year % 100 != 0)
                || year % 400 == 0;
        yield leap ? 29 : 28;
    }
    case 4, 6, 9, 11 -> 30;
    case 1, 3, 5, 7, 8, 10, 12 -> 31;
    default -> 0;
};

yield fournit la valeur du cas à l’expression switch. Février donne 29 en 2024 et 28 en 2026. Une seule expression après une flèche, comme case 2 -> 28;, n’a pas besoin de yield.

Lis l’ancienne forme avec deux-points
switch (level) {
    case 1:
        System.out.println("Bronze");
    case 2:
        System.out.println("Silver");
        break;
    case 3:
        System.out.println("Gold");
        break;
}

Pour le niveau 1, l’exécution entre dans le premier cas et continue dans le deuxième, affichant à la fois « Bronze » et « Silver ». C’est l’enchaînement des cas : une étiquette avec deux-points n’arrête pas l’exécution. break termine le switch. Des étiquettes successives avec deux-points peuvent partager volontairement une action ; un break manquant après une action peut exécuter accidentellement la suivante.

Un switch sur char peut regrouper 'a', 'e', 'i', 'o', 'u' pour donner « vowel », avec default donnant « other ». Le même principe de valeur exacte s’applique aux caractères, aux commandes et aux choix numériques.

Points clés

  • Utilise switch pour des étiquettes fixes d’un même sélecteur.
  • Les cas avec flèche ne s’enchaînent pas.
  • Une expression switch doit produire un résultat pour chaque valeur possible du sélecteur.
  • Un cas constitué d’un bloc fournit son résultat à l’expression avec yield.
  • Un cas avec deux-points peut s’enchaîner avec le suivant sans break.
  • Les cas portant sur des chaînes correspondent à un contenu exact, sensible à la casse.
3

Contrôle la répétition et l’arrêt

La répétition dépend à la fois d’une condition et d’un changement d’état du programme. Suis une boucle depuis ses valeurs initiales jusqu’à son test, son corps et sa mise à jour pour voir quand elle s’arrête. Les trois formes de boucle placent ces éléments à différents endroits : avant le corps, après celui-ci ou ensemble dans un en-tête. Les sorties anticipées et les passages sautés ajoutent des possibilités utiles, mais rendent aussi nécessaire un suivi attentif de l’ordre d’exécution.

3.1 Tests d’une boucle while et changements d’état

Une boucle while teste sa condition avant chaque passage. Si la condition est vraie, Java exécute le corps et revient au test. Si elle est fausse, l’exécution continue après la boucle. Un premier test faux signifie qu’il n’y a aucun passage.

Suis le départ, le test, le corps et la mise à jour
int i = 1;
while (i <= 5) {
    System.out.println(i);
    i++;
}

La valeur initiale est 1. Chaque passage affiche la valeur actuelle puis l’augmente. Le cinquième passage affiche 5 et porte i à 6. Le test suivant est faux, donc la boucle se termine. Le corps s’exécute cinq fois, mais la condition est testée six fois : une fois avant chaque passage et une dernière fois avec un résultat faux.

Une boucle de comptage a besoin d’une valeur initiale, d’un test et d’une mise à jour qui la rapproche de l’arrêt. Sans i++, cette boucle affiche 1 indéfiniment. Un point-virgule placé par erreur est un autre piège : dans while (i <= 5);, l’instruction vide est le corps. Lorsque i commence dans l’intervalle, le bloc suivant n’est jamais atteint et ne peut pas le mettre à jour.

Arrête-toi lorsqu’une limite est franchie

L’égalité est souvent un test d’arrêt fragile. En partant de 0 et en ajoutant 3, on obtient 0, 3, 6, 9, 12, et ainsi de suite. Le test i != 10 ne peut pas détecter le franchissement de 10, car 10 est sauté. Le test i < 10 termine la boucle après le traitement de 9. Choisis une borne qui correspond au sens de la mise à jour.

Certaines boucles se répètent un nombre inconnu de fois. Par exemple :

int amount = 1;
int days = 0;
while (amount < 1000) {
    amount *= 2;
    days++;
}

Chaque passage double la quantité et compte un jour. Après neuf passages, elle vaut 512 ; après dix, elle vaut 1 024. Le test faux à 1 024 laisse days égal à 10. Une boucle peut se terminer au-dessus de son seuil lorsque la mise à jour avance par pas plus grands.

Lis avant de décider de t’arrêter
while (true) {
    String line = scanner.nextLine();
    if (line.equals("stop")) {
        break;
    }
    System.out.println("You wrote: " + line);
}

Ici, scanner est le Scanner utilisé pour la saisie. La boucle lit une ligne, vérifie si elle contient « stop » et ne réaffiche que les lignes ordinaires. La commande d’arrêt est lue, mais pas traitée. while (true) a besoin d’une sortie accessible pour se terminer ; une boucle qui continue à se répéter sans sortir est une boucle infinie.

Suis les changements d’état

Considère un produit :

int n = 3;
int product = 1;
while (n > 0) {
    product *= n;
    n--;
}
Momentproductn
Avant la boucle13
Après le passage 132
Après le passage 261
Après le passage 360

La multiplication utilise l’ancienne valeur de n, puis la décrémentation a lieu. Déplacer la décrémentation avant la multiplication changerait les valeurs multipliées.

Déclare un résultat cumulé avant la boucle pour qu’il soit conservé d’un passage à l’autre. Une variable déclarée dans le corps est créée à nouveau chaque fois que l’exécution atteint sa déclaration. Affiche le résultat dans le corps pour voir les résultats intermédiaires ; affiche-le après l’accolade fermante pour montrer une fois le résultat final.

Points clés

  • Une boucle while peut ne s’exécuter aucune fois.
  • Suis l’évaluation de la condition avant chaque passage, y compris le test final qui est faux.
  • Les boucles de comptage ont besoin d’une mise à jour qui les rapproche d’une borne d’arrêt.
  • Une commande d’arrêt doit être vérifiée avant que la saisie correspondante soit traitée.
  • Conserve les résultats cumulés à l’extérieur du corps de la boucle.

3.2 Vérifications de saisie avec do-while

Une boucle do-while exécute le corps avant de vérifier si un autre passage est nécessaire. Utilise-la lorsque la première action doit avoir lieu, par exemple pour afficher un menu ou demander une valeur à saisir.

Teste après la première action
int i = 10;
do {
    System.out.println(i);
    i++;
} while (i < 5);

Le corps affiche 10 et incrémente i jusqu’à 11. Ce n’est qu’ensuite que Java teste i < 5. La condition est fausse, donc il n’y a pas de deuxième passage. Une boucle while (i < 5) partant de 10 n’afficherait rien.

Le point-virgule après le while (...) final est obligatoire. Il termine l’instruction do-while. Cela diffère du point-virgule placé par erreur après l’en-tête d’un while à test initial, qui crée un corps de boucle vide.

Répète tant que la saisie est invalide
int rating;
do {
    System.out.print("Rating (1-5): ");
    rating = Integer.valueOf(scanner.nextLine());
} while (rating < 1 || rating > 5);

L’invite apparaît avant la première vérification : l’utilisateur peut donc fournir la valeur à vérifier. Avec les saisies 7, puis 0, puis 4, les deux premières évaluations de la condition sont vraies et déclenchent une nouvelle invite. La dernière est fausse, donc la boucle se termine avec rating égal à 4.

La condition décrit la poursuite de la boucle, pas l’acceptation. Une note valide satisfait rating >= 1 && rating <= 5. La boucle se répète tant que cette expression est fausse, ce que les lois de De Morgan réécrivent sous la forme rating < 1 || rating > 5. Une conjonction entre ces bornes extérieures ne serait jamais vraie : un nombre ne peut pas être inférieur à 1 et supérieur à 5 en même temps.

Déclare la variable vérifiée avant le bloc

L’accolade fermante termine la portée du corps avant l’évaluation de la condition. Une déclaration comme int rating dans le bloc do ne serait donc pas accessible dans la condition finale. Déclare la variable avant do et affecte-lui la saisie dans le corps. L’affectation s’exécute toujours avant le premier test.

Le même placement compte lorsque la valeur acceptée est utilisée ensuite. rating reste accessible après toute la boucle et contient alors la dernière valeur lue.

Garde un menu ouvert
String choice;
do {
    System.out.println("a: show status, q: quit");
    choice = scanner.nextLine();
    if (choice.equals("a")) {
        System.out.println("Ready");
    }
} while (!choice.equals("q"));

Chaque passage affiche le menu et lit un choix. Saisir « a » affiche « Ready » et répète la boucle. Saisir « q » saute l’action et met fin à la boucle au niveau de la condition. Une commande inconnue provoque aussi une répétition, car elle n’est pas « q ».

Lorsque son corps ne contient aucun continue ciblant la boucle, une boucle do-while peut être réécrite avec while (true) et un break en bas du corps, associé à la condition niée. Un continue demande une attention particulière dans une telle réécriture : dans la boucle do-while d’origine, il passe à la condition, tandis que dans une boucle while-true, il revient en haut et peut sauter ce test ajouté en bas.

Points clés

  • Le corps d’une boucle do-while s’exécute avant son premier test.
  • Le point-virgule final est obligatoire.
  • Déclare une variable à l’extérieur du corps lorsque la condition en a besoin.
  • Pour valider une saisie, répète la boucle tant que la valeur est invalide.

3.3 Intervalles et bornes des boucles for

Une boucle for regroupe le contrôle d’un comptage dans un seul en-tête. Elle est utile lorsque tu connais l’intervalle ou le nombre de passages avant le début de la répétition.

Lis l’en-tête dans l’ordre d’exécution
for (int i = 1; i <= 5; i++) {
    System.out.println(i);
}

L’initialisation s’exécute une fois et affecte 1 à i. Java teste i <= 5, exécute le corps si la condition est vraie, exécute i++ et revient au test. La mise à jour est écrite dans l’en-tête, mais s’exécute après le corps. Le dernier test faux termine la boucle.

Pour un comptage ordinaire, i++ et ++i ont le même effet à l’emplacement de la mise à jour, car la valeur d’aucune des deux expressions n’est utilisée. Garde les modifications du compteur dans l’en-tête pour que la suite soit facile à prévoir.

Choisis la première et la dernière valeur
En-têteValeurs utilisées par le corpsPassages
int i = 0; i < 5; i++0 à 45
int i = 0; i <= 5; i++0 à 56
int i = 10; i >= 1; i--10 à 110
int i = 0; i <= 20; i += 50, 5, 10, 15, 205

Pour des pas croissants d’une unité, lorsque la borne de fin est supérieure ou égale à celle de départ, une borne de fin exclue donne un nombre de passages égal à la fin moins le départ ; une borne de fin incluse ajoute un passage. Avec des pas plus grands, il faut lister ou compter les valeurs réellement atteintes. Une boucle décroissante doit tester dans le sens correspondant : partir de 10 avec i <= 1 ne donne aucun passage.

Une erreur de décalage d’une unité inclut ou exclut une borne à tort. Pour afficher les nombres de 1 à 10, i < 10 oublie 10 ; utilise i <= 10. Vérifie la première valeur utilisée dans le corps, la dernière et la première valeur qui ne satisfait pas la condition.

Construis un résultat sur un intervalle
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
System.out.println(sum);

Le corps ajoute chaque entier une fois et se termine à 5 050. Un produit commence différemment : initialise product à 1 avant de multiplier par les nombres de 1 à 5. Cela donne 120 ; commencer à 0 laisserait le produit à 0 après chaque multiplication.

Surveille la portée et les corps vides

Un compteur déclaré dans l’en-tête existe pendant toute la boucle, mais pas après son accolade fermante. Déclare-le plus tôt si le code suivant a besoin de sa valeur finale.

Un point-virgule immédiatement après l’en-tête constitue un corps vide. Dans for (int i = 0; i < 3; i++);, l’instruction vide s’exécute trois fois. Un bloc suivant qui affiche « Hello » s’exécute une fois après la boucle, pas trois fois. Les accolades se placent directement après l’en-tête.

Toute partie de l’en-tête peut être omise. for (;;) { ... } n’a pas de condition d’arrêt et se comporte comme while (true) ; il lui faut une sortie comme break pour se terminer.

Choisis la boucle la plus claire
TâcheForme utileRaison
Parcourir un intervalle connuforLe départ, la borne et le pas sont réunis.
Répéter jusqu’à un changement de saisie ou d’étatwhileLe test peut empêcher le premier passage.
Demander d’abord, puis vérifierdo-whileLa première exécution du corps est obligatoire.

Les formes peuvent exprimer la même répétition, mais les réécritures doivent préserver l’ordre des tests et des mises à jour, y compris ce qu’un continue saute.

Points clés

  • Une boucle for exécute l’initialisation une fois, puis le test, le corps et la mise à jour.
  • Vérifie le départ, la dernière valeur incluse et le nombre de passages.
  • Un compteur déclaré dans l’en-tête n’est plus accessible après la boucle.
  • Utilise for pour les intervalles, while pour les changements d’état et do-while lorsqu’un premier passage est obligatoire.
  • Un point-virgule après un en-tête for crée un corps vide.

3.4 Sorties anticipées et passages sautés

Une sortie anticipée peut arrêter la répétition dès que sa tâche est accomplie. Sauter un passage peut éviter un traitement inutile tout en poursuivant la boucle. Suis attentivement leurs destinations : break et continue ont des rôles différents.

Termine une recherche avec break
for (int n = 51; n <= 100; n++) {
    if (n % 7 == 0) {
        System.out.println(n);
        break;
    }
}

Les valeurs de 51 à 55 échouent au test de divisibilité. La valeur suivante, 56, est affichée et break quitte immédiatement la boucle. La mise à jour ne s’exécute pas après ce break. Sans lui, les multiples suivants comme 63 et 70 seraient aussi affichés.

Un break sans étiquette cible la boucle ou le switch englobant le plus proche. L’exécution continue après cette construction, pas après l’ensemble du programme.

Saute un passage avec continue
for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) {
        continue;
    }
    System.out.print(i + " ");
}

Pour 3, 6 et 9, continue saute l’instruction d’affichage. Dans une boucle for, la mise à jour de l’en-tête s’exécute tout de même, suivie de la condition. La sortie contient 1, 2, 4, 5, 7, 8 et 10.

Pour une boucle while ou do-while, continue passe à la condition. Toute mise à jour placée en dessous dans le corps est sautée. Si un compteur while commence à 0 et que la première action est if (i % 3 == 0) { continue; }, un i++ placé plus loin dans le corps n’est jamais atteint. Le compteur reste à 0 et la boucle se répète indéfiniment. Déplace la mise à jour nécessaire avant chaque chemin qui saute la suite, ou utilise un en-tête for pour que la mise à jour reste automatique.

Quitte volontairement des boucles imbriquées

Un break ordinaire dans une boucle interne ne termine que cette boucle interne. Une étiquette peut désigner une boucle externe comme cible de sortie :

outer:
for (int a = 1; a <= 10; a++) {
    for (int b = 1; b <= 10; b++) {
        if (a * b == 24 && a + b == 10) {
            System.out.println("Found " + a + " and " + b);
            break outer;
        }
    }
}

La recherche parcourt les paires dans l’ordre. Pour a = 4 et b = 6, les deux tests réussissent et le break étiqueté quitte les deux boucles. continue outer passerait à la mise à jour de la boucle externe, puis à son test suivant.

Distingue les sorties du switch de celles de la boucle

Dans une boucle de menu contenant un switch sous forme avec deux-points, break dans un cas termine le switch. Il ne termine pas à lui seul la boucle qui l’entoure. Un schéma clair consiste à affecter false à un indicateur de boucle dans le cas de sortie, puis à utiliser break pour quitter le switch. La boucle se termine lorsque la vérification suivante de sa condition constate que l’indicateur est faux. Les cas avec flèche n’ont pas besoin de break pour empêcher l’enchaînement des cas.

Un break sans étiquette est autorisé dans une boucle ou un switch ; continue est autorisé dans une boucle. Les placer ailleurs provoque une erreur de compilation. Garde la règle d’arrêt normale dans la condition de la boucle lorsqu’elle peut s’y trouver. Utilise while (true) avec un break lorsque le test d’arrêt se place naturellement après la lecture d’une saisie mais avant son traitement. Plusieurs sorties peuvent être utiles, mais chaque chemin supplémentaire ajoute des états à suivre lors du suivi de l’exécution.

Points clés

  • break quitte immédiatement sa cible.
  • Dans une boucle for, continue exécute tout de même la mise à jour de l’en-tête.
  • Dans une boucle while, continue peut sauter une mise à jour nécessaire du corps.
  • Une sortie ordinaire agit sur la construction admissible la plus proche.
  • Un break étiqueté peut quitter une boucle externe.
  • Un break dans un switch ne quitte pas directement une boucle qui l’entoure.
4

Construis et vérifie des boucles utiles

Une boucle devient utile lorsqu’elle ne conserve que les informations nécessaires à un problème : un compteur, une somme cumulée, une meilleure valeur ou un indicateur qui mémorise une correspondance. Combiner ces petits schémas permet de résoudre des tâches de traitement de saisie et de recherche. Les boucles imbriquées étendent la répétition aux lignes et aux colonnes. Suis les changements de valeurs, conserve l’état dans la bonne portée et utilise des saisies vides et des cas limites pour vérifier que le résultat décrit toutes les données.

4.1 Comptages, sommes et moyennes cumulés

Un compteur enregistre le nombre de valeurs qui répondent à une condition. Un accumulateur combine des valeurs dans un résultat cumulé. Déclare les deux avant la boucle pour que chaque passage poursuive le travail précédent.

Initialise selon l’opération

Utilise int count = 0; et incrémente le compteur lorsqu’un élément répond à la condition. Une somme commence à 0 et utilise sum += value;. Un produit commence à 1, car multiplier un 0 initial effacerait l’effet de tous les facteurs suivants. Initialiser une somme dans le corps la remet à zéro à chaque passage.

Pour un intervalle, le pas de la boucle peut sélectionner les valeurs : additionner les entiers pairs de 2 à 100 par pas de 2 donne 2 550. Tu peux aussi placer une condition dans la boucle. Compter les nombres de 1 à 100 divisibles par 3 ou par 5 donne 47 : les six multiples de 15 ne doivent être comptés qu’une seule fois.

Arrête la saisie avant d’ajouter la valeur

Une sentinelle est une valeur de saisie spéciale qui met fin à la lecture. Ce n’est pas une valeur ordinaire des données :

int sum = 0;
int count = 0;
while (true) {
    int number = Integer.valueOf(scanner.nextLine());
    if (number == 0) {
        break;
    }
    sum += number;
    count++;
}

Pour la saisie 12, 7, 5, 0, la somme prend successivement les valeurs 12, 19 et 24. Le compteur atteint 3. Le 0 final déclenche le break avant que l’une ou l’autre variable change. Le compter créerait un quatrième élément et donnerait une moyenne incorrecte, même si l’ajout de zéro ne change pas la somme.

Divise seulement après avoir vérifié le compteur
if (count > 0) {
    double average = (double) sum / count;
    System.out.println(average);
} else {
    System.out.println("No numbers entered");
}

L’exemple affiche 8.0. Avec des opérandes entiers, la division supprime la partie fractionnaire : 25 / 4 vaut 6. Convertis avant de diviser pour obtenir 6,25 : (double) sum / count. Effectuer le transtypage après, (double) (sum / count), ne fait que convertir le résultat déjà tronqué en 6,0.

Si la sentinelle arrive en premier, le compteur vaut 0. Une division entière par zéro lève une ArithmeticException ; une somme en virgule flottante égale à zéro divisée par zéro donne NaN. La vérification du compteur évite qu’une saisie vide produise une moyenne qui n’a pas de sens.

Suis plusieurs résultats en un passage

Pour les scores 55, 72, 90, 48 et 81, avec un seuil de réussite de 60, on obtient cinq scores et trois réussites. Garde un compteur total pour chaque score et un compteur de réussites dans la condition de réussite. 100.0 * passed / total donne 60,0 pour cent ; 100.0 fait utiliser des calculs en virgule flottante. Vérifie aussi que le total est positif avant cette division.

L’endroit où se fait l’affichage change ce qui est montré. Des distances de 5, 3 et 8 km donnent des sommes cumulées de 5, 8 et 16 km lorsqu’elles sont affichées dans la boucle après l’addition. Un affichage après la boucle ne donne que le résultat final, 16 km.

Choisis un type assez grand pour la somme

Le maximum d’un int est 2 147 483 647. La somme de tous les entiers de 1 à 100 000 devrait donner 5 000 050 000, mais un int revient à 705 082 704 sans signaler d’erreur. long sum = 0; contient correctement cette somme ; le maximum d’un long est d’environ 9,2 × 10¹⁸. Une conversion élargissante effectuée après le dépassement de capacité ne peut pas restaurer la valeur perdue.

Points clés

  • Initialise une somme ou un compteur à 0 et un produit à 1.
  • Exclus la sentinelle de la somme et du comptage.
  • Convertis un opérande avant la division pour conserver la partie fractionnaire.
  • Protège le calcul des moyennes et des pourcentages contre une saisie vide.
  • Place la mise à jour de chaque compteur à côté de la condition qu’il compte.
  • Utilise un type assez grand avant de calculer une somme importante.

4.2 Meilleures valeurs, recherches et chiffres

Certaines boucles mémorisent une meilleure valeur ; d’autres mémorisent si une correspondance a été trouvée. Choisis l’état initial pour qu’il reflète la situation réelle avant et après chaque passage.

Garde la meilleure valeur rencontrée jusque-là

Pour suivre un maximum, remplace-le uniquement lorsque la valeur actuelle est plus grande : if (value > max) { max = value; }. En partant de la première mesure, les températures 14, 19, 11, 23 et 17 °C donnent les maximums successifs 14, 19, 19, 23 et 23 °C. Un minimum utilise < à la place.

Initialiser un maximum à 0 échoue avec des données toutes négatives : -5, -2 et -9 laisseraient à tort 0 comme résultat. Initialise-le à partir d’une mesure réelle ou commence à Integer.MIN_VALUE pour un maximum de type int et à Integer.MAX_VALUE pour un minimum de type int. Indique l’absence de résultat lorsqu’il n’y a eu aucune mesure.

Pour enregistrer une position, mets-la à jour dans la même branche que la valeur. Un > strict conserve le premier maximum en cas d’égalité ; >= le remplace à nouveau et conserve le dernier.

Arrête-toi après avoir trouvé une correspondance
int n = 1;
while (n * n <= 500) {
    n++;
}

À 22, le carré est 484, donc un autre passage s’exécute. À 23, il est 529 et la condition n’est plus satisfaite. La boucle a trouvé le plus petit entier positif dont le carré dépasse 500. Une recherche bornée peut à la place tester chaque candidat dans une boucle for et s’arrêter avec break à la première correspondance.

Pour une question portant sur au moins une valeur, initialise un indicateur à faux et passe-le à vrai lorsqu’une correspondance est trouvée. Pour une question portant sur toutes les valeurs, initialise-le à vrai et passe-le à faux dès qu’un contre-exemple apparaît. Ne réinitialise aucun de ces indicateurs dans une branche else pour les valeurs suivantes : par exemple, une mesure ultérieure qui ne correspond pas n’efface pas une mesure négative antérieure.

Teste la présence d’un diviseur

Un nombre premier est supérieur ou égal à 2 et ne possède aucun diviseur de 2 jusqu’au nombre qui le précède. Pour un petit entier positif, une vérification plus courte teste les diviseurs seulement jusqu’à sa racine carrée :

int n = 91;
boolean isPrime = n >= 2;
for (int d = 2; d * d <= n; d++) {
    if (n % d == 0) {
        isPrime = false;
        break;
    }
}

Les deux facteurs d’une paire ne peuvent pas être tous deux supérieurs à la racine carrée. Pour 91, le diviseur 7 donne un reste nul et fait passer l’indicateur à faux. Pour 97, aucun diviseur de 2 à 9 ne le divise, donc l’indicateur reste vrai. Les valeurs inférieures à 2 commencent avec un indicateur faux. Pour les grands entiers positifs de type int, utilise d <= n / d pour éviter un dépassement de capacité dans d * d.

Retire un chiffre décimal par passage

Pour un entier positif ou nul, % 10 extrait le dernier chiffre et la division entière / 10 le retire :

int n = 4072;
int sum = 0;
while (n > 0) {
    sum += n % 10;
    n /= 10;
}

Les chiffres sont 2, 7, 0 et 4, ce qui donne 13. La variable de travail n finit à 0. Pour inverser les chiffres, mets à jour reversed = reversed * 10 + n % 10; avant de retirer le chiffre ; 1 234 devient 4 321 lorsque le résultat tient dans le type choisi.

Pour compter les chiffres, zéro nécessite un passage même si n > 0 est faux au départ. Utilise une boucle do-while qui incrémente le compteur et divise n par 10. Elle compte un chiffre pour 0 et le nombre habituel pour les valeurs positives.

Points clés

  • Initialise un extremum à partir de données réelles ou d’une limite adaptée du type.
  • Mets à jour la position d’un extremum en même temps que sa valeur.
  • Garde un indicateur de recherche vrai après une correspondance pour « au moins une », ou faux après un contre-exemple pour « toutes ».
  • Un test de primalité n’a pas besoin de diviseurs supérieurs à la racine carrée.
  • Pour les entiers positifs ou nuls, % 10 extrait un chiffre et / 10 le retire.
  • Compter les chiffres de zéro nécessite un premier passage obligatoire.

4.3 Boucles imbriquées, suivi d’exécution et cas de test

Les boucles imbriquées répètent une répétition complète à chaque passage externe. Elles sont utiles pour les lignes, les colonnes, les tableaux et les formes. La boucle interne doit repartir de zéro chaque fois que la boucle externe l’atteint.

Affiche une ligne, puis termine-la
for (int row = 1; row <= 3; row++) {
    for (int col = 1; col <= 5; col++) {
        System.out.print(row * col + "\t");
    }
    System.out.println();
}

La première ligne contient 1, 2, 3, 4, 5 ; la deuxième contient 2, 4, 6, 8, 10 ; la troisième contient 3, 6, 9, 12, 15. Le print interne crée des colonnes sur une ligne ; le println après la boucle interne termine cette ligne. Déplacer println dans la boucle interne place chaque produit sur sa propre ligne.

Lorsque les nombres de passages sont fixes, multiplie les passages externes par les passages internes. Trois passages externes et quatre passages internes exécutent le corps interne 12 fois. Le tableau ci-dessus comporte trois fois cinq affichages de produits, soit 15.

Fais varier la taille des lignes
for (int row = 1; row <= 4; row++) {
    for (int col = 1; col <= row; col++) {
        System.out.print("*");
    }
    System.out.println();
}

La borne interne dépend maintenant de la ligne. Les nombres de passages sont 1, 2, 3 et 4, donc le triangle contient 10 étoiles. Une seule multiplication de nombres de passages fixes serait incorrecte, car la boucle interne ne s’exécute pas autant de fois sur chaque ligne.

Utilise des noms différents pour les compteurs de boucles dont les portées se chevauchent. Déclarer un autre int i dans une boucle où i est déjà accessible provoque une erreur de compilation. Pour une boucle while interne, initialise son compteur au début de chaque passage externe. L’initialiser uniquement avant la boucle externe le laisse au-delà de la borne après la première ligne.

Suis les valeurs au même moment

Pour une boucle de 1 à 4, soustrais les valeurs impaires d’une somme initialisée à 0 et ajoute les valeurs paires :

Valeur traitéeActionSomme après le passage
1Soustraire 1-1
2Ajouter 21
3Soustraire 3-2
4Ajouter 42

Indique si une ligne décrit le début ou la fin d’un passage. Inclus le test final qui échoue lorsque tu vérifies la fin de la boucle. Un suivi qui mélange des valeurs avant et après mise à jour peut faire paraître incorrecte une boucle correcte.

Place des séparateurs entre les éléments

Cinq nombres nécessitent quatre virgules. Affiche un séparateur avant chaque élément sauf le premier :

for (int i = 1; i <= 5; i++) {
    if (i > 1) {
        System.out.print(", ");
    }
    System.out.print(i);
}

La sortie est « 1, 2, 3, 4, 5 », sans virgule au début ni à la fin. C’est un problème des piquets : le nombre d’espaces entre les éléments diffère du nombre d’éléments.

Teste des cas qui révèlent les erreurs

Essaie zéro passage, un passage et les valeurs situées sur chaque borne et juste à côté. Pour les boucles de saisie, essaie d’abord la sentinelle. Pour les boucles imbriquées, vérifie si la deuxième ligne est correctement réinitialisée. Des affichages temporaires des variables de boucle révèlent la progression réelle. Si un programme reste bloqué, examine chaque chemin à la recherche d’une mise à jour ou d’une sortie et arrête-le avec Ctrl+C dans un terminal ou avec le bouton d’arrêt de l’environnement de développement.

Points clés

  • La boucle interne s’exécute entièrement à chaque passage externe.
  • Multiplie les nombres de passages uniquement lorsqu’ils sont tous deux fixes.
  • Réinitialise le compteur d’une boucle while interne à chaque passage externe.
  • Place le saut de ligne d’une ligne après sa boucle interne.
  • Pour les lignes du tableau de suivi d’exécution, utilise le même moment à chaque passage.
  • Teste zéro passage, un passage et les deux côtés d’une borne.
  • Les séparateurs se placent entre les éléments : ils sont donc un de moins.

Conditions et boucles en Java : exemples

4 Leçons Interactives

1

Transforme une règle du programme en condition

12 étapes
Construis des comparaisons, combine-les et vérifie leurs valeurs de vérité ainsi que leur ordre d’évaluation.
  1. 1
    IntroductionPars d’une règle sur les données

    Une condition répond par vrai ou faux à une question sur les données actuelles. Commence par des comparaisons simples, puis combine-les en une règle qui accepte exactement les valeurs voulues.

    Nous allons vérifier un intervalle de température, comparer du texte et protéger une division entière. À chaque étape, distingue le sens de la condition de l’ordre dans lequel Java l’évalue.

  2. 2
    ExplicationDonne un nom à une comparaison

    Une comparaison produit un boolean, qui peut être stocké pour une utilisation ultérieure.

    int age = 17;
    boolean isAdult = age >= 18;
    

    Ici, isAdult stocke false. L’expression if (isAdult) teste ensuite directement cette valeur. Un entier seul ne peut pas servir de condition : if (age) échoue, car Java exige un booléen, et non un nombre utilisé comme valeur de vérité.

  3. 3
    ExempleLis précisément l’opérateur

    Avec a = 7 et b = 10, a < b est vrai et a >= b est faux. Les comparaisons a != b et a == 7 sont vraies.

    La différence entre = et == compte : l’affectation modifie une variable, tandis que la comparaison pose une question. Pour un booléen, if (done = true) compile mais écrase l’indicateur avant de le tester. Utilise if (done) pour tester la valeur existante.

  4. 4
    ConseilCompare les caractères de la saisie

    Une chaîne non nulle comme command possède un contenu textuel et une identité d’objet. command.equals("quit") teste les caractères ; command == "quit" teste l’identité.

    Utilise equalsIgnoreCase uniquement lorsque les différences de casse doivent être acceptées. Par exemple, « Quit » et « quit » correspondent avec cette méthode mais diffèrent avec equals. Nier une correspondance exacte donne !command.equals("quit").

  5. 5
    ExempleVérifie une différence entre décimaux
    double sum = 0.1 + 0.2;
    boolean close = Math.abs(sum - 0.3) < 1e-9;
    

    La somme est stockée sous la forme 0.30000000000000004. L’égalité exacte avec 0.3 est fausse, mais la différence absolue est inférieure à cette tolérance, ce qui rend close vrai. Le test de tolérance accepte une petite différence ; il ne change aucune des deux valeurs stockées et ne les rend pas exactement égales.

  6. 6
    DéfiTeste un nombre impair négatif

    Un programme utilise n % 2 == 1 pour détecter les entiers impairs. Que manque-t-il lorsque n vaut -11 et comment peut-on corriger le test ?

    ---reveal---

    -11 % 2 vaut -1, donc le test est faux même si -11 est impair. Utilise n % 2 != 0 : la divisibilité par 2 donne un reste nul, et les restes non nuls, positifs ou négatifs, indiquent des entiers impairs.

  7. 7
    ExplicationExige les deux bornes

    Pour accepter les températures de 18 à 24 °C inclus, exige les deux comparaisons : temp >= 18 && temp <= 24.

    Avec 21, les deux sont vraies. Avec 17, la première est fausse ; avec 25, la seconde est fausse. Utiliser || entre ces bornes de l’intervalle accepterait les trois valeurs, car chacune satisfait au moins l’un des deux tests. Chaque opérande doit être une expression booléenne complète.

  8. 8
    Point cléInverse tout l’intervalle

    Être en dehors du même intervalle signifie temp < 18 || temp > 24. Une seule borne non respectée suffit pour être à l’extérieur.

    C’est une loi de De Morgan en action : !(p && q) équivaut à !p || !q. Nier les deux parties change aussi l’opérateur qui les relie. L’autre loi est !(p || q) équivalent à !p && !q ; conserver l’ancien opérateur changerait les saisies acceptées.

  9. 9
    ExemplePlace une condition de garde avant la division
    int total = 36;
    int count = 0;
    boolean large = count != 0 && total / count > 10;
    

    La première comparaison, qui est fausse, détermine le résultat, donc && saute la division. C’est l’évaluation en court-circuit. Inverser les opérandes diviserait par zéro avant de vérifier count et lèverait une ArithmeticException. Avec ||, un opérande gauche vrai fait de même sauter l’opérande droit.

  10. 10
    DéfiDistingue le regroupement de l’ordre de lecture

    Avec a = true, b = false et c = false, a || b && c et (a || b) && c donnent-ils le même résultat ? Explique le regroupement.

    ---reveal---

    Non. La première expression se regroupe sous la forme a || (b && c) parce que && est prioritaire, donc elle est vraie. La seconde exige le résultat de a || b ainsi que c ; puisque c est faux, son résultat est faux.

  11. 11
    DéfiCombine une borne et une exception

    Une charge est acceptée si elle est comprise entre 6 et 14 kg inclus ou si une dérogation est active, mais un calcul entier 100 / count > 5 doit aussi réussir sans erreur. Écris la condition de sorte que count égal à 0 ne puisse pas atteindre la division.

    ---reveal---

    count != 0 && (load >= 6 && load <= 14 || override) && 100 / count > 5

    La première condition de garde rejette zéro. Le choix entre parenthèses accepte l’intervalle ou la dérogation ; seul un chemin qui n’a pas été rejeté atteint la division.

  12. 12
    RécapitulatifVérifie une condition des deux côtés

    Avant d’utiliser une condition, essaie une saisie qui devrait être acceptée et une autre qui devrait être rejetée. Pour les intervalles, vérifie aussi les bornes.

    Lis les parenthèses et les priorités pour déterminer le regroupement, puis suis l’évaluation en court-circuit de gauche à droite. Cela permet de repérer à la fois une règle d’acceptation incorrecte et un calcul qui s’exécute avant sa condition de garde.

2

Choisis un chemin et produis un résultat

14 étapes
Suis les blocs, ordonne les cas qui se chevauchent et utilise des expressions switch pour choisir selon des valeurs exactes.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSuis le chemin que Java atteint
  2. 2
    ExempleExécute exactement une branche
  3. 3
    ExplicationGarde le résultat après la décision
  4. 4
    DéfiRepère un affichage inconditionnel
  5. 5
    ConseilRends le choix interne explicite
  6. 6
    ExempleParcours les seuils dans le bon ordre
  7. 7
    LienSépare les actions indépendantes
  8. 8
    DéfiCorrige une borne oubliée
  9. 9
    ExplicationChoisis selon une valeur exacte
  10. 10
    ExempleAffecte la valeur choisie
  11. 11
    ExplicationDonne sa valeur à un bloc
  12. 12
    DéfiSuis l’enchaînement des cas avec deux-points
  13. 13
    DéfiChoisis une structure pour une règle mixte
  14. 14
    RécapitulatifExamine les limites des décisions
3

Suis une boucle de son premier passage jusqu’à sa sortie

18 étapes
Suis des boucles à test initial et à test final, des répétitions contrôlées par un compteur, des passages sautés et des sorties étiquetées.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionObserve les changements d’état
  2. 2
    ExplicationTeste avant d’entrer
  3. 3
    ExempleSuis l’évolution d’un produit
  4. 4
    DéfiÉvite de sauter la valeur d’arrêt
  5. 5
    ExplicationExécute une fois avant de décider
  6. 6
    ExempleLis une note avant de la tester
  7. 7
    DéfiPrévois l’acceptation d’une borne
  8. 8
    LienPlace le comptage dans l’en-tête
  9. 9
    ExempleCompte avec des pas supérieurs à un
  10. 10
    DéfiGarde la borne voulue
  11. 11
    ConseilVérifie si le corps est vide
  12. 12
    ExempleArrête-toi à la première correspondance
  13. 13
    ExplicationSaute le reste d’un passage
  14. 14
    DéfiTrouve la mise à jour sautée
  15. 15
    ExplicationDonne un nom de sortie à une boucle externe
  16. 16
    LienDistingue les sorties du switch et de la boucle
  17. 17
    DéfiCombine un passage sauté et une sortie anticipée
  18. 18
    RécapitulatifSuis la destination suivante
4

Construis des résultats qui décrivent toutes les données traitées

19 étapes
Combine des compteurs, des extrema, des indicateurs booléens, des chiffres et des boucles imbriquées, en vérifiant leur état avec des suivis d’exécution et des cas limites.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDétermine ce qui doit être conservé d’un passage à l’autre
  2. 2
    ExplicationDistingue un comptage d’une somme
  3. 3
    ExempleLis et rejette la sentinelle
  4. 4
    ExempleSuis l’état pendant la saisie
  5. 5
    ExplicationConserve la partie fractionnaire de la moyenne
  6. 6
    DéfiCalcule la moyenne des seules mesures acceptées
  7. 7
    ConseilUtilise assez tôt un type de capacité suffisante
  8. 8
    ExempleGarde la meilleure mesure
  9. 9
    DéfiEnregistre la position en cas d’égalité
  10. 10
    Point cléLaisse un indicateur mémoriser une correspondance
  11. 11
    ExplicationRecherche un diviseur
  12. 12
    ExempleExtrais les chiffres dans un ordre fixe
  13. 13
    DéfiGarde en mémoire une mesure négative
  14. 14
    ExplicationTermine chaque ligne avant d’avancer
  15. 15
    ExempleCompte des lignes de taille variable
  16. 16
    DéfiCorrige le séparateur au premier élément
  17. 17
    ConseilChoisis des lignes de suivi révélatrices
  18. 18
    DéfiCombine une borne variable et une sélection
  19. 19
    RécapitulatifVérifie le sens de chaque résultat

Conditions et boucles en Java : QCM

50 Questions Pratiques en 5 séries

Série 1 : Trouve des erreurs et prévois des comportements combinés10 Questions Pratiques

Question 1 sur 10

Que vaut !(false || true) ?
  1. true
  2. 0
  3. false
  4. 1
Afficher la réponseMasquer la réponse
Réponse : C
L’expression entre parenthèses est vraie parce qu’au moins un opérande est vrai. La négation inverse ce résultat en false. Appliquer ! au seul premier opérande laisserait une expression différente ; les parenthèses font de toute la disjonction son opérande.

Question 2 sur 10

Qu’est-ce qui s’affiche ?

int a = -2;
int b = 5;
if (a > 0)
    if (b > 0)
        System.out.print("both");
    else
        System.out.print("one");
System.out.print("end");
  1. « oneend »
  2. « end »
  3. « bothend »
  4. « bothoneend »
Afficher la réponseMasquer la réponse
Réponse : B
Le else appartient au if interne, et toute la décision interne est ignorée parce que a > 0 est faux. Seul l’affichage après la décision imbriquée s’exécute. Afficher « one » reviendrait à rattacher à tort le else au if externe en se fondant sur l’indentation ou le sens voulu.

Question 3 sur 10

Quelle valeur est affectée ?

int level = 3;
int result = switch (level) {
    case 1, 2 -> 4;
    case 3 -> {
        int base = level * 2;
        yield base + 1;
    }
    default -> 0;
};
  1. 6
  2. 4
  3. 0
  4. 7
Afficher la réponseMasquer la réponse
Réponse : D
Le niveau 3 entre dans le cas constitué d’un bloc, où base devient 6 et yield fournit 7 à l’expression. Le cas groupé précédent ne correspond pas. Renvoyer 6 reviendrait à s’arrêter à la variable intermédiaire au lieu de suivre la valeur explicitement fournie par yield dans le bloc.

Question 4 sur 10

Quelle est la valeur finale de count ?

int count = 0;
outer:
for (int row = 1; row <= 3; row++) {
    for (int col = 1; col <= 3; col++) {
        if (row == col) {
            continue outer;
        }
        count++;
    }
}
  1. 3
  2. 6
  3. 0
  4. 9
Afficher la réponseMasquer la réponse
Réponse : A
La ligne 1 atteint immédiatement sa diagonale et n’ajoute rien. La ligne 2 ajoute une fois avant la colonne 2 et la ligne 3 ajoute deux fois avant la colonne 3, ce qui donne 3. Un continue interne ordinaire ne sauterait que chaque cellule diagonale et parcourrait six cellules hors diagonale ; l’étiquette abandonne au contraire le reste de chaque ligne.

Question 5 sur 10

Pour n = 143, une boucle de test de primalité commence au diviseur 2 et continue tant que d * d <= n, en utilisant break lorsque le reste est nul. À quel diviseur s’arrête-t-elle pour la première fois ?
  1. 7
  2. 11
  3. 12
  4. 13
Afficher la réponseMasquer la réponse
Réponse : B
Le nombre 143 est égal à 11 fois 13, et aucun entier de 2 à 10 ne le divise. Le diviseur 11 est atteint parce que son carré vaut 121, soit une valeur encore inférieure ou égale à 143. Bien que 13 soit aussi un diviseur, la boucle s’arrête au plus petit facteur et n’a jamais besoin d’atteindre 13.

Question 6 sur 10

Que vaut count à la fin ?

int count = 0;
int col = 1;
for (int row = 1; row <= 3; row++) {
    while (col <= row) {
        count++;
        col++;
    }
}
  1. 6
  2. 1
  3. 9
  4. 3
Afficher la réponseMasquer la réponse
Réponse : D
La colonne ne commence à 1 qu’une seule fois. Chaque ligne n’ajoute donc qu’un nouveau passage : la ligne 1 la fait passer à 2, la ligne 2 à 3 et la ligne 3 à 4, ce qui laisse count à 3. Le total triangulaire de 6 nécessite de remettre col à 1 au début de chaque passage externe.

Question 7 sur 10

Une boucle de saisie s’arrête à la sentinelle -9 et doit calculer la moyenne des seules valeurs positives. Après avoir initialisé sum et count à 0, elle vérifie la sentinelle, puis ajoute chaque valeur de données à sum mais n’incrémente count que pour les valeurs positives. Pour les saisies -4, 6, -2, 10, -9, qu’affiche (double) sum / count et quelle correction faut-il apporter ?
  1. 5.0 ; additionner et compter seulement les valeurs positives.
  2. 8.0 ; additionner et compter seulement les valeurs positives.
  3. 2.5 ; additionner et compter toutes les valeurs de données.
  4. 5.0 ; additionner les positives mais compter toutes les valeurs de données.
Afficher la réponseMasquer la réponse
Réponse : A
La somme actuelle est 10 parce qu’elle inclut les mesures négatives, tandis que count vaut 2 : la division affiche donc 5.0. Place les deux mises à jour dans le test des valeurs positives pour obtenir une somme de 16 et un effectif de 2, soit la moyenne voulue de 8,0. Compter toutes les données donnerait encore un dénominateur décrivant un ensemble différent de celui de la somme des seules valeurs positives.

Question 8 sur 10

Quel nombre de chiffres cela produit-il pour n = 0 ?

int n = 0;
int digits = 0;
do {
    digits++;
    n /= 10;
} while (n > 0);
  1. 0
  2. 10
  3. 1
  4. La boucle ne s’arrête jamais.
Afficher la réponseMasquer la réponse
Réponse : C
Le premier passage obligatoire incrémente digits jusqu’à 1 et laisse n à 0 après la division entière. La condition est ensuite fausse, donc la boucle se termine. Un while à test initial avec la même condition sauterait le corps et compterait à tort zéro chiffre pour le nombre écrit 0.

Question 9 sur 10

Un enchaînement rejette score < 0 || score > 40, puis attribue « high » à score >= 30, « middle » à score >= 18 et « low » au reste. Quelles catégories les scores 40, 41 et 18 reçoivent-ils, dans cet ordre ?
  1. « invalid », « invalid », « low »
  2. « high », « invalid », « middle »
  3. « high », « high », « middle »
  4. « high », « invalid », « low »
Afficher la réponseMasquer la réponse
Réponse : B
L’intervalle valide inclut 40, donc ce score atteint la branche high ; 41 est rejeté avant tout test de catégorie. La comparaison >= 18 inclut 18 dans la catégorie middle. Traiter 18 comme low exclurait une borne que la comparaison inclut explicitement.

Question 10 sur 10

Une recherche affiche le premier entier de 25 à 75 inclus qui est divisible par 4 ou par 7, mais pas par les deux. Qu’affiche-t-elle ?
  1. 28
  2. 35
  3. 32
  4. 36
Afficher la réponseMasquer la réponse
Réponse : C
Le premier candidat divisible par l’un ou l’autre nombre est 28, mais il est divisible par les deux et doit être sauté. Le candidat suivant qui convient est 32, divisible par 4 seulement : la recherche s’arrête donc là. Accepter 28 reviendrait à utiliser un ou ordinaire sans imposer qu’une seule des deux conditions soit vraie.
Série 2 : Lis des conditions et choisis un chemin10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quelle est la valeur de -13 % 2 != 0 ?
  1. false
  2. true
  3. -1
  4. 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une String command non nulle contient un texte lu en entrée. Quelle expression vérifie que son contenu est exactement « pause » ?
  1. command == "pause"
  2. command.equalsIgnoreCase("pause")
  3. !command.equals("pause")
  4. command.equals("pause")
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Quelle condition accepte une masse de 4 à 9 kg, bornes incluses ?
  1. mass >= 4 && mass <= 9
  2. mass > 4 && mass < 9
  3. mass >= 4 || mass <= 9
  4. mass < 4 || mass > 9
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Qu’affiche ce code ?

boolean ready = true;
boolean locked = false;
boolean expired = false;
System.out.println(ready || locked && expired);
  1. false
  2. true false
  3. true
  4. false false
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Qu’affiche ce code ?

int stock = 0;
if (stock > 0) {
    System.out.print("available ");
} else {
    System.out.print("empty ");
}
System.out.print("checked");
  1. « available checked »
  2. « empty checked »
  3. « empty »
  4. « available empty checked »
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Qu’est-ce qui s’affiche ?

int load = 74;
if (load >= 50) {
    System.out.print("medium");
} else if (load >= 70) {
    System.out.print("high");
} else {
    System.out.print("low");
}
  1. « medium »
  2. « high »
  3. « mediumhigh »
  4. « low »
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Quelle valeur est stockée dans mode ?

String command = "RUN";
int mode = switch (command) {
    case "run" -> 1;
    case "wait" -> 2;
    default -> 3;
};
  1. 1
  2. 2
  3. 0
  4. 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Avec int sum = 15; et int count = 0;, que se passe-t-il lors de l’évaluation de count == 0 || sum / count > 4 ?
  1. L’expression vaut false sans division.
  2. L’expression vaut true sans division.
  3. L’expression lève une ArithmeticException.
  4. L’expression vaut true après division.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Pourquoi ce code ne compile-t-il pas ?

int value = 8;
String label;
if (value > 5) {
    label = "large";
}
System.out.println(label);
  1. label est hors de sa portée de déclaration.
  2. Un if ne peut pas affecter une chaîne.
  3. label ne reçoit pas de valeur sur chaque chemin.
  4. La comparaison doit utiliser >= à la place.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un programme autorise l’entrée lorsque member && !blocked || guest && codeValid est vrai. Quelle condition rejette exactement les entrées qu’il autoriserait ?
  1. (!member || blocked) && (!guest || !codeValid)
  2. (!member && blocked) || (!guest && !codeValid)
  3. (!member || blocked) || (!guest || !codeValid)
  4. (!member && blocked) && (!guest && !codeValid)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Suis les tests, les mises à jour et les sorties des boucles10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Combien de fois le corps s’exécute-t-il ?

int n = 12;
while (n < 8) {
    n++;
}
  1. 1 fois
  2. 4 fois
  3. 0 fois
  4. 5 fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Qu’est-ce qui s’affiche ?

int level = 9;
do {
    level -= 2;
} while (level > 8);
System.out.println(level);
  1. 7
  2. 9
  3. 8
  4. 5
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Combien de fois le corps s’exécute-t-il ?

for (int k = 2; k <= 17; k += 4) {
    System.out.println(k);
}
  1. 3
  2. 5
  3. 6
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Qu’est-ce qui s’affiche, sans tenir compte de l’espace final ?

for (int k = 2; k <= 7; k++) {
    if (k % 2 == 0) {
        continue;
    }
    System.out.print(k + " ");
}
  1. « 2 4 6 »
  2. « 3 5 7 »
  3. « 3 »
  4. « 3 4 5 6 7 »
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Que valent amount et steps après cette boucle ?

int amount = 3;
int steps = 0;
while (amount < 40) {
    amount *= 2;
    steps++;
}
  1. amount = 24, steps = 3
  2. amount = 40, steps = 4
  3. amount = 48, steps = 5
  4. amount = 48, steps = 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Quelle est la valeur finale de total ?

int total = 0;
for (int k = 1; k <= 8; k++) {
    if (k % 3 == 0) {
        continue;
    }
    total += k;
    if (total > 12) {
        break;
    }
}
  1. 12
  2. 13
  3. 19
  4. 15
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une boucle do-while lit un entier de 2 à 6 inclus. Quelle condition la fait se répéter exactement tant que la valeur est invalide ?
  1. value < 2 || value > 6
  2. value >= 2 && value <= 6
  3. value < 2 && value > 6
  4. value <= 2 || value >= 6
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un en-tête for déclare int index. Où le code peut-il lire cette variable ?
  1. Partout dans la méthode main.
  2. Seulement dans la mise à jour de l’en-tête.
  3. Seulement après la fin de la boucle.
  4. Seulement dans cette boucle for.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Qu’est-ce qui s’affiche ?

int hits = 0;
outer:
for (int row = 1; row <= 4; row++) {
    for (int col = 1; col <= 4; col++) {
        if (row + col == 5) {
            break outer;
        }
        hits++;
    }
}
System.out.println(hits);
  1. 6
  2. 3
  3. 9
  4. 12
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Pourquoi cette boucle ne se termine-t-elle jamais ?

int n = 1;
while (n != 12) {
    n += 2;
}
  1. La mise à jour réduit n à chaque passage.
  2. La condition n’est vérifiée qu’une fois.
  3. La suite reste impaire et saute 12.
  4. Le corps remet n à 1 à chaque passage.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Calcule des résultats à partir de saisies répétées10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quelle valeur initiale un accumulateur doit-il utiliser avant de multiplier les entiers de 2 à 6 inclus ?
  1. 0
  2. 2
  3. 6
  4. 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une boucle lit 9, 4, 8, puis la sentinelle -1. Elle vérifie la sentinelle avant de mettre à jour la somme et le compteur. Quelle moyenne doit-elle indiquer ?
  1. 5.0
  2. 7.0
  3. 5.25
  4. 6.666666666666667
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Avec int sum = 17; et int count = 4;, quelle est la valeur de (double) (sum / count) ?
  1. 4.25
  2. 4.5
  3. 4.0
  4. 5.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une boucle qui recherche un maximum ne traitera que des entiers négatifs. Pourquoi initialiser max à 0 peut-il donner une réponse incorrecte ?
  1. Aucune saisie négative ne peut remplacer cette valeur initiale.
  2. Chaque saisie négative remplacera cette valeur initiale.
  3. Zéro empêche la boucle de saisie de démarrer.
  4. Comparer des entiers négatifs provoque un dépassement de capacité.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Qu’est-ce qui s’affiche ?

int n = 6205;
int sum = 0;
while (n > 0) {
    sum += n % 10;
    n /= 10;
}
System.out.println(sum);
  1. 12
  2. 56
  3. 13
  4. 5026
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Combien d’étoiles sont affichées au total ?

for (int row = 2; row <= 5; row++) {
    for (int col = 1; col < row; col++) {
        if (col == 2) {
            continue;
        }
        System.out.print("*");
    }
}
  1. 6
  2. 9
  3. 10
  4. 7
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Que valent best et position ensuite ?

int best = Integer.MIN_VALUE;
int position = 0;
for (int day = 1; day <= 5; day++) {
    int value = day % 3 - 4;
    if (value >= best) {
        best = value;
        position = day;
    }
}
  1. best = -2, position = 2
  2. best = -2, position = 5
  3. best = -3, position = 4
  4. best = -4, position = 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une boucle a compté 7 mesures acceptées sur 12. Quelle expression calcule le pourcentage de mesures acceptées avec un résultat fractionnaire ?
  1. 100.0 * accepted / total
  2. accepted / total * 100.0
  3. (double) (accepted / total) * 100
  4. (double) (100 * (accepted / total))
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Quelle est la sortie ?

for (int k = 3; k <= 5; k++) {
    if (k > 3) {
        System.out.print(", ");
    }
    System.out.print(k);
}
  1. « , 3, 4, 5 »
  2. « 3, 4, 5, »
  3. « 3, 4, 5 »
  4. « 345 »
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Qu’affiche ce code ?

boolean allPositive = true;
for (int k = 1; k <= 4; k++) {
    int value = k - 2;
    if (value <= 0) {
        allPositive = false;
    } else {
        allPositive = true;
    }
}
System.out.println(allPositive);
  1. false, car une valeur précédente était négative ou nulle.
  2. true, bien que toutes les valeurs n’aient pas été positives.
  3. true, car chaque valeur produite était positive.
  4. false, bien que chaque valeur produite ait été positive.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 5 : Combine des décisions avec des schémas de boucle10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Quel mot-clé fournit un résultat depuis un cas constitué d’un bloc de plusieurs instructions dans une expression switch ?
  1. yield
  2. break
  3. continue
  4. default
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Qu’est-ce qui s’affiche ?

int result = 0;
switch (2) {
    case 1:
        result += 2;
    case 2:
        result += 3;
    case 3:
        result += 5;
        break;
    default:
        result = -1;
}
System.out.println(result);
  1. 3
  2. 10
  3. 8
  4. -1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Que vaut total après la boucle ?

int total = 0;
for (int k = 1; k <= 5; k++) {
    switch (k % 3) {
        case 0:
            break;
        default:
            total += k;
    }
    total++;
}
  1. 14
  2. 17
  3. 16
  4. 5
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Quelle est la valeur finale de total ?

int total = 0;
for (int n = 1; n <= 9; n++) {
    if (n % 2 == 0) {
        total += 2;
    } else if (n % 3 == 0) {
        total += 3;
    } else {
        total--;
    }
}
  1. 14
  2. 8
  3. 9
  4. 11
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une boucle de validation accepte les entiers de 10 à 14 inclus. Elle lit les saisies 8, 14, puis 11 avec do { ... } while (value < 10 || value > 14);. Combien de saisies lit-elle ?
  1. 1
  2. 3
  3. 2
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Qu’est-ce qui s’affiche ?

int n = 58;
int result = 0;
do {
    int digit = n % 10;
    if (digit % 2 == 0) {
        result = result * 10 + digit;
    }
    n /= 10;
} while (n > 0);
System.out.println(result);
  1. 8
  2. 85
  3. 5
  4. 58
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une boucle imbriquée affiche quatre lignes de six valeurs. L’appel qui effectue le saut de ligne se trouve après la boucle interne mais dans la boucle externe. Combien d’affichages de valeurs et d’appels de saut de ligne s’exécutent ?
  1. 24 affichages de valeurs et 24 appels de saut de ligne.
  2. 10 affichages de valeurs et 4 appels de saut de ligne.
  3. 24 affichages de valeurs et 6 appels de saut de ligne.
  4. 24 affichages de valeurs et 4 appels de saut de ligne.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Pourquoi Math.abs((0.1 + 0.2) - 0.3) < 1e-9 peut-il être vrai alors que (0.1 + 0.2) == 0.3 est faux ?
  1. La tolérance transforme la somme stockée en exactement 0,3.
  2. La différence calculée est non nulle mais inférieure à la tolérance.
  3. L’opérateur d’égalité compare l’identité des objets double.
  4. L’appel de valeur absolue arrondit chaque différence à zéro.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une boucle avec sentinelle doit calculer la moyenne des entiers positifs jusqu’à 0. Son corps lit une valeur, incrémente count, vérifie si la valeur est 0 et utilise break, puis ajoute la valeur. Pour les saisies 6, 10, 0, elle affiche (double) sum / count. Quel est le résultat et quelle correction faut-il apporter ?
  1. Environ 5,3333 ; compter seulement après le test d’arrêt.
  2. 8,0 ; placer la mise à jour de la somme avant le test d’arrêt.
  3. 16,0 ; initialiser count à 1 avant la lecture.
  4. Environ 5,3333 ; effectuer le transtypage du quotient calculé.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Qu’affiche ce code ?

for (int n = 4; n > 0; n--);
{
    System.out.print("done");
}
  1. « done » quatre fois
  2. Rien du tout
  3. « done » indéfiniment
  4. « done » une fois
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

63 Mots-Clés, chacun avec sa définition

A

Accumulateur
Un accumulateur stocke un résultat cumulé entre les passages d’une boucle, en ajoutant chaque valeur acceptée au résultat précédent ou en multipliant ce résultat par cette valeur.
Un accumulateur initialisé avant la boucle conserve la distance totale parcourue sur plusieurs jours.

B

Bloc
Un bloc regroupe des instructions entre accolades afin qu’une branche ou une boucle puisse traiter le groupe comme son corps, avec sa propre portée pour les variables locales.
Un bloc autour de deux instructions d’affichage rend les deux conditionnelles au même test if.
Boucle à test final
Une boucle à test final vérifie si un autre passage est nécessaire après l’exécution de son corps ; la forme do-while de Java place la condition après l’accolade fermante.
Une boucle à test final peut afficher un menu une fois même lorsque la première commande y met immédiatement fin.
Boucle do-while
Une boucle do-while exécute son corps avant de tester sa condition : au moins un passage a donc lieu avant qu’elle puisse arrêter de se répéter.
Une boucle do-while demande une note avant de vérifier si un nouvel essai est nécessaire.
Boucle externe
Une boucle externe contient une autre boucle et contrôle le nombre de démarrages de la répétition interne, en avançant généralement d’une ligne par passage.
La boucle externe s’exécute quatre fois lorsqu’un tableau nécessite quatre lignes avec un saut de ligne après chacune.
Boucle for
Une boucle for regroupe l’initialisation, un test de condition répété et une mise à jour dans un seul en-tête, ce qui facilite le suivi d’une répétition contrôlée par un compteur.
Une boucle for parcourt les entiers de 1 à 12 inclus et ajoute chaque valeur à une somme cumulée.
Boucle imbriquée
Une boucle imbriquée est une boucle placée dans une autre boucle, de sorte que sa répétition complète est atteinte à chaque passage du corps englobant.
Une boucle imbriquée affiche toutes les colonnes d’une ligne avant que la boucle externe passe à la ligne suivante.
Boucle infinie
Une boucle infinie continue à se répéter sans sortie, souvent parce qu’une mise à jour nécessaire manque ou qu’une valeur d’arrêt n’est jamais atteinte.
Un compteur qui reste à 1 pendant que i <= 5 est testé produit une boucle infinie, sauf si un autre chemin permet de sortir.
Boucle interne
Une boucle interne est contenue dans une autre boucle et effectue une tâche répétée, comme parcourir chaque colonne de la ligne actuelle.
La boucle interne recommence à la colonne 1 sur chaque ligne lorsque son compteur est correctement réinitialisé.
Boucle while
Une boucle while teste une condition booléenne avant chaque exécution du corps et peut n’effectuer aucun passage si son premier test est faux.
Une boucle while continue à doubler une quantité jusqu’à ce qu’elle atteigne ou dépasse son objectif.
Branche
Une branche est un chemin possible dans une décision ; une instruction if-else sélectionne l’une de ses deux branches selon une condition booléenne.
La branche correspondant à la condition fausse affiche « Try again » lorsque la note saisie ne satisfait pas la condition requise.
break
Une instruction break quitte immédiatement sa cible ; sans étiquette, celle-ci est la boucle ou le switch englobant le plus proche dans lequel elle apparaît.
Un break arrête la recherche lorsque le premier candidat satisfaisant les tests requis est trouvé.

C

Cas limite
Un cas limite est une saisie ou un état initial proche d’une limite, comme des données vides, un seul passage ou une borne, qui peut révéler une erreur cachée.
Un cas limite où la sentinelle est saisie en premier vérifie qu’une boucle de calcul de moyenne gère l’absence de données.
Compteur
Un compteur enregistre le nombre d’événements ou de valeurs répondant à une condition, en commençant généralement à zéro et en augmentant une fois par correspondance.
Un compteur n’augmente que pour les mesures acceptées, ce qui garde correct le dénominateur de leur moyenne.
Condition de poursuite
Une condition de poursuite décrit quand un autre passage de boucle doit avoir lieu ; un résultat vrai répète la boucle et un résultat faux met fin à la répétition.
La condition de poursuite pour la saisie d’une note est vraie hors de l’intervalle de 1 à 5 inclus.
continue
Une instruction continue saute le reste du corps de boucle en cours et passe vers le passage suivant, en effectuant notamment la mise à jour d’une boucle for simple.
Un continue saute l’affichage d’une valeur indésirable tout en laissant avancer le compteur du for.
Contre-exemple
Un contre-exemple est une valeur qui rend fausse une affirmation portant sur toutes les valeurs ; un indicateur qui vérifie toutes les correspondances reste faux après l’avoir rencontré.
Une mesure nulle est un contre-exemple à l’affirmation selon laquelle chaque valeur enregistrée est positive.

D

Dépassement de capacité
Un dépassement de capacité se produit lorsqu’un résultat entier dépasse l’intervalle de son type et revient à une autre valeur sans signaler d’erreur arithmétique.
Un dépassement de capacité dans un accumulateur int fausse une somme importante même si chaque saisie individuelle tient dans un int.
Division entière
La division entière divise des opérandes entiers et supprime toute partie fractionnaire : convertir son résultat après coup ne peut donc pas restaurer cette partie.
La division entière donne 4 pour 17 / 4, ce qui explique pourquoi un calcul de moyenne convertit d’abord un opérande.

E

Else pendant
Un else pendant est un else dont le regroupement visuel peut être ambigu ; Java le rattache au if précédent le plus proche qui n’a pas encore de branche alternative.
Les accolades résolvent le else pendant lorsqu’une vérification externe du billet contient une vérification interne de l’âge.
Enchaînement de else if
Un enchaînement de else if teste plusieurs conditions dans l’ordre et n’exécute que la première branche dont la condition est vraie, ou son else final si aucun test ne réussit.
Un enchaînement de else if attribue une seule note même lorsque le score satisfait plusieurs seuils inférieurs.
Enchaînement des cas
L’enchaînement des cas est la poursuite de l’exécution depuis un cas avec deux-points dans les instructions des cas suivants, jusqu’à une sortie ou à la fin du switch.
Un break manquant provoque l’enchaînement des cas : la correspondance avec le premier cas affiche donc son message d’état, puis aussi celui du cas suivant.
Erreur de décalage d’une unité
Une erreur de décalage d’une unité fait s’exécuter une boucle une fois de trop ou une fois de moins, généralement parce que sa valeur initiale ou son test de borne est incorrect.
Une erreur de décalage d’une unité omet la dernière valeur lorsqu’une boucle utilise < 12 mais doit inclure 12.
ET logique
Le ET logique relie deux expressions booléennes et n’est vrai que si les deux sont vraies ; Java écrit sa forme à court-circuit &&.
Un ET logique relie les bornes inférieure et supérieure lorsque les deux doivent être respectées pour accepter une température.
Exhaustivité
L’exhaustivité signifie qu’un switch qui produit une valeur prend en compte chaque valeur possible du sélecteur, de sorte qu’aucune entrée ne reste sans résultat.
Un cas default assure l’exhaustivité d’un switch sur un int qui ne comporte que quelques étiquettes explicites.
Expression switch
Une expression switch choisit et produit une valeur à partir des cas correspondants, de sorte que son résultat peut être affecté ou utilisé dans une autre expression.
Une expression switch affecte le nombre de jours en sélectionnant le cas du mois en cours.
Extraction de chiffres
L’extraction de chiffres récupère le dernier chiffre décimal d’un entier positif ou nul avec % 10, afin de l’utiliser avant qu’une division ne le retire.
L’extraction de chiffres parcourt les chiffres de droite à gauche lorsqu’une boucle divise à répétition par 10.

É

Étiquette de cas
Une étiquette de cas nomme une valeur fixe acceptée par un cas switch ; plusieurs étiquettes séparées par des virgules peuvent partager une action avec flèche.
Une étiquette de cas pour 6 peut partager une action de fin de semaine avec l’étiquette pour 7 dans un switch avec flèches.
Évaluation en court-circuit
L’évaluation en court-circuit ignore l’opérande droit de && ou de || lorsque l’opérande gauche détermine déjà le résultat complet.
L’évaluation en court-circuit permet d’utiliser count != 0 && sum / count > 5 sans erreur lorsque les deux variables sont des int.

I

Indicateur booléen
Un indicateur booléen est une variable booléenne qui enregistre si une condition a été satisfaite, par exemple si une correspondance a été trouvée ou un contre-exemple rencontré.
Un indicateur booléen cherchant au moins une mesure négative reste vrai après une correspondance, même si la dernière mesure est positive.
Initialisation
L’initialisation donne sa valeur de départ à une variable ; l’initialisation d’une boucle for s’exécute une fois avant son premier test de condition.
L’initialisation fixe un compteur à rebours à 8 avant que l’en-tête commence à le tester et à le diminuer.
Instruction break étiquetée
Une instruction break étiquetée désigne une instruction englobante étiquetée comme cible de sortie, ce qui permet à une recherche imbriquée de quitter une boucle externe.
Une instruction break étiquetée met immédiatement fin aux deux boucles de recherche lorsque la paire requise est découverte.
Instruction continue étiquetée
Une instruction continue étiquetée cible une boucle englobante étiquetée, abandonne le travail en cours et passe vers le passage suivant de cette boucle.
Une instruction continue étiquetée passe à la mise à jour du for externe au lieu de vérifier les colonnes restantes.
Itération
Une itération est une exécution du corps d’une boucle ; la condition de la boucle détermine si un autre passage peut commencer ou si la répétition se termine.
Une itération double la quantité stockée et augmente de un le nombre de jours écoulés.

L

Lois de De Morgan
Les lois de De Morgan permettent de nier un test booléen composé en niant les deux opérandes et en transformant l’opérateur qui les relie de et en ou, ou inversement.
Les lois de De Morgan transforment un test vérifiant qu’une valeur n’est pas dans un intervalle fermé en un ou portant sur les deux bornes extérieures.

M

Maximum
Un maximum est la plus grande valeur des données traitées ; une boucle le conserve en remplaçant la meilleure valeur stockée uniquement lorsque c’est approprié.
Pour trouver le maximum de plusieurs températures négatives, il faut commencer par une donnée ou par une valeur initiale suffisamment basse.
Minimum
Un minimum est la plus petite valeur des données traitées, suivie en remplaçant la meilleure valeur stockée lorsqu’une mesure plus basse apparaît.
Le minimum reste inchangé lors d’une journée plus chaude parce que la nouvelle mesure n’est pas plus petite.
Mise à jour
Une mise à jour modifie l’état qui contrôle la boucle après l’exécution normale du corps ; un en-tête for place cette opération après sa condition.
La mise à jour i += 4 fait passer le compteur de 2 à 6 après la fin du premier corps de boucle for.

N

Négation
La négation inverse une valeur booléenne avec ! : elle transforme vrai en faux et faux en vrai sans modifier les données sous-jacentes.
La négation dans !command.equals("stop") est vraie tant que le texte saisi diffère de « stop ».
Nombre premier
Un nombre premier est un entier supérieur ou égal à 2 qui n’a pas d’autres diviseurs positifs que 1 et lui-même ; trouver un autre diviseur permet de l’exclure.
Le test de primalité rejette 91 lorsqu’il atteint le diviseur 7, car le reste est nul.

O

Opérateur conditionnel
L’opérateur conditionnel ?: sélectionne l’une de deux valeurs d’expression selon une condition booléenne, ce qui permet un choix court entre deux valeurs.
L’opérateur conditionnel affecte « even » ou « odd » à label selon un test de reste.
Opérateur d’affectation
L’opérateur d’affectation = stocke une valeur dans une variable ; l’expression obtenue a pour valeur cette valeur affectée, et non un résultat de comparaison.
Utiliser l’opérateur d’affectation dans if (done = true) modifie l’indicateur avant l’exécution de la branche.
Opérateur d’égalité
L’opérateur d’égalité == compare des valeurs primitives, mais, pour des références d’objets comme les chaînes, il teste si les objets sont identiques.
L’opérateur d’égalité accepte 3 == 3.0 parce qu’une conversion numérique rend leurs valeurs égales.
Opérateur de comparaison
Un opérateur de comparaison teste la relation entre deux valeurs et produit un booléen, par exemple pour déterminer si un nombre est supérieur à un autre.
L’opérateur de comparaison <= inclut dans un intervalle autorisé un score égal à la borne supérieure.
OU exclusif
Le OU exclusif est vrai lorsqu’un seul de deux opérandes booléens est vrai ; Java exprime cette opération avec l’opérateur ^.
Le OU exclusif rejette une valeur divisible par les deux nombres testés lorsqu’une seule règle de divisibilité doit être satisfaite.
OU logique
Le OU logique relie deux expressions booléennes et est vrai lorsqu’au moins l’une est vraie, y compris lorsque les deux le sont ; sa forme à court-circuit est ||.
Un OU logique accepte une commande lorsqu’elle correspond à l’une de deux chaînes autorisées.

P

Portée
La portée d’une variable locale est la partie du programme où cette variable peut être nommée ; la portée d’une déclaration dans un bloc se termine à son accolade fermante.
La portée d’un résultat déclaré avant un if permet à l’affichage suivant de lire la valeur affectée.
Priorité des opérateurs
La priorité des opérateurs détermine le regroupement des expressions sans parenthèses ; le ET logique est prioritaire sur le OU logique.
La priorité des opérateurs fait que a || b && c signifie a || (b && c), même si ou apparaît en premier.
Problème des piquets
Un problème des piquets apparaît lorsque les éléments et les espaces entre eux ont des nombres différents, comme cinq valeurs affichées qui nécessitent quatre séparateurs.
Un problème des piquets est évité en affichant une virgule avant chaque nombre sauf le premier.

R

Recherche
Une recherche examine des candidats jusqu’à trouver une correspondance requise ou à épuiser les candidats disponibles sans en trouver.
Une recherche peut s’arrêter au premier nombre dont le carré dépasse la limite choisie.
Reste
Un reste est la valeur laissée par % après une division entière ; un reste nul indique que la valeur est divisible par le diviseur.
Le reste dans -13 % 2 est -1 : tester si le reste est non nul permet donc de reconnaître cet entier impair.

S

Sélecteur
Un sélecteur est la valeur évaluée par un switch et comparée à ses étiquettes de cas pour choisir le code ou l’expression à exécuter.
Le sélecteur command dirige le texte « wait » vers un cas portant cette étiquette de chaîne exacte.
Sentinelle
Une sentinelle est une valeur de saisie désignée qui signale la fin d’une séquence et qui est vérifiée avant le traitement ordinaire des données.
Une sentinelle de -1 termine la lecture sans devenir un élément supplémentaire dans le comptage ou la somme des données.
Seuil
Un seuil est une valeur qui sépare des résultats possibles ; son opérateur de comparaison détermine si le seuil lui-même appartient à un cas.
Un seuil écrit score >= 30 inclut 30, tandis que score > 30 exclut ce score exact.
Somme cumulée
Une somme cumulée est la somme de toutes les valeurs traitées jusque-là, mise à jour à chaque passage et disponible pour un affichage intermédiaire ou final.
Une somme cumulée affichée après chaque addition montre la progression avant la saisie de la dernière valeur.
Sortie anticipée
Une sortie anticipée termine une boucle avant que sa condition ne l’arrête normalement, souvent parce qu’un résultat de recherche ou une commande d’arrêt a été trouvé.
Une sortie anticipée empêche une sentinelle de saisie d’être ajoutée à une somme cumulée ou comptée comme donnée.

T

Tableau de suivi d’exécution
Un tableau de suivi d’exécution enregistre certaines valeurs du programme à des moments cohérents pendant l’exécution, ce qui rend visibles les changements d’état et les chemins suivis par la boucle.
Un tableau de suivi d’exécution montre la somme après chaque passage et la condition qui finit par arrêter la boucle.
Test aux limites
Un test aux limites vérifie une valeur située à un seuil ou juste à côté, ce qui aide à révéler les valeurs oubliées, les chevauchements et les bornes incluses ou exclues à tort.
Un test aux limites utilisant 29, 30 et 31 vérifie le passage à une catégorie commençant à 30.
Tolérance
Une tolérance est une grandeur de différence admise lors de la comparaison de nombres calculés qui peuvent contenir de petites erreurs d’arrondi.
Une tolérance de 1e-9 accepte la très petite différence entre 0.1 + 0.2 et 0.3 dans ce calcul.

V

Valeur booléenne
Une valeur booléenne est soit true, soit false ; les comparaisons en produisent et les conditions Java exigent une expression de ce type.
La valeur booléenne stockée dans isFull devient vraie lorsqu’un conteneur atteint sa capacité.
Validation des entrées
La validation des entrées vérifie si une valeur saisie respecte les conditions autorisées par le programme avant de la classer ou de la traiter.
La validation des entrées rejette un score supérieur à 100 avant qu’un enchaînement de notes puisse le classer comme « A ».
Variable de boucle
Une variable de boucle contient un état variable qui sert à contrôler ou à décrire la répétition, comme le compteur actuel ou la valeur candidate.
La variable de boucle avance de trois en trois, donc une vérification de borne peut arrêter la boucle même si une valeur cible exacte est sautée.

Y

yield
L’instruction yield fournit une valeur depuis un cas constitué d’un bloc d’une expression switch, après les calculs qui la précèdent dans ce bloc.
Une instruction yield fournit 29 après qu’un cas de février a déterminé que l’année est bissextile.

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer