Les conditions
Description du chapitre et des ses objectifs :
Pour l'instant nos programmes ne font que executer une série bien définie d'instructions, mais cela va bientôt changer. Vous allez dès à présent apprendre à utiliser les
conditions afin de n'effectuer que certaines instructions en fonction du résultat des précédentes.
Vous allez vous initier rapidement à l'
algèbre de Boole et découvrir tous ses secrets. Vos programmes vont devenir de plus en plus interactifs grace à cela!
Accéder directement à une des parties du cours :
Et si...
Vous vous demandez certainement ce qu'est une condition? Et bien c'est exactement la même chose qu'en français.
Citation :
Si j'ai 1 pomme, je suis heureux.
Où est la condition?
Si j'ai 1 pomme bravo. Maintenant on regarde ça en C, et comme le C c'est facile (

) , "si" s'écrit
if (pour les anglophobes
if signifie si en anglais).
Regardons le code type:
if ( /* condition */)
{
// faire des choses
}
Question : if c'est une fonction?
Que neni! Comme je l'ai dit c'est une condition, celle-ci s'inclut dans un main. Comme vous pouvez le remarquer, ce n'est pas une instruction, donc on a pas de '
;' à la fin. Cependant, on englobe la condition dans des parenthèses et le bloc d'instructions qui suit (délimité par des "{ }" s'execute si la condition est vraie.
Question : Qu'est-ce qu'une condition vraie?
Pour répondre à cela, voyons tout d'abord comment
évaluer une expression.
Tout d'abord le
comparateur d'égalitée qui est noté "==".
Attention : "==" est TOTALEMENT différent de l'opérateur d'affectation "=", "==" est un test d'égalitée.
Un petit exemple pour la route:
if( nombre_pommes == 1)
{
etre_heureux();
}
Cela se lit: Si j'ai une pomme, j'execute
etre_heureux. (oui mes exemples sont parfois un peu nuls, mais bon...)
Donc, si le résultat de
(nombre_pommes == 1) est
vrai, je vais executer le bloc d'instruction.
Dans le cas où on aurait: "
int nombre_pommes = 1;"
"
nombre_pommes == 1" retournerait
vrai.
Alors que avec: "
int nombre_pommes = 45;"
"
nombre_pommes == 1" retournerait
faux.
Maintenant le
comparateur de supériorité strict qui se note ">".
Si par exemple je souhaite transcrire cette phrase:
Citation : Si j'ai plus de 3 pommes, je peux faire un gâteau.
Cela se traduis en C par:
if( nombre_pommes > 3)
{
faire_gateau();
}
Donc si nombre_pommes est égal à 7484312, je peux faire un gâteau.
Et si j'ai 3 pommes, je ne peux pas faire de gâteau! En effet, c'est une comparaison stricte, il faut qu'il ai
plus que 3 mais pas au moins 3.
Voyons donc sa déclinaison
comparateur de supériorit qui se note ">=".
Maintenant si je souahite transcrire la phrase:
Citation : Si j'ai au moins 3 pommes, je peux faire un gâteau.
Qui se traduis en C par:
if( nombre_pommes >= 3)
{
faire_gateau();
}
Donc la, si nombre_pommes est égal à 3, on execute le bloc d'instruction car il y a
au moins 3 pommes.
Vous voulez sans doute connaître les
comparateurs d'infériorit maintenant? Très bien, l'inférioritée stricte se note "<" et l'autre "<=".
Question : Et si par exemple je veux qu'une valeur prenne toutes les valeurs possibles sauf une? Le contraire de l'égalité quoi...
Il existe le comparateur "
différent de" qui se note "!=" et qui s'utilise de la façon suivante:
if( quotient != 0 ) // on ne peut pas diviser par 0
{
resultat = nombre / quotient;
}
Maintenant si vous souhaitez avoir le contraire du résultat attendu, il existe un opérateur spécifique pour la
négation c'est "!" qui se met devant toute condition:
if( !(quotient == 0) )
{
resultat = nombre / quotient;
}
Ici si quotient est égal à 0 "quotient ==0" est vrai. Or "!(vrai)" est faux (c'est la négation de vrai)
if( !(nombre_pommes < 3) )
{
faire_gateau();
}
Ici, on peut traduire l'expression par: s'il n'y a pas moins de 3 pommes, je peux faire un gâteau. Ce qui revient à faire:
if(nombre_pommes >=3).
Information : Note importante: on considère que une condition fausse est égale à 0, et est vrai dans tous les autres cas!
On peut donc voir apparaître ce genre de choses:
if(quotient) //vrai tout le temps que quotient différent de 0
{
printf("Division possible\n");
}
Et on peut aussi nier cette condition:
if(!quotient) //vrai lorsque quotient == 0
{
printf("Quotient nul, division impossible\n");
}
En effet, si
quotient est égal à 0, quotient en lui même est faux. Cependant il y a le symbole "!" qui renvois la négation de l'expression, !
quotient est donc vrai lorsque
quotient est faux, soit
quotient == 0.
J'espère que vous saurez utiliser tous ces tests de condition sans trop d'encombres car c'est d'une importance capitale que de savoir manier les conditions. N'oubliez pas de vous reporter à la section d'exerices correspondants pour vous entraîner.
Et sinon?
Si vous avez essayé de faire plusieurs conditions de suite, vous trouvez certainement tout cela fastidieux, par exemple:
if( nombre_pommes >= 3 )
{
faire_gateau();
}
if( nombre_pommes < 3 )
{
acheter_pommes();
}
C'est pour cela que pour un cas contraire on a inventé le
else!
Si j'ai au moins 3 pommes, je fais un gateau; sinon je vais en acheter.
if( nombre_pommes >= 3 )
{
faire_gateau();
}
else
{
acheter_pommes();
}
Remarquez que le
else prends TOUS les autres cas possibles. Un autre exemple:
if( quotient == 0 )
{
}
else
{
printf("Resultat de la division= %d", nombre / quotient
);
}
Question : Et si je ne veux pas que ça prenne toutes les autres conditions?
Et bien il est possible de combiner une
else et un
if sous la forme d'un... Attention tenez vous bien...
else if!
Un exemple rapide d'utilisation:
if ( nombre_pommes >= 1)
{
etre_heureux();
}
else if( nombre_pommes ==0 )
{
aller_en_acheter();
}
else
{
printf("On ne peux pas avoir un nombre négatif de pommes\n");
}
Chouette non?
Attention : Un else if va très expressement faire un if sur les valeurs restantes du else. Donc par définition, il est impossible de mettre un else if après un else tout seul.
Dernière règle concernant les
if...else, si vous mettez la moindre instruction entre les 2 blocs
if et
else, et bien ça ne compilera pas. En effet, il faut obligatoirement que un
else suive directement un bloc
if (que ce soit un
else if ou
if tout court).
Exemples de codes incorrects:
Erreur :
if ( nombre_pommes >= 1)
{
etre_heureux();
}
nombre_pommes = 5;
else
{
aller_en_acheter();
}
Erreur :
if ( nombre_pommes >= 1)
etre_heureux();
nombre_pommes = 5;
else
aller_en_acheter();
Information : Attention donc aux blocs d'instructions et préférez mettre des accolades!
Il existe une forme "rapide" pour écrire une condition, executer quelquechose si c'est vrai, sinon autre chose. Pour cela, il existe les opérateurs
? : qui s'utilisent de cette façon:
(<condition> ) ? <a_faire_si_condition_vraie> : <a_faire_si_condition_fausse>
On utilise ça généralement afin d'affecter une valeur rapidement, voici un exemple qui se charge de récolter la paritée d'un nombre:
int pair;
int nombre_pommes = 52;
/*il se passe des choses... */
pair = (nombre_pommes % 2 == 1) ? 1 : 0;
&& et ||
Encore 2 nouveaux opérateurs à apprendre par coeur. Le ET logique écrit "&&" et le OU logique "||".
Si vous ne savez pas à quoi cela peut vous servir, voici un exemple:
Est-ce que le prix d'un télévision est dans une fourchette de prix spécifique? Ma fourchette va de 500 à 1000 euros. Au-dessus, c'est trop cher, en dessous, il n'y a pas d'écran du type que je veux. Donc le prix doit être supérieur à 500 ET inférieur à 1000. Voyons cela en C:
if(prix >= 500 && prix <1000)
{
}
Attention : Il ne faut jamais faire ce genre de choses: if( 500 <= prix <= 1000) ce n'est absolument pas correct. Un seul test de condition à chaque fois.
Voyons maintenant un exemple avec le OU sous la forme d'un exercice.
Voici le contexte: on a 3 choix possible de cadeaux à faire à sa copine. Le premier est une boîte de chocolats, le deuxième une tapette à mouche, et enfin le troisième est un bouquet de fleurs. A chacun de ces types de cadeau est attribué un identifiant (un chiffre auquel va correspondre le type de l'objet). Chosir le premier ou le troisième cadeau est une bonne idée, le second n'en est pas une. (je me dégage de toute responsabilité en cas d'application de mes idées dans la vraie vie

)
Pour cela, nous allons même faire un petit menu qui permet de choisir l'objet que l'on veut offrir et la suite du programme nous expliquera si le choix a été une bonne idée ou pas. Je vous laisse chercher un peu.
Vous avez trouvé une solution? Voici la mienne:
Secret (cliquez pour afficher)#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int choix;
printf("Voici les objets disponibles:\n1_ Une boite de chocolats\n2_ Une tapette a mouche\n3_ Un bouquet de fleurs\n\n");
printf("Choisissez l'objet que vous souhaitez offrir en saissisant le nombre associe: ");
scanf("%d",&choix);
if( (choix == 1) || (choix == 3) )
{
}
else
{
}
return 0;
}
Vous ne savez pas comment fonctionne le OU et le ET logique? Voici un petit cours sur l'algèbre de Boole et les tables de vérité.
On dit que 1 correspond à vrai et 0 à faux.
| 0 |
|| |
0 |
donne 0 |
| 1 | || | 0 | donne 1 |
| 0 | || | 1 | donne 1 |
| 1 | || | 1 | donne 1 |
| 0 | && | 0 | donne 0 |
| 1 | && | 0 | donne 0 |
| 0 | && | 1 | donne 0 |
| 1 | && | 1 | donne 1 |
Voilà vous êtes un roi des conditions maintenant!
Switch
Il existe un autre format de condition, un peu moins utilisé car souvent le code écrit dedans est redondant. Il s'utilise dans le cas où l'on doit gérer de nombreux cas d'égalit. Par exemple:
Citation :
Si j'ai 3 pommes, je fais un gateau. Si j'ai 4 pommes, j'achète 2 pommes et je fais 2 gâteaux. Si j'ai 5 pommes, j'achète une pomme et je fais 2 gâteaux...
Pour cela il existe donc le
switch. Pour chaque cas, on va exécuter des instructions, et lorsque l'on a finit un casse la boucle. Voyons le format type:
int choix;
//on initialise choix comme on le souhaite ici
switch (choix) // ce n&#039;est pas une condition, on va tester chaque égalitée possible
{
case 1: //correspond à un if(choix ==1)
/* execution des instructions */
break; //on casse finit le bloc d&#039;instruction
case 2: //correspond à un if(choix ==2)
/* execution des instructions */
break; //on casse finit le bloc d&#039;instruction
default: //dans tous les autres cas
/* execution des instructions */
break; //on casse finit le bloc d&#039;instruction
}
Comme vous pouvez le voir, on répète déjà énormément de choses, ce qui est généralement inutile. Maintenant, examinons la syntaxe:
- - Après le switch, on déclare un bloc d'instructions
- - Pour chaque test d'égalité, on met à la place "case <valeur>: "
- - On finit un case par un break; qui casse le bloc d'instructions, on sort directement du switch
- - On fait attention à vérifier ce qu'il doit se passer dans tous les autres cas avec un default
Attention : Très important: Un switch ne s'effectue que sur un test dégalité avec une valeur entière!
Il est possible aussi d'executer les mêmes actions pour 2
case différents en les mettant à la suite:
switch (choix)
{
case 1:
case 2:
/* execution des instructions pour (choix ==1 && choix ==2)*/
break; //on casse finit le bloc d&#039;instruction
default: //dans tous les autres cas
/* execution des instructions */
break; //on casse finit le bloc d&#039;instruction
}
Information : Personnellement je trouve cela assez illisible, c'est pour cela que j'utilise la plupart du temps des if...else
Pour vous entraîner, vous pouvez essayer de faire un menu plus complexe comme nous l'avons fait un peu plus haut et d'afficher le choix de l'utilisateur.
Les conditions sont la clef d'un programme évolué, n'hésitez pas à revenir dessus voir rerevenir dessus si vous avez un doute. Aidez vous d'un papier et un crayon pour vérifier vos tables de vérité si vous avez un doute. Et enfin, posez vos question sur le forum, des gens viendront vous aider
Chapitre précédent - Sommaire - Chapitre suivant
Nos rédacteurs et membres sont pour la plupart ouverts à des remarques constructives et servir à alerter le rédacteur du cours, des fautes éventuelles ou de propositions et nouvelles perspectives de cours etc ...
Pour ce faire cliquez ici
Postez vous aussi un commentaire à cette partie via le lien que voici