Première partie

Objectifs d'apprentissages

  • Créer soi-même une méthode equals(Object o)
  • Implémenter un type paramétré, ici une interface
  • Utiliser l'interface java.util.Comparator<T>

Section 1: la méthode equals

Comme vous le savez, la classe Object déclare une méthode equals.

                  
public class Object {

    // ...

    public boolean equals(Object obj) {
        return this == other;
    }

}
                

Puisqu'en Java, toutes les classes héritent des caractéristiques de la classe Object. Toutes les classes possèdent donc une méthode boolean equals(Object obj). C'est vrai pour les classes prédéfinies, mais aussi pour toutes les classes que l'on crée soi-même.

On utilise la méthode equals afin de comparer les objets désignés par des variables références. Étant donné deux variables référence a et b, et les objets désignés:

  • Pour comparer l'identité des objets (est-ce que a et b désignent le même objet ou non?), on utilise l'opérateur de comparaison «==» (donc «a == b»);
  • Pour comparer le contenu des deux objets (est-ce que le contenu des objets désignés est logiquement équivalent?), on utilise la méthode «equals» (donc a.quals(b)).

Pour cette première partie, vous devez créer la classe Book. Son implémentation est très simple. Voici les éléments que vous devrez intégrer:

  • Une variable d'instance author de type String;
  • Une variable d'instance title de type String;
  • Une variable d'instance year de type int (l'année de publication du livre);
  • Un contructeur Book(String author, String title, int year), qui reçoit en paramètre l'auteur, le titre, l'année de publication;
  • Une méthode toString(), qui retourne une chaîne de caractère ayant le format suivant: «author: title (year);
  • Une méthode equals(Object o).

Votre implémentation doit être robuste. En particulier, une méthode equals ne devrait jamais produire une erreur d'exécution. Les objets sont logiquement équivalents ou ils ne le sont pas.

Question 1.1:

Implémentez la classe Book. Utilisez le gabarit fourni comme point de départ.

Section 2: l'interface java.util.Comparator<T>

Pour votre dernier laboratoire, vous avez utilisé l'interface Comparable pour creér des objets de la classe Post. Un objet qui implémente cette interface doit redéfinir la méthode compareTo et ainsi être capable de se comparer à un autre objet.

Contrairement à Comparable, une classe implémentant l'interface Comparator est externe au type d'élément que nous comparons. Une telle classe doit implémenter les méthodes compare et equals pour définir et imposer l'ordre de tri.

Ainsi, la méthode sort de la classe Collections.sort or Arrays.sort utilisera la méthode compare du comparateur (objet réalisant l'interface Comparator). Il nous faut donc une méthode compare qui puisse traiter le type d'éléments se trouvant dans la liste (objet de la classe ArrayList, par example).

Puisque Comparator est une interface, il lui faut une implémentation concrète.

Notez que la classe ArrayList possède un paramètre de type. Pour ce laboratoire, nous déclarons des variables de type ArrayList<Book>. Ainsi, l'instance ne reçoit que des objets de la classe Book. Du coup, la méthode sort doit recevoir un comparateur pour des objets de la classe Book. Ainsi, BookComparator réalisent l'interface Comparator<Book>. Le grand avantage de cette structure de programme, c'est que l'on peut comparer les objets selon plusieurs critères (par author, par title, par year) et donc trier les éléments en fonctions de critères variés.

Vous devez créer une classe Library afin de sauvegarder des objets de la classe Book. Pour ce faire, nous utilisons à nouveau ArrayList. De plus, on souhaite trier les éléments de la liste à l'aide d'un objet Comparator. Vous devez trier les éléments de la liste d'abord par auteur, ensuite par titre, et finalement selon l'année de publication (bien sûr, dans une application complète, il y aurait plusieurs comparateurs).

La classe Library a les caractéristiques suivantes:

  • void addBook(Book b): ajoute un livre à la bibliothèque (ajout d'un objet de la classe Book à l'aide de la méthode addBook de l'objet de la classe Library);
  • void sort(): trie les éléments à l'aide d'un objet Comparator;
  • void printLibrary(): affiche tous les livres dans l'ordre actuel de la liste.
Question 1.2:

Vous devez compléter l'implémentation de la classe Library ainsi que BookComparator. Utilisez les gabarits fourni pour Library et BookComparator comme point de départ.

Deuxième partie

Objectifs d'apprentissage

  • Déclarer et implémenter une interface
  • Créer classe abstraite
  • Mieux comprendre l'héritage en Java

Classes abstraites et interfaces

En mathématique, une série est une séquence infinie de termes qui sont additionnés les uns aux autres. La somme partielle d'une série, \(S_n\), est la somme des \(n\) premiers termes. $$ S_n = \sum_{i=1}^{n} a_i $$ Vous devez concevoir une hiérarchie de classes, conforme au diagramme UML ci-bas, de sorte que toutes les séries possèdent une méthode next, qui retourne la prochaine valeur \(S_n\). Le premier appel à la méthode next retournera \(S_1\), soit $$ a_1 $$ le prochain appel à la méthode next retournera \(S_2\), soit $$ a_1 + a_2 $$ le prochain appel à la méthode next retournera \(S_3\), soit $$ a_1 + a_2 + a_3 $$ et ainsi de suite. L'implémentation de la méthode next dépend du type de série, Arithmetic ou Geometric pour cette question. Cette hiérarchie comprend l'interface Series, une classe abstraite nommée AbstractSeries, ainsi que deux implémentations concrètes, Arithmetic et Geometric.

UML diagram of AbstractSeries, Series, Arithmetic, and Geometric. Series is an interface. It declares a public method called next that has no parameter and it returns a value of type double. AbstractSeries is an abstract class. It implements the interface series. It declares a public method called take that takes a parameter of type n and the return type is array of double. Arithmetic and Geometric are subclasses of AbstractSeries.

Voici un programme test pour illustrer le résultat attendu pour:

  • une class pour la somme partielle de l'Arithmetic série avec 1 comme le premier élément and le raison 1;
  • une class pour la somme partielle de la Geometric série avec 1 comme le premier élément and le raison 0.5.

                  
public class TestSeries {

    public static void main(String[] args) {

        AbstractSeries sn;
        double[] tuple;

        sn = new Arithmetic();

        System.out.println("The first five terms of the arithmetic series are:");

        for (int n=0; n<5; n++) {
            System.out.println(sn.next());
        }

        sn = new Geometric();

        System.out.println();
        System.out.println("The first five terms of the geometric series are:");

        tuple = sn.take(5);

        for (int n=0; n<5; n++) {
            System.out.println(tuple[n]);
        }

    }
}
                           

Here is the expected output:

> TestSeries.java
> java TestSeries
The first five terms of the arithmetic series are:
1.0
3.0
6.0
10.0
15.0

The first five terms of the geometric series are:
1.0
1.5
1.75
1.875
1.9375
>
                

La première boucle affichera les valeurs 1.0, 3.0, 6.0, 10.0, 15.0, alors que la deuxième affichera, 1.0, 1.5, 1.75, 1.875, 1.9375.

Question 2.1: Series

Vous devez concevoir une interface nommée Series. Elle doit déclarer une méthode nommée next dont le type de la valeur de retour est double.

Utilisez le gabarit fourni comme point de départ.

Question 2.2: AbstractSeries

Donnez l'implémentation d'une classe abstraite nommée AbstractSeries. Elle doit réaliser l'interface Series. La classe implémente la méthode take qui retourne un tableau contenant les prochaines k sommes partielles de cette série, où k est le paramètre formel de la méthode take.

Utilisez le gabarit fourni comme point de départ.

Question 2.3: Arithmetic

Donnez l'implémentation de la classe Arithmetic. Elle doit être une sous-classe de la classe AbstractSeries. Pour cette implémentation, le premier appel à la méthode next retournera la valeur 1.0, le second appel retournera la valeur 3.0, le troisième appel retournera la valeur 6.0, le quatrième appel retournera la valeur 10.0, et ainsi de suite. De façon générale, le \(i\)ème appel de la méthode retournera \(S_{i-1} + i\), pour \(i \in 1, 2, 3\ldots\) et \(S_{i-1}\) est la valeur de l'appel précédent de la méthode next. $$ S_n = \sum_{i=1}^{n} i $$

Voici les 5 premières sommes partielles de la série arithmétique: $$S_1 = 1$$ $$S_2 = 1 + 2 = 3$$ $$S_3 = 1 + 2 + 3 = 6$$ $$S_4 = 1 + 2 + 3 + 4 = 10$$ $$S_5 = 1 + 2 + 3 + 4 + 5 = 15$$

Utilisez le gabarit fourni comme point de départ.

2.3 Geometric

Vous devez implémenter la classe Geometric. Cette classe est une sous-classe de AbstractSeries. Chaque appel de la méthode next produit la prochaine somme partielle de cette série selon l'équation ci-bas. Le premier appel produira la valeur 1.0, le second appel produira la valeur 1.5, le troisième appel produira la valeur 1.75, etc. Vous pouvez utiliser la méthode Math.pow( a, b ), qui retourne \(a^b\), pour vos calculs. $$ S_n = \sum_{i=0}^{n} \frac{1}{2^i}$$

Voici les 5 premières sommes de la série géométrique: $$ S_1 = 1 $$ $$ S_2 = 1 + \frac{1}{2} = 1.5 $$ $$ S_3 = 1 + \frac{1}{2} + \frac{1}{4} = 1.75 $$ $$ S_4 = 1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} = 1.875 $$ $$ S_5 = 1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \frac{1}{16} = 1.9375 $$ Chaque appel à la méthode next produit la prochaine somme partielle, c'est-à-dire la prochaine valeur de \( S_n \).

Utilisez le gabarit fourni comme point de départ

Troisième partie

Créer et soumettre un fichier zip (1 point)

Directives

  • Créez un répertoire que vous nommerez lab5_123456, où vous remplacerez 123456 par votre numéro d'étudiant. Notez que le nom du répertoire est en minuscules, incluant la lettre «l».
  • Dans ce répertoire, placer les fichiers pour les exercices du laboratoire. N'y ajoutez que le code source, les fichiers .java. En particulier, ne soumettez pas les fichiers .class.
  • Dans ce répertoire, créez aussi un fichier texte nommé README.txt, qui devra contenir votre nom, numéro d'étudiant, ainsi qu'une brève description du contenu (en français ou en anglais, c'est votre choix) :
    
    Nom de l'étudiante ou de l'étudiant: Paidge Beaulieu
    Numéro d'étudiant: 123456
    Code du cours: ITI1121
    Section de laboratoire: A02
    
    Cette archive contient les 8 fichiers du laboratoire 5.
    
    Spécifiquement, ce fichier (README.txt), ainsi que
    AbstractSeries.java, Arithmetic.java, Book.java, BookComparator.java, Geometric.java,
    Library.java, Series.java.
    
                        
  • Créez un fichier zip lab5_123456.zip à partir du répertoire lab5_123456.
  • Assurez-vous que cette archive comprend tous les fichiers nécessaires. Pour ce faire, copiez le fichier zip quelque part, ouvrez-le et assurez-vous que les fichiers et les répertoires espérés s'y trouvent.
  • Soumettez l'archive sur le site Web https://uottawa.brightspace.com/.

Remarques importantes!

Nous utilisons des scripts automatisés pour tester et évaluer votre soumission de laboratoire. Par conséquent, vous devez suivre ces instructions à la lettre. En particulier:
  • Les noms de tous les fichiers et méthodes doivent être exacts. Utilisez le code de démarrage fourni pour éviter des problèmes.
  • Il faut soumettre un fichier .zip; pas de fichiers individuels; pas un .rar, pas un .7z, ni rien d’autre.
  • Tous les fichiers de java doivent être présents et compiler avec succès (autrement dit, l’exécution de javac *.java ne doit générer aucune erreur), même si vous n’êtes pas capable de compléter un exercice.
  • Notez si le code ne sera pas compilé en raison d'erreurs de syntaxe, vous n'obtiendrez pas de marque. Même si vous ne pouvez pas à résoudre complètement cet exercice, vous devez déposer un fichier contenant les méthodes intactes qui compilent correctement (vous pouvez mettre "return 0" si vous avez abandonné).
  • Votre travail doit être soumis au plus tard à 23h30 le mardi de la semaine prochaine.

JUnits

Pour vous assurer que votre code est correct, nous avons préparé quelques tests unitaires. Consultez le fichier Readme.txt dans le fichier zip pour obtenir des informations supplémentaires.

Resources

Table of Contents