jeudi 16 novembre 2017

Positif, Négatif, Nul : la structure conditionnelle un peu plus compliquée

Énoncé

Ecrire un algorithme qui lit un nombre entier et nous informe s'il est positif, négatif ou bien nul.

Cet exercice est parmi les premiers exercices que les enseignants donnent comme pratique à la structure conditionnelle Si...Sinon. Cela peut être déduit facilement parce que le programme (ou l'algorithme) va classifier le nombre; il va le mettre avec les nombres positifs, avec les nombres négatifs ou bien avec les nombres nuls. Pour pouvoir le classifier, il doit tester des conditions. Et lorsqu'on dit "test", on dit "conditionnel" (Si...Sinon).

Contrairement au problème de Pair/Impair, nus avons deux grandes différences :
  1. Il n'y a aucune confusion lors du choix de la définition pour les notions "nombre positif", "nombre négatif" et "nombre nul".
  2. Nous avons trois possibilités pas seulement deux, sachant qu'une structure "Si...Sinon" permet de choisir entre deux possibilités seulement.

Ainsi, il suffit de détailler ces deux points pour atteindre l'objectif de cet exercice sachant que l'étudiant à bien compris le cas le plus simple où nous avons deux possibilités seulement (Si...Sinon simple).

Premièrement les conditions à vérifier :
Pour qu'un nombre n soit dit "positif", il doit satisfaire la condition n > 0.
Pour qu'un nombre n soit dit "négatif", il doit satisfaire la condition n < 0.
Un nombre est nul s'il est ni positif, ni négatif.

Pour ce dernier point, il est préférable de définir l'une des conditions en fonction des autres, plus précisément, la négation des autres. Cela facilite l'utilisation de Si...Sinon qui exécute un bloc si la condition est vraie et l'autre bloc dans le cas contraire (si la négation de la condition est correcte).

Deuxièmement, la structure conditionnelle doit être définie. Si nous avons plus de deux cas alors il est certain que nous allons utiliser plusieurs Si...Sinon ou bien des Si...Sinon imbriqués (l'objectif pédagogique de cet exercice).

Un Si...Sinon imbriqué, c'est à dire un Si...Sinon à l'intérieur d'un autre Si...Sinon, permet de créer plus de deux branches que nous pouvons obtenir par un simple Si...Sinon. Cette structure est utilisée si nos condition ne présentent pas de chevauchement : il est impossible d'avoir deux conditions vérifiées au même temps. Dans le cas de notre exercice, ce principe est respecté parce qu'un nombre ne peut pas être, à titre d'exemple, positif et nul au même temps.

Regroupons tout cela dans le programme suivant :

En Pascal :

Program PositifNegatifNul;
Var
 n : Integer;
Begin
 WriteLn('Donnez le nombre à tester :');
 ReadLn(n);
 If (n > 0) Then 
  WriteLn('Positif') {Positif s'il est supérieur à 0}
 Else
  if (n < 0) Then
   WriteLn('Negatif') {Négatif s'il est inférieur à 0}
  Else
   WriteLn('Nul'); {Nul s'il est ni positif, ni négatif}
End.

En Java :

import java.util.Scanner;

public class Exemple {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  System.out.println("Donnez le nombre à tester :");
  int n = scanner.nextInt();
  if(n > 0)
   System.out.println("Positif"); // Positif s'il est supérieur à 0
  else
   if (n < 0)
    System.out.println("Negatif"); // Négatif s'il est infénrieur à 0
   else
    System.out.println("Nul"); // Nul s'il est ni positif, ni négatif
 }
}



Une mauvaise écriture

Il est aussi possible d'écrire le programme autrement. Je peux voir les trois conditions comme des conditions indépendante et donner à chacune d'elle une structure Si...FSi simple. Cela donnera un programme te que le suivant :

En Pascal :

Program PositifNegatifNul;
Var
 n : Integer;
Begin
 WriteLn('Donnez le nombre à tester :');
 ReadLn(n);
 If (n > 0) Then 
  WriteLn('Positif');

 If (n < 0) Then 
  WriteLn('Négatif');

 If (n = 0) Then 
  WriteLn('Nul'); 
End.

En Java :


import java.util.Scanner;

public class Exemple {
 public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  System.out.println("Donnez le nombre à tester :");
  int n = scanner.nextInt();
  if(n ... 0)
   System.out.println("Positif"); 
  
  if(n ... 0)
   System.out.println("Négatif"); 
  
  if(n == 0)
   System.out.println("Nul"); 
 }
}

Malgré que ce code fonctionne parfaitement, mais, il est considéré dans le contexte de cet exercice comme faux. N'oublions pas que l'objectif de cet exercice de pratiquer les Si...Sinon; chose qui n'est pas atteinte dans ce dernier code. En effet, quelque soit la valeur de n, le programme va le tester pour les trois cas. C'est à dire, si le nombre n est positif, le programme affiche le message "Positif", mais, il fera comme même les deux autres testes (négatif et nul).