Contrôle des variables private par les modificateurs total de tous les livres qu'on lui aura passé
total de tous les livres qu'on lui aura passé par la méthode "comptabiliser". Voici
comment une instance comptable de cette classe peut être utilisée :
o comptable, comptabilise ce livre (on lui passe un livre dont le prix est égal à
Une variable d'instance private n'est pas modifiable en dehors de la classe. Ajouter 12) ;
un modificateur (un "setter") permet la modification en dehors de la classe tout en o un peu plus loin dans le code : comptable, comptabilise cet autre livre (dont le
contrôlant les valeurs affectées à la variable d'instance. prix est égal à 20).
o A la fin on s'adresse au comptable : comptable, dis-moi le prix total que tu as
1. Ajoutez un prix aux livres (nombre qui peut avoir des décimales, de type Java double) comptabilisé et le comptable retourne 32 (12 + 20). Il faudra donc prévoir une
avec 2 méthodes getPrix et setPrix pour obtenir le prix et le modifier. Si un prix passé en méthode pour cela dans la classe Comptable.
paramètre au setter est négatif, le prix n'est pas modifié et un message d'erreur est affiché.
Ajoutez un constructeur qui prend le prix en paramètre, en plus des autres attributs. Ce Vous mettrez la classe Comptable dans un fichier à part (pas dans le fichier [Link]).
constructeur fait appel à un autre pour éviter de dupliquer du code ("this(...)"). Testez votre nouvelle classe dans la méthode main de TestLivre. 2 comptables seront créés.
Si le prix d'un livre n'a pas été donné, la description du livre (toString()) devra indiquer "Prix Ils comptabiliseront chacun quelques livres. A la fin, on fera afficher le total des prix ainsi
pas encore donné". Attention, un livre peut être gratuit (0 est une valeur possible pour un prix) comptabilisés par chacun des 2 comptables.
; la valeur -1 indiquera que le prix n'a pas encore été donné.
Testez. 2. Vous ne devez pas modifier la classe Comptable pour cette question.
2. Vous allez modifier la classe Livre pour qu'il ne soit plus possible de modifier le prix Pour simplifier l'utilisation de la classe Livre, on veut cacher la classe Comptable aux
d'un livre : un prix ne peut être donné qu'une seule fois et ne peut être modifié ensuite (une "clients" de la classe Livre. Un client de la classe Livre est une classe qui utilise la
tentative pour changer le prix ne fait qu'afficher un message d'erreur). classe Livre.
Récrivez la méthode setPrix (et autre chose si besoin est). Cette fois-ci vous ajouterez une Les livres vont faire enregistrer automatiquement leur prix par un comptable (un
variable d'instance booléenne prixFixe (pour "prix fixé") qui indiquera si prix a déjà été donné même comptable pour tous les livres) : appelez directement la
(n'utilisez plus la valeur -1 comme valeur particulière, comme c'était fait à la question méthode comptabiliser depuis la méthode setPrix (et depuis les constructeurs si
précédente). nécessaire). Pour cela vous devrez utiliser un this explicite. Puisque le comptable doit
Faut-il écrire une méthode "setPrixFixe" pour modifier la variable d'instance booléenne ? être le même pour tous les livres (il ne dépend pas d'une instance particulière
Ajoutez une méthode "isPrixFixe" qui renvoie vrai si le prix a déjà été fixé. de Livre), vous allez l'enregistrer dans une variable de la classe Livre de quel type ?
Testez en écrivant une méthode main qui essaie de changer le prix d'un livre. A tout moment on peut demander (à qui ?) le total des prix comptabilisés.
Comparaison de 2 livres en utilisant une méthode Maintenant la classe Livre devient une classe cliente de la classe Comptable ; on peut
aussi dire que la classe Livre dépend de la classe Comptable (pour bien fonctionner).
d'instance
Dans la classe Livre écrivez une méthode d'instance compare pour comparer 2 livres Nombres complexes (pour les matheux !)
sur leur nombre de pages.
compare prend un livre en paramètre et elle renvoie 0 si le livre a le même nombre de 1. Créez une classe Complexe pour représenter des nombres complexes sous leur forme
pages que l'instance qui reçoit le message, 1 si l'instance courante ("this") a plus de algébrique a + ib.
pages que le parametre et -1 sinon.
La classe contient 2 variables d'instance de type double pour représenter la partie réelle et la
partie imaginaire.
Pour tester, vous utiliserez un code semblable au suivant :
[Link]("L'auteur du plus gros livre est ");
String auteurPlusGrosLivre;
Ajoutez les méthodes pour
// Le code pour trouver le livre qui a le plus de pages (entre 2 livres)
// Ecrivez 2 versions : une avec if et l'autre avec switch additionner (ajouteToi)
... multiplier 2 complexes (multiplieToiPar ; rappel sur la multiplication)
[Link](auteurPlusGrosLivre); avoir l'opposé d'un nombre complexe (opposeToi ; l'opposé de a + ib est -a + i(-b))
avoir les parties réelles et imaginaires (avec des getter)
calculer le module d'un nombre complexe (module ; rappel sur le module).
Délégation (une nouvelle classe Comptable)
Cet exercice montre comment des instances peuvent collaborer pour obtenir le résultat N'implantez pas la soustraction.
voulu. Pour simplifier, vous vous placerez dans le cas où les prix des livres sont bloqués : Pour l'addition (idem pour la multiplication et l'opposé), la méthode ajouteToi enverra le
le prix d'un livre ne peut être donné qu'une seule fois (dans un constructeur ou dans un message suivant à un nombre complexe : "complexe, ajoute-toi ce nombre". Le nombre à qui
modificateur) et ne peut être modifié ensuite. on envoie le message est donc modifié. La méthode ajouteToi aura le profil suivant :
1. Créez une classe Comptable qui possède une méthode de signature "void Complexe ajouteToi(Complexe) ; le paramètre est le nombre que l'on ajoute au nombre à qui on
comptabiliser(Livre l)". Une instance de cette classe permettra de calculer le prix envoie le message ; la méthode retourne la valeur de l'instance courante pour pouvoir
© Master 1- SIGL-décembre 2020 © Master 1- SIGL-décembre 2020
1 2
enchaîner ; par exemple, [Link](z2).multiplieToiPar(z3) ajoute z2 à z1 et multiplie le
résultat par z3.
Vous implanterez aussi une méthode toString() qui retourne la représentation habituelle des
nombres complexes : 5.3, 6.0i, 2 + 5.2i, 3.0 - 8.0i (les nombres ne devront pas être de la
forme 1 + -2i, mais de la forme 1 - 2i).
2. Dans une classe TestComplexe , commencez par tester la méthode toString() avec les
nombres complexes suivants : 0, 2, 2i, -2i, 1 + 2i, 3 - 5i. Avec, par
exemple, [Link](new Complexe(1, -2)).
Testez ensuite l'addition avec l'addition de (1 + 2i) + (3 - 5i). Le résultat est 4 - 3i.
Pour finir, testez la multiplication avec (1 + 2i) x (3 - 5i). Le résultat est 13 + i. Ca n'est pas ce
que vous trouvez ?
3. Tout devrait bien fonctionner maintenant, mais testons un peu plus.
Vérifiez que (1 + i)(1 + i) est bien égal à 2i . Testez en mettant 1 + i dans une variable z et
en calculant [Link](z).
Si ça n'est pas le cas, réfléchissez à la raison. Le fait que z soit passé en paramètre, en plus d'être
le destinataire du message peut être la raison de votre problème. Si votre résultat était faux,
corrigez le code de multiplieToiPar.
4. Vous ferez ensuite le calcul suivant en utilisant votre classe (vous devriez trouver -7 -2i) :
z1 = 1 + 2i
z2 = 3 - 5i
z3 = 1 + i
z4 = (z1 - z2) (z3 - 1)
Après le calcul votre programme affichera les valeurs finales de z1, z2, z3 et z4. Essayez de
comprendre les valeurs affichées.
Comment faire si on veut aussi afficher à la fin les valeurs initiales de z1, z2 et de z3 ?
5. Faites maintenant le calcul suivant en partant des mêmes valeurs de départ de z1 et z2 : (z1
- z2) (z1 + z2 -1)
Vous devriez trouver 15 + 27i. Si ça n'est pas ce que vous trouvez, essayez de comprendre
pourquoi (on ne vous demande pas d'écrire le bon code ; ne le faites que si vous êtes en avance
par rapport à vos camarades).
6. On voit les difficultés si le nombre complexe à qui on envoie un message est modifié à la
suite de ce message. Dans la pratique d'autres méthodes seront utilisées, qui ne modifient pas
le nombre complexe qui reçoit le message. Ecrivez 2 méthodes add et mul dans la
classe Complexe, qui retournent la somme et le produit du nombre complexe à qui on envoie le
message, et du nombre complexe passé en argument, mais sans modifier le nombre qui reçoit
le message. De même écrivez la méthode oppose() qui retourne l'opposé du nombre à qui on
envoie un message, sans modifier le nombre qui reçoit le message. Le profil de add est le suivant
:
Complexe add(Complexe)
En utilisant ces nouvelles méthodes, refaites maintenant le calcul (z1 - z2) (z1 + z2 -
1)dans TestComplexe.
© Master 1- SIGL-décembre 2020 © Master 1- SIGL-décembre 2020
3 4