[t]40ex
UniversitéPierre & Marie Curie
U.F.R d'infomatique
[t]45ex
Maîtrise -- 2000-01
Programmation Objet et Distribution
Tavaux dirigés n° 2
Exercice I Héritage, agrégation : variante sur l'exemple du cours. On reprend
(en partie) la classe point
:
class point (x0,y0) =
object
val mutable x = x0
val mutable y = y0
method get_x = x
method get_y = y
method rmoveto (dx,dy) = begin x <- x +. dx; y <- y +. dy end
method print () =
print_string "( "; print_float x; print_string " , ";
print_float y; print_string ")"
end;;
Question (I.1) Définir, par agrégation de la classe point
, une classe
double_point
qui représente un couple de points
(p1, p2)
. Elle fournira les méthodes suivantes :
-
get_p1 : unit -> float*float
-
get_p2 : unit -> float*float
-
rmoveto : float*float -> unit
-
print : unit -> unit
Question (I.2) Ecrire une fonction do_rect
qui prend en arguments quatre
entiers x, y, h, w
et calcule la liste des quatre point
's
du rectangle de coin inférieur gauche (x,y)
, de hauteur
h
et de largeur w
.
Question (I.3) Définir, par héritage de la classe double_point
, la classe
moving_points
qui fournit les deux méthodes :
-
translate : point -> unit
telle que
dp#translate p
effectue la translation du couple de points
dp
selon le vecteur Op (oùO est le
point origine)
-
rotate : point -> float -> unit
telle que
dp#rotate p a
effectue la rotation de dp
autour du point
p
selon l'angle a
.
On rappelle que l'on obtient une rotation de a par rapport àl'origine en appliquant les équations
{
x' = x.cos a - y.sin a |
y' = x.sin a + y.cos a
|
.
Question (I.4) Écrire une fonction de type double_point -> point list
dont
l'argument représente les deux points opposés d'un rectangle et
qui calcule la liste des quatre points du rectangle.
Exercice II Des piles, encore.
Question (II.1) En vous inspirant du module Stack
, définir une classe
pour des piles d'entiers.
Faut-il conserver une méthode create
? Quel type donner àpush
, pop
, etc. ?
Question (II.2) Étendre la classe précédente pour obtenir une classe de
piles oùles opérations de dépilage et d'accés àla valeur du
sommet de pile sont disjointes (top
donne la valeur sans
modifier la pile et pop
dépile sans donner la valeur)
Question (II.3) On se donne le type suivant :
type arsym = Num of int | Op | Plus | Moins | Mult | Div ;;
On considère qu'une arsym list
représente une expression
arithmétique postfixée. Écrire une fonction d'évaluation
utilisant les piles de la question précédente.
Exercice III Types sommes, expressions arithmétiques (encore !) et classes
abstraites.
Question (III.1) Écrire une classe abstraite expar
fournissant deux
méthodes :
-
eval : unit -> int
qui donnera la valeur de l'expression.
-
to_string : unit -> string
qui donnera une chaîne de
caractères représentant la notation infixée de l'expression.
Question (III.2) Écrire, par héritage de expar
, les six classes
représentant les constantes entières, le moins unaire, l'addition,
la soustraction, la multiplication et la division.
Question (III.3) Écrire une fonction qui prend en argument une
arsym list
représentant une expression arithmétique
postfixée (cf exercice précédent) et construit
l'objet correspondant.
Question (III.4) Écrire, par héritage de expar
, trois classes
(toujours abstraites) prenant zéro, un et deux arguments pour
représenter les opérations 0-aires (ie : les constantes),
les opérations unaires et les opérations binaires. En déduire six
classes pour représenter les constantes entières, le moins unaire,
l'addition, la soustraction, la multiplication et la division.
This document was translated from LATEX by HEVEA.