• Aucun résultat trouvé

5.1.1

Constructions

I Dans les structures conditionnelles qu’on a eu jusqu’`a maintenant, il y avait toujours un simple test. Exemple :

let x = r e a d _ i n t () in if x > 5

t h e n p r i n t _ s t r i n g " s u p ´e r i e u r "

e l s e p r i n t _ s t r i n g " i n f ´e r i e u r ";

La condition est ici x > 5 entre le if et le then. Le r´esultat de ce test est soit vrai, soit faux. En anglais, on dit true ou false. Une valeur de cette nature est dite "bool´eenne", et il y correspond le type "bool".

I Une valeur bool´eenne est une valeur comme une autre. Rien n’empˆeche de lui donner un nom. Dans cet exemple, on appelle b le bool´een associ´e `a la r´eponse `a la question "est-ce que x est strictement plus grand que 5 ?", qui s’´ecrit en Caml (x > 5).

let x = r e a d _ i n t () in let b = ( x > 5) in

...

Remarque : on a plac´e le test x > 5 entre parenth`eses. C’est un choix de pr´esentation. Pourquoi des parenth`eses ? Supposez que l’on souhaite tester si x vaut 5 ou non. Sans les parenth`eses, cela donnerait let b = x = 5 in ... ce qui serait visuellement tr`es d´eroutant, `a cause de la pr´esence de plusieurs signes d’´egalit´e qui ont des significations diff´erentes.

I On peut aussi utiliser directement les valeurs true et false pour construire un bool´een. Exemple :

let b = t r u e in ...

Une valeur bool´eenne (bool) vaut true ou false, et peut se construire avec des tests comparatifs.

I Revenons aux structures de d´ecision :

La condition d’un if est toujours une expression de type bool.

Voici un programme ´equivalent au premier du chapitre. La seule diff´erence est qu’on a pos´e b la valeur bool´eenne (x > 5). Ce bool´een b d´etermine ensuite le comportement du if.

let x = r e a d _ i n t () in let b = ( x > 5) in if b

t h e n p r i n t _ i n t " s u p ´e r i e u r "

e l s e p r i n t _ i n t " i n f ´e r i e u r ";

Que pensez-vous du code suivant ?

if f a l s e

t h e n p r i n t _ i n t " ahh "

e l s e p r i n t _ i n t " ohh ";

R´eponse : il est ´equivalent `a print int "ohh";, puisque c’est toujours le bloc du else qui est effectu´e.

F Ecrivez une fonction nomm´ee est pair qui prend un entier n en param`etre et renvoie true lorsque celui-ci est pair, et false sinon. Trouvez ensuite un moyen de tester votre fonction.

− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − −

n est pair lorsque n mod 2 vaut 0. Le bool´een correspondant `a la question "est-ce que x est pair ?" est ((n mod 2) = 0). C’est cette valeur que va retourner la fonction est pair :

let e s t _ p a i r n = ( n mod 2 = 0) in

Pour tester la fonction, on peut soit nommer son r´esultat et l’utiliser comme condition d’un test :

let r e s u l t = e s t _ p a i r 3 in if r e s u l t

t h e n p r i n t _ s t r i n g " p a i r "

e l s e p r i n t _ s t r i n g " i m p a i r ";

soit mettre directement l’appel `a la fonction apr`es le if :

let e s t _ p a i r n = ( n mod 2 = 0) in if e s t _ p a i r 3 t h e n p r i n t _ s t r i n g " oui " e l s e p r i n t _ s t r i n g " non "; if e s t _ p a i r 4 t h e n p r i n t _ s t r i n g " oui " e l s e p r i n t _ s t r i n g " non ";

Qui affiche logiquement "non" puis "oui".

5.1.2

Affichage

I Pour afficher la valeur de retour d’une fonction qui renvoie un bool´een, on aimerait bien disposer d’une fonction permettant d’afficher un bool´een, c’est-`a-dire une fonction prenant en param`etre un bool´een et qui affiche "true"

ou "false" selon la valeur de ce bool´een. La fonction print bool n’est pas une fonction pr´ed´efinie, car elle n’est pas d’un usage tr`es fr´equent. Heureusement, on peut la d´efinir soi-mˆeme facilement.

F Ecrivez une fonction print bool `a l’aide d’un test if. Quel est le type de cette fonction ?

− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − −

La fonction est de type bool -> unit.

let p r i n t _ b o o l b =

if b

t h e n p r i n t _ s t r i n g "t r u e"

e l s e p r i n t _ s t r i n g "f a l s e";

in

Pour tester, on peut par exemple faire print bool true, qui affiche "true", puis print bool (3 > 4), qui affiche "false".

I La fonction string of bool, traduire "cha^ıne `a partir d’un bool´een", est une fonction pr´ed´efinie. Elle prend en param`etre un bool´een et retourne sa repr´esentation sous forme d’une chaˆıne "true" ou "false". Cette fonction a ´et´e d´efinie par :

let s t r i n g _ o f _ b o o l b =

if b

t h e n "t r u e"

e l s e "f a l s e"

in

On peut utiliser cette fonction pr´ed´efinie pour afficher facilement un bool´een. Par exemple, si b est un bool´een qui vaut vrai, alors l’instruction suivante affiche "true".

p r i n t _ s t r i n g ( s t r i n g _ o f _ b o o l b ) ;

Si on a besoin d’afficher plusieurs bool´eens, on pourra d´efinir print bool de la mani`ere suivante :

let p r i n t _ b o o l b =

p r i n t _ s t r i n g ( s t r i n g _ o f _ b o o l b ) ;

in

I Pour afficher des bool´eens, on d´efinit g´en´eralement la fonction print bool au pr´ealable :

let p r i n t _ b o o l b =

p r i n t _ s t r i n g ( s t r i n g _ o f _ b o o l b ) ;

in

Par exemple, pour tester le code de la fonction est pair :

let p r i n t _ b o o l b =

p r i n t _ s t r i n g ( s t r i n g _ o f _ b o o l b ) ;

in

let e s t _ p a i r n = ( n mod 2 = 0) in

p r i n t _ b o o l ( e s t _ p a i r 3) ; p r i n t _ s t r i n g " ";

p r i n t _ b o o l ( e s t _ p a i r 4) ;

Ce code affiche "false true".

5.1.3

Lecture

I Pour lire un entier, il n’y a pas de fonction read bool(). L`a encore parce qu’elle ne sert pas beaucoup. Mais il y a la fonction bool of string, traduire "bool´een `a partir d’une cha^ıne". Ainsi on peut d´efinir soi-mˆeme read bool :

let r e a d _ b o o l () =

let s = r e a d _ l i n e () in

b o o l _ o f _ s t r i n g s in

L’utilisateur doit taper "true" ou "false" fournir le bool´een.

F En utilisant les fonctions string of bool, ´ecrivez un programme qui demande deux bool´eens `a l’utilisateur, et qui affiche s’ils sont ´egaux ou non.

− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − let r e a d _ b o o l () = let s = r e a d _ l i n e () in b o o l _ o f _ s t r i n g s in let b1 = r e a d _ b o o l () in let b2 = r e a d _ b o o l () in p r i n t _ s t r i n g ( s t r i n g _ o f _ b o o l ( b1 = b2 ) ) ;

I En pratique, il est beaucoup plus simple de lire un entier. L’association g´en´eralement utilis´ee est z´ero pour false et n’importe quel autre entier pour true. Voici la traduction imm´ediate en code :

let r e a d _ b o o l () =

let x = r e a d _ i n t () in if x = 0

t h e n f a l s e e l s e t r u e in

Cette fonction peut ˆetre condens´ee en :

let r e a d _ b o o l () =

( r e a d _ i n t () < > 0) in

En effet, on renvoie bien vrai d`es que l’entier lu est diff´erent de 0.

On peut r´eutiliser le code de l’exercice pr´ec´edent pour tester notre nouvelle fonction. Il suffit maintenant `a l’utilisateur de taper 0 pour faux, et 1 (ou tout autre entier) pour vrai.

let b1 = r e a d _ b o o l () in let b2 = r e a d _ b o o l () in

5.1.4

Exercices

F Simplifiez la fonction suivante :

let p a s s e _ o u _ n o n x = if x < 10 t h e n f a l s e e l s e t r u e in − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − −

La fonction renvoie une valeur bool´eenne qui est vraie si x est sup´erieur ou ´egal `a 10. Donc :

let p a s s e _ o u _ n o n x = ( x >= 10) in

F Ecrivez une fonction qui analyse la performance d’un concurrent dans une course de la mani`ere suivante. La fonction est performant prend en param`etres le nombre total de participants et le rang d’arriv´ee. Elle renvoie vrai si le concurrent se situe strictement dans la premi`ere moiti´e des participants (c’est-`a-dire renvoie faux si le candidat arrive juste au milieu ou au-del`a). Quel est le type de cette fonction ?

− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − −

Type : int -> int -> bool.

On peut faire un test pour discuter selon que le nombre de participant est pair ou impair.

let e s t _ p e r f o r m a n t p a r t i c i p a n t s r a n g =

if ( p a r t i c i p a n t s mod 2) = 0

t h e n ( r a n g <= p a r t i c i p a n t s / 2)

e l s e ( r a n g <= ( p a r t i c i p a n t s - 1) / 2)

in

Mais on peut aussi traiter d’un coup les deux parit´es grˆace `a la division enti`ere.

let e s t _ p e r f o r m a n t p a r t i c i p a n t s r a n g = ( r a n g <= p a r t i c i p a n t s / 2) in

Voyez-vous comment modifier la fonction si on veut cette fois renvoyer vrai aussi lorsque le candidat arrive juste au milieu ?

R´eponse :

let e s t _ p e r f o r m a n t _ b i s p a r t i c i p a n t s r a n g = ( r a n g <= ( p a r t i c i p a n t s + 1) / 2 ) in

Documents relatifs