"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

  1. 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é.
  2. 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.
  1. 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.
  2. 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 : 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