Archives Wild Code School
Java

Java - Control Flow

Quête 15 sur 43

Introduction

Un programme en Java est constitué d'une suite d'instructions exécutées les unes après les autres. Cela ressemble beaucoup à une recette de cuisine où tu dois suivre chaque étape individuelle pour arriver à un résultat.

Les instructions simples travaillent sur des variables et se contentent soit de déplacer des données, soit d'effectuer des calculs mathématiques dont le résultat est stocké dans une variable.

Souviens-toi que tu combines des instructions simples avec des accolades pour construire des groupes d'instructions. Un tel bloc de code se comporte comme une seule instruction.

...

Avec les instructions de control flow (flux de contrôle : l'ordre dans lequel le programme exécute ses instructions), tu peux modifier l'ordre d'exécution. Cette quête présente les possibilités que Java offre pour contrôler le flux du programme.

🤓 À la fin de cette quête, tu sauras :

✅ Comment exclure une suite d'instructions de l'exécution ✅ Comment répéter une suite d'instructions


Tu peux modifier le control flow (flux de contrôle) d'un programme de deux manières

  • exclure une instruction, ou
  • répéter une instruction

La décision

Une décision simple te permet de contrôler si une instruction est exécutée ou non. Le mot réservé utilisé pour contrôler la décision en Java est l'instruction if (si). Pour présenter l'instruction if, nous allons regarder un extrait de code Java afin d'avoir un peu de contexte.

Dans l'extrait de code Java suivant, la première ligne déclare une variable et lui affecte une valeur initiale.

La troisième ligne est la décision. Le mot réservé if est suivi d'une expression qui doit s'évaluer à une valeur logique vraie pour que l'instruction suivante s'exécute.

Les lignes 4 et 6 marquent une instruction qui ne sera exécutée que lorsque la condition du if s'évalue à vrai. Garde à l'esprit que les accolades servent à combiner un nombre quelconque d'instructions. Ce bloc de code combiné fonctionne comme une seule instruction.

Si tu regardes le code Java suivant, la suite d'instructions entre accolades n'est exécutée que lorsque la condition de la ligne 3 est vraie. Autrement dit, l'age (âge) doit être de 18 ans ou plus.

java
var age = 21; // 1. simple assignment

if(age > 17) // 2. decision to execute code
{
    System.out.println("I am of age"); // 3. conditionally executed code
}

Tu peux essayer ça et affecter d'autres valeurs à la variable age, puis lancer l'extrait de code pour voir dans quels cas il affiche un message.

Parfois nous avons besoin d'exécuter une suite d'instructions et nous voulons que l'expression soit inversée.

java
var age = 17; // 1. simple assignment

if(age <= 17) // 2. decision to execute code
{
    System.out.println("I am a kid"; // 3. conditionally executed code
}

Parfois nous voulons que des instructions différentes soient exécutées selon que l'expression s'évalue à vrai ou à faux. Cela arrive assez souvent, donc l'instruction if dispose d'un moyen intégré pour le faire

java
var age = 17; // 1. simple assignment

if(age > 17) // 2. decision to execute code
{
    System.out.println("I am of age"; // 3. conditionally executed code
}
else 
{
    System.out.println("I am a kid"; // 4. conditionally executed code
}

Tu n'es pas obligé de préciser la clause else (sinon). Elle est toujours optionnelle.

Tu peux aussi utiliser l'instruction switch (aiguillage : choisit un bloc à exécuter selon la valeur d'une variable) pour une décision. Cette instruction fournit

La boucle

Au lieu d'exclure, tu peux vouloir répéter une suite d'instructions.

java
var i = 1; // 1. simple assignment

while(i<6) // 2. decision to execute code
{
    System.out.println("I am " + i + " years old"); // 3. conditionally executed code
}

Tu pourrais en fait répéter l'instruction et modifier le texte de la sortie à chaque ligne.

java
System.out.println("I am 1 years old");
System.out.println("I am 2 years old");
System.out.println("I am 3 years old");
System.out.println("I am 4 years old");
System.out.println("I am 5 years old");

Il devrait cependant être clair que cela ne marchera jamais que lorsque l'instruction à répéter est petite. Si tu veux quelque chose qui fonctionne toujours, peu importe le nombre de répétitions, utilise une loop (boucle).

Garde à l'esprit qu'il est possible d'exécuter une suite d'instructions une seule fois, et parfois tu n'exécuteras même pas du tout la suite d'instructions.

Attention

Il y a un problème assez important avec les boucles : tu dois t'assurer qu'une boucle se termine et ne continuera pas à exécuter une suite d'instructions encore et encore indéfiniment.

La question « Une boucle va-t-elle se terminer ? » mène à l'un des plus grands problèmes en informatique, le Halting problem (problème de l'arrêt : déterminer si un programme finira par s'arrêter). La réponse est non : il n'est pas possible, en général, de dire si un programme va se terminer. La théorie autour de ce sujet est très intéressante mais aussi très mathématique et hors du périmètre de cette quête.

Référence

Pour les commandes de base, une bonne référence avec des exemples est disponible chez Oracle

🔬 Exercice

Ta mission pour cette quête est de :

  • Écrire un extrait de code qui utilise l'instruction if et exécute du code Java conditionnel.

  • Écrire un extrait de code avec la même condition mais qui n'exécute pas le code Java conditionnel.

Écris un extrait de code qui exécute du code Java

a) exactement une fois b) exactement quatre fois c) jamais

Écris un extrait de code qui ne se termine jamais

Pour arrêter l'exécution d'un programme depuis la console, utilise Ctrl+c. Le programme devrait maintenant se terminer.


☝️ Résumé

Les décisions et les boucles sont les briques fondamentales pour contrôler le flux d'un programme informatique. Avec if et switch, Java propose deux façons de contrôler le flux à partir d'une décision, tandis que while, do {} while et for te permettent de boucler et donc de répéter l'exécution d'instructions. Une fois que tu as appris ces concepts, tu es prêt à programmer. Avec les logiciels, c'est souvent juste le grand nombre de décisions et de boucles qui rend la programmation plutôt difficile.


💪 Défi

Écris un programme qui calcule le produit de deux variables, où les variables varient de 1 à 10. C'est-à-dire le produit de 11, 12, 13, ..., 110 et 21, 22, 23, ..., 220, et ainsi de suite.

Points à surveiller :

  • Trop de décisions ou de boucles, c'est difficile à comprendre. En règle générale, essaie de garder un faible nombre de décisions ou de boucles imbriquées. Tu ne devrais pas dépasser un niveau de trois boucles, par exemple.

🧐 Critères d'acceptation

  • ✔️ Tu sais ce que fait la décision
  • ✔️ Tu sais ce que fait la boucle et ce qui pourrait arriver dans le pire des cas avec les boucles.
  • ✔️ Ton code est disponible sur Github/Gitlab

Introduction

A program in Java consists of a sequence of statements executed one after the other. This pretty much reflects a recipe where you have to follow the individual steps to achieve some result.

Simple statements work on variables and either simply move around some data or perform mathematical computations with the result saved in a variable.

Remember that you combine simple statements with curly brackets to build groups of statements. Such a code block acts as a single statement.

...

With control flow statements, you can change the order of execution. This Quest introduces the possibilities that Java offers to control the flow of the program.

🤓 By the end of this quest, you will:

✅ Know how to exclude a sequence of statements from execution ✅ Know how to repeat a sequence of statements


You can change the control flow in a program in two ways

  • exclude a statement or
  • repeat a statement

Decision

A simple decision will let you control if a statement is executed at all. The reserved word used to control the decision in Java is the if statement. To introduce the if statement, we will look at a Java Code snippet to have some context.

In the following Java code snippet, the first line declares are variable and assigns an initial value to it.

The third line is the decision. The reserved word if is followed by an expression that has to evaluate to a logical true value to make the following statement execute.

Line 4 and 6 mark a statement that will only be executed when the condition in the if statement is evaluated to true. Keep in mind that the curly brackets are used to combine any number of statements. This combined code block works like a single statement.

If you look at the following Java code, the sequence of statements in the curly brackets is only executed when the condition in line 3 is true. That is, the age has to be 18 or older.

java
var age = 21; // 1. simple assignment

if(age > 17) // 2. decision to execute code
{
    System.out.println("I am of age"); // 3. conditionally executed code
}

You can try this out and assign other values to the age variable and run the code snippet to see when it will print out a message.

Sometimes we need to execute a sequence of statements and want the expression to be inverted.

java
var age = 17; // 1. simple assignment

if(age <= 17) // 2. decision to execute code
{
    System.out.println("I am a kid"; // 3. conditionally executed code
}

Sometimes we want different statements to be executed depending on the expression evaluating to true or false. This happens rather often so the if statement has a build in way to

java
var age = 17; // 1. simple assignment

if(age > 17) // 2. decision to execute code
{
    System.out.println("I am of age"; // 3. conditionally executed code
}
else 
{
    System.out.println("I am a kid"; // 4. conditionally executed code
}

You do not need to specify the else clause. It is always optional.

You can also use the switch statement for a decision. This statement provides

Loop

Instead of exclusion, you may want to repeat a sequence of statements.

java
var i = 1; // 1. simple assignment

while(i<6) // 2. decision to execute code
{
    System.out.println("I am " + i + " years old"); // 3. conditionally executed code
}

You could actually repeat the statement and modify the text for the output in each line.

java
System.out.println("I am 1 years old");
System.out.println("I am 2 years old");
System.out.println("I am 3 years old");
System.out.println("I am 4 years old");
System.out.println("I am 5 years old");

It should be clear though, that this will only ever work when the statement you want to repeat is small. If you want something that always works, no matter how often, use a loop.

Keep in mind that it is possible to execute a sequence of statements only once and sometimes you will not even execute the sequence of statements at all.

Attention

There is one rather big problem with loops: You have to make sure that a loop terminates and will not keep executing a sequence ever and ever again.

The question: "Will a loop terminate?" leads to one of the biggest problems in computing, the Halting problem. The answer is no - it is not possible, in general, to tell if a program will terminate. The theory around this topic is very interesting but also very mathematical and out of scope for this quest.

Reference

For the basic commands, a good reference with examples is available from Oracle

🔬 Exercise

Your task for this quest is to:

  • Write a code snippet that uses the if statement and executes some conditional Java code.

  • Write a code snippet with the same condition and does not execute some conditional Java code.

Write a code snippet that executes some Java code

a) exactly once b) exactly four times c) never

Write a code snippet that never terminates

To stop the execution of a program from the console, use Ctrl+c. The program should terminate now.


☝️ Summary

Decisions and loops are the fundamental building block to control the flow of a computer program. With if and switch, Java supports two ways to control flow based on a decision, while while, do {} while and for allow you to loop and thus repeat execution of statements. Once you learned the concepts you are ready to program. With software, it is often just the large number of decisions and loops that makes programming somehow difficult.


💪Challenge

Write a program that computes the product of two variables, where the variables vary from 1 to 10. That is, the product of 11, 12, 13, ..., 110 and 21, 22, 23, ..., 220, and so on.

Things to look for:

  • Too many decisions or loops are hard to understand. As a rule of thumb, try to keep the number of nested decisions or loops low. You should not exceed a level of three loops, for example.

🧐 Acceptance criteria

  • ✔️ You know what the decision does
  • ✔️ You know what the loop does and what could happen in the worst case with loops.
  • ✔️ Your code is available on Github/Gitlab