boucles.tex 6.22 KB
Newer Older
Rémy Huet's avatar
Rémy Huet committed
1
2
3
4
\subsection{Généralités}
\begin{frame}{Introduction}
	\begin{block}{Mise en contexte}
		On sait désormais effectuer des actions diverses, et ce en fonction de paramètres donnés au programme par l'utilisateur.
Rémy Huet's avatar
Rémy Huet committed
5

Rémy Huet's avatar
Rémy Huet committed
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
		Maintenant, comment faire si l'on veut effectuer la même opération un certain nombre de fois?
	\end{block} \Pause
	\begin{beamercolorbox}[rounded=true]{orangebox}
		\enquote{Facile, on les copie colle autant de fois qu'on veut dans le script!}
	\end{beamercolorbox} \Pause

	\begin{block}{}
		Non, non, non et re-NON! C'est une très mauvaise pratique, car cela rend le script:
		\begin{itemize}
			\item Plus lourd
			\item Illisible
			\item Statique (le nombre d'exécutions est fixé et ne peut pas dépendre de paramètres extérieurs)
		\end{itemize}

		C'est pourquoi on utilise des \textbf{boucles}
	\end{block}
\end{frame}

\begin{frame}{Les boucles en théorie}
	\begin{block}{Définition}
		Une boucle est une structure permettant de réaliser de manière répétée une action.
		Elle est composée:
		\begin{itemize}
			\item D'un corps: c'est l'ensemble des instructions qui seront exécutées lors d'un passage dans la boucle.
			\item D'une condition de réalisation: si celle-ci est vraie, un passage est effectué
		\end{itemize}
	\end{block}
Stephane Bonnet's avatar
Typo  
Stephane Bonnet committed
33
	\begin{alertblock}{N.B.}
Rémy Huet's avatar
Rémy Huet committed
34
35
36
		La condition peut correspondre à n'importe laquelle des conditions vues précédemment.
		Elle peut ne jamais être fausse. On parlera alors de \textbf{boucle infinie}.

Stephane Bonnet's avatar
Typo  
Stephane Bonnet committed
37
		\textit{Par exemple, 1 -eq 1 engendrera une boucle infinie}
Rémy Huet's avatar
Rémy Huet committed
38
	\end{alertblock}
Rémy Huet's avatar
Rémy Huet committed
39
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
40

Rémy Huet's avatar
Rémy Huet committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
\subsection{La boucle tant que \ldots faire}

\begin{frame}[fragile]{En théorie}
	\begin{block}{Explications}
		Elle est composée d'une condition \enquote{simple} \textit{comme celle des if} et d'un corps.
		Elle est de la forme :
	\end{block}
	\begin{Verbatim}
{\large TANT QUE condition}

{\large FAIRE}

	{\large actions}

{\large FIN_TANT_QUE}
	\end{Verbatim}

	\begin{block}{Concrètement}
		Son fonctionnement est assez simple.
Stephane Bonnet's avatar
Typo  
Stephane Bonnet committed
60
		Tant que la condition est vérifiée, la boucle boucle.
Rémy Huet's avatar
Rémy Huet committed
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
	\end{block}
\end{frame}

\begin{frame}[fragile]{Et en bash?}
	En bash, la syntaxe de cette boucle est la suivante :
	\begin{Verbatim}
{\large while [ condition ]}

{\large do}

	{\large actions}

{\large done}
	\end{Verbatim}

	Exemple. Dans \texttt{script.sh}:
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
#!/bin/bash

while [ -z $reponse ] || [ $reponse != 'oui' ]\textcolor{red}{# ou juste [ ``$reponse'' != oui ]}
do
        read -p 'Dites oui : ' reponse
done
		\end{Verbatim}
	\end{beamercolorbox}
	\begin{block}{}
		Ce script demandera à l'utilisateur d'entrer du texte tant que l'utilisateur n'enverra pas \enquote{oui}

		On notera que comme pour les if, on peut utiliser les opérateurs arithmétiques
	\end{block}
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

\subsection{La boucle pour}

\begin{frame}[fragile]{En théorie}
	\begin{block}{Utilité}
		La boucle \texttt{pour} permet de parcourir une liste de valeurs et de boucler autant de fois qu'il y a de valeurs.
	\end{block}
	Syntaxe :
	\begin{Verbatim}

{\large POUR variable PRENANT valeur1 valeur2 valeur3}

{\large FAIRE}

	{\large actions}

{\large FIN_POUR}
	\end{Verbatim}
\end{frame}

\begin{frame}[fragile]{Et en bash ?}
	En bash, la syntaxe est la suivante:
	\begin{Verbatim}

{\large for variable in val1 val2 val3}

{\large do}

	{\large actions}

{\large done}
	\end{Verbatim}

	Exemple :
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
#!/bin/bash

while [ "$reponse" != 'oui' ]
do
        read -p 'Dites oui : ' reponse
done
		\end{Verbatim}
	\end{beamercolorbox}
	\begin{block}{}
		Ce script demandera une entrée à l'utilisateur tant que ça ne sera pas \enquote{oui}
	\end{block}
\end{frame}

\begin{frame}[fragile]{Un autre exemple plus complexe \ldots}
	\begin{alertblock}{Exercice: les années bissextiles}
		Écrire un script qui:
		\begin{itemize}
			\item Demande deux années à l'utilisateur : celle de départ ou celle d'arrivée. Elles pourront être fournies en paramètre (dans cet ordre). La ou les valeurs manquantes seront demandées par le prompt lors de l'exécution du programme.
Stephane Bonnet's avatar
Typo  
Stephane Bonnet committed
147
			\item Affiche toutes les années bissextiles comprises entre celles données (incluses)
Rémy Huet's avatar
Rémy Huet committed
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
		\end{itemize}
		On utilisera uniquement des boucles \texttt{for} et pas de boucle \texttt{while}
	\end{alertblock}
	\begin{exampleblock}{Rappel}
		Une année est bissextile si elle est un multiple de 4. Exception : elle ne l'est pas si elle est un multiple de 100. Exception à l'exception : elle l'est si elle est un multiple de 400.
	\end{exampleblock}
\end{frame}

\begin{frame}[fragile]{Indices}
	\begin{block}{Indices}
		\begin{itemize}
		\item Pour générer les valeurs pour la boucle \texttt{for}, allez voir du côté de \sout{chez Swann} \texttt{seq}
		\item La commande \texttt{let} ne renvoie pas directement la valeur du calcul. On utilisera une autre syntaxe pour faire les calculs dans les if: \texttt{\$((calcul))}
		\end{itemize}
	\end{block}
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
164
\begin{frame}[fragile]{Solution}
Rémy Huet's avatar
Rémy Huet committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
	Proposition de solution:
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
#!/bin/bash \Pause

depart=$1 \Pause
arrivee=$2 \Pause

if [ -z $2 ] \Pause
then \Pause
	if [ -z $1 ] \Pause
	then \Pause
		read -p 'Année de départ ? ' depart \Pause
	fi \Pause
	read -p "Année d'arrivée ? " arrivee \Pause
fi \Pause

for annee in `seq $depart $arrivee` \Pause
do \Pause
	if [ $(($annee % 4)) -eq 0 ] && [ $(($annee % 100)) -ne 0 ] || [ $(($annee % 400)) -eq 0 ] \Pause
	then \Pause
		echo $annee \Pause
	fi \Pause
done
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212

\begin{frame}[fragile]{Retour sur les paramètres}
	\begin{block}{Contexte}
		Tout à l'heure, on a vu que les paramètres n'étaient accessibles que via 9 variables.
		Mais il est bien possible d'avoir plus de 9 paramètres sur un script.
		On utilisera alors la commande \texttt{shift} pour \enquote{décaler} les paramètres.
		(\verb+$2 -> $1, $3 -> $2 ... [...] -> $9+)
	\end{block}
	Exemple : écrire un script qui liste tous les paramètres avec leur place: \Pause
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
#!/bin/bash

for i in `seq 1 $#`
do
	echo "Le paramètre $i vaut $1"
	shift
done
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}