✩
✪
Cours de l’option informatique
Lyc´eeLouis-le-Grand
Ann´ee–
1 ✬✫
Rapp els sur le langage Caml
sommaire
—liaisonsglobalesetlocales;
—fonctionssurleslistes;
—it´erateurssurleslistes;
—typesetfiltrages;
—styleimp´eratif;
—effetsdebord
2✩
✪
liaisons globales et lo cales
#leta=2;;
a:int=2
#a+3;;
-:int=5
#letb=3ina+b;;
-:int=5
#b;;
Entr´eeinteractive:
>b;;
>^
L’identificateurbn’estpasd´efini.
3 ✬✫
fonctions sur les listes
longueur:’alist->int
accolle:’alist->’alist->’alist
membre:’a->’alist->bool
adjoint:’a->’alist->’alist
union:’alist->’alist->’alist
intersection:’alist->’alist->’alist
miroir:’alist->’alist
produitcart´esien:
’alist->’alist->(’a*’a)list
Instructionfailwith"messaged’erreur"
4
✩
✪ letreclongueur=function
|[]->0
|_::q->longueurq+1;;
letrecaccoleab=matchawith
|[]->b
|t::q->t::(accoleqb);;
letrecmembrex=function
|[]->false
|t::q->t=x||membrexq;;
letrecadjointx=function
|[]->[x]
|t::q->ift=xthent::qelset::(adjointxq);;
letrecunionab=matchawith
|[]->b
|t::q->unionq(adjointtb);;
letmiroira=
letrecd´everseab=matchawith
|[]->b
|t::q->d´everseq(t::b)
in
d´eversea[];;
5 ✬✫
it ´erateurs sur les listes
map:(’a->’b)->’alist->’blist
dolist:(’a->unit)->’alist->unit
itlist:(’a->’b->’a)->’a->’blist->’a
listit:(’a->’b->’b)->’alist->’b->’b
itlistfx[a;b;c]s’´evalueenf(f(fxa)b)c
listitf[a;b;c]xs’´evalueenfa(fb(fcx))
Applications:´ecrirelesfonctions
minlistmaxlistsumlistflatlist
6✩
✪ letrecmapf=function
|[]->[]
|t::q->(ft)::(mapfq);;
letrecdo_listf=function
|[]->()
|t::q->ft;do_listfq;;
letrecit_listfx=function
|[]->x
|t::q->it_listf(fxt)q;;
letreclist_itflx=matchlwith
|[]->x
|t::q->ft(list_itfqx);;
letmin_listl=it_listminmax_intl;;
(*max_intestleplusgrandentiermachinedoncleneutredemin*)
letsum_listl=it_list(funab->a+b)0l;;
letflat_listl=it_list(funab->a@b)[]l;;
7 ✬✫
filtrage standard sur les listes
letrecma_fonction...l=matchlwith|[]->...
|t^ete::queue->...(ma_fonction...queue)
ouencore,cequirevientexactementaumˆeme:
letrecma_fonction...=function
|[]->...|t^ete::queue->...(ma_fonction...queue)
Doncl’utilisationdefunctionestenr´ealit´eunfiltrage.
Onn’utiliserafun(quipermetdemultiplesarguments)qu’avec
parcimonie.
8
✩
✪
ty p e s Caml `a utiliser
typessimplesintfloatboolcharunit
typesconstruitsdebaselistvectstring
attention:lesdeuxdernierssontmutables!
typessommeIlspeuventˆetrer´ecursifs!Unexempleplussimple:
typecarte=As|Roi|Dame|Valet|Nofint
typesproduitCesontlesenregistrementsd’autreslangages:
typecitoyen={nom:string;nos´ecu:int;...}
9 ✬✫
v ecteurs et c h aˆınes
Sivestdutype’avect,ses´el´ementssontdutype’a.Onlesindexe
`apartirde0:v.(i)estl’´el´ementd’indicei,qu’onpeutmodifierenplaceparuneinstructionv.(i)<-x.
Unechaˆınedecaract`eresestpresqueunvecteurdechar:le
caract`ered’indiceidelachaˆınesests.[i]qu’onpeutmodifier
commeci-dessus.L’op´erateurdeconcat´enationestnot´e^.
Utiles:vectlengthstringlengthinitvectmakevect
init_vect:int->(int->’a)->’avectmake_vect:int->’a->’avect
Attentionaupi`ege!cr´eerunematrice...
10✩
✪
ty p e s somme
typecarte=As|Roi|Dame|Valet|Nofint;;
typecouleur=Pique|Cœur|Carreau|Tr`efle;;
leta=Asandb=N8;;
typecarte_`a_jouer==carte*couleur;;
letc=As,Tr`efle;;
letpoints_beloteatout=function
|As,_->11|Roi,_->4|Dame,_->3
|Valet,c->ifc=atoutthen20else2
|(N9),cwhenc=atout->14
|(N10),_->10|_->0;;
11 ✬✫
ty p e s pro duit
D´efinitiondutype:
typepoint={x:int;y:int;
couleur:color;visible:bool};;
Cr´eationd’unevaleur:tousleschampsdoiventˆetrerenseign´es
leta={visible=true;couleur=red;x=0;y=3}
Filtrage:onpeutnefiltrerquesurquelqueschamps
matchxwith{visible=true;couleur=red}->...
Exemple:leslistesrevisit´ees
type’acellule={valeur:’a;suite:’aliste}
and’aliste=Nil|Lof’acellule;;
´Ecrire:filtrer:(’a->bool)->’aliste->’aliste
12
✩
✪ Ons’inspireduprogrammehabituel:
letrecfiltrerpred=function|[]->[]
|t::q->ifpredtthent::(filtrerpredq)elsefiltrerpredq;;
pour´ecrire:
letrecfiltrerpred=function
|Nil->Nil|L{valeur=t;suite=q}
->ifpredtthenL{valeur=t;suite=filtrerpredq}
elsefiltrerpredq;;
13 ✬✫
R´ ecapitulatif des motifs de filtrage
<identificateur><constante>(<motif>)
<motifsansliaison>|<motifsansliaison>
<motif>as<identificateur>
<motif>when<expressionbool´eenne>
<motif>,<motif><motif>::<motif>
<Constructeur>(<motif>){<s´electeur>=<motif>;...}
14✩
✪
Structures de con trˆ ole
for<identificateur>=<valeur>(to|downto)<valeur>
do
<instruction>
done;;
while<expressionbool´eenne>
do
<instruction>
done;;
Cesdeuxinstructionsont,bienentendu,unevaleur,quiest()(du
typeunit).
15 ✬✫
R´ ef ´erences
Cr´eation:leta=ref[]andb=ref2;;
Consulation:match!awith[]->2+!b
Modification:a:=2::!a;b:=3+!b;;
`Arapprocherdel’utilisationdesvecteursetdeschaˆınesdecaract`eres.
Champsmutablesdansuntypeproduit.
Int´erˆetsetpr´ecautions`aprendre.
Exemple:quicksort.
16
✩
✪
Le tri rapide (quic ksort)
Pourtrierles´el´ementsd’indicesi`aj(inclus)d’untableauv:
1.onposex=vi;
2.onr´eorganiseletableau(entreietj)etontrouvertelque
∀k∈{i,...,r−1},vkxvr=x∀k∈{r+1,...,j},vk>x
3.ontrie(r´ecursivement)lestranchesd’indicesi`ar−1etr+1`aj.
Lecoˆutdanslecaslepire(lequelest-il)estO(n 2).
LecoˆutmoyenestO(nlgn).
17 ✬✫ letquicksortv=
letn=vect_lengthv
in
letscindeij=
letr=refi
andx=v.(i)
in(*v.(i..r-1)<=x=v.(r)<v.(r+1..k)*)
fork=i+1tojdoifv.(k)<=xthen
(v.(!r)<-v.(k);incrr;v.(k)<-v.(!r))
done;
v.(!r)<-x;
!r
in
letrectriij=ifi<jthen
letk=scindeij
in(trii(k-1);tri(k+1)j)
in
tri0(n-1);;
18✩
✪
Autres tris classiques
Le tri par insertion
C’estletridesjoueursdescartes:aufuret`amesurequ’unecarte
estdistribu´ee,onlarange`asaplacedanssamain.
Algorithmiquement,ils’agitdoncd’´ecrireunefonctiond’insertion
dansunelistetri´ee.
Cetriestquadratique,etadapt´e`alastructuredeliste.
Le tri par s´election
Onextraitleminimum,ontrier´ecursivementcequirestede
l’ensembleinitial.Iln’yaplusqu’`aplacerentˆeteleminimumcalcul´e.
Ils’agitl`aencored’untriquadratique,bienadapt´eauxlistes.
19 ✬✫
Le tri-fusion (merge-sort)
Ond´ecoupel’ensembledecl´es`atrierendeuxparties`apeupr`es
´egales,qu’ontrier´ecursivement.Iln’yaplusqu’`afusionnerdeux
ensemblestri´es.
Cetriestadapt´e`alastructuredeliste,ild´ecouledirectementdu
paradigme“diviserpourr´egner”ets’av`ereefficace,puisqu’enO(nlgn).
20
✩
✪ (*triparinsertion*)
letrecins`erex=function|[]->[x]
|t::q->ifx<=tthenx::t::qelset::(ins`erexq);;
letrectri_insertion=function
|[]->[]
|[x]->[x]|t::q->ins`eret(tri_insertionq);;
21 ✬✫ (*tripars´election*)
letrecextrait_minimum=function|[]->failwith"Listevide"
|[x]->x,[]|t::q->letm,q’=extrait_minimumq
inift<=mthent,qelsem,t::q’;;
letrectri_s´election=function
|[]->[]|l->letm,r=extrait_minimuml
inm::(tri_s´electionr);;
22✩
✪ letrecfusionl1l2=matchl1,l2with
|[],_->l2
|_,[]->l1
|t1::q1,t2::q2
->ift1<=t2thent1::(fusionq1l2)
elset2::(fusionl1q2);;
letrecd´ecoupe=function
|[]->[],[]
|[x]->[x],[]
|a::b::q->letq1,q2=d´ecoupeq
in
a::q1,b::q2;;
letrectri_fusion=function
|[]->[]
|[x]->[x]
|l->letl1,l2=d´ecoupel
in
fusion(tri_fusionl1)(tri_fusionl2);;
23 ✬✫
Qu’app elle-t-on effet de b ord ?
et programmation fonctionnelle ?
R´ef´erences,vecteurs,champsmutables...
Maisaussi:entr´ee-sorties,toutegestiondel’interface(biblioth`eque
graphics)etdescommunications...
24