Aller au menu - Aller au contenu

Icône Conditions et boucles

Avatar
Mise à jour : 04/08/2011
Difficulté : Intermédiaire Intermédiaire Creative Commons BY-NC-SA
7 018 visites depuis 7 jours, dont 70 sur ce chapitre classé 32/786
Comme tout programme, un script csh doit pouvoir s'adapter aux situations. Il ne peut pas se contenter d'exécuter toujours la même suite d'instructions. Enfin bon, il peut, mais c'est limité. :( Deux procédés vont nous permettre de gagner en souplesse :

  • Les conditions : Des instructions ne sont exécutées qu'à certaines conditions.
  • Les boucles : Certaines instructions sont répétées plusieurs fois.


Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

A - Les conditions

Plutôt que de laisser l'utilisateur entrer n'importe quoi, nous allons maintenant lui proposer une petite devinette. Par exemple... Combien font six fois sept ? Il faudra donc comparer la réponse de l'utilisateur à la bonne (42, n'est-ce pas ? ;) ).


if simple


Vous allez donc écrire un script devinette en modifiant un peu votre script saisie. À la fin, si l'utilisateur a répondu 42, on le félicite.

Code : Bash
1
2
3
4
5
6
#!/bin/csh

echo "Combien font six fois sept ?"
set reponse=$<
echo 'Vous avez saisi : '$reponse
if ($reponse == 42) echo "C'est la bonne reponse. Bravo !"

Regardons la ligne 6 de plus près. if sert à tester une condition, que l'on indique entre parenthèses. $reponse est la valeur de la variable reponse.

La condition $reponse == 42 est vraie si la variable reponse a la valeur 42 et fausse sinon. Si elle est vraie, on exécute l'instruction située derrière le if, c'est-à-dire echo. Remarquez qu'on doit obligatoirement utiliser echo avec des guillemets, cette fois-ci, vu qu'il y a une apostrophe dans le texte. Remarquez aussi qu'il faut mettre deux signes = pour tester une égalité. Et pour une différence, c'est !=.


if complexe


Maintenant, il faudrait prévoir de faire quelque chose si l'utilisateur se trompe. Par exemple, on peut lui indiquer s'il est en dessous ou au dessus de la bonne réponse. Nous avons alors besoin des instructions then, else et endif.

La structure de programme est la suivante :

Code : Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
if (condition 1) then
   instruction à exécuter si la condition 1 est vraie
   autres insructions éventuelles si la condition 1 est vraie
else if (condition 2) then
   instruction à exécuter si 1 est fausse mais 2 est vraie
   autres insructions éventuelles si 1 est fausse mais 2 est vraie
else
   instruction à exécuter si les conditions 1 et 2 sont fausses
   autres insructions éventuelles si 1 et 2 sont fausses
endif


On peut mettre plusieurs blocs else if si on veut tester encore d'autres conditions. Dans notre cas, cela donne :

Code : Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/csh
                            
echo "Combien font six fois sept ?"
set reponse=$<
echo 'Vous avez saisi : '$reponse
if ($reponse == 42) then
   echo "C'est la bonne reponse. Bravo !"
else if ($reponse < 42) then
   echo "Vous etes en dessous de la bonne reponse."
else
   echo "Vous etes au dessus de la bonne reponse."
endif

Si l'utilisateur entre autre chose qu'un nombre, il recevra un message d'erreur. Et franchement, il l'aura bien mérité. :colere2: S'il entre un nombre incorrect, il voudra certainement réessayer. C'est ce que permettent les boucles.


Pour tester plusieurs cas de figure, on peut aussi se servir de l'instruction switch. Nous verrons ça au prochain chapitre.

B - Les boucles


while


Avec la boucle while, par exemple, vous pouvez indiquer que certaines instructions doivent être répétées tant qu'une condition est vraie. La structure est :

Code : Bash
1
2
3
4
5
while (condition)
   instruction
   autre instruction
   encore une autre
end


Dans notre cas, on va donc commencer par définir une variable gagne, initialisée à 0. Tant qu'elle vaut 0, on répète notre programme encore et encore. Lorsque l'utilisateur répond 42, on change la valeur de gagne. La boucle ne sera donc plus répétée.

Code : Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/csh

set gagne = 0
while ($gagne == 0)
   echo "Combien font six fois sept ?"
   set reponse=$<
   echo 'Vous avez saisi : '$reponse
   if ($reponse == 42) then
      echo "C'est la bonne reponse. Bravo !"
      set gagne = 1
   else if ($reponse < 42) then
      echo "Vous etes en dessous de la bonne reponse."
   else
      echo "Vous etes au dessus de la bonne reponse."
   endif
end


Vous voyez que j'ai laissé un nombre d'espaces différent au début de chaque ligne. On appelle cela des indentations. Elles ne sont pas nécessaires pour l'ordinateur mais vous permettent à vous de relire plus facilement votre programme, en voyant bien ce qui fait partie de la boucle while, ce qui fait partie du bloc if, etc.

Dans le même esprit, comme votre script commence à s'allonger, vous pouvez y inclure des commentaires : des lignes que l'ordinateur ignorera superbement, mais grâce auxquelles vous vous souviendrez du sens des instructions que vous avez écrites. Je vous rappelle que les lignes de commentaires commencent, en csh, par un #.


#!/bin/csh est l'exception qui confirme la règle. Elle commence par un # mais ce n'est pas un commentaire.


Voici donc notre code-source commenté :

Code : Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/csh

#On initialise gagne `a 0 pour dire qu'on n'a pas encore gagne.
set gagne = 0

#La boucle principale, tant qu'on n'a pas gagne.
while ($gagne == 0)

   #On pose la question et on enregistre la reponse
   echo "Combien font six fois sept ?"
   set reponse=$<
   echo 'Vous avez saisi : '$reponse
   
   #On compare la reponse de l'utilisateur et la bonne (42)
   if ($reponse == 42) then

      echo "C'est la bonne reponse. Bravo !"
      set gagne = 1
      #gagne vaut maintenant 1 donc la boucle ne sera pas repetee.

   else if ($reponse < 42) then
      echo "Vous etes en dessous de la bonne reponse."
   else
      echo "Vous etes au dessus de la bonne reponse."
   endif
end
#Fin de la boucle principale.


foreach et @


On peut aussi enchaîner plusieurs questions, pour interroger plus globalement l'utilisateur sur la table de multiplication des 6.

La boucle foreach est parfaite pour ça. Voici sa structure :

Code : Bash
1
2
3
4
5
foreach variable (liste des valeurs successives de la variable)
   instruction
   autre instruction
   encore une autre
end

À chaque tour de la boucle, la variable change de valeur. Elle adopte les valeurs indiquées dans la parenthèse, l'une après l'autre. Ces valeurs peuvent être des nombres ou des chaînes de caractères (des mots). On peut même faire cohabiter des nombres et des mots entre les mêmes parenthèses si on veut que la variable soit un nombre au premier tour de boucle et un mot au suivant. Pour nous, ce ne serons que des nombres, ceux qu'on veut multiplier par 6.

Code : Bash
1
foreach multi (2 5 7 8 11)


L'ennui, à présent, c'est que le bon résultat sera différent à chaque tour de la boucle foreach. Ce ne sera pas toujours 42. Avant d'interroger l'utilisateur, on doit donc calculer ce résultat avec l'instruction @.

Code : Bash
1
@ resultat = 6 * $multi


Le symbole @ signifie "fait ce calcul".


L'autre difficulté, c'est que le programme devient assez complexe, avec deux boucles imbriquées et des tests conditionnels au milieu. Pour s'y retrouver, il est donc bon de tracer un schéma.

Image utilisateur


À vous de jouer, maintenant. Je vous ai tout expliqué. Essayez d'écrire le script vous-mêmes.


Correction


Secret (cliquez pour afficher)
Code : Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/csh

#La boucle principale
foreach multi (2 5 7 8 11)

   #Calcul du bon resultat
   @ resultat = 6 * $multi
   #On initialise gagne a 0 pour dire qu'on n'a pas encore gagne.
   set gagne = 0

   #La boucle while, tant qu'on n'a pas gagne.
   while ($gagne == 0)

      #On pose la question et on enregistre la reponse
      echo "Combien font 6 fois "$multi" ?"
      set reponse=$<
      echo 'Vous avez saisi : '$reponse
   
      #On compare la reponse de l'utilisateur et la bonne (42)
      if ($reponse == $resultat) then

         echo "C'est la bonne reponse. Bravo !"
         set gagne = 1
         #gagne vaut maintenant 1 donc la boucle while ne sera pas repetee.

      else if ($reponse < $resultat) then
         echo "Vous etes en dessous de la bonne reponse."
      else
         echo "Vous etes au dessus de la bonne reponse."
      endif
   end
   #Fin de la boucle while.
end
#Fin de la boucle principale
echo 'Vous avez trouve toutes les bonnes reponses. Felicitations !'
Vous connaissez maintenant les conditions et les boucles, et vous savez même faire des calculs. Avec ces principes simples, vous pouvez programmer ce que vous voulez. Il est temps, maintenant, d'écrire votre premier script "utile".
Chapitre précédent Sommaire Chapitre suivant

Partager

Il n'y a pas encore de commentaire pour ce tuto.