"Les bases"
Page Home (contact) Retour
TPs
Support de cours
Reprenez les classes Livre et TestLivre du TP précédent
(les sources dans 2 fichiers séparés).
Contrôle des variables private par les modificateurs
- Ajoutez un prix aux livres (nombre qui peut avoir 2 décimales de
type Java double) avec 2 méthodes getPrix et setPrix
pour obtenir le prix et le modifier. Ajoutez au moins un constructeur qui
prend le prix en paramètre. Testez.
Si le prix d'un livre n'a pas été donné, la description
du livre (toString()) devra indiquer "Prix pas encore donné".
Attention, un livre peut être gratuit (0 est une valeur possible pour
un prix) ; la valeur -1 indiquera que le prix n'a pas encore été
donné.
- On bloque complètement les prix : un prix ne peut être donné
qu'une seule fois et ne peut être modifié ensuite (une tentative
pour changer le prix ne fait qu'afficher un message d'erreur).
Récrivez la méthode setPrix (et autre chose si besoin
est). Vous ajouterez une variable d'instance booléenne prixFixe (pour
"prix fixé") qui indiquera que le prix ne peut plus être modifié.
Faut-il écrire une méthode "setPrixFixe" pour modifier
la variable d'instance booléenne ?
Ajoutez une méthode "isPrixFixe" qui renvoie vrai si le prix
a déjà été fixé.
Correction :
Classe Livre
Classe TestLivre
Comparaison de 2 livres en utilisant une méthode d'instance
Dans la classe Livre écrivez une méthode d'instance
compare
pour comparer 2 livres 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 pages que l'instance qui reçoit
le message, 1 si l'instance courante ("this") a plus de pages
que le parametre et -1 sinon.
Pour tester, vous utiliserez un code semblable au suivant :
System.out.print("L'auteur du plus gros livre est ");
String auteurPlusGrosLivre;
// 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
. . .
System.out.println(auteurPlusGrosLivre);
Correction :
Classe Livre
Classe TestLivre
Comparaison de 2 livres en utilisant une méthode de classe
Dans la classe Livre, écrivez
une méthode de classe compare2 pour comparer 2 livres (passés
en paramètres) sur leur nombre de pages. Testez.
Correction :
Classe Livre
Délégation (une nouvelle classe Comptable)
Cet exercice montre comment des instances peuvent collaborer pour obtenir
le résultat voulu. Pour simplifier, vous vous placerez dans le cas où les prix des livres sont bloqués : le prix d'un livre ne peut être donné qu'une seule fois (dans un constructeur ou dans un modificateur) et ne peut être modifié ensuite.
- Créez une classe Comptable qui
possède une méthode de signature "void comptabiliser(Livre
l)". Une instance de cette classe permettra de calculer le prix total
de tous les livres qu'on lui aura passé par la méthode "comptabiliser".
Vous mettrez la classe Comptable dans un fichier à part (pas
dans le fichier Livre.java).
Testez votre nouvelle classe dans la méthode main de TestLivre.
2 comptables seront créés. Ils comptabiliseront chacun quelques
livres. A la fin, on fera afficher le total des prix ainsi comptabilisés
par chacun des 2 comptables.
- Vous ne devez pas modifier la classe Comptable pour cette question.
Pour simplifier l'utilisation de la classe Livre, on
veut cacher la classe Comptable aux "clients" de la classe Livre. Les
livres vont faire enregistrer automatiquement leur prix par un comptable (un
même comptable pour tous les livres) : appelez directement la méthode comptabiliser depuis la méthode setPrix (et depuis
les constructeurs si nécessaire). Pour cela vous devrez utiliser un this explicite. A tout moment on peut demander (à qui ?) le
total des prix comptabilisés. Testez.
Correction :
Question 1 :
Classe Livre
Classe Comptable
Classe TestLivre
Question 2 :
Classe Livre
Classe TestLivre
Nombres complexes (pour les matheux !)
1. Créez une classe Complexe pour représenter des nombres
complexes. Arrangez-vous pour pouvoir au moins additionner et multiplier 2 complexes,
avoir l'opposé d'un nombre complexe, avoir les parties réelles et
imaginaires, le module d'un nombre complexe. N'implantez pas la soustraction.
Pour l'addition (idem pour la multiplication et l'opposé), la méthode
ajouteToi enverra le message suivant à un nombre complexe : "complexe,
ajoute-toi ce nombre". Le nombre à qui on envoie le message est
donc modifié. La méthode ajouteToi aura le profil
suivant :
- Complexe ajouteToi(Complexe)
(renvoie la valeur de l'instance courante pour pouvoir enchaîner ;
par exemple, z1.ajouteToi(z2).multiplieToiPar(z3).
Vous implanterez aussi une méthode toString() (comme dans le TP
1) qui renvoie la représentation habituelle des nombres complexes : 5,
2 + 5i, 3 - 8i, 6i (les nombres pourront comporter
des décimales, mais ne devront pas être de la forme 1 +
-2 i, mais de la forme 1 - 2 i).
Ne passez tout de même pas trop de temps sur cette méthode.
2. Vérifiez que (1 + i)(1 + i) est bien égal à
2i . Testez en mettant 1 + i dans une variable z et en calculant
z.multiplieToiPar(z).
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)
Votre programme affichera les valeurs finales de z1, z2,
z3 et z4. Essayez de comprendre les valeurs affichées.
3. Comment faire si on veut aussi afficher à la fin les valeurs initiales
de z1, z2 et de z3 ?
4. 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 + 27 i. Ca n'est pas ce que
vous trouvez ? Essayez de comprendre pourquoi.
5. On voit les difficultés si le nombre complexe à qui on envoie un message (par exemple multiplieToiPar) est modifié à la suite de ce message. Il est utile d'avoir d'autres méthodes add et mul
qui renvoient 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. Ajoutez ces méthodes.
Le profil de add est le suivant :
Complexe add(Complexe)
Refaites maintenant le calcul (z1 - z2) (z1 + z2 -1) .
Quelles méthodes préférez-vous, ajouteToi et
multiplieToiPar, ou add et mul ? Pourquoi ?
Correction :
Classe Complexe
Pour ceux qui ont déjà fini :
Quelques calculs, quelques erreurs
1. Copiez, corrigez, compilez et exécutez la classe suivante.
Le programme suivant devrait afficher 3 (ou 3.0).
public class Division {
public static void main(String args) {
int x, y;
x = 3;
y = 2;
double a = x / y;
double f = a * y;
System.out.println(f);
}
}
2. Idem pour la classe suivante (la classe doit afficher "1 + 1 = 2",
puis 120, c'est-à-dire la valeur de e, puis 36.9) :
public class Classe2 {
public static void main(String args) {
int a = 1;
int b = 1;
System.out.println(a + b + " = " + a + b);
// Interdit de modifier les 3 lignes suivantes !
byte c = 50;
byte d = 70;
byte e;
// Mais vous pouvez modifier cette ligne...
e = c + d;
System.out.println("e= " + e);
System.out.println(20.1 + 16.8); // Explications ?
}
Après avoir fait exécuter cette classe, remplacez 50 par 70 pour
la valeur de c. Ne modifiez rien d'autre, compilez et exécutez. Quelle
valeur est affichée pour e ?
3. Utilisez la classe java.lang.Math (cherchez dans la documentation des API) pour faire afficher par cette classe
quelques calculs scientifiques et en particulier racine carrée de 4,
cos(pi / 2), etc.
4. Faites afficher 5 nombres entiers aléatoires compris entre 1 et 10 (bornes
comprises).
Retour TPs