Académique Documents
Professionnel Documents
Culture Documents
Poly
Poly
S - Semestre 1
Initiation la programmation
anne universitaire 2013-2014
Introduction
[. . . ] l'informatique est la discipline qui s'applique tudier et dnir des oprations, et
o l'on opre des transformations sur des combinaisons de symboles trs gnraux reprsentant diverses informations en de nouvelles combinaisons de symboles, elles-mmes porteuses
d'informations.
G. Ifrah, Histoire Universelle des Chires, coll. Bouquins, t. II, p. 725.
La programmation
Un algorithme est la description d'un enchanement de calculs et de tches lmentaires en vue
de la ralisation d'un traitement automatique de donnes. Ces donnes doivent tre reprsentes
par des structures appropries. L'algorithme peut ensuite tre cod dans un langage de programmation pour donner un programme. La programmation regroupe ces activits : algorithmique,
structuration de donnes et codage, les deux premires tant certainement les plus importantes.
Contrairement ce que pourrait croire un novice, la tche principale de la conception d'un
programme n'est pas l'criture de celui-ci dans un langage informatique donn.
La ralisation d'un programme se dcompose en eet en plusieurs phases. De manire simplie, on prsente ainsi la gense d'un programme :
1. tablissement d'un cahier des charges : le problme pos ;
2. analyse du problme et dcomposition de celui-ci en sous-problmes plus ou moins indpendants et plus simples rsoudre ;
3. choix de structures de donnes pour reprsenter les objets du problme ;
4. mise en uvre des dirents algorithmes utiliser pour rsoudre les sous-problmes ;
5. codage des algorithmes et cration du programme dans un langage de programmation
donn ;
6. tests (et corrections) et validation auprs des utilisateurs.
Bien souvent, dans la pratique, ces tapes ne sont pas aussi nettement dcoupes. Les quatre
premires sont certainement les plus importantes et on peut remarquer qu'elles sont indpendantes du langage de programmation choisi, qui n'intervient normalement qu' la cinquime
3
4
tape. La dernire tape est, elle aussi, trs importante et ce serait une grave erreur de penser
qu'elle ne fait pas partie du cycle de cration d'un programme.
Pour un dbutant en informatique, tudiant de surcrot, le cahier des charges consistera
souvent en un nonc d'exercice ou de problme propos par un enseignant. Une premire tche,
et elle est souvent plus dicile qu'on ne le croit, sera de comprendre cet nonc ! Il faudra ensuite
rchir la rsolution de ce problme et, ensuite seulement, le coder dans un langage. On peut
donc le constater, une bonne partie du travail doit se faire avec un crayon et un papier ! Une erreur
(mthodologique) des dbutants est souvent, une fois l'nonc lu (ou plus souvent simplement
survol), de se ruer sur leur clavier et de commencer taper dessus (on ne sait d'ailleurs trop
quoi) et seulement alors de commencer rchir la rsolution du problme.
Objectif du cours
Il s'agit de poser les notions de base en programmation imprative.
Expressions et instructions.
Constantes et variables, aectation. Variables locales.
Types de donnes simples : nombres entiers ou non entiers, boolens, caractres et chanes
de caractres.
Expressions et instructions conditionnelles.
Rptition conditionnelle d'intructions (boucle tant que). Rptition non conditionnelle
d'instructions (boucle pour).
Fonctions et procdures. Paramtres formels, paramtres eectifs.
Dans les deux cours qui suivent (API1 et API2) sont abordes les notions
tableaux ;
enregistrements ;
chiers ;
rcursivit ;
structures de donnes dynamiques ;
programmation modulaire ;
algorithmes de recherche et de tri ;
complexit des algorithmes.
Le choix du langage
Il existe de trs nombreux langages impratifs : C, Pascal, Ada, Python, Caml. . .
Pendant quelques annes nous avons utilis le langage Pascal. Mais l'exprience a montr
que la lourdeur de la syntaxe de ce langage, ainsi que certaines de ses ambiguts, prsentaient
de relles dicults pour des tudiants dbutant en programmation. Ce langage ncessitant
une phase d'dition, puis une phase de compilation avant toute excution, il devient trs vite
fastidieux de tester la moindre ide d'algorithme. Pour ces raisons nous avons dcid de changer
de langage.
Nous nous sommes alors tourns vers Caml. Mme si la base ce langage est avant tout un
langage fonctionnel, il ore aussi la possibilit de programmer dans un style impratif. Il dispose
de plusieurs modes d'excution :
un mode interactif
un mode compil 1 qui permet de produire des excutables autonomes.
1. en ralit, il existe deux modes compils : une compilation en code-octet qui doit ensuite tre interprt par
une machine virtuelle : et une compilation en code natif pour une architecture donne.
5
Dans le cours d'InitProg, le mode interactif est le seul mode abord. La compilation pour produire
des programmes excutables autonomes sera aborde dans le cours d'API1.
Caml est un langage fonctionnel dans lequel les fonctions sont des valeurs du mme ordre que
toute autre valeur. En particulier, une fonction peut produire une autre fonction. Par exemple, la
fonction plus dnie ci-dessous est une fonction qui permet d'additionner deux nombres entiers.
# let plus a b = a + b ;;
val plus : int -> int -> int = <fun>
Mais on peut aussi appliquer cette fonction un seul entier, et la valeur produite par cette
application donne une fonction qui, comme le montre le type indiqu par l'interprte du langage
est une fonction qui un entier associe un autre entier.
# let plus2 = plus 2 ;;
val plus2 : int -> int = <fun>
L'application de la fonction
plus2
# plus2 5 ;;
- : int = 7
Mathmatiquement parlant, la fonction plus est donc une fonction dont l'ensemble de dpart
est l'ensemble des entiers Z et celui d'arrive est l'ensemble des fonctions de Z dans Z.
plus : Z (Z Z).
Une autre faon de considrer la fonction qui deux entiers associe la somme de ces deux
entiers consiste la dnir comme une fonction dont l'ensemble de dpart est l'ensemble des
couples d'entiers Z Z est celui d'arrive est Z.
add : Z Z Z.
Les deux fonctions plus et add sont d'une certaine manire deux facettes de la mme fonction :
on dit que la premire en est la version currye et la seconde la version dcurrye.
En Caml, on peut crire trs simplement la forme dcurrye.
# let add (a,b) = a + b ;;
val add : int * int -> int = <fun>
puisque l'interprte du langage attend qu'un couple d'entiers soit fourni la fonction add.
En programmation, il est frquent d'avoir dnir des fonctions ou procdures deux
(ou plus) paramtres. Dans la plupart des langages de programmation (C, Ada, Pascal. . . ),
6
lorsqu'une telle fonction a t dnie, il n'est pas possible de l'appliquer avec un nombre d'arguments infrieur au nombre de paramtres prcis dans sa dnition. Nous avons donc choisi, pour
ce cours d'InitProg, de programmer toutes les fonctions ou procdures plusieurs paramtres
que nous rencontrerons sous leur forme dcurrye 2 . Cela a le double avantage
d'tre syntaxiquement proche de ce qui se fait dans d'autres langages de programmation ;
de ne pas permettre l'application partielle d'une fonction qui fournirait des valeurs fonctionnelles qui pourrait dsorienter le programmeur dbutant.
Organisation du polycopi
Ce polycopi est dcoup de manire assez classique en introduction (que vous lisez actuellement), chapitres, annexes, et diverses tables (des gures, des matires, . . . ).
Les chapitres recouvrent les objectifs du programme d'InitProg. Ils sont tous suivis de quelques
exercices. Durant les sances hebdomadaires, les enseignants pourront complter la liste de ces
exercices par d'autres.
Une annexe importante est celle prsentant les fonctions du module Cartes. Ce module dnit
un environnement de travail qui permet de dplacer des cartes situes sur quatre tas d'un tas vers
un autre. Cet environnement est utilis durant les premires semaines du cours pour introduire
progressivement les direntes structures de contrle en programmation imprative, ainsi que
les notions de fonctions et procdures. Le report en annexe de la prsentation de ce module est
dlibr an de distinguer les objectifs du cours (prsents dans les divers chapitres) des moyens
pour les atteindre.
Ce polycopi ne contient pas les sujets de TP qui seront proposs au fur et mesure par
l'intermdiaire du semainier du portail des UE d'informatique (http://www.fil.univ-lille1.
fr/portail/ls1/initprog/) ou du site du cours sur Moodle (http://moodle.univ-lille1.
fr/). Bien entendu, les TP font partie intgrante du cours et sont indispensables une bonne
comprhension de ce cours.
n pour
renvoyer
Caml
2. Les tudiants qui poursuivront leurs tudes en informatique dcouvriront dans un cours de 3me anne
consacr la programmation fonctionnelle les avantages des fonctions curryes.
7
in
for i = 1 to n do
f := !f * i
done;
!f
Enn, les dialogues avec l'interprte du langage sont dcrits sous la forme
# let a = 5 ;;
val a : int = 5
# fact (5) ;;
- : int = 120
Lorsqu'une nouvelle structure syntaxique du langage est prsente pour la premire fois, elle
l'est sous la forme
Le site du cours
Le site du cours se trouve l'adresse :
http://www.fil.univ-lille1.fr/portail/ls1/initprog
.
Vous pouvez y accder l'aide de votre tlphone lgant (smartphone pour les anglophones) grce au QR-code de la gure 1.
Figure
licenses/by-nc-sa/3.0/fr/).
(http://creativecommons.org/
Chapitre 1
Expressions et instructions
1.1 Expressions
Une expression est une manire de reprsenter un calcul. Par exemple, l'aire d'un disque de
rayon r est donne par l'expression :
r2
pi
**
2.
Dans les formules les grandeurs possdent ce que les physiciens appellent des dimensions, en
informatique on parle plutt de types.
Lorsqu'on crit de manire traditionnelle une expression, un certain nombre de conventions
d'criture nous permet d'omettre certains signes d'oprations. Ici, par exemple, les signes de multiplications sont implicites. Lorsqu'on souhaite traduire cette expression de manire informatique,
il faudra savoir que des rgles strictes devront tre appliques, l'ensemble de ces rgles forme la
syntaxe du langage, et il faudra absolument les respecter pour esprer obtenir un rsultat.
1.2 Le logiciel
Objective Caml
Le langage informatique que nous utiliserons pour ce cours est Caml. On peut utiliser ce
langage dans dirents modes.
En mode interprt : dans ce mode le programmeur dialogue (en Caml) avec un interprte
du langage. Plus prcisment, il rdige des phrases qu'il communique l'interprte, et celuici vrie qu'elles sont bien rdiges et donne en retour une rponse au programmeur. Le
mode interprt permet au programmeur d'valuer immdiatement et pas pas ses ides.
9
10
CHAPITRE 1.
EXPRESSIONS ET INSTRUCTIONS
En mode compil : dans ce mode, le programmeur rdige (avec un diteur de textes) l'intgralit de son programme, puis le soumet un compilateur du langage dont le rle est de
produire un programme excutable. Si le programme est correctement rdig (aucune erreur
de syntaxe, cohrence des types dans les expressions, . . . ), il ne reste plus au programmeur
qu' lancer l'excution de son programme et vrier la conformit de cette excution au
cahier des charges initial.
Dans le cours d'InitProg, nous n'utiliserons que le mode interprt. La compilation sera aborde
dans le cours API1 au semestre suivant.
Caml est un langage dvelopp par l'INRIA (Institut National de Recherche en Informatique
et Automatique) que l'on peut tlcharger l'adresse http://caml.inria.fr/. On en trouve
direntes implantations et celle que nous utiliserons est Objective Caml. Objective Caml
est un logiciel libre qui peut tre tlcharg depuis l'adresse prcdente ainsi que le manuel
d'utilisation 1 . Il en existe des versions pour les plateformes les plus courantes : Linux, Microsoft
Windows, MacOS X. Dans ce polycopi, ainsi que dans les salles de TP, nous utiliserons une
version pour Linux.
Pour dbuter une session de dialogue avec l'interprte d'Objective Caml, on tape la commande ocaml dans un terminal.
> ocaml
Objective Caml version 3.10.2
#
Le symbole dise (#) est l'invite de l'interprte : c'est le signe qu'il est prt vous couter et
excuter la commande que vous lui donnerez.
Avant de dcouvrir les premires expressions et instructions du langage Caml, voyons celle
qui permet de quitter l'interprte. C'est la directive 2 #quit.
# #quit ;;
>
Caml
(1.1)
1.3.
11
1. Tout d'abord l'expression (4 * (-3 + 5)) / 2. Elle est trs proche de la notation mathmatique usuelle, les nombres sont nots comme d'habitude, l'addition et la division aussi,
la multiplication est note *, et on utilise des parenthses pour marquer ici la priorit de
certaines oprations sur d'autres.
2. L'expression est termine par un double point-virgule (;;). C'est une situation gnrale
dans tout dialogue avec l'interprte, le double point-virgule marque la n d'une phrase
que l'on souhaite communiquer l'valuation. Ce marqueur mis, il ne reste plus qu' le
faire suivre d'un retour-chariot (touche Entre du clavier) pour soumettre la phrase
l'interprte.
3. Si l'expression ne contient aucune erreur de syntaxe, et est typable 3 , alors l'interprte
procde son valuation et en donne le rsultat. Dans le cas prsent, l'expression est
parfaitement bien forme (aucune erreur de syntaxe), elle est correcte du point de vue des
types mis en jeux, et l'interprte nous indique que cette expression a une valeur de type
numrique entier (int) et que sa valeur est l'entier 4.
Prcisons tout de suite qu'une expression ne doit pas ncessairement tre crite sur une seule
ligne. On peut crire une expression sur autant de lignes que l'on veut. C'est le marqueur de n ;;
qui indique l'interprte que la rdaction de l'expression est acheve. Voici la mme expression
rdige sur plusieurs lignes.
# (
4
*
(
-3
+
5
)
)
/
2
;;
- : int = 4
L'opration de division sur les nombres entiers fournit le quotient dans la division euclidienne.
Par exemple 7/3 vaut 2 et non pas environ 2.3333. Le reste de la divition est obtenu avec
l'oprateur mod.
#
#
#
-
7
:
7
:
3
:
/ 3
int
mod
int
* 2
int
;;
= 2
3 ;;
= 1
+ 1 ;;
= 7
Bien entendu, on peut calculer des nombres non entiers que nous nommerons nombres ottants
ou simplement ottants 4 . En Caml, ces nombres sont tous marqus d'un sparateur dcimal, le
point, qu'ils soient ou non dots de chires aprs la virgule.
3. Cette notion de typage sera aborde petit petit dans ce cours et les suivants.
4. Ces nombres correspondent approximativement aux nombres dcimaux.
12
CHAPITRE 1.
#
#
-
EXPRESSIONS ET INSTRUCTIONS
2. ;;
: float = 2.
2.333 ;;
: float = 2.333
Comme on peut le voir sur ces deux exemples, le type de ces nombres est float, pour nombre
virgule ottante .
En Caml, il faut distinguer les oprateurs arithmtiques portant sur des nombres entiers,
de ceux portant sur des nombres non entiers. Les oprateurs pour les quatre oprations usuelles
(addition, soustraction, multiplication et division) portant sur les nombres de type float sont
identiques ceux portant sur les nombres entiers, mais suivis d'un point. Voici l'expression
arithmtique (1.1) ci-dessus, value avec des nombres de type float.
# (4. *. (-. 3. +. 5.)) /. 2. ;;
- : float = 4.
Caml refuse systmatiquement toute expression numrique o sont mlanges des nombres
de nature direntes.
# 1 + 2. ;;
This expression has type float but is here used with type int
# 1 +. 2. ;;
This expression has type int but is here used with type float
Les deux fonctions int_of_float et float_of_int assurent la conversion d'un nombre d'un
type l'autre.
#
#
#
#
#
-
int_of_float (-2.7) ;;
: int = -2
int_of_float (2.7) ;;
: int = 2
float_of_int (2);;
: float = 2.
1 + int_of_float (2.) ;;
: int = 3
1. +. float_of_int (2) ;;
: float = 3.
1.3.
13
#
#
#
#
#
-
true ;;
: bool = true
false ;;
: bool = false
1 = 5-4 ;;
: bool = true
1 < 5-4 ;;
: bool = false
1 >= 5-4 ;;
: bool = true
not
(ngation).
(1 = 1) && (1 = 0) ;;
: bool = false
(1 = 1) || (1 = 0) ;;
: bool = true
not (1 = 0) ;;
: bool = true
Le chapitre 2 donne plus de prcisions sur les oprateurs logiques et les expressions boolennes,
ainsi que sur les expressions et instructions boolennes.
A;;
: char
a;;
: char
1;;
: char
?;;
: char
= A
= a
= 1
= ?
Les chanes de caractres sont des suites nies de caractres placs les uns la suite des
autres. Elles peuvent ne contenir aucun caractre : chane vide, et elles peuvent en contenir
jusqu' 224 6, soit plus de 16 millions de caractres. En Caml, elles sont mises entre guillemets
et leur type est dsign par string.
#
#
-
"Aa1?" ;;
: string = "Aa1?"
"";;
: string = ""
L'oprateur de concatnation qui construit une chane en mettant bout bout deux chanes
est dsign par ^.
14
CHAPITRE 1.
EXPRESSIONS ET INSTRUCTIONS
Le chapitre 7 est consacr une prsentation plus dtaille des caractres et chanes de
caractres.
1.4 Instructions
En Caml, une instruction est une expression dont la valeur est de type unit 5 . Ce type
ne contient qu'une seule valeur note (). Par consquent, cela signie que toute instruction a
pour valeur (), que cette valeur est connue avant mme que l'expression ne soit value, et
donc que ce qui importe n'est pas tant la valeur de l'instruction, que l'eet de bord qu'elle
produit. Et d'ailleurs, plutt que de parler d'valuation de l'expression, on dit plutt excution
de l'instruction.
Les eets de bord produits par l'excution d'une instruction peuvent tre de plusieurs natures :
modication de la valeur de l'environnement courant de travail, par exemple en modiant
la valeur d'une variable mutable (cf chapitre 4) ;
communication du programme avec le monde extrieur, par exemple par lecture ou criture
d'une valeur.
Voici la plus simple (et la plus inutile) des instructions.
# () ;;
- : unit = ()
L'excution de cette instruction ne provoque aucun eet de bord (ni modication de variable, ni
lecture, ni criture). Seule sa valeur est fournie par l'interprte.
Il faut bien comprendre la rponse de l'interprte l'excution de ces instructions d'impression. Dans chacun des cas, on peut voir l'impression de la valeur donnes ces instructions,
immdiatement suivie par la valeur de l'instruction qui est immuablement - : unit = ().
On pourrait prfrer qu'un saut de ligne distingue la valeur imprime de la valeur de l'instruction. La fonction print_endline eectue un saut de ligne immdiatement aprs avoir imprim
ce qu'on lui demande. Mais cette fonction ne permet l'impression que des chanes de caractres.
5. Cette dnition n'est pas tout fait exacte, mais nous nous en contenterons pour le cours de ce semestre.
Nous verrons dans le cours qui suit qu'il existe des instructions dont la valeur est d'un autre type.
1.4.
15
INSTRUCTIONS
print_newline ().
# print_newline () ;;
- : unit = ()
Comme on peut le voir sur cet exemple, cette instruction ne prend aucun paramtre. Elle se
contente d'imprimer un saut de ligne, et si rien auparavant n'a t imprim, comme c'est le cas
ici, on obtient une ligne vide. Cette instruction suit en gnral d'autres instructions d'impression,
et ncessite d'excuter une squence d'instructions. Cette notion de squence d'instructions est
prsente dans la section 1.4.3.
Comme on peut le constater sur la gure 1.1, l'eet de bord provoqu par cette instruction est
une initialisation du tas numro 1 avec trois cartes de couleurs successives , et .
En poursuivant le dialogue avec l'interprte, on dplace la carte au sommet du tas numro 1
vers le tas numro 2 et la situation atteinte est celle montre sur la gure 1.2.
# deplacer_sommet (1,2) ;;
- : unit = ()
16
CHAPITRE 1.
Figure
EXPRESSIONS ET INSTRUCTIONS
init_tas (1,"TCP")
Algorithme 1.1 Mettre les trois cartes du tas 1 vers les tas 2, 3 et 4
1: deplacer le sommet du tas 1 vers le tas 2
2: deplacer le sommet du tas 1 vers le tas 3
3: deplacer le sommet du tas 1 vers le tas 4
#
#
#
-
deplacer_sommet(1,2);;
: unit = ()
deplacer_sommet(1,3);;
: unit = ()
deplacer_sommet(1,4);;
: unit = ()
Dans ce dialogue, chacune des trois instructions est donne excuter les unes aprs les autres,
et l'interprte donne le rsultat de son travail aprs chacune d'elles (la mention - : unit = ()).
On peut aussi regrouper ces trois instructions en une seule :
# deplacer_sommet(1,2);
deplacer_sommet(1,3);
deplacer_sommet(1,4);;
- : unit = ()
L'usage du simple point-virgule pour sparer les instructions permet de les transmettre l'interprte en une seule fois, et celui-ci ne donne qu'une seule rponse. En un seul ordre, nous avons
command l'excution de trois instructions.
Cette construction est trs frquente en programmation imprative, et on la nomme squence
d'instructions. En Caml, une squence d'instructions s'obtient en sparant les instructions par
un simple point-virgule. Dans une squence d'instructions, le nombre d'instructions n'est pas
1.4.
17
INSTRUCTIONS
Figure
deplacer_sommet (1,2)
limit.
Lorsqu'une squence d'instructions est excute, toutes les instructions qui la composent sont
excutes les unes aprs les autres dans l'ordre de leur apparition dans la squence. La valeur
fournie d'une squence est la valeur de la dernire instruction, c'est--dire () en gnral.
Voici un autre exemple d'utilisation de la squence d'instructions pour produire une achage
d'une ligne compose de plusieurs lments de types distincts.
# print_string ("(4 * (-3 + 5)) / 2 = ");
print_int ((4 * (-3 + 5)) / 2) ;
print_newline () ;;
(4 * (-3 + 5)) / 2 = 4
- : unit = ()
On verra qu'il est parfois ncessaire de parenthser 7 une squence d'instructions pour viter
certaines ambiguits (cf page 28). En Caml cela peut se faire avec des parenthses ouvrante et
fermante, ou bien avec les deux mots-cls du langage begin et end. Dans la suite nous dsignerons
par bloc d'instructions toute squence place entre ces deux mots.
7. Par parenthser, il faut entendre le fait de placer une expression entre un symbole d'ouverture et un symbole
de fermeture, symboles qui peuvent tre eectivement une parenthse ouvrante (() et une parenthse fermante
()), ou tout autre couple de symboles convenus comme { et }, ou bien [ et ], ou bien encore begin et end.
18
CHAPITRE 1.
Figure
EXPRESSIONS ET INSTRUCTIONS
Ce parenthsage n'a que pour seule vocation viter des ambiguits syntaxiques, et ne change
rien l'excution de la squence qu'il contient.
# begin
print_string ("(4 * (-3 + 5)) / 2 = ");
print_int ((4 * (-3 + 5)) / 2) ;
print_newline ()
end ;;
(4 * (-3 + 5)) / 2 = 4
- : unit = ()
1.5.
EXERCICES
19
1.5 Exercices
1.5.1 Expressions numriques
Exercice 1-1
Caml
(3 + 4) 5.
3 + (4 5).
3 + 4 5.
125 (12
125 (12
204
6 ).
204
5 ).
Pour la dernire expression, expliquez la dirence sensible entre la valeur obtenue en arithmtique entire, et celle en arithmtique ottante.
1.5.2 Instructions
Exercice 1-2
Impressions de valeurs
Question 1
l'exercice
Utilisez l'une des instructions print_... pour imprimer la valeur des expressions de
Question 2
crivez une instruction qui imprime une expression arithmtique, puis le signe =, puis
la valeur de l'expression arithmtique et enn un passage la ligne. Voici un exemple, dans lequel
l'instruction a t eace.
# (* instruction effacee *)
(3+4)*5 = 35
- : unit = ()
Trouvez une squence d'instructions qui ralise cela, puis cherchez une seule instruction.
20
CHAPITRE 1.
EXPRESSIONS ET INSTRUCTIONS
Chapitre 2
Conditions, expressions et
instructions conditionnelles
2.1 Le problme
tat initial : Tas 1 un tre ou un pique les autres tas vides.
tat nal : tas 1 et 4 vides et le tas 2 contient le tre ou rien , et le tas 3 contient le pique
ou rien.
2.1.1 Algorithme
La rsolution du problme ncessite une tude de cas :
sinon
n si
21
22CHAPITRE 2.
V
V
F
F
Table
E2
V
F
V
F
E1 ou E2
V
V
V
F
L'oprateur et
L'expression E ="la carte au sommet du tas 1 est un tre et sa valeur est suprieure celle
de la carte situe au sommet du tas 2" peut se dcomposer en deux expressions simples
1. E1 ="la carte au sommet du tas 1 est un tre",
2. E2 ="la carte au sommet du tas 1 a une valeur suprieure ou gale celle du tas 2"
le lien les unissant tant le connecteur ou oprateur logique et
E = E1 et E2
2.2.
23
EXPRESSIONS BOOLENNES
E1
E2
V
V
F
F
Table
V
F
V
F
E1 et E2
V
F
F
F
L'oprateur non
L'expression E ="la carte au sommet du tas 1 n'est pas un tre" peut se dcomposer en
une expressions plus simple
1. E1 ="la carte au sommet du tas 1 est un tre",
que l'on nie.
E = non(E1 )
V
F
Table
non(E1 )
F
V
Double ngation
lment neutre du ou
lment neutre du et
lment absorbant du ou
lment absorbant du et
Idempotence du ou
Idempotence du et
Tautologie
Contradiction
Commutativit du ou
Commutativit du et
Associativit du ou
Associativit du et
Distributivit du et par rapport au ou
Distributivit du ou par rapport au et
Loi de Morgan (1)
Loi de Morgan (2)
non(non(a)) = a
a ou F = a
a et V = a
a ou V = V
a et F = F
a ou a = a
a et a = a
a ou non(a) = V
a et non(a) = F
a ou b = b ou a
a et b = b et a
(a ou b) ou c = a ou (b ou c)
(a et b) et c = a et (b et c)
a et (b ou c) = (a et b) ou (a et c)
a ou (b et c) = (a ou b) et (a ou c)
non(a ou b) = non(a) et non(b)
non(a et b) = non(a) ou non(b)
24CHAPITRE 2.
2.3 En Caml
2.3.1 Boolens
En
Caml
vrai
faux
Table
true
false
2.4 Boolens en
Caml
Figure
Exemple 1 :
Tous les exemples donns par la suite s'appuient sur une conguration des tas donne la gure
2.1.
2.3.
25
EN CAML
#
#
#
#
#
#
#
-
true ;;
: bool = true
false ;;
: bool = false
tas_vide(1);;
: bool = true
tas_non_vide(1);;
: bool = false
couleur_sommet(2) = PIQUE;;
: bool = false
couleur_sommet(2) = CARREAU;;
: bool = true
sommet_trefle(3);;
: bool = true
Oprateur logique
En Caml
Table
et ou non
&&
||
not
Exemple 2 :
#
#
#
#
#
#
#
#
#
-
2.3.3 Attention !
Les oprateurs
&&
et
||
not.
26CHAPITRE 2.
On pourrait tre tent, pour exprimer que la carte au sommet du tas 1 est un tre ou un
carreau, d'crire
couleur_sommet(1) = TREFLE || CARREAU,
mais cela est incorrect car TREFLE et CARREAU ne sont pas des boolens, mais des couleurs. Il faut
donc crire
couleur_sommet(1) = TREFLE || couleur_sommet(1) = CARREAU
En Caml, ces oprateurs ne sont pas commutatifs : les arguments sont valus squentiellement de gauche droite.
Exemple 3 :
En
, les expressions
Caml
et
sommet_trefle(1) && tas_non_vide(1)
ne sont pas quivalentes :
l'valuation de la premire expression ne dclenche jamais d'exception, car si le tas 1 est
vide, sommet_trefle(1) n'est pas valu, puisque la valeur de l'expression complte est
alors dtermine
# tas_non_vide(1) && sommet_trefle(1);;
- : bool = false
Exemple 4 :
Dans le contexte indiqu par la gure 2.1, on a
2.5.
27
INSTRUCTIONS CONDITIONNELLES
# if sommet_carreau(2) then
0
else
1 ;;
- : int = 0
# if sommet_trefle(2) then
0
else
1 ;;
- : int = 1
unit.
L'instruction conditionnelle complte (ou alternative) permet de mener une action si une
condition est satisfaite, et une autre dans le cas contraire.
Exemple 5 :
Traduction en Caml de l'algorithme dcrit la section 2.1.1.
if sommet_trefle(1) then begin
deplacer_sommet(1,2)
end else begin
deplacer_sommet(1,3)
end
La condition est ici exprime par l'expression boolenne (simple) sommet_trefle(1), le premier bloc d'instructions (celui qui suit le mot rserv then) est
begin
deplacer_sommet(1,2)
end
else)
28CHAPITRE 2.
Notez qu'il n'y a pas de ; aprs le end qui prcde le else. En revanche, si cette instruction conditionnelle est suivie d'une autre, il faudra ajouter un ; aprs le end du second bloc (end {if};).
Exemple 6 :
Dplacer la carte situe au sommet du tas 1 si c'est un tre sinon ne rien faire.
if sommet_trefle(1) then begin
deplacer_sommet(1,2)
end
else doivent
et end.
2.6.
MTHODOLOGIE
29
2.6 Mthodologie
Voici quelques principes mthodologiques concernant la conception d'instructions conditionnelles.
1. tude des cas intervenant dans le problme
commencer par distinguer les dirents cas,
vrier que ces cas sont bien exhaustifs (on n'oublie aucune situation)
vrier que ces cas ne sont pas redondants (cas exclusifs)
donner un exemple de comportement attendu de l'instruction pour chacun des cas
2. Pour chacun des cas
tablir un test (expression boolenne) permettant de distinguer le cas
dterminer la squence d'instructions excuter dans ce cas
3. Construire un jeu de tests qui permet de s'assurer de la validit du programme : ce jeu doit
comprendre au moins un test pour chacun des cas envisags.
Exemple
L'objectif atteindre est de dplacer la carte de plus grande valeur au sommet d'un des trois tas
vers le tas 4.
Rsoudre ce problme revient reprer quel tas possde en son sommet la carte de plus
grande valeur.
tude des cas Il y a videmment trois possibilits : c'est le tas 1 ou le tas 2 ou le tas 3.
Comment les distinguer ?
c'est le tas 1, si la carte au sommet du tas 1 est suprieure ou gale celle du tas 2, et
est suprieure ou gale celle du tas 3.
c'est le tas 2, si la carte au sommet du tas 2 est suprieure ou gale celle du tas 1, et
est suprieure ou gale celle du tas 3.
c'est le tas 3, si la carte au sommet du tas 3 est suprieure ou gale celle du tas 1, et
est suprieure ou gale celle du tas 2.
Autrement dit c'est le tas i si la condition superieur(i,j) && superieur(i,k) (dans
laquelle j et k dsignent les deux numros de tas autres que i) est satisfaite. Les conditions
distinguant les trois cas ne sont pas exclusives (penser aux cas d'galit).
30CHAPITRE 2.
2.7 Exercices
Exercice 2-1
En utilisant les tables de vrit, prouvez quelques proprits des oprateurs logiques et, ou et
non.
Si a et b sont deux expressions boolennes, le ou-exclusif de ces deux expressions, not a b, est
une nouvelle expression boolenne qui est vraie si et seulement si une seule des deux expressions
a ou b est vraie. La table de vrit du ou-exclusif est donne
a
V
V
F
F
Table
b
V
F
V
F
ab
F
V
V
F
Exercice 2-3
Question 1
Exprimez le fait que [a, b] et [c, d] sont des intervalles disjoints, attention au cas des
intervalles vides, par exemple si a = 15 et b = 5.
Question 2
Exprimez le fait que [a, b] et [c, d] sont des intervalles qui se recouvrent partiellement de
deux manires :
1. a = V
2. a = F
Exercice 2-5
Question 1
crivez l'instruction ci-dessous sans utiliser l'oprateur
non
si non a alors
instr1
sinon
instr2
n si
Question 2
crivez l'instruction cidessous sans utiliser l'oprateur
et
ni d'oprateurs de comparaison.
2.7.
31
EXERCICES
si aetb alors
instr1
n si
Question 3
crivez l'instruction cidessous sans utiliser l'oprateur
si aoub alors
ou
instr1
n si
Exercice 2-6
Expliquez pourquoi le programme
if superieur(1,2) && superieur(1,3) then begin
deplacer_sommet(1,4)
end;
if superieur(2,1) && superieur(2,3) then begin
deplacer_sommet(2,4)
end;
if superieur(3,1) && superieur(3,2) then begin
deplacer_sommet(3,4)
end ;;
Exercice 2-7
Reprenez le problme de la section 2.6 en admettant qu'un ou plusieurs des trois premiers tas
peut tre vide. Si les trois tas sont vides, on ne dplace aucune carte.
32CHAPITRE 2.
Chapitre 3
Instructions conditionnellement
rptes
3.1 Un problme
tat initial : Tas 1 un nombre quelconque de cartes, les autres tas vides.
tat nal : tas 1, 3 et 4 vides, le tas 2 contient toutes les cartes du tas 1 initial
3.2 Algorithme
La rsolution du problme ncessite de dplacer (une une) toutes les cartes du tas 1 vers le
tas 2. Ce qu'on peut dcrire par
n tant que
que
Une boucle tant que se termine lorsque sa condition n'est plus satisfaite. Par consquent
la sortie de la boucle, on est assur que la condition est fausse
n tant que
{condition est fausse}
3.4 La boucle
tant que
en
Caml
Comme bien des langages de programmation, Caml permet d'crire des instructions conditionnellement rptes. La syntaxe de l'instruction tant que est dcrite de manire gnrale
ci-dessous.
33
34
CHAPITRE 3.
Exemple
traduction en
Caml
while tas_non_vide(1) do
deplacer_sommet(1,2)
done
Lorsqu'elle sera xcute, cette instruction testera si le tas 1 est non vide. Si ce n'est pas le
cas (c'est--dire si le tas 1 est vide) alors l'instruction est termine, sinon (si le tas 1 n'est pas
vide), une carte sera dplace du tas numro 1 vers le tas numro 2. Ce dplacement eectu, la
vacuit du tas numro 1 sera nouveau teste, et selon le cas l'instruction est termine ou un
dplacement est eectu. Et on poursuit ainsi tant que le tas 1 n'est pas vide.
3.5 Mthodologie
La conception d'une boucle tant que ncessite plusieurs points d'attention :
la situation avant d'entrer dans la boucle (pr-condition) estelle celle souhaite ?
Par exemple, l'instruction qui suit peut tre source d'erreur.
while sommet_trefle(1) do
deplacer_sommet(1,2)
done
En eet, la condition du tant que porte sur la couleur de la carte au sommet du tas 1.
Pour cela on utilise la fonction sommet_trefle. Mais pour tre utilise, celle-ci est ncessite
que le tas numro 1 ne soit pas vide.
la situation la sortie de la boucle (post-condition) estelle bien celle souhaite ?
la boucle ne risquetelle pas d'tre innie (problme de l'arrt) ?
Par exemple, l'instruction qui peut conduire une rptition innie de dplacement d'une
carte du tas 1 vers le tas 2, puis d'un retour de la carte dplace vers son tas d'origine. En
eet si le tas 1 n'est pas vide au moment d'excuter cette instruction, la condition du tant
que est satisfaite et l'action est excute, action qui aboutit la mme situation que celle
de dpart : le tas 1 ne sera jamais vide.
while tas_non_vide(1) do
deplacer_sommet(1,2);
deplacer_sommet(2,1)
done
3.6.
EXERCICES
3.6 Exercices
Exercice 3-1
Dcrivez les relations satisfaites entre a, b et c l'issue des boucles qui suivent
1. tant que a = b faire
actions
2.
n tant que
tant que a b faire
3.
n tant que
tant que (a 6= b) ou (a > c) faire
actions
actions
n tant que
Exercice 3-2
35
36
CHAPITRE 3.
Chapitre 4
Constantes, variables
4.1 Types de donnes
En programmation, les donnes manipules peuvent tre de natures direntes : nombres
entiers, nombres rels, chanes de caractres, boolens, . . . . Ces direntes natures de donnes
sont appeles types de donnes.
Le langage Caml dispose d'un certain nombre de types prdnis.
Nom : bool
Ensemble des valeurs : true, false
Littraux : true et false
Oprateurs : &&, ||, not
Exemple 1 :
#
#
#
-
true;;
: bool = true
not(true);;
: bool = false
true || false;;
: bool = true
Nom :
int
37
38
CHAPITRE 4.
CONSTANTES, VARIABLES
Ensemble des valeurs : le type int est limit aux entiers appartenant un intervalle [[emin , emax ]],
et il y a donc un plus petit et un plus grand entier. Cet intervalle dpend de l'architecture
du processeur de l'ordinateur utilis. Sur des architectures 32 bits, on a
[[emin , emax ]] = [[230 , 230 1]] = [[1073741824, 1073741823]].
Littraux : les entiers dans leur forme crite usuelle. Par exemple : 24.
Constantes prdnies : les constantes min_int et max_int donnent les valeurs du plus petit
Exemple 2 :
(1+2)*3;;
: int = 9
9 / 2;;
: int = 4
9 mod 5;;
: int = 4
max_int;;
: int = 1073741823
min_int;;
: int = -1073741824
max_int + 1;;
: int = -1073741824
min_int - 1;;
: int = 1073741823
float
Nom : couleur
Ensemble des valeurs : Les donnes de ce type ne peuvent prendre que quatre valeurs notes :
CARREAU, TREFLE, PIQUE
et
COEUR.
Nom : numero_tas
Ensemble des valeurs : Les donnes de ce type ne peuvent prendre que quatre valeurs : 1,
2, 3
et 4.
1. Le nom complet de ces types est en fait Cartes.couleur et Cartes.numero_tas. Dans le texte du poly nous
n'employons que la notation raccourcie.
4.2.
39
VARIABLES
4.2 Variables
4.2.1 Notion de variable
Les variables servent nommer des valeurs.
Elles sont caractrises par leur nom ou identicateur, leur type et leur valeur.
<expression>
Exemple 3 :
L'expression qui dnit la valeur d'une variable peut faire rfrence d'autres variables
condition que celles-ci aient t pralablement dclares.
Exemple 4 :
Exemple 5 :
A
1a
a-b
-a
deplacer-sommet
40
CHAPITRE 4.
CONSTANTES, VARIABLES
En plus de ces rgles, certains mots ne peuvent pas tre utiliss comme identicateurs : ce
sont les mots rservs ou mots-cls du langage (cf annexe C.2).
4.2.4 Environnement
L'ensemble des variables dnies dans un contexte de calcul s'appelle un environnement.
Lorsqu'on dclare une variable, on augmente l'environnement courant de cette nouvelle variable. Ainsi si dans un certain environnement E0 on dclare la variable
# let a = 12 ;;
val a : int = 12
l'environnement qui suit cette dclaration est augment d'une variable nomme
12, et l'environnement est maintenant
et de valeur
E1 =< a, 12 >: E0 .
Aprs la dclaration
# let b = 5 ;;
val b : int = 5
l'environnement est
E2 =< b, 5 >: E1 =< b, 5 >:< a, 12 >: E0 .
On voit donc que la dclaration de variables peut augmenter l'environnement. Mais rien ne
peut faire diminuer l'environnement : une variable dclare le reste pour toute la dure de la
session.
l'environnement devient
E3 =< a, 9 >: E2 =< a, 9 >:< b, 5 >:< a, 12 >: E0 .
4.2.
41
VARIABLES
On constate que l'environnement E3 contient deux variables de mme nom a : l'une valant 12
qui dans le temps a t la premire tre dclare, l'autre valant 9 qui est la plus rcente.
Quelle est alors la valeur de l'expression a*b dans l'environnement E3 ? Dans l'expression, on
remplace la variable b par sa valeur 5, mais qu'en est-il pour a ? 9 ou 12 ? La rgle d'valuation dit
de choisir la valeur de la variable la plus rcemment dclare, autrement dit 9. Par consquent,
dans l'environnement E3 l'expression a*b vaut 45.
ab 95 45.
Dans l'environnement E3 , toute rfrence la variable a est une rfrence la variable
< a, 9 >. L'autre variable < a, 12 > est masque par < a, 9 >.
Les expressions <expressioni > sont alors toutes values dans l'environnement dans lequel
la phrase de dclaration est exprime.
Exemple 6 :
# let a
and b
val a :
val b :
# a + b
- : int
= 1
= 2;;
int = 1
int = 2
;;
= 3
c
:
d
:
= 1. ;;
float = 1.
= c +. 2. ;;
float = 3.
mais il n'est pas possible de demander la dclaration simultane qui suit si aucune dclaration
pralable d'une variable e de type float n'a t faite.
# let e = 1.
and f = e +. 2. ;;
Unbound value e
n'existe pas, et il
42
CHAPITRE 4.
# let
val e
# let
and
val e
val f
e
:
e
f
:
:
CONSTANTES, VARIABLES
= -3.;;
float = -3.
= 1.
= e +. 2. ;;
float = 1.
float = -1.
noter que dans l'environnement obtenu aprs ces dclarations, la variable e vaut 1., et f vaut
autrement dit f a t calcule avec la valeur de e dans l'environnement prcdent.
-1.,
a2
b2
1 + a2 + b2
2 + a2 + b2
on pourrait crire (en supposant que dans l'environnement courant il y ait deux variables a et b
de valeurs ottantes)
sqrt(a**2. +. b**2.) *.
(1. +. sqrt(a**2. +. b**2.)) /.
(2. +. sqrt(a**2. +. b**2.))
mais cela n'est videmment pas satisfaisant parce que d'une part
l'expression n'est pas facilement
lisible, et d'autre part dans son valuation, la sous-expression a2 + b2 va tre calcule trois fois.
Pour mener des calculs, il arrive souvent que, pour ne pas noyer le propos par de longues
formules, on utilise des notations pour les simplier. On pose que tel symbole vaut temporrairement telle valeur, et ensuite on utilise ce symboleen lieu et place de celle-ci.
Sur notre exemple cela pourrait donner : soit = a2 + b2 dans l'expression
1+
2+
Caml
est
Cette faon de mener le calcul remdie aux deux dfauts signals ci-dessus :
le code est beaucoup
plus lisible ;
la sous-expression a2 + b2 n'est calcule qu'une seule fois, et donc on gagane en ecacit.
4.2.
43
VARIABLES
Avec une telle dclaration, la variable alpha ne vient s'ajouter l'environnement courant
que pour la dure de l'valuation de l'expression qui suit. Sitt cette valuation termine, elle
est supprime, et n'existe donc pas dans l'environnement courant l'issue du calcul. Il n'y a
aucune dirence entre l'environnement avant et aprs valuation. Le problme de pollution
d'environnement est rgl.
La syntaxe gnrale de dclaration de variables locales est donne ci-dessous.
Les variables non locales dclares par une simple forme let sont appeles variables globales
par opposition locales.
on constate un avertissement sur le fait que la premire partie n'a pas le type unit, et un message
d'erreur qui montre que dans l'environnement courant la variable a n'est lie aucune valeur, et
ceci malgr la forme la dclaration qui prcde.
Utilise dans une expression conditionnelle, elle provoque un message d'erreur de syntaxe.
# if true then begin
let a = 1;
print_string ("Fini")
end ;;
44
CHAPITRE 4.
CONSTANTES, VARIABLES
Syntax error
for).
En conclusion, une dclaration globale de variable ne peut tre encapsule dans une
squence d'instructions, dans une expression conditionnelle ou dans une boucle.
En revanche, la forme let
... in ... est une expression. ce titre elle peut tre encapsule.
# let a = 1 in print_int a ;
print_newline () ;;
1
- : unit = ()
# if true then begin
let a = 1 in
print_int (a+1)
end ;;
2- : unit = ()
Algorithme
Une solution du problme consiste dplacer (une une) toutes les cartes du tas 1 vers un
autre tas (le tas 2 par exemple), et compter chaque dplacement eectu.
n tant que
Comme on peut le voir, dans cet algorithme la valeur du compteur volue durant son excution.
Une variable dont la valeur peut voluer durant l'excution d'un programme est appele variable mutable. Par opposition, nous nommerons parfois les variables non mutables des constantes.
4.3.
45
VARIABLES MUTABLES
Exemple 7 :
Dclaration d'une variable mutable compteur initialise 0.
# let compteur = ref 0 ;;
val compteur : int ref = {contents = 0}
Comme on peut le voir, cette variable n'est pas de type int, mais de type int ref. Et sa valeur
est {contents = 0}.
# compteur ;;
- : int ref = {contents = 0}
Comme compteur n'est pas de type int, on ne peut pas l'utiliser tel quel dans le contexte
d'une expression o on attend un int.
# compteur + 1;;
This expression has type int ref but is here used with type
Exemple 8 :
#
#
#
-
!compteur ;;
: int = 0
!compteur + 1;;
: int = 1
!compteur;;
: int = 0
4.3.4 Aectation
L'aectation est une instruction qui permet de changer la valeur d'une variable mutable.
La syntaxe de cette instruction est
46
CHAPITRE 4.
CONSTANTES, VARIABLES
Exemples :
1. Pour mettre zro la variable compteur prcdemment dclare
(* compteur = xxx *)
compteur := 0 ;
(* compteur = 0 *)
2. ajouter 1 au compteur
(* compteur = n *)
compteur := !compteur + 1 ;
(* compteur = n + 1 *)
Remarques :
1. Attention ne pas confondre le symbole := utilis en Caml pour l'instruction d'aectation,
avec le symbole = utilis comme oprateur de comparaison, ainsi que dans la dclaration
de variables.
2. En programmation, on est souvent amener utiliser des instructions du type
a := !a + 1
qui augmentent de 1 la valeur d'une variable (mutable). Cette opration s'appelle incrmentation et on dit qu'on incrmente une variable.
La dcrmentation est la diminution de la valeur d'une variable.
a := !a - 1
3.
Il n'en est rien du tout ! Il s'agit d'une dclaration d'une nouvelle variable a qui vient
masquer la prcdente. De plus, on ne peut pas utiliser cette forme let dans une boucle.
Par exemple, on peut crire
# let a = ref 0 ;;
val a : int ref = {contents = 0}
# while !a < 5 do
a := !a + 1;
print_int !a;
print_newline ()
done ;;
1
2
3
4
5
- : unit = ()
4.4.
47
# let a = 0 ;;
val a : int ref = {contents = 0}
# while a < 5 do
let a = a + 1;
print_int (a);
print_newline () )
done ;;
Syntax error
4. L'aectation est une opration autorise sur les variables mutables uniquement. Elle ne
l'est pas sur les variables non mutables (ou constantes).
# let a = 1 ;;
val a : int = 1
# a := 2;;
This expression has type int but is here used with type a ref
Exemple 9 :
# print_int(1234);;
1234- : unit = ()
# let a = 1234;;
val a : int = 1234
# print_int(a*2);;
2468- : unit = ()
# print_int(1234.);;
This expression has type float but is here used with type int
# print_float(1234.);;
1234.- : unit = ()
Comme on peut le voir ces instructions impriment la valeur du paramtre sans passer la
ligne. Cela peut poser problme lorsqu'on veut acher deux nombres successifs.
Exemple 10 :
# begin
print_int(1);
print_int(2)
end ;;
12- : unit = ()
Exemple 11 :
print_newline
48
CHAPITRE 4.
CONSTANTES, VARIABLES
# begin
print_int(1);
print_newline();
print_int(2);
print_newline()
end ;;
1
2
- : unit = ()
Exemple 12 :
# let a = 12
and b = 21
in
begin
print_int(a);
print_string(" + ");
print_int(b);
print_string(" = ");
print_int(a+b);
print_newline()
end ;;
12 + 21 = 33
- : unit = ()
4.6.
49
EXERCICES
4.6 Exercices
Exercice 4-1 Dclarations de variables
Dcrivez les valeurs des variables dclares l'issue des deux sessions suivantes :
let a = 1 ;;
let a = 2 ;;
let b = 2*a + 1 ;;
let a = 1 ;;
let a = 2
and b = 2*a + 1 ;;
Situation initiale :
50
CHAPITRE 4.
CONSTANTES, VARIABLES
Chapitre 5
La boucle pour
5.1 La boucle Pour
On peut calculer la somme des entiers de 1 n l'aide d'une structure itrative tant
de deux variables, i pour numrer les entiers successifs de 1 n, et S pour les cumuler.
que
et
ajouter i S
incrmenter i
P
{notons qu'on a toujours S = i1
k=1 k }
n tant que
renvoyer
Compte tenu de la condition, il est possible de dire avant l'excution de cet algorithme que
la squence d'instructions contenue dans la boucle tant que sera eectue n fois.
De manire plus gnrale, si un algorithme s'crit de cette faon
initialiser i a
n tant que
52
CHAPITRE 5.
LA BOUCLE POUR
De telles itrations dont le nombre d'tapes est dtermine par une variable qui parcourt
l'ensemble des valeurs comprises entre deux bornes est appele une boucle pour, et la variable i
est appele indice de la boucle.
On peut rcrire le calcul de la somme des entiers compris entre 1 et n en utilisant une boucle
pour.
Algorithme 5.2 Calcul de la somme des n premiers nombres entiers avec une boucle pour
Entre : n unPentier positif ou nul
Sortie : s = nk=1 k
initialiser S 0
pour i variant de 1 n faire
ajouter i P
S
{on a S = ik=1 k}
n pour
renvoyer
pour
for i = a to b do
(* sequence dinstructions *)
done
Exemple 1 :
5.2.
53
De plus, ce n'est pas une variable mutable, et on ne peut donc pas modier la valeur de cet
indice dans la squence d'instructions du corps de la boucle.
pour
for i = a downto b do
(* sequence dinstructions *)
done
Exemple 2 :
1. Ce n'est pas le cas dans tous les langages de programmation, comme par exemple C ou Pascal
54
CHAPITRE 5.
LA BOUCLE POUR
on a ici a = 1 et f (x) =
x
2
u0
un+1
1
un
1
+
2
un
1
x
n pour
renvoyer
un
Pour raliser cet algorithme en Caml, il sut d'utiliser une seule variable pour mmoriser
les valeurs successives des termes de la suite.
(* on suppose declarees ici trois variables
- a de type float
- f de type float > float
- n de type int
*)
let u = ref a
in
begin
for i = 1 to n do
u := f(!u)
done;
!u
end
5.3.
55
SUITES RCURRENTES
n tant que
renvoyer u
Remarque : si aucun terme de la suite ne satisfait la condition donne, la boucle est innie
(le programme ne s'arrte pas). Aussi avant de concevoir de tels programmes est-il important de
s'assurer qu'au moins un terme de la suite vrie la condition.
Facile programmer.
u0
u1
un+2
un+1 + un n N
56
CHAPITRE 5.
ordre total :
LA BOUCLE POUR
la suite des nombres de Catalan dnie par son premier terme et une relation
de rcurrence s'appuyant sur tous les termes qui prcdent
u0
un+1
1
n
X
uk unk n N
k=0
5.4.
57
EXERCICES
5.4 Exercices
Exercice 5-1
downto
Question 1
l'aide d'une boucle indices croissant, rcrivez l'instruction qui suit de sorte que
l'achage soit identique.
for i = n downto 1 do
print_int(i);
print_newline()
done
Question 2 En supposant que l'instruction action(i) accomplisse une certaine tche qui dpend
de i, comment rrire l'instruction
for i = b downto a do
action(i)
done
Exercice 5-5
Question 1
Ralisez un programme qui ache l'cran une ligne de n toiles, l'entier n tant donn.
L'achage du programme demand est donn ci-dessous pour n = 5 :
*****
Question 2
donn.
58
CHAPITRE 5.
LA BOUCLE POUR
*****
*****
*****
*****
*****
Question 3
Question 4 Ralisez un programme qui ache l'cran un triangle (isocle) de hauteur n pointe
en bas, l'entier n tant donn.
Une trace d'excution du programme demand est donne ci-dessous :
*****
****
***
**
*
un+1
a
un
B
+
2
2un
Question 1
Question 2
Modiez votre programme pour qu' l'excution on obtienne un achage de tous les
termes demands, raison d'un par ligne.
Par exemple, l'achage produit aura la forme qui suit pour a = 1, B = 2 et n = 5.
u(1)
u(2)
u(3)
u(4)
u(5)
=
=
=
=
=
1.5
1.41666666667
1.41421568627
1.41421356237
1.41421356237
Question 3
5.4.
EXERCICES
59
Question 2
Cette suite est croissante et tend vers + lorsque n tend vers +. crivez une fonction
qui calcule l'indice du premier terme suprieur ou gal un rel positif s pass en paramtre.
60
CHAPITRE 5.
LA BOUCLE POUR
Chapitre 6
Les fonctions
6.1 Les fonctions
Nous avons dj rencontr et utilis plusieurs fonctions : tas_non_vide, couleur_sommet,
du module Cartes, ainsi que not, et bien d'autres encore.
Le but de ce chapitre est de voir comment crer nos propres fonctions.
Une fonction permet d'abstraire et de nommer un calcul ou une expression. Une fois dnie,
une fonction peut tre utilise pour produire de nouvelles expressions du langage.
Contrairement aux instructions, un appel une fonction ne doit pas modier l'tat courant
de l'environnement.
superieur
Exemple 1 :
La fonction prdnie donnant la ngation d'un boolen en Caml est une fonction nomme not,
qui opre sur un paramtre de type bool, dont la valeur renvoye est aussi de type bool et pour
laquelle il n'y a aucune contrainte d'utilisation. Nous rsumons tout cela par la notation :
not : bool
a
7
Exemple 2 :
bool
.
a
Un autre exemple est la fonction du module Cartes qui permet de comparer les hauteurs des
cartes situes au sommet de deux tas. Cette fonction est nomme superieur, elle prend deux
paramtres de type Cartes.numero_tas, et renvoie une valeur de type bool. Elle possde aussi
61
62
CHAPITRE 6.
LES FONCTIONS
une contrainte d'utilisation qui exige qu'aucun des deux tas passs en paramtre ne soit vide.
Tout cela est rsum par la notation :
superieur : numero_tas numero_tas
7
n, p
bool
Exemple 3 :
bool
est rouge
faux sinon
Le code en
Caml
let rouge(n) =
sommet_coeur(n) || sommet_carreau(n)
6.1.
63
LES FONCTIONS
Exemple 4 :
La fonction
factorielle
peut s'crire en
factorielle : int
n
CU : n 0
int
n!
Caml
let factorielle(n) =
let f = ref 1
in
for i=1 to n do
f := !f*i
done;
!f
Une fonction peut utiliser toute variable globale, condition qu'elle soit dclare avant la
fonction.
Exemple 5 :
Le code
let un = 1
let plus_un(n) =
n + un
int
.
n+1
Mais si on rednit la constante sans rednir la fonction, c'est toujours l'ancienne valeur de
la constante qui est prise en compte.
# let un = 2;;
val un : int = 2
# plus_un(0);;
- : int = 1
64
CHAPITRE 6.
LES FONCTIONS
Exemple 6 :
La fonction
puissance
peut s'crire en
Caml
int
an
avec le code
let puissance1(a,n) =
let p=ref 1
in
for i=1 to n do
p := !p*a
done;
!p
Exemple 7 :
Caml
float
an
avec le code
let puissance2(a,n) =
let p=ref 1.
in
for i=1 to n do
p := !p*.a
done;
!p
Un appel une fonction plusieurs paramtres doit se faire avec le bon nombre et le bon
type des paramtres. Ainsi, dans l'exemple
#
#
-
puissance1(2,10);;
: int = 1024
puissance2(2.,10);;
: float = 1024.
les deux appels de fonction sont corrects car eectus avec le bon nombre et les bons types de
paramtres. Mais dans l'exemple
# puissance1(2);;
This expression has type int but is here used with type int * int
6.1.
65
LES FONCTIONS
l'interprte signale une erreur dans l'appel la fonction puissance1 parce qu'un seul entier a
t pass en paramtre au lieu des deux attendus, et dans l'exemple
# puissance2(2,10);;
This expression has type int * int but is here used with type float * int
il signale une erreur parce qu'au lieu du couple (rel, entier) attendu par la fonction puissance2,
un couple (entier, entier) lui a t pass.
unit.
Exemple 8 :
Exemple 9 :
se code en
int
1
Caml
let un() = 1
Exemple 10 :
type de x
valeur de x
Il est bien entendu pralablement ncessaire d'avoir dclar une variable mutable x.
# let valeur_de_x() = !x;;
Unbound value x
valeur_de_x
est
66
CHAPITRE 6.
#
#
#
-
LES FONCTIONS
valeur_de_x();;
: int = 1
x := 2;;
: unit = ()
valeur_de_x();;
: int = 2
Exemple 11 :
Supposons que nous voulions programmer une fonction qui simule le lancer d'une pice de monnaie. Cette fonction doit donner le rsultat "PILE" ou "FACE" de manire alatoire.
pile_ou_face : unit
()
7
string
.
PILE ou FACE
int
p
pile_ou_face();;
: string = "PILE"
pile_ou_face();;
: string = "FACE"
pile_ou_face();;
: string = "FACE"
pile_ou_face();;
: string = "PILE"
6.2.
PROCDURES
67
6.2 Procdures
Nous avons dj rencontr et utilis plusieurs procdures : init_tas et deplacer_sommet du
module Cartes.
Une procdure permet de crer une nouvelle action, ou encore d'abstraire et nommer une suite
d'instructions. Une fois dnie, une procdure peut tre utilise comme une nouvelle instruction
du langage.
Comme toute instruction, un appel une procdure modie l'tat courant de l'environnement : c'est un eet de bord.
Exemple 12 :
let tout_mettre_sur_tas1 () =
(* vider le tas 2 sur le tas 1 *)
while tas_non_vide(2) do
deplacer_sommet(2,1)
done;
(* vider le tas 3 sur le tas 1 *)
while tas_non_vide(3) do
deplacer_sommet(3,1)
done;
(* vider le tas 4 sur le tas 1 *)
while tas_non_vide(4) do
deplacer_sommet(4,1)
done
68
CHAPITRE 6.
LES FONCTIONS
Exemple 13 :
let vider_tas(depart,arrivee) =
while tas_non_vide(depart) do
deplacer_sommet(depart,arrivee)
done
Cette procdure a pour nom vider_tas et possde deux paramtres (depart et arrivee)
qualis de formels, car lors de la conception (ou criture) de cette procdure, ces paramtres
n'ont aucune valeur. Ils servent nommer les (futures) valeurs qui seront passes lors d'un appel
la procdure.
6.2.5 Mthodologie
SPECIFIER, SPECIFIER, SPECIFIER
6.3.
69
EXERCICES
6.3 Exercices
6.3.1 Fonctions
Exercice 6-1
Question 1
Question 2
Exercice 6-2
Ralisez et testez une fonction tas_tous_vides qui renvoie un boolen indiquant si tous les tas
sont vides.
Exercice 6-3
Question 1
Ralisez une fonction tas_max qui donne le numro du tas dont le sommet a la carte de
valeur la plus leve, parmi les deux tas passs en paramtres. Ne pas oublier les CU.
Question 2
Question 3
Ralisez une fonction tas_max3 analogue la prcdente pour trois tas passs en paramtres.
Mme chose pour quatre tas ! (paramtres ou non ?)
Ralisez une fonction qui renvoie le ou-exclusif des deux boolens passs en paramtres.
bool
vrai si n est divisible par p
faux sinon
CU : p 6= 0
int
annee
bool
vrai si annee est bissextile
faux sinon
70
CHAPITRE 6.
LES FONCTIONS
Ralisez de deux faons la fonction qui deux entiers associe le coecient binomial
1. une premire faon utilisant la fonction factorielle ;
2. une seconde faon exploitant la simplication
n
p
n
n (n 1) . . . (n p + 1)
=
.
p
p (p 1) . . . 1
b 2c
d 2e
b 2c
d 2e
= 2
= 1
Question 1
Ralisez une fonction nomme plancher qui calcule le plancher du nombre rel x pass
en paramtre 1 . Il est conseill de se concentrer d'abord sur le cas des rels positifs ou nuls, puis de
gnraliser.
Question 2
De mme, ralisez une fonction nomme plafond pour le plafond dun rel.
Ralisez une fonction qui simule un d. Cette fonction renvoie au hasard un entier compris entre
1 et 6.
Raliser et tester un prdicat tas1_ordonne qui renvoie vrai si le tas numro 1 est rang dans
l'ordre croissant. Le tas vide est ordonn, les tas d'une cartes le sont aussi. Un tas est ordonn
lorsque toute carte du tas est suprieure au sens large toutes celles qu'elle surmonte. (comme
pour l'exercice prcdent plusieurs versions sont possibles).
1. Cette fonction est prdnie dans l'unit math et se nomme floor.
6.3.
EXERCICES
71
6.3.2 Procdures
Exercice 6-13
crire l'entte de la procdure deplacer_sommet du module Cartes. (Le type qui dnit les
couleurs se nomme couleurs, et celui qui dnit les tas se nomme numero_tas.)
Exercice 6-14
Exercice 6-15
Question 1
Reprendre la procdure tout_mettre_sur_tas1 en utilisant la procdure vider_tas. (attention l'ordre des dclarations de ces procdures)
Question 2
Faire une version paramtre par le numro du tas sur lequel on veut tout mettre.
Exercice 6-16
Spciez et ralisez une procdure qui ache la table de multiplication par un entier donn en
paramtre.
72
CHAPITRE 6.
LES FONCTIONS
Chapitre 7
Exemple 1 :
# let espace = ;;
val espace : char =
Les constantes littrales de type char sont dsignes entre deux apostrophes.
On peut aussi dclarer des variables mutables de type char.
Exemple 2 :
# let c = ref a;;
val c : char ref = {contents = a}
Exemple 3 :
# print_char(!c);;
a- : unit = ()
73
74
CHAPITRE 7.
Exemple 4 :
porte le numro 64 et le
La gure 7.1 donne pour les 128 premiers caractres leur numro associ (code ASCII 1 ).
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
Figure
La fonction
0
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
ESP
!
"
#
$
%
&
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
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
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
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
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
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
int_of_char
Exemple 5 :
1. ASCII = American Standard Code for Information Interchange
7.2.
#
#
#
-
75
int_of_char( );;
: int = 32
int_of_char(A);;
: int = 65
int_of_char(a);;
: int = 97
Exemple 6 :
# for i=65 to 70 do
print_char (char_of_int(i))
done;;
ABCDEF- : unit = ()
Une chane de longueur nulle ne comprend aucun caractre : c'est la chane vide.
En Caml, les chanes de caractres forment le type string et leur longueur est limite
224 6 = 16 777 210 caractres.
Il est possible de dclarer des variables de type string.
Exemple 7 :
# let chaine1
and chaine2
val chaine1 :
val chaine2 :
= "TIMO"
= "LEON";;
string = "TIMO"
string = "LEON"
76
CHAPITRE 7.
Les constantes littrales de type string sont dsignes entre deux guillemets.
Il est possible d'crire une donne de ce type au moyen des procdures print_string et
print_endline.
Exemple 8 :
# begin
print_string("Bonjour, je mappelle ");
print_string(chaine1);
print_endline(chaine2);
print_endline("Et vous, comment vous appelez-vous ?")
end;;
Bonjour, je mappelle TIMOLEON
Et vous, comment vous appelez-vous ?
- : unit = ()
chaine1.[0];;
: char = T
chaine1.[1];;
: char = I
chaine1.[2];;
: char = M
chaine1.[3];;
: char = O
7.2.
77
Les chanes de caractres sont des structures de donnes mutables. On peut modier un
caractre d'une chane de caractres l'aide de la notation indicielle. Pour modier le caractre
d'indice i d'une chane s, on utilise la che <-.
Exemple 10 :
# let c = "TiMOLEON";;
val c : string = "TiMOLEON"
# c.[1] <- I;;
- : unit = ()
# c ;;
- : string = "TIMOLEON"
L'accs un caractre d'une chane s n'est possible que si l'indice i est compris entre 0 et
|s| 1. Toute tentative d'accs un caractre d'indice situ en dehors de cet intervalle dclenche
l'exception Invalid_argument
7.2.3 Concatnation
La concatnation de deux chanes de caractres s1 et s2 est l'opration consistant mettre
bout bout ces deux chanes. La chane ainsi obtenue est appele concatne de s1 et s2 .
En Caml, c'est l'oprateur ^ qui permet d'exprimer la concatnation de deux chanes de
caractres.
Exemple 11 :
# chaine1^chaine2;;
- : string = "TIMOLEON"
La longueur de la chane de caractres s1 ^s2 est gale la somme des longueurs de chacune
des deux chanes
|s1 ^s2 | = |s1 | + |s2 |.
78
CHAPITRE 7.
String.
String.length : string
s
int
.
String.length(s) = |s|
Exemple 12 :
#
#
-
String.length("TIMOLEON");;
: int = 8
String.length("");;
: int = 0
String.create(n)
string
String.create(n) ,
Exemple 13 :
# String.create(10);;
- : string = "<\135\236\183\024\017/\008\000\000"
string
,
String.copy(s)
o String.copy(s) est une nouvelle chane copie de la chane s, c'estdire une chane
gale s.
Exemple 14 :
7.3.
79
# let s1 = "tIMOLEON" ;;
val s1 : string = "tIMOLEON"
# let s2 = String.copy (s1) ;;
val s2 : string = "tIMOLEON"
# s1 = s2 ;;
- : bool = true
# s1.[0] <- T ;;
- : unit = ()
# s1 ;;
- : string = "TIMOLEON"
# s2 ;;
- : string = "tIMOLEON"
80
CHAPITRE 7.
7.4 Exercices
Exercice 7-1
Exercice 7-2
Exercice 7-3
string_of_char
Ralisez la fonction
string_of_char : char
c
7
string
s
string_of_char(a) ;;
: string = "a"
string_of_char(1) ;;
: string = "1"
string_of_char(+) ;;
: string = "+"
string
s
string_of_int(123) ;;
: string = "123"
string_of_int(-12) ;;
: string = "-12"
7.4.
81
EXERCICES
Exemple 15 :
#
#
#
#
-
sous_chaine("TIMOLEON",0,1);;
: string = "T"
sous_chaine("TIMOLEON",1,3);;
: string = "IMO"
sous_chaine("TIMOLEON",4,4);;
: string = "LEON"
sous_chaine("TIMOLEON",0,8);;
: string = "TIMOLEON"
Ralisez la fonction
miroir : string
s
string
.
miroir(s)
Question 1
Question 2
Initialisez le tas 1 avec des tres dont le nombre est donn par l'utilisateur.
Question 3
82
CHAPITRE 7.
Ralisez une fonction initiale qui donne le caractre initial (c'est--dire le premier) d'une
chane de caractres. Cette fonction a-t-elle des contraintes d'utilisation ?
Question 2 Ralisez une fonction finale qui donne le caractre nal (c'est--dire le dernier) d'une
chane de caractres. Cette fonction a-t-elle des contraintes d'utilisation ?
Question 3 Ralisez une fonction sauf_initiale qui donne la chane passe en paramtre sans son
initiale. Cette fonction a-t-elle des contraintes d'utilisation ?
Une chane de caractres s1 est un prxe d'une autre s2 si la chane s1 est le dbut de la chane
s2 . titre d'exemple, les prxes de TIMOLEON sont , T, TI, TIM, TIMO,TIMOL,
TIMOLE, TIMOLEO
et TIMOLEON.
Ralisez de deux faons direntes une fonction qui teste si une chane (premier paramtre
de la fonction) est un prxe d'une autre (second paramtre de la fonction).
Exercice 7-11
Ralisez une fonction qui retourne le plus petit (aus sens de l'ordre dni dans la section 7.1.3)
caractre de la chane de caractres passe en paramtre.
Annexe A
Les cartes
A.1 Prsentation
Le module Cartes ore une extension du langage Caml an d'crire des programmes destins
un robot manipulateur de cartes.
Le domaine de travail du robot est constitu de tas, numrots 1,2,3,4, sur lesquels sont
empiles des cartes jouer. Ces cartes ont les couleurs habituelles (, , et ) et les valeurs
habituelles (par ordre croissant : as, deux, trois, . . . , dix, valet, dame, roi). Les cartes proviennent
de plusieurs jeux, il est donc possible de trouver plusieurs exemplaires d'une mme carte.
Chacun des quatre tas peut contenir un nombre quelconque de cartes, y compris aucune.
84
ANNEXE A.
LES CARTES
$ ocamlcartes
Chargement des images. Patientez quelques instants.
....................................................
Objective Caml version 3.10.0
Camlcartes
FIL IEEA univ. Lille 1 (2009)
pour obtenir de laide : aide_moi () ;;
#
Ceci accompli, on peut faire rfrence tous les lments dclars dans le module en utilisant
leur nom non prx par celui du module.
# init_tas (1,"T") ;;
- : unit = ()
open Cartes
a t excute.
Cartes
Syntaxe :
A.3.
LE LANGAGE DU MODULE
85
CARTES
Si A et B sont des chanes de description, la chane A+B est aussi une chane de description
qui reprsente un choix entre les cartes de A ou celles de B ;
Si A est une chane de description, [A] reprsente la rptition des cartes de A un nombre
quelconque (dni de manire alatoire) de fois (y compris zro).
Les parenthses sont autorises pour viter les ambiguts.
Exemple 1 :
1. init_tas(1,"") dclare le tas numro 1 vide.
2. l'instruction init_tas(2,"TCK") dcrit le tas numro 2 contenant de bas en haut un ,
un et un .
3. l'instruction init_tas(3,"T+P") dcrit le tas numro 3 contenant une carte qui est soit
un soit un .
4. init_tas(4,"[T+P]") dcrit le tas numro 4 contenant un nombre quelconque, non dtermin, de cartes de couleur ou .
5. l'instruction init_tas(1,"T+[P]CC") dcrit le tas numro 1 contenant soit une seule carte
de couleur , soit un nombre quelconque de surmont de deux .
6. l'instruction init_tas(1,"(T+[P])CC") dcrit le tas numro 1 contenant soit trois cartes
un surmont de deux , soit un nombre quelconque de surmont de deux . noter
qu'une autre faon de dcrire la mme initialisation est d'utiliser la chane "TCC + [P]CC".
Une instance possible de l'tat des quatre tas aprs excutions des instructions numrotes
1, 2, 3 et 5 est donne par la partie gauche de la gure A.1 page 86.
Remarque :
Tout programme de rsolution d'un problme sur les cartes doit dbuter par
une initialisation des quatre tas l'aide de l'instruction init_tas. Une fois cette initialisation
eectue, cette instruction n'est plus utilise. Il s'en suit qu'aprs l'tape d'initialisation, le
nombre de cartes globalement prsentes sur les quatre tas ne varie pas.
A.3.2 Action
La seule action permettant de modier l'tat des tas est le dplacement de la carte situe
au sommet d'un tas vers le sommet d'un autre tas. Cette action est donne par un appel la
procdure deplacer_sommet 2 paramtre par un couple :
Syntaxe :
deplacer_sommet(n,p)
o n est le numro du tas duquel on prend une carte, et p est celui du tas sur lequel on la pose.
Exemple 2 :
CU : Il n'est pas permis de dplacer une carte situe sur un tas vide. Toute tentative d'action
deplacer_sommet(n,p)
86
ANNEXE A.
(a) 1
Figure
LES CARTES
(b) 2
Test de vacuit
Pour tester si un tas est vide, on fera appel la fonction 3
Syntaxe :
tas_vide(n)
qui donne la valeur vrai (true en anglais, et en Caml) si le tas numro n est vide,
en anglais et en Caml) dans le cas contraire.
On peut faire le test contraire en faisant appel la fonction
Syntaxe :
tas_non_vide(n)
faux (false
Syntaxe :
A.3.
LE LANGAGE DU MODULE
87
CARTES
Exemple 3 :
if couleur_sommet(2)=PIQUE then ...
CU : Il est normalement dnu de sens de tester la couleur de la carte situe au sommet d'un
tas vide. Toute tentative d'appel couleur_sommet(n) dclenche l'exception Tas_Vide si le tas
n est vide.
Quatre autres fonctions 5 permettent aussi de tester la couleur du sommet d'un tas
Syntaxe :
sommet_trefle(n)
sommet_carreau(n)
sommet_coeur(n)
sommet_pique(n)
qui donnent la valeur vrai si le sommet du tas n est un (,,) et faux dans le cas contraire.
Elles sont soumises la mme contrainte d'utilisation que la fonction couleur_sommet, et
dclenchent la mme exception en cas de non respect de cette contrainte.
Syntaxe :
superieur(n,p)
qui donne la valeur vrai si la carte au sommet du tas numro n a une valeur suprieure ou gale
celle du tas numro p, et la valeur faux dans le cas contraire.
CU : On ne peut comparer les cartes situes au sommet de deux tas que s'ils ne sont pas vides.
Tout appel superieur(n,p) dclenche l'exception Tas_Vide si l'un des tas n ou p est vide.
88
ANNEXE A.
LES CARTES
# deplacer_sommet(4,1) ;;
deplacer_sommet(4,1);;
(*
._____. *)
(*
| 3P | *)
(*
._____. *)
(*
| 10P | *)
(*
._____. *)
(*
| vP | *)
(*
._____. *)
(*
| 5P | *)
(*
._____.
._____. *)
(*
| 5T |
| 4P | *)
(* ._____.
._____.
._____.
._____. *)
(* | 7P |
| 6T |
| 6K |
| dP | *)
(*____________________________________________*)
- : unit = ()
3. mode texte et graphique : Dans ce mode, on visualise l'volution des tas de cartes la
fois dans le terminal et dans une fentre graphique.
Le mode d'achage par dfaut est le mode graphique. L'instruction
affichage_en_mode_texte ()
Remarque : Le mode texte permet de conserver une trace de l'excution d'un programme dans
un chier texte. Par exemple, si un chier nomm exo.ml contient un programme de rsolution
d'un problme sur les cartes, et s'il contient une instruction demandant un achage textuel,
alors dans un terminal la commande
$ ocamlcartes exo.ml > exo.result
produit un chier texte nomm exo.result contenant toutes les instructions excutes suivies
de l'tat des tas de cartes qu'elles transforment.
Vitesse d'excution
Un dlai est impos entre l'excution des instructions de manipulation des tas. Le temps
d'attente peut tre ajust en fonction des besoins. Le module fournit deux lments permettant
de consulter (quel_delai) 7 et de modier (fixer_delai) 8 cette temporisation.
Pour augmenter la vitesse d'excution, il sut de diminuer la valeur relle.
6. Ces trois procdures sont de type unit unit
7. dont le type est unit float
8. dont le type est float unit
A.3.
LE LANGAGE DU MODULE
CARTES
89
fixer_delai(0.1)
Pause
L'instruction pause 9 permet de faire une pause durant l'excution d'un programme. Elle
s'utilise en communiquant un message en paramtre, message qui sera imprim dans le terminal
lors de la pause. La pause s'arrte ds l'appui sur la touche Entre.
pause ("un petit repose bien merite")
Plus rien n'est possible avant l'excution de l'instruction Admin.repare (). Cette instruction
permet de rparer l'automate (les lignes rouges de la fentre graphique disparaissent), et de
poursuivre les actions sur les tas de cartes.
#
#
-
Admin.repare ();;
: unit = ()
deplacer_sommet(2,3) ;;
: unit = ()
90
ANNEXE A.
LES CARTES
A.4 Exercices
, moyen
et dicile
Exercice A-1
Pour chacune des descriptions qui suivent, donnez l'instruction d'initialisation du tas qui convient :
A.4.
91
EXERCICES
A.4.2 Squence
Dans tous les exercices qui suivent, l'nonc dcrit une situation initiale des quatre tas de
cartes (dans la syntaxe du module Cartes), et la situation nale atteindre.
Exercice A-2
Situation initiale :
Tas 1 :
Tas 3 :
"TT"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
""
""
Tas 2 :
Tas 4 :
"TT"
""
Situation nale :
Exercice A-3
Situation initiale :
Tas 1 :
Tas 3 :
"TK"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"KT"
""
Tas 2 :
Tas 4 :
""
""
Situation nale :
Exercice A-4
Situation initiale :
Tas 1 :
Tas 3 :
"TKTK"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"KKTT"
""
Tas 2 :
Tas 4 :
""
""
Situation nale :
Exercice A-5
Situation initiale :
Tas 1 :
Tas 3 :
"TKCP"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"PCKT"
""
Tas 2 :
Tas 4 :
""
""
Situation nale :
A.4.3 Conditionnelle
Exercice A-6
Situation initiale :
Tas 1 :
Tas 3 :
"T+P"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
""
"[P]"
Tas 2 :
Tas 4 :
"[T]"
""
Situation nale :
Exercice A-7
92
ANNEXE A.
Situation initiale :
Tas 1 :
Tas 3 :
"(T+K+C+P)(T+K+C+P)"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
""
"(T+K+C+P)(T+K+C+P)"
Tas 2 :
Tas 4 :
""
""
Situation nale :
LES CARTES
le symbole signiant que les cartes sont dans l'ordre croissant (i.e. la carte du dessous a une
valeur infrieure ou gale celle du dessus).
Exercice A-8
Situation initiale :
Tas 1 :
Tas 3 :
"T+K+C+P"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"[T]"
"[C]"
Tas 2 :
Tas 4 :
"[K]"
"[P]"
Situation nale :
Exercice A-9
Situation initiale :
Tas 1 :
Tas 3 :
"(T+K+C+P)(T+K+C+P)"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"[K+C]"
""
Tas 2 :
Tas 4 :
"[T+P]"
""
Situation nale :
A.4.
93
EXERCICES
A.4.4 Itration
Exercice A-10
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
""
""
Tas 2 :
Tas 4 :
"[T]"
""
Situation nale :
Exercice A-11
Situation initiale :
Tas 1 :
Tas 3 :
"[K+C][T+P]"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"[T+P][K+C]"
""
Tas 2 :
Tas 4 :
""
""
Situation nale :
Exercice A-12
Situation initiale :
Tas 1 :
Tas 3 :
"[K]"
""
Tas 2 :
Tas 4 :
"[T]"
""
Tas 1 :
Tas 3 :
"[K]"
"[KT]"
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
""
"[KT]"
Tas 2 :
Tas 4 :
"[T]"
""
Situation nale :
ou bien :
Exercice A-13
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
""
"[T]"
Tas 2 :
Tas 4 :
"[T]"
""
Situation nale :
le nombre de cartes des deux tas 2 et 3 dirant d'au plus 1 dans la situation nale.
Exercice A-14
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
"[P]"
Tas 2 :
Tas 4 :
"[K]"
""
Tas 1 :
Tas 3 :
""
"[K]"
Tas 2 :
Tas 4 :
"[T]"
"[P]"
Situation nale :
vider_tas(depart,arrivee)
qui
94
ANNEXE A.
Exercice A-15
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
"[C]"
Tas 2 :
Tas 4 :
"[K]"
"[P]"
Tas 1 :
Tas 3 :
"[P]"
"[K]"
Tas 2 :
Tas 4 :
"[T]"
"[C]"
Situation nale :
Exercice A-16
Situation initiale :
Tas 1 :
Tas 3 :
"[T][K][C][P]"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"[P][C][K][T]"
""
Tas 2 :
Tas 4 :
""
""
Situation nale :
Exercice A-17
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
"[P]"
Situation nale :
Tas 2 :
Tas 4 :
LES CARTES
"[K]"
""
Tas 1 : ""
Tas 2 : ""
Tas 3 : ""
Tas 4 : "[TKP][XY ][Z ]"
o X et Y dsignent les deux couleurs restantes lorsque l'une des couleurs manque, et Z dsigne
la couleur restante lorsque X ou Y manque.
Exercice A-18
Situation initiale :
Tas 1 :
Tas 3 :
"[T+K+C+P]"
""
Tas 2 :
Tas 4 :
""
""
Tas 1 :
Tas 3 :
"[T]"
"[C]"
Tas 2 :
Tas 4 :
"[K]"
"[P]"
Tas 2 :
Tas 4 :
""
""
Situation nale :
Exercice A-19
Situation initiale :
Tas 1 :
Tas 3 :
"T[T]"
""
Situation nale :
Tas 1 : ""
Tas 2 : "T"
Tas 3 : "[T]"
Tas 4 : ""
le symbole indique que la carte est de valeur minimale.
Exercice A-20
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
""
Situation nale :
Tas 2 :
Tas 4 :
""
""
Tas 1 : ""
Tas 2 : "[T]
Tas 3 : ""
Tas 4 : ""
le symbole signiant que les cartes sont ranges par ordre croissant de valeurs de bas en haut.
Exercice A-21
A.4.
95
EXERCICES
Situation initiale :
Tas 1 :
Tas 3 :
"[T+K]"
""
Situation nale :
Tas 2 :
Tas 4 :
""
""
Exercice A-22
Situation initiale :
Tas 1 :
Tas 3 :
"K[T]"
""
Situation nale :
Tas 2 :
Tas 4 :
""
""
Tas 1 : "[T+K]"
Tas 2 : "[T+K]"
Tas 3 : "[T+K]"
Tas 4 : "[T+K]"
les tres tant quitablement rpartis sur les quatre tas, l'unique carreau se trouvant n'importe
o.
Remarque : ce problme est infaisable sans le carreau.
Exercice A-23
Situation initiale :
Tas 1 :
Tas 3 :
"[T]"
"[C]"
Situation nale :
Tas 2 :
Tas 4 :
"[K]"
"[P]"
Tas 1 : "[T]"
Tas 2 : "[K]"
Tas 3 : "[C]"
Tas 4 : "[P]"
le symbole signiant que les cartes sont ranges par ordre croissant de valeurs de bas en haut.
Question 1
vide ?
Quel problme pose cette fonction si lors d'un appel le tas tas pass en paramtre est
Question 2
crivez une fonction qui teste l'galit de la valeur de deux cartes situes au sommet
de deux tas que l'on supposera non vide.
Question 2
Puis crivez une fonction qui teste l'galit de deux cartes (valeur et couleur) situes
au sommet de deux tas supposs non vides.
inverser_tas1
96
ANNEXE A.
Question 1
Question 2
LES CARTES
inverser_tas1 (),
on
Annexe B
Le module
Camlgraph
B.1 Prsentation
Le module Camlgraph est une adaptation du module graphics livr avec toutes les distributions de Objective Caml. Il reprend les mmes fonctions avec les mmes noms. La seule
dirence rside dans le fait que toutes les fonctions y sont dcurryes.
Ce module permet de dessiner des points, des segments, des polygones, des cercles, de remplir
certaines zones dans une fentre graphique. Cette fentre graphique peut tre considre comme
un tableau de points reprs par leurs coordonnes (cf gure B.1). Ces coordonnes sont des
nombres entiers. Seuls les points dont les deux coordonnes sont positives ou nulles et infrieures
la largeur et la hauteur de la fentre sont visibles.
Figure
Le programme ci-dessous illustre une utilisation de ce module. Son excution produit l'image
prsente sur la gure B.2.
97
98
(*
(*
(*
(*
(*
(*
ANNEXE B.
auteur : EW
date
: mai 2009
objet : dessin de cercles
concentriques de
couleurs aleatoires
utilise le module Camlgraph
LE MODULE
CAMLGRAPH
*)
*)
*)
*)
*)
*)
open Camlgraph ;;
let largeur = 600
and hauteur = 400
B.2 Module
Camlgraph
Author(s) : FIL
B.2.
MODULE
99
CAMLGRAPH
Figure
fentre graphique
w=
Camlgraph
largeur, h = hauteur.
100
ANNEXE B.
LE MODULE
CAMLGRAPH
Couleurs prdnies
val black : color
val white : color
val red : color
val green : color
val blue : color
val yellow : color
val cyan : color
val magenta : color
de coordonnes (x,y).
au point de coordonnes
(x,y).
val curveto : (int * int) * (int * int) * (int * int) -> unit
B.2.
MODULE
101
CAMLGRAPH
points
val draw_arc : int * int * int * int * int * int -> unit
draw_arc (x,y,rx,ry,a1,a2) dessine un arc d'ellipse de centre (x,y),
horizontal rx, de rayon vertical ry, entre les angles a1 et a2.
val draw_ellipse : int * int * int * int -> unit
draw_ellipse (x,y,rx,ry) dessine une ellipse de centre (x,y),
de rayon vertical ry.
val draw_circle : int * int * int -> unit
draw_circle (x,y,r) dessine un cercle de
de rayon
de rayon horizontal
rx,
B.2.4 Texte
val draw_char : char -> unit
draw_char (c)
dessine le caractre
la position courante.
courantes.
B.2.5 Remplissage
val fill_rect : int * int * int * int -> unit
fill_rect (x,y,w,h) remplit le rectangle dont le coin infrieur gauche a
coordonnes (x,y), de largeur w et de hauteur w, avec la couleur courante
val fill_arc : int * int * int * int * int * int -> unit
pour
102
ANNEXE B.
LE MODULE
CAMLGRAPH
couleur courante
(x,y),
de
de
Annexe C
begin
(* sequence dinstructions *)
end
103
104
ANNEXE C.
C.2.
105
MOTS-CLS DU LANGAGE
for i = a to b do
(* sequence dinstructions *)
done
for i = a downto b do
(* sequence dinstructions *)
done
Rappel
en un entier.
106
ANNEXE C.
entre 0 et 255.
ASCII).
n'est pas un entier compris
male.
C.3.2 Impressions
et passe la ligne.
C.4 Directives
#quit : pour quitter l'interprte.
#use <nom fichier> : pour charger
valuer.
Annexe D
This expression has type . . . but is here used with type . . . message d'erreur lorsqu'une
expression n'est pas typable par inadquation des types de certaines sous-expressions.
# 1 + 2. ;;
This expression has type float but is here used with type int
# print_string (1);;
This expression has type int but is here used with type string
Unbound value ... message d'erreur lorsque dans l'valuation d'une expression une variable
non pralablement dclare intervient.
# a + 1;;
Unbound value a
Unbound constructor ... message d'erreur lorsque dans une expression intervient un construc-
teur non dclar. En Caml, les constructeurs sont dsigns par des identicateurs dbutant
par une lettre majuscule.
# init_tas(2,TT);;
Unbound constructor TT
# let a = 1 in a*a + A ;;
Unbound constructor A
This function is applied to too many arguments, maybe you forgot a ` ;' message d'erreur lorsqu'on prcise d'avantange de paramtres qu'il n'est ncessaire.
107
108
ANNEXE D.
This expression is not a function, it cannot be applied message d'erreur lorsqu'on essaie
d'utiliser une valeur comme une fonction...
# let a = 3 ;;
val a : int = 3
# a(4);;
This expression is not a function, it cannot be applied
Bibliographie
[EC00] Bruno Pagano Emmanuel Chailloux, Pascal Manoury. Dveloppement d'applications
avec Objective Caml. O'Reilly, 2000. Disponible en ligne l'adresse http://www.pps.
jussieu.fr/Livres/ora/DA-OCAML/.
109
110
BIBLIOGRAPHIE
Calcul de n! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mettre les trois cartes du tas 1 vers les tas 2, 3 et 4 . . . . . . . . . . . . .
Solution du problme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Solution du problme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Compter les cartes du tas 1 . . . . . . . . . . . . . . . . . . . . . . . . . .
Calcul de la somme des n premiers nombres entiers. . . . . . . . . . . . .
Calcul de la somme des n premiers nombres entiers avec une boucle pour
Calcul du terme d'indice n d'une suite rcurrente . . . . . . . . . . . . . .
Calcul du premier terme satisfaisant une condition . . . . . . . . . . . . .
111
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
16
21
33
44
51
52
54
55
112
16
17
18
24
74
86
97
99
113
114
1.1 Expressions . . . . . . . . . . . . . . . . .
1.2 Le logiciel Objective Caml . . . . . . .
1.3 Premires expressions en Caml . . . . . .
1.3.1 Expressions numriques . . . . . .
1.3.2 Expressions boolennes . . . . . .
1.3.3 Caractres et chanes de caractres
1.4 Instructions . . . . . . . . . . . . . . . . .
1.4.1 Instructions d'impression . . . . .
1.4.2 Instructions du module Cartes . .
1.4.3 Squence d'instructions . . . . . .
1.5 Exercices . . . . . . . . . . . . . . . . . .
1.5.1 Expressions numriques . . . . . .
1.5.2 Instructions . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
et ||
. . . .
. . . .
. . . .
. . . .
. . . .
115
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
10
10
12
13
14
14
15
15
19
19
19
21
21
21
21
21
22
22
23
24
24
24
25
26
26
27
28
29
30
116
Un problme . . . . . . . . .
Algorithme . . . . . . . . . .
Sortie d'une boucle tant que
La boucle tant que en Caml
Mthodologie . . . . . . . . .
Exercices . . . . . . . . . . .
4 Constantes, variables
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 La boucle pour
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
33
33
33
33
33
34
35
37
37
37
37
38
38
39
39
39
39
40
40
40
41
42
43
44
44
44
45
45
47
48
49
51
51
52
52
53
53
54
54
54
55
55
57
117
6 Les fonctions
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Les cartes
A.1 Prsentation . . . . . . . . . . . .
A.2 Utilisation du module Cartes . .
A.3 Le langage du module Cartes . .
A.3.1 Description de tas . . . .
A.3.2 Action . . . . . . . . . . .
A.3.3 Tests sur les tas . . . . .
A.3.4 Comparaison des valeurs .
A.3.5 Contrle de l'achage . .
A.3.6 Rparer l'automate . . . .
A.3.7 Obtenir de l'aide . . . . .
A.4 Exercices . . . . . . . . . . . . .
A.4.1 Descriptions de tas . . . .
A.4.2 Squence . . . . . . . . .
A.4.3 Conditionnelle . . . . . .
A.4.4 Itration . . . . . . . . . .
A.4.5 Fonctions et procdures .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
61
61
61
62
63
64
65
66
67
67
67
68
68
68
69
69
71
73
73
73
74
75
75
75
76
77
78
78
80
83
83
83
84
84
85
86
87
87
89
89
90
90
91
91
93
95
118
B Le module Camlgraph
B.1 Prsentation . . . . . . . . . . . . . . .
B.2 Module Camlgraph . . . . . . . . . . .
B.2.1 Gestion des fentres graphiques
B.2.2 Gestion des couleurs . . . . . .
B.2.3 Point et dessin de lignes . . . .
B.2.4 Texte . . . . . . . . . . . . . .
B.2.5 Remplissage . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 97
. 98
. 98
. 99
. 100
. 101
. 101
C.1 Syntaxe . . . . . . . . . . . . . . . . . . . . . .
C.1.1 Commentaires . . . . . . . . . . . . . .
C.1.2 Expressions et instructions . . . . . . .
C.1.3 Expressions conditionnelles . . . . . . .
C.1.4 Instructions conditionnelles . . . . . . .
C.1.5 Instructions conditionnellement rptes
C.1.6 Constantes, variables . . . . . . . . . . .
C.1.7 La boucle pour . . . . . . . . . . . . . .
C.1.8 Les fonctions . . . . . . . . . . . . . . .
C.1.9 Caractres et chanes de caractres . . .
C.2 Mots-cls du langage . . . . . . . . . . . . . . .
C.3 Fonctions prdnies du langage . . . . . . . .
C.3.1 Fonctions de conversion . . . . . . . . .
C.3.2 Impressions . . . . . . . . . . . . . . . .
C.3.3 Du module String . . . . . . . . . . . .
C.4 Directives . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
103
103
103
103
103
104
104
104
105
105
105
105
105
105
106
106
106
107