TD1 1 Expressions, sous-expressions et r`egles de portée 2 Fonctions

Licence 3, semestre 5, 2013–2014 Programmation Fonctionnelle
TD1
1 Expressions, sous-expressions et r`
egles de port´
ee
Entourer toutes les sous-expressions (et sous-sous-expressions) des expressions
suivantes. V´
erifier ´
egalement le respect des r`
egles de port´
ee. Si la d´
eclaration est ty-
pable, donner son type et sa valeur. Chaque ligne correspond `
a une ligne du top-level.
1. letx=1inx+1
2. let x = 3
letx=1inx+1
lety=x+2
3. letx=1inlety=2inletx=3inx+y
4. let x = 3
letx=1inlety=x+2inx+y
5. let x = 3
letx=lety=4iny+1inx+y
6. letx=lety=1inx+yinx*2
7. letx=1inlety=letx=2inxiny+x
8. let x = if true then let y = 2 in y + 1 else 5
9. let x = if true then let tmp = 5.0 in 0.0 else tmp /. 2.0
10. let () = if c then print int 1; print int 3
11. let x = if true then print int 1; 3 else 5
2 Fonctions
Donner le type des fonctions suivantes ou expliquer pourquoi elles ne sont pas ty-
pables.
1
1. letfx=x*. 2. /. 4
2. letfxy=
let x = float (x + 3) in
Printf.printf "valeur %s : %f\n" y x
3. letfxy=
let g x y = float x +. y in
gyx
4. let f x =
letgx=x+1in
lethx=x+.2.in
gx+hx
5. let f x =
let g y = y + int_of_string x in
let x = 12 in
g 4
6. let f x =
let g y = y +. float x in
letx=12+xin
g x
3 Programmation : drag and drop
3.1 ´
Echauffements
Le but de cette partie est de se familiariser avec les types et les fonctions donn´
ees
en annexes.
´
Ecrire une fonction val echauffement : unit -> unit qui effectue
les ´
etapes suivantes :
1. Lancer une fenˆ
etre graphique de taille 300 ×300,
2. Attendre qu’une touche du clavier soit tap´
ee,
3. Afficher le caract`
ere de la touche et la position du curseur de la souris `
a ce mo-
ment l`
a sur le terminal.
Maintenant, on va programmer une petite application pour d´
eplacer un disque de
couleur `
a l’aide de la souris, selon le principe du drag and drop : on clique sur le disque
pour le s´
electionner, on le d´
eplace avec la souris tant que le bouton est press´
e, puis on
le “repose” en relˆ
achant le bouton.
2
3.2 Premier pas : la fonction push
Le premier pas consiste `
a d´
etecter un clic de souris au sein du cercle. ´
Ecrire une
fonction r´
ecursive
val push : (int *int) -> unit
tel que l’appel de fonction push (x,y) effectue les ´
etapes suivantes :
1. Attendre un clic de souris dans la fenˆ
etre
2. V´
erifier que l’on a cliqu´
e dans le cercle de centre (x,y) sinon revenir en 1.
3. Colorier le cercle en rouge.
On utilise alors cette fonction de la mani`
ere suivante.
1. Dessiner un cercle noir de rayon 10 et plac´
e en (100,100).
2. Appeler la fonction push (100,100).
3. Attendre un clic de souris dans la fenˆ
etre.
4. Quitter.
3.3 drag and drop
Pour r´
ealiser le d´
eplacement du cercle, ´
ecrire tout d’abord une fonction
val move : (int *int) -> (int *int) -> (int *int) ->
(int *int)
tel que l’appel move (x,y) (mx,my) (sx,sy) renvoie le couple (sx -
mx + x,sy - my + y).
Ensuite, ´
ecrire une fonction de d´
eplacement
val drag : (int *int) -> (int *int) -> unit
mutuellement r´
ecursive avec push tel que l’appel drag (x,y) (mx,my) ef-
fectue les ´
etapes suivantes :
1. Attendre que la souris soit d´
eplac´
ee ou le bouton relˆ
ach´
e.
2. Rappeler push si le bouton est relˆ
ach´
e.
3. Sinon calculer les nouvelles coordonn´
ees du cercle `
a l’aide de la fonction move.
4. Retourner en 1
Enfin, modifier la fonction push de mani`
ere `
a ce que l’´
etape 3 de son algorithme
soit remplac´
ee par un appel `
a la fonction drag.
3
3.4 Annexes
Ici est pr´
esent´
e un extrait de la biblioth`
eque graphics. Pour l’utiliser :
This library is implemented under the X11 windows system. Programs that use
the graphics library must be linked as follows:
ocamlc other options graphics.cma other files
or start ocaml and type
#load "graphics.cma";;.
Voici les fonctions dont vous pourrez avoir besoin :
val open graph : string -> unit Show the graphics window or
switch the screen to graphic mode. The graphics window is cleared and the cur-
rent point is set to (0, 0). The string argument is used to pass optional information
on the desired graphics mode, the graphics window size, and so on. Its interpreta-
tion is implementation-dependent. If the empty string is given, a sensible default
is selected. Example : open graph " 300x300"
type status = {
mouse_x : int ;
X coordinate of the mouse
mouse_y : int ;
Y coordinate of the mouse
button : bool ;
true if a mouse button is pressed
keypressed : bool ;
true if a key has been pressed
key : char ;
the character for the key pressed
}
type event =
| Button_down
A mouse button is pressed
| Button_up
A mouse button is released
| Key_pressed
A key is pressed
| Mouse_motion
The mouse is moved
| Poll
Don’t wait; return immediately
To specify events to wait for.
val wait next event : event list -> status Wait until one
of the events specified in the given event list occurs, and return the status of
4
the mouse and keyboard at that time. If Poll is given in the event list, re-
turn immediately with the current status. If the mouse cursor is outside of the
graphics window, the mouse x and mouse y fields of the event are outside the
range 0..size x()-1, 0..size y()-1. Keypresses are queued, and dequeued one by
one when the Key pressed event is specified.
val clear graph : unit -> unit Erase the graphics window.
val draw circle : int -> int -> int -> unit draw circle
xyrdraws a circle with center x,y and radius r. The current point is un-
changed. Raise Invalid argument if r is negative.
val fill circle : int -> int -> int -> unit Fill a circle with
the current color. The parameters are the same as for Graphics.draw circle[25.1].
type color = int
val red : color
val set color : color -> unit Set the current drawing color.
5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !