-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchapitre-structure.tex
341 lines (271 loc) · 7.47 KB
/
chapitre-structure.tex
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
\section{Les variables structurées}
%\leconwithtoc
\subsection{Le type structuré}
\begin{frame}{types simple et structuré}
\begin{itemize}
\item
Les variables de \code{types}
dits «~\code{simples}~» ne peuvent
contenir qu’une seule valeur à la fois
(entier, réel, booléen, caractère, chaine).
\bigskip
\item
Cependant, certains types
d’information consistent en un
regroupement de plusieurs données
élémentaires.
\begin{itemize}
\item
une \textbf{date} est composée de trois éléments (le jour, le mois,
l’année);
\item {
un \textbf{moment} de la journée est un triple d’entiers (heures,
minutes, secondes)}
\item {
la localisation d’un \textbf{point} dans un plan nécessite
deux coordonnées cartésiennes (l’abscisse \textit{x} et
l’ordonnée \textit{y}) ou polaires (le rayon \textit{r} et l’angle
\textit{$\theta $})}
\item {
une \textbf{adresse }est composée de plusieurs données}
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{type structuré}
Pour stocker et manipuler de tels ensembles de données, nous utiliserons
des \textbf{types structurés} ou \textbf{structures}.
\bigskip
\cadre{
Une \code{structure} est donc un ensemble
fini d’éléments pouvant être de types distincts. Chaque élément de cet
ensemble, appelé \code{champ} de la structure, possède un nom unique.
}
\bigskip
Noter qu’un champ d’une structure peut lui-même être une structure.
Par exemple, une \textbf{carte d’identité} inclut parmi ses informations
une \textbf{date} de naissance, l’\textbf{adresse} de son
propriétaire (cachée dans la puce électronique!),\dots
\end{frame}
\subsection{Définition d'une structure}
\begin{frame}{Définition}
La définition d’un type structuré adoptera le modèle suivant~:
\bigskip
\cadre{
\begin{pseudo}
\Struct{NomDeLaStructure}
\Decl nomChamp1~: type1
\Decl nomChamp2~: type2
\Decl \dots
\Decl nomChampN~: typeN
\EndStruct
\end{pseudo}
}
\bigskip
\textit{nomChamp1}, \dots, \textit{nomChampN }
sont les noms des différents champs de la structure,
et \textit{type1}, \dots, \textit{typeN}
les types de ces champs.
\bigskip
Ces types sont
\begin{itemize}
\item
soit les types «~simples~» étudiés
précédemment (entier, réel, booléen, caractère, chaine)
\item
soit d’autres
types structurés dont la structure aura été préalablement définie.
\end{itemize}
\end{frame}
\begin{frame}{Exemple}
Pour exemple, nous définissons ci-dessous trois
types structurés que nous utiliserons souvent par la suite~:
\bigskip
\cadre{
\begin{pseudo}
\Struct{Date}
\Decl jour~: entier
\Decl mois~: entier
\Decl année~: entier
\EndStruct
\end{pseudo}
}
\end{frame}
\begin{frame}{Exemple}
\cadre{
\begin{pseudo}
\Struct{Moment}
\Decl heure~: entier
\Decl minute~: entier
\Decl seconde~: entier
\EndStruct
\end{pseudo}
}
\bigskip
\cadre{
\begin{pseudo}
\Struct{Point}
\Decl x~: réel
\Decl y~: réel
\EndStruct
\end{pseudo}
}
\end{frame}
\subsection{Déclaration d’une variable de type structuré}
\begin{frame}{Exemple}
Une fois un type structuré défini, la
déclaration de variables de ce type est identique à celle des variables
simples.
\bigskip
Par exemple~:
\bigskip
\cadre{
\begin{pseudo}
\Decl anniversaire, jourJ~: Date
\Decl départ, arrivée, unMoment~: Moment
\Decl a, b, centreGravité~: Point
\end{pseudo}
}
\end{frame}
\subsection{Utilisation des variables de type structuré}
\begin{frame}{Utilisation d'un champ}
Pour accéder à l’un des champs d’une variable structurée, il faut mentionner
le nom de ce champ ainsi que celui de la variable dont il fait partie.
\bigskip
Nous utiliserons la notation «~pointée~»~:
\bigskip
\cadre{
\begin{pseudo}
\Stmt nomVariable.nomChamp
\end{pseudo}
}
\end{frame}
\begin{frame}{Exemple}
\cadre{
\begin{pseudo}
\Let anniversaire.jour \Gets 15
\Let anniversaire.mois \Gets 10
\Let anniversaire.année \Gets 2014
\Let arrivée.heure \Gets départ.heure + 2
\Let centreGravité.x \Gets (a.x + b.x) / 2
\end{pseudo}
}
\end{frame}
\begin{frame}{Utilisation globale}
On peut cependant, dans certains cas, utiliser
une variable structurée de manière globale (c’est-à-dire d’une façon
qui agit simultanément sur chacun de ses champs).
\bigskip
Le cas le plus
courant est l’affectation interne entre deux variables structurées de
même type, par exemple~:
\bigskip
\cadre{
\begin{pseudo}
\Let arrivée \Gets départ
\end{pseudo}
}
\bigskip
qui résume les trois instructions suivantes~:
\bigskip
\cadre{
\begin{pseudo}
\Let arrivée.heure \Gets départ.heure
\Let arrivée.minute \Gets départ.minute
\Let arrivée.seconde \Gets départ.seconde
\end{pseudo}
}
\end{frame}
\begin{frame}{Paramètre d'un module}
Une variable structurée peut aussi être le
paramètre d’un module, et un module peut également renvoyer une
«~valeur~» de type structuré.
\bigskip
Par exemple, l’entête d’un module
renvoyant le nombre de secondes écoulées entre une heure de départ et
d’arrivée serait~:
\bigskip
\cadre{
\begin{pseudo}
\ModuleSign{nbSecondesEcoulées}{ départ\In, arrivée\In~: Moment}{entier}
\end{pseudo}
}
\end{frame}
\begin{frame}{Lire et afficher}
On pourra aussi lire ou afficher une variable structurée.
\bigskip
\cadre{
\begin{pseudo}
\Read unMoment
\Write unMoment
\end{pseudo}
}
\end{frame}
\begin{frame}{Comparaison}
On ne peut pas utiliser les opérateurs de comparaison ({\textless}, {\textgreater}) pour
comparer des variables structurées.
\bigskip
En effet, s’il est naturel de vouloir comparer des dates ou des moments,
comment définir une relation d’ordre avec les points du plan ou avec
des cartes d’identités ?
\bigskip
Si le besoin de comparer des variables
structurées se fait sentir, il faudra dans ce cas écrire des modules de
comparaison adaptés aux structures utilisées.
\end{frame}
\begin{frame}{Assignation globale}
Par facilité d'écriture, on peut assigner tous les champs en une
fois via des «~\{\}~».
\bigskip
Exemple~:
\bigskip
\cadre{
\begin{pseudo}
\Let anniversaire \Gets \{1, 9, 1989\}
\end{pseudo}
}
\end{frame}
\subsection{Exemple d’algorithme}
\begin{frame}{Exemple}
Le module ci-dessous reçoit en paramètre deux dates ;
la valeur renvoyée est
\begin{itemize}
\item
–1 si la première date est antérieure à la deuxième,
\item
0 si les deux dates sont identiques
\item
1 si la première date est postérieure à la
deuxième.
\end{itemize}
\end{frame}
\begin{frame}{Exemple}
\cadre{
\begin{pseudo}
\Module{comparerDates}{date1\In, date2\In~: Date}{entier}
\Decl résultat~: entier
\Let résultat \Gets -1
\RComment valeur choisie par défaut
\If{date1.année ${\geq}$ date2.année}
\If{date1.année $>$ date2.année}
\Let résultat \Gets 1
\Else \RComment les années sont identiques
\If{date1.mois ${\geq}$ date2.mois}
\If{date1.mois $>$ date2.mois}
\Let résultat \Gets 1
\Else \RComment les années et les mois sont identiques
\If{date1.jour ${\geq}$ date2.jour}
\If{date1.jour $>$ date2.jour}
\Let résultat \Gets 1
\Else \RComment les années, les mois et les jours sont identiques
\Let résultat \Gets 0
\EndIf
\EndIf
\EndIf
\EndIf
\EndIf
\EndIf
\Return résultat
\EndModule
\end{pseudo}
}
\end{frame}