TP Programmation : Fiche 1

Transcription

TP Programmation : Fiche 1
TP Programmation : Fiche 1
LICENCE 1 MATH-INFO
1
S’organiser en TP
La première chose à faire c’est de se connecter sous Linux. Si vous êtes sous Windows, rebootez votre PC et choisissez Linux au démarrage. Une fois connectés,
vous devez ouvrir un shell. Ensuite, pour être sûr de retrouver facilement le
travail effectué lors des scéances précédentes, créez un répertoire que vous appellerez par exemple Caml. Entrez dans ce répertoire et créez en un nouveau,
que vous appellez par exemple TP1. Rendez vous dans ce nouveau répertoire. Si
vous tapez la commande pwd, il doit s’afficher /home/votre login/Caml/TP1. Il
ne vous reste plus qu’à lancez l’interpréteur ocaml avec la commande ocaml
(toujours dans le shell ouvert précédemment). Vous êtes prêts pour travailler, il
vous suffit de taper votre code dans l’interpréteur.
2
Définitions, types et valeurs
1. Définir un nom global n comme la somme des 5 premiers entiers non nuls.
Que renvoie ocaml ? Pourquoi ?
2. Définir un nom global m comme le cube du nom précédent.
3. Redéfinir n comme le produit des 5 premiers entiers non nuls.
Que se passe-t-il si on tape ”m ; ; ” ? Est-ce normal ?
4. Que répond ocaml si l’on tape maintenant n - n ? Et x - x ?
5. Définir un nom local n égal à 30 pour calculer le cube de 30.
Que vaut n avant, pendant et après ce calcul ?
6. Proposer une expression permettant de calculer b2 − 4ac avec a = 1 + xy,
b = x − y, c = x + 2y, x = 156 et y = 123.
7. Que répond ocaml si l’on tape ”9 ; ;”, puis ”’9’ ; ;”, puis ”"9" ; ;”, puis
”9.0 ; ;” ?
8. Définir un nom global pi s comme la chaı̂ne de caractères ”-3.14”
Définir un nom global pi f comme le réel correspondant à la chaı̂ne pi s.
Des fonctions de conversion sont prédéfinies en ocaml. Vous en trouverez
des exemples à la fin de l’exercice. N’hésitez pas à les utiliser.
9. Définir un nom global pi i comme l’entier correspondant à la troncature
de la chaı̂ne pi s. Que se passe-t-il si on essaye d’utiliser la fonction de
conversion int of string ? Pourquoi ?
10. Définir un nom global pi s2 comme étant la concaténation de pi s et de
la chaı̂ne ”159”.
Définir les nom globaux pi i2 et pi f2 de la même manière que vous avez
1
définit pi i et pi f. Comparez pi f et pi f2, puis pi i et pi i2. Que
remarquez vous ? Est-ce normal ?
Remarques :
# int_of_float 3.14 ;;
- : int = 3
# int_of_float -4.67 ;;
This expression has type float -> int but is here used with type int
# int_of_float (-4.67) ;;
- : int = -4
# float_of_int (-3) ;;
- : float = -3.0
# string_of_float 3.14 ;;
- : string = "3.14"
# string_of_int (int_of_float 4.77) ;;
- : string = "4"
# int_of_string "45" ;;
- : int = 45
# float_of_string "coucou" ;;
Exception: Failure "float_of_string".
# float_of_string "
- 4.67 " ;;
Exception: Failure "float_of_string".
# float_of_string "-4.67" ;;
- : float = -4.67
3
3.1
Erreurs !
Récupérer un fichier et l’utiliser
Sortez de l’interpréteur ocaml en tapant #quit ; ;.
Vous voilà de nouveau dans le shell. Copiez le fichier tp1.ml du compte de JeanChristophe Janodet sur votre propre compte en tapant la ligne de commande
suivante :
cp ~janodet/L1/TP1/tp1.ml .
Si vous exécutez la commande ls, vous vous assurez que le fichier a bien été
récupéré.
Il ne vous reste plus qu’à l’ouvrir avec l’éditeur emacs en exécutant la commande
emacs tp1.ml &. Notez que le caractère & à la fin de la commande vous permet
de continuer d’utiliser le shell. Relancez l’interpréteur ocaml en tapant ocaml
dans ce shell.
Le fichier que vous venez d’ouvrir contient les fonctions qui vous seront utiles
dans la suite du TP. Il vous suffit de les copier-coller, de l’éditeur emacs vers
l’interpréteur ocaml. Modifiez les, si besoin est, dans votre emacs, puis copiercollez les de nouveau dans l’interpréteur.
3.2
Une fonction
Dimitri est très fier de la fonction ocaml qu’il vient d’écrire :
2
let la_fonction_a_Dimitri x =
let u = 4*x and p = 4.0*(atan 1.0); in
let v = u+.1 and rayon = x*.x in
let w = p*.rayon in
w
Malheureusement, quand il la teste, l’interpréteur ocaml s’obstine à lui afficher
un message d’erreur. . .Comme vous êtes une âme charitable, vous lui proposez
votre aide. Il ne reste plus qu’à trouver les erreurs et les corriger.
Que calcule cette fonction ? Il existe un moyen plus simple de la définir, à vous
de le découvrir.
3.3
Deux autres fonctions
Grace à votre aide Dimitri se sent pousser des ailes et se lance dans la programmation de deux autres fonctions. Il semble qu’il n’a pas tout compris de vos
explications, car elles aussi donnent des messages d’erreur. . .
let sourire bb =
let x = 2
(string_of_int x)bb^"!"^(string_of_float(int_of_float x);;
let academy star =
let y = false and z = y||true in
let bonne_musique = y &&& z in
bonne_musique;;
4
Kèskessafè ?
Grace à votre soutien sans faille, Dimitri a enfin réussi à définir une fonction
qui ne génère pas une erreur. Le problème c’est qu’il a tellement passé de temps
à l’écrire, qu’il ne se souvient plus ce qu’elle fait. Pouvez-vous (encore !) venir à
son secours ?
let fonction_mystere v =
let p = 9.42477 and q = 3.0 in
let u = p *.4.0 /. q in
(u*.u /.(2.0*.u))*. v;;
La meilleure façon de savoir ce qu’une fonction fait c’est de l’implémenter et de
la tester dans un interpréteur ocaml (Par exemple, que retourne la fonction si
son paramètre est égale à 1.0 ? et 0.5 ?).
3