Examen de juin 2000

Durée de l'épreuve : 2 heures

L'usage des polycopiés du cours est autorisé. Tous les autres documents, sous
quelque forme que ce soit (papier, électronique ou autre) sont interdits, y
compris les énoncés et corrigés des exercices des TD.

Le barême est donné entre crochets au début de chaque question.

Exercice 1 [4 pts] :

Une classe A définit une méthode m() et redéfinit la
méthode toString(). Le profil de la méthode m() est :
``public A m()''.

Voici une portion de code d'une autre classe B :

java.util.List liste = new java.util.ArrayList();
// les lignes qui suivent ont été omises ;
// elles remplissent la liste avec des instances de A
. . .
String s;
for (int i = 0; i < liste.size(); i++) {
    System.out.println(liste.get(i).m());
    s += liste.get(i).toString();
}
  1. Indiquez les erreurs éventuelles du code ci-dessus. Pour chaque erreur, dites si le code provoquera une erreur à la compilation ou à l'exécution, et expliquez le problème.
  2. Corrigez les erreurs et, pour chaque ligne à l'intérieur de la boucle, précisez quelles méthodes seront appelées (y compris les appels implicites) en donnant le nom de la méthode et la classe dans laquelle elle est définie.
IMPORTANT : ne corrigez que le code qui empêche le programme de s'exécuter ; ne touchez pas au reste du code, même si vous pensez que le résultat n'est pas celui qui vous semble le meilleur.

Réponses

Exercice 2 [4 pts] :

On reprend l'exercice sur les étagères étudié pendant les TPs.

Rappels :
La classe Etagere a 2 variables :
private Livre[] livres; // contient les livres de l'étagère
private int nbLivres; // nombre de livres de l'étagère

La classe Livre a 2 méthodes
public String getAuteur()
public String getTitre()

Ajoutez à la classe Etagere une méthode rechercherTitres(String auteur) qui renvoie dans un tableau tous les titres des livres écrits par l'auteur ; attention, toutes les cases du tableau devront être remplies.

Réponse

Exercice 3 [4 pts] (noté en fait sur 5 pts) :

  1. Écrivez une méthode enregistrerTitres(String auteur, String fichier) qui enregistre dans le fichier les titres de l'auteur. Il vous est imposé d'utiliser la méthode rechercherTitres de la question précédente.
  2. Écrivez une méthode ArrayList lireTitres(String fichier) qui renvoie une liste de titres de livres lus dans le fichier (supposés écrits par la méthode enregistrerTitres de la question précédente).
  3. Écrivez une méthode ArrayList lireTitres(String fichier, boolean tri) qui renvoie la liste triée par ordre alphabétique si le 2ème paramètre est à vrai (sinon, l'ordre est quelconque). Il vous est imposé d'utiliser la méthode lireTitres() de la question précédente.
Réponses

Exercice 4 [4 pts] :

  1. Écrivez une classe PanelLogin pour un composant graphique qui permet de saisir un nom et un mot de passe dans 2 champs de saisie. Des labels indiquent à l'utilisateur la signification des zones de saisie.
    Remarque : la disposition des composants graphiques ne comptera pas pour la note ; ajoutez-les simplement.
    Pour simplifier, vous utiliserez des JTextField pour saisir le nom et même le mot de passe. On rappelle que getText() permet d'avoir le texte saisi dans un JTextField.
    Une méthode isOk() de la classe permettra de savoir si les nom et mot de passe sont corrects (elle renvoie un booléen). Vous supposerez que vous disposez de la méthode
    public static boolean verifier(String nom, String motDePasse)
    de la classe Utilisateur, qui renvoie vrai si le mot de passe et le nom de login conviennent.
  2. Écrivez le code d'une fenêtre (classe Fenetre) qui contient un panel PanelLogin, un bouton ``Afficher'' qui fait afficher ``Correct'' ou ``Incorrect'', selon que l'utilisateur a entré dans le panel des noms et mot de passe corrects ou incorrects.
    Dans la fenêtre, le PanelLogin sera situé au centre, le bouton Afficher à droite et le résultat (``Correct'' ou ``Incorrect'') en bas.
  3. Pour tester, écrivez une méthode main() dans la classe Fenetre.
Réponse

Exercice 5 [4 pts] :

Une usine fabrique des pièces.

Certaines de ces pièces sont simples. D'autres, dites complexes, sont composées avec plusieurs pièces (déjà fabriquées). Pour simplifier, vous supposerez qu'une pièce complexe n'est pas composée de plus d'une pièce d'un autre type ; par exemple, la pièce de code p1 pourra être composée d'une pièce de code p2 et d'une pièce de code p3 (mais pas de 5 pièces de code p3).

On s'intéresse au temps nécessaire pour la fabrication de ces pièces (mesuré en minutes). Pour les pièces complexes, on connait directement le temps nécessaire à l'assemblage des pièces (déjà fabriquées) mais on voudrait savoir le temps total nécessaire, y compris le temps qu'il a fallu pour fabriquer les pièces assemblées.

  1. Indiquez quelles classes on pourrait utiliser pour modéliser ce problème.

  2. Vous ne donnerez que les en-têtes de classe et les méthodes que vous introduirez pour calculer le temps total de fabrication des pièces (qu'elles soient complexes ou non), et les déclarations des variables d'état utilisées dans ces méthodes.
    Un diagramme UML serait bienvenu.
  3. Donnez aussi un exemple simple de méthode main() qui utilise vos méthodes. Vous pourrez utiliser des méthodes que vous n'aurez pas écrites, en leur donnant des noms significatifs et un rapide commentaire pour les décrire.

  4. Voici ce que devra modéliser la méthode main() (le temps de fabrication de la pièce elle-même est donné entre parenthèses) : 2 pièces simples p1 (10) et p2 (15), 2 pièces complexes p3 (5) et p4 (25). p3 est composé des pièces p1 et p2 ; p4 est composé des pièces p1, p2 et p3.
  5. A quels endroits de votre code avez-vous utilisé le polymorphisme ?
Réponse