On appelle traitement conditionnel un portion de code qui n’est pas exécutée systématiquement, c’est à dire des instructions dont l’exécution est conditionnée par le succès d’un test.
En algorithmique un traitement conditionnel se rédige de la sorte :
Si <condition> alors <instructions> finSi
Si la condition est vérifiée, alors les instructions sont exécutées, sinon, elles ne sont pas exécutées. L’exécution de l’algorithme se poursuit alors en ignorant les instructions se trouvant entre le alors et le finSi. Un traitement conditionnel se code de la sorte :
if (<condition>) { <instructions> } |
Notez bien qu’il n’y a pas de point-virgule après la parenthèse du
if
.
La formulation d’une condition se fait souvent à l’aide des opérateurs de comparaison. Les opérateurs de comparaison disponibles sont :
==
: égalité
!=
: non-égalité
<
,
<=
: inférieur à, respectivement strict et large
>
,
>=
: supérieur à, respectivement strict et large
Par exemple, la condition
a
==
b
est vérifiée si et seulement
si
a
et
b
ont la même valeur au moment où le test
est évalué. Par exemple,
Console.WriteLine("Saisissez une valeur"); int i = int.Parse(Console.ReadLine()); if (i == 0) { Console.WriteLine("Vous avez saisi une valeur nulle."); } Console.WriteLine("Au revoir !"); |
Si au moment où le test
i
== 0
est évalué, la valeur de
i
est bien
0
, alors le test sera vérifié et
l’instruction
Console
.
WriteLine
(
"Vous avez saisi une valeur nulle."
);
sera
bien exécutée. Si le test n’est pas vérifié, les instructions du bloc
sous la portée du
if
sont ignorées.
Il existe une forme étendue de traitement conditionnel, on la note en algorithmique de la façon suivante :
Si <condition> alors <instructions> sinon <autresinstructions> finSi
Les instructions délimitées par alors et sinon sont exécutées si le test est vérifié, et les instructions délimitées par sinon et finSi sont exécutées si le test n’est pas vérifié. On traduit le traitement conditionnel étendu de la sorte :
if (<condition>) { <instructions1> } else { <instructions2> } |
Par exemple,
Console.WriteLine("Saisissez une valeur"); int i = int.Parse(Console.ReadLine()); if (i == 0) { Console.WriteLine("Vous avez saisi une valeur nulle."); } else { Console.WriteLine("La valeur que vous avez saisi, " + i + ", n'est pas nulle."); } |
Notez la présence de l’opérateur de comparaison
==
. Si vous utilisez
=
pour comparer deux
valeurs, ça ne compilera pas !
On formule des conditions davantage élaborées en utilisant des
connecteurs et et ou. La condition A et B
est vérifiée si les deux conditions A et B sont
vérifiées simultanément. La condition A ou B est vérifiée si
au moins une des deux conditions A et B est
vérifiée. Le et s’écrit
&&
et le ou
s’écrit
||
. Par exemple, voici un programme C qui nous donne
le signe de i × j sans les multiplier.
Console.WriteLine("Saisissez deux valeurs numériques : "); float i = float.Parse(Console.ReadLine()); float j = float.Parse(Console.ReadLine()); Console.Write("Le produit de " + i + " par " + j + " est "); if ((i >= 0 && j >= 0) || (i < 0 && j < 0)) { Console.WriteLine("positif."); } else { Console.WriteLine("négatif."); } |
Lorsqu’une seule instruction d’un bloc
if
doit être exécutée,
les accolades ne sont plus nécessaires. Il est possible par exemple de
reformuler le programme précédent de la sorte :
Console.WriteLine("Saisissez deux valeurs numériques : "); float i = float.Parse(Console.ReadLine()); float j = float.Parse(Console.ReadLine()); Console.Write("Le produit de " + i + " par " + j + " est "); if ((i >= 0 && j >= 0) || (i < 0 && j < 0)) Console.WriteLine("positif."); else Console.WriteLine("négatif."); |
Un bloc est un ensemble d’instructions délimité par des
accolades. Par exemple le bloc
public
static
void
Main
(
string
[]
args
)
, ou encore le bloc
if
. Vous aurez remarqué qu’il est possible d’imbriquer les
blocs et qu’il convient d’ajouter un niveau d’indentation
supplémentaire à chaque fois qu’un nouveau bloc est ouvert.
Une des conséquences de la structure de blocs du langage c# s’observe dans l’exemple suivant :
int i = 4; if (i == 4) { int j = i + 1; } Console.WriteLine("j = " + j + "."); |
Vous aurez remarqué la variable j est déclarée à l’intérieur
du bloc
if
, et utilisé à l’extérieur de ce bloc. Ce code ne
compilera pas parce que une variable n’est utilisable qu’à
l’intérieur du bloc où elle a été déclarée. La portée (ou
encore la visibilité) de la variable j se limite donc à ce
bloc
if
.
En plaçant l’instruction suivante à droite d’une affectation,
<variable> = (<condition>) ? <valeur> : <autrevaleur> ; |
on place
valeur
dans
variable
si
condition
est vérifié,
autrevaleur
sinon. Par exemple,
max = (i>j) ? i : j ; |
place la plus grande des deux valeurs
i
et
j
dans
max
. Plus généralement on peut utiliser le si ternaire dans
n’importe quel calcul, par exemple
int i = 4; int j = 2; int k = 7; int l; Console.WriteLine((i> (l = (j>k) ? j : k)) ? i : l); |
j
= (
j
>
k
) ?
j
:
k
)
place dans
l
la plus grande des
valeurs
j
et
k
, donc
(
i
> (
l
= (
j
>
k
) ?
j
:
k
)) ?
i
:
l
est la plus grande des
valeurs
i
,
j
et
k
. La plus grande
de ces trois valeurs est donc affichée par cette instruction.
Le
switch
est une instruction permettant sélectionner un cas
selon la valeur d’une variable. La syntaxe est la suivante :
switch(<nomvariable>) { case <valeur_1> : <instructions_1> ; break ; case <valeur_2> : <instructions_2> ; break ; /* ... */ case <valeur_n> : <instructions_n> ; break ; default : <instructionspardefaut> ; break; } |
Si nomvariable contient la valeur valeuri, alors les
instructionsi sont exécutées. Si aucune des valeurs énumérées ne
correspond à celle de nomvariable, ce sont les
instructionspardefaut qui sont exécutées. Les
break
servent à fermer chaque cas, y compris le dernier ! Si par exemple,
nous voulons afficher le nom d’un mois en fonction de son numéro, on
écrit :
switch(numeroMois) { case 1 : Console.Write("janvier") ; break ; case 2 : Console.Write("fevrier") ; break ; case 3 : Console.Write("mars") ; break ; case 4 : Console.Write("avril") ; break ; case 5 : Console.Write("mai") ; break ; case 6 : Console.Write("juin") ; break ; case 7 : Console.Write("juillet") ; break ; case 8 : Console.Write("aout") ; break ; case 9 : Console.Write("septembre") ; break ; case 10 : Console.Write("octobre") ; break ; case 11 : Console.Write("novembre") ; break ; case 12 : Console.Write("decembre") ; break ; default : Console.Write("Je connais pas ce mois...");break; } |
Une variable booléenne ne peut prendre que deux valeurs : vrai et
faux. Le type booléen en c# est
bool
et une variable de
ce type peut prendre soit la valeur
true
, soit la
valeur
false
.
if
Lorsqu’une condition est évaluée, par exemple lors d’un test, cette condition prend à ce moment la valeur vrai si le test est vérifié, faux dans le cas contraire. Il est donc possible de placer une variable booléenne dans un if. Observons le test suivant :
Console.WriteLine("Saisissez un booléen : "); bool b = bool.Parse(Console.ReadLine()); if (b) Console.WriteLine("b is true."); else Console.WriteLine("b is false."); |
Si b contient la valeur
true
, alors le test est réussi,
sinon le
else
est exécuté. On retiendra donc qu’il est
possible de placer dans un
if
toute expression pouvant
prendre les valeurs
true
ou
false
.
Un test peut être effectué en dehors d’un
if
, par exemple
de la façon suivante :
bool x = (3>2); |
On remarque que
(3>2)
est une condition. Pour décider quelle
valeur doit être affectée à
x
, cette condition est
évaluée. Comme dans l’exemple ci-dessus la condition est vérifiée,
alors elle prend la valeur
true
, et cette valeur est affectée à
x
.
Les connecteurs
||
et
&&
peuvent s’appliquer à des
valeurs (ou variables) booléennes. Observons l’exemple suivant :
bool x = (true && false) || (true); |
Il s’agit de l’affectation à
x
de l’évaluation de la
condition
(
true
&&
false
) || (
true
)
. Comme
(
true
&&
false
)
a pour
valeur
false
, la condition
false
||
true
est ensuite évaluée et prend la
valeur
true
. Donc la valeur
true
est affectée à
x
.
Parmi les connecteurs logiques se trouve
!
, dit opérateur de
négation. La négation d’une expression est vraie si l’expression est
fausse, fausse si l’expression est vraie. Par exemple,
bool x = !(3==2); |
Comme
3 == 2
est faux, alors sa négation
!(3 == 2)
est vraie. Donc la valeur
true
est affectée à
x
.
Complétons notre tableau des priorités en y adjoignant les connecteurs logiques et les opérateurs de comparaison :
noms | opérateurs |
opérateurs unaires |
cast ,
- ,
~ ,
! ,
++ ,
-- |
produit |
* ,
/ ,
% |
somme |
+ ,
- |
décalage binaire |
>> ,
<< |
comparaison |
> ,
< ,
>= ,
<= |
égalité |
== ,
!= |
ET binaire |
& |
OU Exlusif binaire |
^ |
OU binaire |
| |
connecteurs logiques |
&& ,
|| |
if ternaire |
()?: |
affectations |
= ,
+= ,
-= , … |