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