Ce TP ne sera pas noté, par contre, vous devrez soumettre votre travail en utilisant l'interface TPLab.
Redémarrez votre ordinateur, et choisissez Linux
au démarrage. Si vous
n'avez pas l'habitude de Linux, passez quelques minutes pour explorer
l'interface. Vous avez accès à vos dossiers personnels, au web (le navigateur
internet s'appelle iceweasel
) etc.
Le plus simple pour expérimenter avec des tous petits programmes Caml est d'utiliser l'interprète Caml. Pour lancer cet interprète, vous avez plusieurs solutions.
interprete-caml
que vous sauvegardez sur votre bureau, puis vous double-cliquez sur l'icône correspondante.
Terminal
(menu Applications --> Accessoires --> Terminal
), puis vous tapez la commande suivante à l'intérieur de ce terminal :
$ ledit ocaml
$ ocaml
Une fois dans l'interprète Caml, vous pouvez :
;;
pour demander l'évaluation de ce que vous avez écrit),
Control
et sur c
,
Control
et a
, ou aller à la fin de la ligne avec Control
et e
,
#quit
(sans oublier le #
) ou en appuyant sur Control
et d
.
Reprenez les exercices que l'on a fait en TD et testez dans l'interprète Caml. Vous avez le droit (c'est même encouragé) de faire des trucs bizarres et interdits, mais essayez de comprendre ce qui se passe.
Dans le code suivant, quelle sera la valeur donnée par f 2
la première et la deuxième fois. Expliquer ce qu'il se passe...
Objective Caml version 3.11.2 # let x=4 ;; # let f y = y+x ;; # f 2 ;; # let x=5 ;; # f 2 ;;
Que se passe-t'il si vous ne mettez pas de else
dans un if
?
Comment expliquez vous cela ?
L'interprète tout seul est un peu pauvre, et si l'on veut faire des programme
un peu gros, il faut sauvegarder ce que l'on fait dans un fichier. Vous avez
peut-être déjà utilisé l'éditeur de texte GEdit
. Pour ce cours, nous
utiliser l'éditeur de texte Emacs
, qui a plusieurs avantages.
Comme l'utilisation de Emacs est un peu étrange au début, et pour éviter de faire un sujet de TP de 15 pages, je vous montrerais comment faire les choses suivantes pour commencer à programmer en Caml.
TP-info-421
,
Emacs
(menu Applications --> Programmation --> Emacs
) et créez
un nouveau fichier (menu File --> Visit New File
; ou premier icône en
haut à gauche) appelé tp1.ml
dans le répertoire crée à l'étape
précédente. Attention, il faut donner le nom de votre fichier sur la
ligne en bas de la fenêtre :
tp1.ml
par exemple) et validez.
Options --> Syntax Highlighting
,
Options --> Paren Match Highlighting
,
Options --> Active Region Highlighting
,
Options --> Save Options
).
let max (a:int) (b:int) : int = if (a<b) then b else a
Tuareg --> Interactive Mode --> Evaluate Buffer
pour donner tout ce que vous avez écrit à un
interprète Caml qui se retrouvera dans une sous-fenêtre de Emacs.
Ça parait un peu complexe au début, mais vous verrez que c'est finalement bien pratique.
En utilisant Emacs et le mode interactif, programmez les fonctions suivantes de la feuille de TD 1 :
fact : int -> int
,
somme_carre : int -> int
,
somme_fonction : (int -> int) -> int -> int
,
puissance : int -> int -> int
,
somme_ii : int -> int
qui calcule la somme des ii.
Quelle est la plus grande valeur de fact que vous pouvez calculer ?
Les suites de Hofstadter a et b sont définies par
Ces suites sont mutuellement recursives.
Calculez à la main les valeurs de a(1) et a(2) puis programmez deux fonctions a : int -> int
et b : int -> int
La suite de Fibonacci est définie de la manière suivante : f(0) = 0, f(1) = 1 et f(n) = f(n-1) + f(n-2) si n>1.
Programmez une fonction fib : int -> int
pour la calculer.
Quelle est la plus grande valeur que vous pouvez obtenir ?
Combien d'additions sont effectuées par Caml pour le calcul de de f 10
?
Qu'en pensez-vous ?
Écrivez deux fonctions sur les listes :
taille
qui calcule la taille d'une liste
alterne
qui prend un élément sur deux dans une liste. Par exemple, alterne [1;2;3;4;5]
donne comme résultat [1;3;5]
.
La courbe du dragon est obtenue en suivant le processus suivant :
Voici les trois premières étapes :
Les coordonnées du nouveau point C sont calculées à partir des coordonnées des anciens points A et B grâce à la formule ( (xA+xB)/2 + (yB-yA)/ 2 , (yA+yB)/2 + (xA-xB)/2 ).
Programmer une fonction dragon : int -> ...
qui dessine la courbe du dragon
d'ordre n (premier argument) pour un segment AB (autre argument de la
fonction).
Pour pouvoir dessiner, vous aurez besoins de :
#load "graphics.cma";; open Graphics
let _ = open_graph " 800x600"
800
). La fenêtre aura une taille de
800 par 600 pixels, et le coin en bas à gauche aura comme
coordonnées (0,0).
Les opérations de dessins, ou les programmes qui dessinent, peuvent être
séquentialisées avec un point virgule. Par exemple, pour tracer
un segment de droite entre les points de coordonnées xa,ya
et xb,yb
, il faut faire
moveto xa ya ;
lineto xb yb
Notez bien que ni moveto xa ya
ni lineto xb yb
ne renvoie de valeur utilisable. En fait, les deux expressions sont de type unit
...
Vous pouvez vous reporter à la documentation en ligne pour les fonctions graphiques simples supplémentaires. (Vous n'en avez pas besoin pour ce TP.)
Que pensez vous de la précision des dessins ? Pouvez-vous l'améliorer ?