Vous êtes sur la page 1sur 9

TD OCL 1ère année master SIC 2016/2017

Exercice I

Département

département
Université «datatype»
1 Nom : String 1
Code : Integer 1..* Date
Nom : String
ajouter(Enseignant) jour : Integer
mois : Integer
Enseignant annee : Integer

Nom : string

enseignant
Début : Date
1 Salaire : Integer «enumration»
1 titre : Titre
/service : Integer Titre
Note
* étudiants chef ma
date : Date enseigner( Matière)
Etudiant mc
augmenterSal(v:Integer)
valeur : Integer pr
Nom : String enseignant 1 * est_maitrisee
Naissance : Date
enseigne * * maitrise
estAdmis() :Boolean * * Matière
age() : Integer
heures : integer
étudiant matière
nom : String

Donnez une contrainte OCL qui spécifie :

1. Le service (Somme des heures effectuées) fait par un enseignant.


2. Quelque soit la matière, il y a toujours au moins un enseignant qui la maitrise.
3. La méthode augmenterSal(m :Integer) qui augmente le salaire d’un enseignant, d’un montant m.
4. Il y a un et un seul chef par département et son âge dépasse les 40 ans.
5. Le nom de chaque enseignant est unique
6. Dans chaque département, il existe au moins un professeur
7. Un professeur a toujours 100% de réussite
8. Un étudiant est admis si la moyenne de toutes ses notes est supérieure ou égale à 10.
Exercice II

Complétez la modélisation présentée par le diagramme de classe en y ajoutant les contraintes :

1- La taille d'une tortue est comprise entre 0 et la taille maximale admise pour son espèce ;
2- Une tortue mâle ne peut avoir de dates de ponte ;
3- Une tortue habite l'un des lieux de la répartition géographique de son espèce ;
4- La température de jour est supérieure à la température de nuit
5- Tout aliment utilisable pour l'élevage en captivité fait partie du régime alimentaire général ;
6- Ecrire la post-condition de l'opération nourriturePossible ;
7- On ne peut changer la taille d'une tortue que pour l'augmenter ; précisez les pré- et post-conditions de
l'opération ;
8- Une tortue ne peut manger que des aliments prévus par son régime alimentaire, ce dernier étant
déterminé par le fait que la tortue est ou non en captivité.
Exercice III : Exprimez en OCL les contraintes suivantes :

1- Dans une société, le directeur est un employé, n’est pas un chômeur et doit avoir plus de 40 ans. De
plus, une société possède exactement un directeur et au moins un employé.
2- Précisez le revenu d’une personne et si elle est au chômage, elle ne doit pas avoir de revenus.
3- Une personne possède au plus 2 parents (référencés).
4- Si une personne possède deux parents, l’un est une femme et l’autre un homme.
5- Tous les enfants d’une personne ont bien cette personne comme parent et inversement.
6- Pour être marié, il faut avoir une femme ou un mari.
7- Pour être marié, il faut avoir plus de 18 ans. Un homme est marié avec exactement une femme et une
femme avec exactement un homme.
8- Concernant la méthode débiter de la classe Compte, la somme à débiter doit être positive pour que
l’appel de l’opération soit valide et, après l’exécution de l’opération, l’attribut solde doit avoir pour
valeur la différence de sa valeur avant l’appel et de la somme passée en paramètre.
9- Toute société doit posséder, parmi ses employés, au moins une personne de plus de 50 ans
10- Imposer qu’il n’existe pas deux instances de la classe Personne pour lesquelles l’attribut nom a la même
valeur, c’est à dire que deux personnes différentes ont un nom différent.
Exercice IV

Un hôtel est constitué d'un certain nombre de chambres. Un responsable de l'hôtel gère la location des chambres.
Chaque chambre se loue à un prix donné (suivant ses prestations).

L'accès aux salles de bain est compris dans le prix de la location d'une chambre. Certaines chambres comportent
une salle de bain, mais pas toutes. Les hôtes de chambres sans salle de bain peuvent utiliser une salle de bain sur le
palier. Ces dernières peuvent être utilisées par plusieurs hôtes.

Des personnes peuvent louer une ou plusieurs chambres de l'hôtel, afin d'y résider. En d’autres termes : l'hôtel
héberge un certain nombre de personnes, ses hôtes (il s'agit des personnes qui louent au moins une chambre de
l'hôtel...).

On vous donne le diagramme de classes. Afin d'enrichir ce diagramme, en décrivant ses contraintes et ses
invariants, spécifier en OCL les déclarations textuelles suivantes :

Hôtel Chambre

Adresse : String Etage : entier


/NbdePièces : entier 1..* Numéro : entier
EtageMin : entier NbdeLits : entier 0..1
EtageMax : entier Prix : réel

CalculerLoyer() : réel Repeindre(c : couleur)

1 0..1
*
dirige héberge
0..1
hôte
Personne Client SalledeBain
1 *
Nom : string loue Etage : entier
Age : entier Numéro : entier
Sexe : {Masculin, * NbUtilisateurs : entier
Féminin}

Utiliser( p : personne)

1. Un hôtel ne contient jamais d'étage numéro 13.


2. Le nombre de personnes par chambre doit être inférieur ou égal au nombre de lits dans la chambre
louée. Les enfants (accompagnés) de moins de 4 ans ne "comptent pas" dans cette règle de calcul (à
hauteur d'un enfant de moins de 4 ans maximum par chambre).
3. On ne peut repeindre une chambre que si elle n'est pas louée. Une fois repeinte, une chambre coûte
10% de plus.
4. L'étage de chaque chambre est compris entre le premier et le dernier étage de l'hôtel.

5. Chaque étage possède au moins une chambre (sauf l'étage 13, qui n'existe pas...).
6. Une salle de bain privative ne peut être utilisée que par les personnes qui louent la chambre contenant
la salle de bain et une salle de bain sur le palier ne peut être utilisée que par les clients qui logent sur le
même palier.
7. Le loyer de l'hôtel est égal à la somme du prix de toutes les chambres louées.
Exercice V

Banque
1
code : int

Intitulé : String

* client
Personne
1
age : int

*
1 propriétaire
Compte

solde : int

créditer(somme :int):void
*
débiter(somme :int) : void

getSolde() : int
Donnez une contrainte OCL qui spécifie :

1. A un objet compte correspond un et un seul objet Personne.


2. La méthode débiter(somme :int), où le paramètre somme doit être positif
et nouveau_solde = ancien_solde - somme.

3. Il n'existe pas de clients de la banque dont l'âge est inférieur à 18 ans


4. L'ensemble des clients de la banque associé à un compte contient le propriétaire de ce compte.

Exercice VI
Personne
Voiture moyen_de_transp transporte > passager age : int
1 ort *
kilométrage : int 1 getAge() : int
propriété possède > propriétaire
1 1

roulement > Roues


Châssis
structure > 1

Donnez une contrainte OCL qui spécifie :

a) La post-condition de l'opération getAge() ;


b) Une voiture possède exactement 04 roues ;
c) Le propriétaire d’une voiture doit toujours faire partie de ses passagers ;
d) Une personne ne peut posséder que des voitures dont le kilométrage est inférieur à 100.000 km.
Exercice VII

Soit le diagramme de classes modélisant un atelier d'usine. Les objets qui y transitent (appelés paquets) doivent passer à
différents postes de contrôle pour être validés et ensuite sortir de l'usine.

Un atelier se compose : de points d'entrée (les sources), de points de sortie (les destinations) et de points de contrôle (les
nœuds).

Les liaisons entre ces éléments sont réalisées par des tapis roulants. A chaque source est associé un unique chemin entre la
source et une destination passant par un ou plusieurs nœuds. Un nœud peut appartenir à plusieurs chemins. Un tapis
roulant appartient à un seul chemin et ne fonctionne que dans un seul sens.

Les sources émettent des paquets. Une source est caractérisée par un délai entre l'envoi de deux paquets successifs.

Un nœud correspond à une machine dont l'objectif est de réaliser un contrôle sur les paquets (exemple "vérification de
poids") qu'elle reçoit et d'indiquer sur le paquet le résultat du contrôle. Le type de contrôle dépend du nœud et nécessite
un temps constant, spécifique du nœud, pour être réalisé. Un nœud ne peut traiter qu'un seul paquet à la fois et on lui
associe une file d'attente où sont entreposés les paquets en attente de contrôle. La taille de cette file est fixée à la
définition de l'atelier et dépend uniquement du nœud considéré.

Lors de la réception, le paquet est traité si le nœud est libre, placé dans la file sinon. Lorsque la file d'attente est pleine, le
paquet tombe, il est alors considéré comme perdu (ou cassé).

Les destinations reçoivent les paquets et les stockent dans leur structure de stockage. Elles peuvent recevoir
simultanément des paquets de plusieurs chemins.

Questions : Donnez une contrainte OCL qui spécifie que :

1. La surface d'un atelier est strictement positive ;


2. Un chemin contient au moins un nœud de contrôle ;
3. Lorsqu'un paquet est cassé, aucune file d'attente, ni aucun stock ne lui sont associés ;
4. Dans un chemin le premier tapis commence sur la source du chemin et le dernier tapis finit par la destination.

NB : Les opérations sur les collections suivantes peuvent être utilisées : first():T, last():T, empty(), notEmpty() et size().
Exercice VIII

Tournoi
* *
Joueur
début :Date Date
fin :Date
Maintenant :Date
accepterJoueur(j :Joueur) :void
estAvant(d :Date) :boolean
* joueurAccepté(j :Joueur) :boolean
Match estAprès(d :Date) :boolean
getNombreJoueurs() :int
estEgal(d :Date) :boolean
début :Date
fin :Date *

Exprimez les contraintes suivantes en OCL :

1) Tous les matchs du tournoi doivent avoir lieu dans la période du tournoi
2) Un match ne peut impliquer que les joueurs qui sont acceptés dans le tournoi
3) Chaque tournoi a au moins un match au premier jour du tournoi
4) Le nombre de joueurs autorisés dans un tournoi est incrémenté de 1 après exécution de accepterJoueur ()
5) L'opération accepterJoueur(j) ne peut être invoquée que si le joueur j n'a pas encore été accepté dans le
tournoi.
6) Spécifier le résultat de l’opération getNombreJoueurs()
Exercice I

1. context Enseignant:: service : Integer derive : self . enseigne . heures->sum()


2. context Matiere inv: self .est_maitrisée ->notEmpty()
3. context Enseignant::augmenterSal(m : Integer) post: self . salaire = self . salaire @pre + m
4. context Departement inv: self . chef->size() = 1 and self . chef .age > 40
5. context Departement inv: self . enseignants->forAll(e1, e2 : Enseignant|e1 <>e2 implies e1.nom <>e2.nom)
6. context: Departement inv: self . enseignants->exists(e: Enseignant |e.titre = Titre ::Pr)
7. context Enseignant let : etuds () : Bag(Etudiants) = self . enseigne . etudiant
inv: self . titre = Titre :: pr implies self . etuds ()->forAll(e| e.estAdmis())
8. context Etudiant inv : self.note[matère]->moy()>=10

Exercice II
1- La taille d'une tortue est comprise entre 0 et la taille maximale admise pour son espèce ;
context Tortue inv :
taille >= 0 and taille <= espèce.tailleMaxAdulte
2- Une tortue mâle ne peut avoir de dates de ponte ;
context Tortue inv :
sexe = #M implies datesPonte -> isEmpty()

3- Une tortue habite l'un des lieux de la répartition géographique de son espèce ;
context Tortue inv :
espèce.repartitionGéographique.lieu -> includes(habite)

4- La température de jour est supérieure à la température de nuit


context ModeElevage inv :
tempJour > tempNuit

5- Tout aliment utilisable pour l'élevage en captivité fait partie du régime alimentaire général ;
context EspeceTortue inv :
modeElevage.typeAliment->forAll(t:TypeAliment | biologie.typeAliment->includes(t))

6- Ecrire la post-condition de l'opération nourriturePossible ;


context EspeceTortue :: nourriturePossible(t :TypeAliment)
post : result=biologie.typeAliment -> includes(t)

7- On ne peut changer la taille d'une tortue que pour l'augmenter ; précisez les pré- et post-conditions de
l'opération ;
context Tortue :: changeTaille(nouvelletaille : entier)
pre : nouvelletaille >= taille
post : taille = nouvelletaille

8- Une tortue ne peut manger que des aliments prévus par son régime alimentaire, ce dernier étant déterminé par
le fait que la tortue est ou non en captivité.
context Tortue :: mange(a : Aliment)
pre :
if captive
then espèce.modeElevage.typeAliment -> includes(a.typeAliment)
else espèce.biologie.typeAliment -> includes(a.typeAliment)
endif
Exercice V
context Compte inv:
propriétaire -> size() = 1

context Compte::débiter(somme : Integer)


pre: somme > 0
post: solde = solde@pre – somme

context Banque inv :


not( clients -> exists (age < 18) )

context Compte inv :


banque.clients -> includes(propriétaire)

Vous aimerez peut-être aussi