• 15 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Mis à jour le 28/01/2019

Ajoutez de la logique à votre programme avec des conditions

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Il est temps de voir ensemble comment contrôler ce que saisit notre utilisateur. On va mettre en place une vérification pour être certain que l'utilisateur a bien saisi une valeur correspondant à un menu existant.

Si vous n'avez jamais entendu parler de conditions, je vous conseille de prendre le temps de regarder la partie consacrée aux conditions du cours d'algorithmique.

Pour récupérer une version propre du projet prêt pour ce chapitre vous pouvez importer le projet git suivant : MyMenu - Step 2

Les conditions

La condition est un des outils basiques de tout langage informatique. Il s'agit dans votre code de mettre en place une ligne qui va dire "si telle condition est vraie alors effectue telle action".

Une condition s'écrit de la forme suivante :

if (condition) {
	code à effectuer
}
  • On commence par le mot-clé if (pour si, en anglais),

  • puis entre parenthèses (), on met la condition à vérifier,

  • enfin entre accolades{}, on met le code à effectuer, si la condition est validée.

Pour écrire une condition, on va utiliser les opérateurs mathématiques basiques, à savoir "est supérieur", "est égal", "est inférieur ou égal", etc.

Voici la liste des principaux opérateurs et leur représentation en code :

est égal

==

n'est pas égal

!=

est supérieur

>

est inférieur

<

est supérieur ou égal

>=

est inférieur ou égal

<=

On a la possibilité de mettre plusieurs conditions à l'aide de 2 autres opérateurs et des parenthèses (comme pour les priorités de calculs mathématiques) :

ET

&&

OU

||

Priorité

( condition )

 On va tester tout ça dans JShell. Ouvrez JShell, puis créez 2 variables :

  • la première de type  int  nommée  nbEntier  et valant 21 ;

  • la seconde de type  double  nommée  nbDouble  et valant 17.5.

jshell> int nbEntier = 21;
nbEntier ==> 21

jshell> double nbDouble = 17.5;
nbDouble ==> 17.5

On va maintenant écrire notre première condition pour vérifier si  nbEntier est égal à 21, si c'est le cas, on affichera : "nbEntier vaut 21".

jshell> if (nbEntier == 21) {
   ...>

3 points suivis du signe supérieur s'affichent ...>. Cela signifie que votre instruction n'est pas encore terminée. À ce point, Java ne sait pas encore quoi faire avec ce code. C'est normal, il manque la fin de notre condition (le code à effectuer et l'accolade fermante }).

jshell> if (nbEntier == 21) {
   ...> System.out.println("nbEntier vaut 21");
   ...> }
nbEntier vaut 21

Le code entre accolades a bien été effectué.

On vérifie maintenant que  nbDouble est bien strictement supérieur à 19.4.

jshell> if (nbDouble > 19.4) {
   ...> System.out.println("nbDouble est strictement supérieur à 19.4");
   ...> }

Rien ne s'affiche ? Normal  nbDouble  vaut 17.5, et n'est donc pas supérieur à 19.4.

Dernier exemple :

jshell> if ((nbDouble > 16.2 && nbDouble < 17.3) || nbEntier == 21) {
   ...> System.out.println("La condition est validée");
   ...> }

Alors que va-t-il se passer avec cette condition qui n'est pas évidente à comprendre ?

La condition est validée et va bien s'afficher. On dit ici à Java de rentrer dans la condition :

  • Si  nbDouble  est compris entre 16.2 ET 17.3 non inclu

  • OU alors si  nbEntier  vaut 21.

La première partie n'est pas validée mais la seconde l'est. Cela fonctionne grâce à l'opérateur ||.

Et les booleans dans tout ça ?

Quand vous définissez une condition, par exemple  nbEntier == 21 , sans que vous le sachiez Java va créer une variable de type boolean, qui va valoir  true  ou  false  selon si la condition est respectée ou non.

Essayez dans JShell pour le voir par vous même.

jshell> nbEntier == 21;
$2 ==> true

jshell> nbEntier == 22;
$3 ==> false

Java a bien créé 2 variables pour ces 2 conditions. Quand vous utilisez le mot clé  if  , Java vérifie que la condition entre parenthèses vaut  true  ou vaut  false . Si elle est  true , on rentre dans la condition.

Vous pouvez donc tout à fait écrire :

jshell> if (true) {
   ...> System.out.println("True !");
   ...> }
True !

Ça n'a pas trop de sens comme condition, mais ça marche !

Pourquoi je vous explique cela ? Et bien souvenez-vous du chapitre précédent dans lequel nous avions effectué  contains  sur une variable de type  String . Cela avait créé une variable de typeboolean :

  • valant  true  si la variable contenait le mot recherché ;

  • valant  false  , si ce n'était pas le cas.

Beaucoup d'outils en Java fonctionnent avec des  boolean  pour faciliter l'écriture de conditions. Vous pouvez donc sans problème faire :

jshell> String str = "Hello World !";
str ==> "Hello World !"

jshell> if (str.contains("World")) {
   ...> System.out.println("str contient World");
   ...> }
str contient World

Sinon et Sinon Si

Nous avons vu la possibilité d'effectuer du code si une condition est respectée. Nous avons aussi la possibilité, avec le mot-clé  else , d'exécuter du code si elle ne l'est pas.

Voilà comment cela fonctionne :

jshell> if (str.contains("World")) {
   ...> System.out.println("str contient World");
   ...> } else {
   ...> System.out.println("str ne contient pas World");
   ...> }
str contient World

Si je change le contenu de str, le résultat ne sera pas forcément le même :

jshell> str = "Bonjour le Monde !";
str ==> "Bonjour le Monde !"

jshell> if (str.contains("World")) {
   ...> System.out.println("str contient World");
   ...> } else {
   ...> System.out.println("str ne contient pas World");
   ...> }
str ne contient pas World

Et oui, cette fois notre variable String  ne contient plus le mot "World".

Enfin il existe une dernière possibilité permettant de prévoir plusieurs cas. Cela s'effectue avec le mot-clé  else if  comme ceci :

jshell> if (str.contains("World")) {
   ...> System.out.println("str est en anglais");
   ...> } else if (str.contains("Monde")) {
   ...> System.out.println("str est en français");
   ...> } else if (str.contains("Mundo")) {
   ...> System.out.println("str est espagnol");
   ...> } else {
   ...> System.out.println("str n'est pas dans une langue connue par le logiciel");
   ...> }

str est en français

Des conditions dans notre menu

Revenons à notre menu dans IntelliJ ! Avec les outils  if ,  else if  et  else , on peut exprimer toutes les conditions possibles d'un programme. Nous allons les utiliser pour être certain que notre utilisateur a bien choisi le menu poulet, le menu boeuf ou le menu végétarien.

En tant que chef de projet, j'ai créé de nouveaux tests pour la suite. Il faut remplacer les 2 tests de la class OrderTest par ceux-ci :

@Test
public void Given_Chicken_When_DisplayMenuSelected_Then_DisplayChickenSentence() {
    order.displaySelectedMenu(1);
    assertEquals("Vous avez choisi comme menu : poulet\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_Beef_When_DisplayMenuSelected_Then_DisplayBeefSentence() {
    order.displaySelectedMenu(2);
    assertEquals("Vous avez choisi comme menu : boeuf\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_Vegetarian_When_DisplayMenuSelected_Then_DisplayVegetarianSentence() {
    order.displaySelectedMenu(3);
    assertEquals("Vous avez choisi comme menu : végétarien\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_TooBigValue_When_DisplayMenuSelected_Then_DisplayErrorSentence() {
    order.displaySelectedMenu(15);
    assertEquals("Vous n'avez pas choisi de menu parmi les choix proposés\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_NegativeValue_When_DisplayMenuSelected_Then_DisplayErrorSentence() {
    order.displaySelectedMenu(-6);
    assertEquals("Vous n'avez pas choisi de menu parmi les choix proposés\n", outContent.toString().replace("\r\n", "\n"));
}

Pourquoi avoir supprimé le test  Given_Nothing_When_DisplayMenuSelection_Then_ShouldDisplayText  ?

La méthode  displayAvailableMenu ne fait qu'afficher du texte et n'a aucune logique. Dans ce test, nous testions que du texte avait bien été affiché. Ce n'est pas très utile

Il y a beaucoup de situations dans lesquelles on est amené à se dire : "hum... je teste ça ou non ?"

Il faut savoir faire un compromis entre temps passé sur les tests et temps passé sur les fonctionnalités. C'est avec l'expérience que vous saurez ce qui est vraiment judicieux de tester.

 Si vous lancez les tests, ceux-ci ne fonctionnent plus. Il va falloir modifier la méthode displaySelectedMenu dans la class Order pour que celle-ci respecte les règles de notre cahier des charges. À savoir, en fonction du choix de l'utilisateur nous afficherons :

  • Vous avez choisi comme menu : poulet

  • Vous avez choisi comme menu : boeuf

  • Vous avez choisi comme menu : végétarien

  • Vous n'avez pas choisi un des choix proposés comme menu

Essayez de trouver par vous-même la solution.

Voici la correction si besoin. Vos tests doivent s'effectuer sans erreur et vous devez pouvoir exécuter votre code !

package com.ocr.anthony;

public class Order {
    /**
     * Display all available menus in the restaurant.
     */
    public void displayAvailableMenu() {
        System.out.println("Choix menu");
        System.out.println("1 - poulet");
        System.out.println("2 - boeuf");
        System.out.println("3 - végétarien");
        System.out.println("Que souhaitez-vous comme menu ?");
    }
    /**
     * Display a selected menu.
     * @param nbMenu The selected menu.
     */
    public void displaySelectedMenu(int nbMenu) {
        if (nbMenu == 1) {
            System.out.println("Vous avez choisi comme menu : poulet");
        } else if (nbMenu == 2) {
            System.out.println("Vous avez choisi comme menu : boeuf");
        } else if (nbMenu == 3) {
            System.out.println("Vous avez choisi comme menu : végétarien");
        } else {
            System.out.println("Vous n'avez pas choisi de menu parmi les choix proposés");
        }
    }
}

Switch

Non, je ne vais pas vous parler de consoles de jeux vidéo, mais d'un autre outil permettant de mettre en place des conditions : le switch !

Cet outil n'apporte aucune fonctionnalité en plus que le triplet  if ,  else if ,  else . Il facilite simplement la lecture quand nous avons beaucoup de else if .

Il s'utilise dans le cas où une variable peut prendre beaucoup de valeurs différentes et que nous souhaitons avoir un comportement pour chacune de ces valeurs.

Le  switch  s'utilise comme ceci :

switch (variable que l'on souhaite comparer) {
	case valeur n°1 :
		action à effectuer pour la valeur n°1;
		break;
	case valeur n°2 :
		action à effectuer pour la valeur n°2;
		break;
	default :
		action à effectuer pour tout autre valeur;
		break;
}
  1. On commence par le mot-clé  switch,

  2. puis entre parenthèses ()la variable dont on souhaite comparer les valeurs.

  3. Pour chaque valeur on commence par le mot-clé  case,

  4. puis la valeur voulue suivie de deux points :,

  5. l'action à effectuer pour la valeur voulue, 

  6. le mot-clé  break;  pour dire qu'il n'y a plus d'actions à effectuer pour cette valeur,

  7. enfin le mot-clé  default , pour les autres cas (c'est le else).

  8. De la même façon default est suivi du code à effectuer et du mot-clé  break;.

Essayez de transformer votre code pour utiliser un  switch .

Voici comment faire :

/**
 * Display a selected menu.
 * @param nbMenu The selected menu.
 */
public void displaySelectedMenu(int nbMenu) {
    switch (nbMenu) {
        case 1:
            System.out.println("Vous avez choisi comme menu : poulet");
            break;
        case 2:
            System.out.println("Vous avez choisi comme menu : boeuf");
            break;
        case 3:
            System.out.println("Vous avez choisi comme menu : végétarien");
            break;
        default:
            System.out.println("Vous n'avez pas choisi de menu parmi les choix proposés");
            break;
    }
}
Exemple de certificat de réussite
Exemple de certificat de réussite