• Aucun résultat trouvé

2.2.1

Division enti`ere et modulo

I L’op´erateur / repr´esente la division enti`ere. C’est-`a-dire qu’il calcul le quotient de deux entiers. L’op´erateur mod calcule le reste de la division enti`ere. D´etaillons cela.

Supposons qu’un fermier dispose de n œufs, et qu’il souhaite remplir des boites de 12. L’expression (n / 12) donne le nombre de boites qu’il remplira enti`erement. L’expression (n mod 12) donne le nombre d’œufs qu’il trouvera dans la boite incompl`ete. En particulier, lorsque n est un multiple de 12, il n’y a pas de boite incompl`ete, et dans ce cas (n mod 12) vaut 0.

Remarque : les divisions par z´ero provoquent ici des erreurs. (n / 0) tout comme (n mod 0) am`ene l’erreur d’ex´ecution suivante :

F a t a l e r r o r : e x c e p t i o n D i v i s i o n _ b y _ z e r o ;

F ´Ecrire un programme qui demande un entier `a l’utilisateur et affiche pair ou impair selon les cas. − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − −

Il s’agit de tester si n est un multiple de 2, c’est-`a-dire si (n mod 2) vaut 0.

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

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 ";

On aurait aussi pu tester la condition inverse, `a savoir si n est impair. On testerait alors si le reste de la division enti`ere par 2 est 1.

let n = r e a d _ i n t () in if n mod 2 = 1

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

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

2.2.2

Fonctions pr´ed´efinies

I Comme pour les r´eels, on dispose de fonctions pr´ed´efinies pour les entiers. Leur mode de fonctionnement est tr`es similaire `a celui des fonctions r´eelles.

• La valeur absolue d’un entier n s’´ecrit abs n.

• Les fonctions min et max fonctionnent pour les entiers aussi bien que pour les r´eels. Si a et b sont deux entiers (min a b) et (max a b) repr´esentent respectivement leur minimum et leur maximum.

Remarque : min, max, et les op´erateurs de comparaisons (<, >, <=, >=, =, <>) sont les seuls op´erateurs qui fonctionnent `a la fois sur des entiers et les r´eels. Il s’agit d’une exception, qui permet au programmeur d’´ecrire des tests sans alourdir les notations.

I Il existe deux fonctions si triviales qu’`a priori elles ne servent `a rien, mais qui nous permettront dans la suite d’´ecrire du code plus lisible, donc il faut les retenir.

La premi`ere fonction permet d’obtenir le nombre qui suit imm´ediatement un entier. Elle est nomm´ee succ en abr´eviation de successeur. Ainsi pour un entier n, l’expression succ n est ´equivalente `a n+1.

La seconde fonction permet d’obtenir le nombre pr´ec´edent un entier, et se nomme pred. Ainsi l’expression pred n est ´equivalente `a n-1.

2.2.3

Conversions

I Lorsqu’on dispose d’une valeur enti`ere par exemple 2, et que l’on veut convertir cette valeur en une valeur r´eelle, c’est-`a-dire 2.0, il faut utiliser la fonction float of int, traduire "r´eel `a partir d’un entier".

La fonction float of int convertit un entier en le r´eel correspondant.

Par exemple :

let x = 2 in

p r i n t _ i n t x ; p r i n t _ n e w l i n e () ;

let y = f l o a t _ o f _ i n t x in

p r i n t _ f l o a t y ;

F Ecrivez une fonction qui demande deux entiers `a l’utilisateur, et qui renvoie la valeur r´eelle de la division exacte du premier par le second.

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

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

let d i v i s e = ( f l o a t _ o f _ i n t x ) /. ( f l o a t _ o f _ i n t y ) in

p r i n t _ f l o a t d i v i s e ;

F Ecrivez une fonction qui affiche les valeurs des racines carr´ees des nombres entiers compris entre 0 et k, o`u k est donn´e par l’utilisateur. Affichez une valeur par ligne.

− − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − − let k = r e a d _ i n t () in for i = 0 to k do let r a c i n e = s q r t ( f l o a t _ o f _ i n t i ) in p r i n t _ f l o a t r a c i n e ; p r i n t _ n e w l i n e () ; d o n e;

I Pour convertir un r´eel en un entier, c’est un peu plus d´elicat, car le r´eel ne tombe par forc´ement pile sur un entier. On dispose de la fonction int of float, traduction : "entier `a partir d’un r´eel", qui se contente d’effacer tous les chiffres apr`es la virgule du nombre r´eel. Ainsi :

i n t _ o f _ f l o a t 4.2 = 4 i n t _ o f _ f l o a t 4.9 = 4 i n t _ o f _ f l o a t ( -4.2) = -4 i n t _ o f _ f l o a t ( -4.9) = -4 Exemple de programme : let y = 4.2 in let x = i n t _ o f _ f l o a t y in p r i n t _ i n t x ; affiche 4.

Attention : la fonction int of float n’est pas la fonction math´ematique partie enti`ere. Cela `a cause de sa fa¸con de traiter les nombres n´egatifs. Par exemple la partie enti`ere de -4.2 est -5 et non pas -4. Si vous avez besoin de calculer la vraie partie enti`ere d’un r´eelle x, faˆıtes : (int of float (floor x)). En bref, floor x repr´esente le plus grand r´eel inf´erieur `a x qui n’ait que des z´eros apr`es la virgule.

2.2.4

Limitation des int

Un int est une valeur comprise entre -1073741824 et 1073741823.

On expliquera `a la fin du cours pourquoi les limites se situent `a ces valeurs pr´ecis´ement (les curieux remarqueront d´ej`a qu’il s’agit d’une puissance de deux, `a une unit´e pr`es). Pour l’instant, le but est surtout d’ˆetre inform´e qu’il y a une limite, et surtout de savoir qu’aucun message d’erreur ne sera affich´e si vous d´epassez ces limites ! Mais quel nombre entier est le suivant de 1073741823 ? ´Ecrivons un programme pour le voir :

p r i n t _ i n t ( 1 0 7 3 7 4 1 8 2 3 + 1) ;

L’affichage qu’on obtient est le nombre -1073741824 ! ´Evidement, cela peut surprendre la premi`ere fois. C’est un peu comme si les nombres de type int tournaient en rond. Lorsqu’on arrive tout en haut des positifs, on repart de tout en bas des n´egatifs. Selon la mˆeme logique, le nombre juste en dessous de -1073741824 est 1073741823, comme le montre le programme :

p r i n t _ i n t ( - 1 0 7 3 7 4 1 8 2 4 - 1) ;

Conclusion :

Lorsqu’on travaille avec des int, il faut faire attention `a ne pas d´epasser les limites, car aucun message d’erreur ne signale les d´epassements.

Remarque : pour faire des calculs avec des nombres plus grands, il faudra soit utiliser des fonctions sp´eciales, soit se contenter d’une approximation avec un nombre de type float. Dans une grande majorit´e des programmes dont l’objectif n’est pas de faire des maths, ces limites sur les int sont suffisamment grandes pour ne poser aucun probl`eme.

Documents relatifs