Programmation Orientée Objets et Evénementielle
Ce document propose une série d'exercices sur la programmation orientée objets en Java, portant sur les notions de classes, héritage, polymorphisme, classes abstraites et collections.
D'après le document Programmation Orientée Objets et Evénementielle
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.
Document source
Programming, Object-Oriented Programming, Java · PDF · 7 pages · 2008
Afficher l'aperçu du document
Ce document propose une série d'exercices sur la programmation orientée objets en Java, portant sur les notions de classes, héritage, polymorphisme, classes abstraites et collections. Il s'agit d'un contrôle continu ou d'un devoir surveillé visant à tester la compréhension des concepts fondamentaux de la programmation orientée objets, la capacité à analyser et corriger un code existant, ainsi qu'à concevoir et implémenter des solutions en Java.
Exercice 1 : Analyse d'un programme Java
Il s'agit d'analyser un programme Java comportant une hiérarchie de classes Livre, BD, Album, et de comprendre son fonctionnement, notamment l'héritage, les constructeurs, les méthodes et l'encapsulation.
1) Que va afficher le programme lors de son exécution ?
Le programme crée plusieurs objets :
- Deux BD (bandes dessinées) b1 et b2 avec des titres, auteurs, prix, nombre de pages et un booléen indiquant si elles sont en couleur.
- Deux livres l1 et l2 avec titres, auteurs, prix et nombre de pages.
- Un album a1 avec titre, auteur, nombre de pages et prix.
Les appels successifs sont :
- b1.Acheter("moi") : assigne "moi" comme propriétaire de b1.
- b1.Afficher() : affiche les informations de b1.
- b2.Afficher() : affiche les informations de b2.
- l1.Afficher() : affiche les informations de l1.
- l1.Acheter("moi") : assigne "moi" comme propriétaire de l1.
- l1.Afficher() : affiche les informations de l1 mises à jour.
- l1.prix = 0.0 : modifie le prix de l1.
- l2.Acheter("lui") : assigne "lui" comme propriétaire de l2.
- l2.Afficher() : affiche les informations de l2.
- a1.Afficher() : affiche les informations de l'album a1.
- a1.Colorie(23) : tente de colorier la page 23 de l'album.
- a1.Acheter("moi") : assigne "moi" comme propriétaire de a1.
- a1.Colorie(23) : tente de recolorier la page 23.
Les affichages pour chaque objet sont :
- BD b1 : affiche titre, auteur, prix, nombre de pages, et indique si elle est en couleur. Le propriétaire est "moi".
- BD b2 : même affichage, propriétaire vide.
- Livre l1 : affiche titre, auteur, prix (modifié à 0.0 après achat), nombre de pages, propriétaire "moi".
- Livre l2 : affiche titre, auteur, prix, nombre de pages, propriétaire "lui".
- Album a1 : affiche titre, auteur, prix, nombre de pages, propriétaire vide initialement.
- Lors du premier appel a1.Colorie(23), la page 23 n'est pas encore coloriée, le propriétaire est vide donc l'album est neuf, la page 23 est coloriée et un message indique que la page est coloriée.
- Après a1.Acheter("moi"), le propriétaire devient "moi".
- Lors du second appel a1.Colorie(23), la page 23 est déjà coloriée, donc un message indique que la page est déjà coloriée.
En résumé, le programme affiche les informations des livres et bandes dessinées avec leurs attributs, indique les propriétaires, et gère la coloration des pages de l'album en fonction de leur état et du propriétaire.
2) Comment Java interprète-t-il l'attribut prix défini sans modificateur d'accès dans Livre ? Comment est-il testé dans le programme ?
L'attribut prix est défini sans modificateur d'accès (ni public, ni private, ni protected), ce qui signifie qu'il a un accès par défaut (package-private). Cela veut dire qu'il est accessible uniquement aux classes du même paquet.
Dans le programme, on voit que l'attribut prix est modifié directement dans le code principal par l1.prix = 0.0;, ce qui est possible car la classe Test est dans le même paquet que Livre.
Conclusion : l'attribut prix est accessible en lecture et écriture dans les classes du même paquet, ce qui est confirmé par la modification directe dans le programme.
3) Comment teste-t-on si un livre est neuf dans ce programme ?
La méthode Est_neuf() teste si un livre est neuf en vérifiant si l'attribut proprietaire est vide :
if (proprietaire == "") return true;
else return false;
Autrement dit, un livre est considéré neuf s'il n'a pas encore de propriétaire.
Donc, le critère pour un livre neuf est que son propriétaire soit la chaîne vide.
4) Décrire la hiérarchie des classes et expliquer l'appel des constructeurs
La hiérarchie est la suivante :
Livreest la superclasse de base, avec les attributs titre, auteur, propriétaire, nombre de pages, prix.BD(bande dessinée) étendLivreet ajoute un attributencouleur(booléen).AlbumétendLivreet ajoute un tableau booléenpage_coloriee[]pour suivre les pages coloriées.
Concernant les constructeurs :
- Le constructeur de
Livreinitialise les attributs titre, auteur, prix, nombre de pages, et met propriétaire à vide. - Le constructeur de
BDappellesuper(t,a,p,nb)pour initialiser les attributs hérités, puis initialiseencouleur. - Le constructeur de
Albumappelle aussisuper(t,a,p,n)et initialise le tableaupage_colorieeàfalsepour toutes les pages.
En résumé, chaque sous-classe appelle explicitement le constructeur de sa superclasse pour initialiser les attributs hérités avant d'initialiser ses propres attributs.
5) Comment le programme gère-t-il la coloration d'une page d'un album ?
La classe Album possède un tableau booléen page_coloriee[] qui indique pour chaque page si elle est coloriée ou non.
La méthode Colorie(int num_page) fonctionne ainsi :
- Si la page
num_pagen'est pas encore coloriée (page_coloriee[num_page] == false) et que l'album est neuf (Est_neuf()retourne true), alors la page est coloriée (valeur mise à true) et un message indique que la page vient d'être coloriée. - Si la page est déjà coloriée, un message indique que la page a déjà été coloriée.
- Si l'album n'est pas neuf (propriétaire non vide), un message indique qu'il n'est pas possible de colorier car l'album a déjà un propriétaire.
Le programme empêche donc de colorier une page si l'album a déjà un propriétaire ou si la page est déjà coloriée.
6) Identifier et corriger les erreurs de frappe dans le code
Plusieurs erreurs sont présentes :
class BD extend Livredoit êtreclass BD extends Livre.- Les modificateurs d'accès sont mal placés :
protected string titre, auteur, proprietaire;doit êtreprotected String titre, auteur, proprietaire;(Java est sensible à la casse). - Dans le constructeur de BD, la déclaration et l'initialisation des paramètres sont mal ordonnées et incomplètes.
- La boucle dans Album pour initialiser
page_colorieeva jusqu'à 100, or le nombre de pages estn; il faut remplaceri < 100pari < n. - La méthode
Coloriecontient des erreurs de syntaxe et d'affichage (parenthèses mal placées, messages incomplets). - Les noms des méthodes doivent respecter la casse :
acheterdoit êtreAcheterpour correspondre à la déclaration.
Ces corrections sont nécessaires pour que le code compile et fonctionne correctement sous Eclipse.
Exercice 2 : Héritage de classe et constructeurs
Il s'agit de concevoir et d'implémenter une hiérarchie de classes pour un site de vente de livres pour enfants, incluant bandes dessinées et albums à colorier, avec gestion des fonctionnalités supplémentaires.
1) Proposer une solution pour représenter les livres, BD et albums à colorier
On définit :
- Une classe
Livreavec les attributs titre, auteur, prix, nombre de pages. - Une classe
BDqui étendLivreet ajoute un booléenencouleur. - Une classe
Albumqui étendLivreet permet de colorier des pages via un tableau booléen.
Chaque classe possède un constructeur initialisant ses attributs et des méthodes adaptées (affichage, coloration).
Cette solution est conforme à la hiérarchie et aux fonctionnalités décrites.
2) Ajouter la possibilité de revendre un livre et d'échanger deux BD de prix équivalent
Pour revendre un livre, on peut ajouter une méthode Vendre() qui remet le propriétaire à vide.
Pour échanger deux BD, on peut créer une méthode statique ou d'instance qui échange les propriétaires si les prix sont égaux :
if (bd1.prix == bd2.prix) {
String temp = bd1.proprietaire;
bd1.proprietaire = bd2.proprietaire;
bd2.proprietaire = temp;
}
Cette modification permet de gérer la revente et l'échange selon les critères donnés.
3) Étendre la hiérarchie pour intégrer les films (DVD)
On crée une nouvelle classe Film qui étend une superclasse commune (par exemple OeuvreCulturelle), ou directement Livre si on considère que les films partagent les attributs titre, auteur et prix.
La classe Film ajoute un attribut durée (entier ou réel).
Le constructeur de Film initialise titre, auteur, prix et durée.
Cette extension permet d'intégrer les films dans la hiérarchie des œuvres culturelles.
Exercice 3 : Héritage de classe et polymorphisme
Il s'agit de modéliser la programmation journalière d'émissions télévisuelles de différents types, en utilisant héritage, classes abstraites et polymorphisme.
1) Proposer une hiérarchie de classes pour les émissions
On peut définir :
- Une classe abstraite
Emissionavec attributs communs : nom, heure de début, heure de fin. - Une classe
Divertissementqui étendEmission, avec attribut animateur, durée fixe de 2 heures. - Une classe
Fictionqui étendEmission, avec attributs nom du film, année, réalisateur, booléen rediffusion. - Une classe
Reportagequi étendEmission, avec attribut thème (information, animalier, culturel) et durée.
Le thème du reportage peut être codé par un enum ou une constante pour limiter les valeurs possibles.
Cette hiérarchie permet de représenter toutes les émissions possibles avec leurs caractéristiques.
3) Programmer la gestion des heures de diffusion selon les règles
On crée une méthode abstraite dans Emission pour programmer l'heure de début et calculer l'heure de fin en fonction des règles :
- Divertissement : durée 2h, programmation possible uniquement entre 18h et 23h.
- Fiction : non rediffusion programmée uniquement à 21h, rediffusion possible à tout moment.
- Reportage : programmation uniquement aux heures creuses (14h, 18h, 0h-6h) et durée ≤ 1h.
La méthode retourne un booléen indiquant si la programmation est possible.
Cette solution utilise le polymorphisme pour adapter la programmation selon le type d'émission.
4) Définir un programme télé comme un tableau d'émissions et implémenter les algorithmes
On crée un tableau d'objets Emission[] contenant des instances hétérogènes.
Les algorithmes :
- a) Afficher la liste des émissions programmées : parcourir le tableau et appeler une méthode d'affichage polymorphe.
- b) Tester la superposition : vérifier que les plages horaires des émissions ne se chevauchent pas.
- c) Afficher heure par heure les émissions : parcourir les heures de la journée et afficher l'émission programmée ou "vide".
Ces algorithmes permettent de gérer et vérifier la programmation télévisuelle.
Exercice 4 : Classes abstraites, héritage, collections ArrayList
Il s'agit d'implémenter une hiérarchie de formes géométriques : Point, Cercle, Cylindre, avec une classe abstraite Forme.
1) Implémenter la classe abstraite Forme
La classe Forme est abstraite et définit trois méthodes abstraites :
aire(): calcul de l'aire de la forme.volume(): calcul du volume de la forme.afficherNom(): affichage du nom de la forme ("point", "cercle", "cylindre").
Cette classe sert de base pour les autres formes.
2) Classe Point
La classe Point étend Forme et possède deux coordonnées réelles x et y.
Elle propose des getters et setters pour ces coordonnées et une méthode toString() affichant les coordonnées sous la forme [x, y].
Les méthodes aire() et volume() retournent 0 car un point n'a pas d'aire ni de volume.
3) Classe Cercle
La classe Cercle étend Point et ajoute un attribut réel rayon.
Deux constructeurs :
- Sans paramètre : centre (0,0), rayon 0.
- Avec paramètres : coordonnées du centre et rayon.
La méthode toString() affiche centre et rayon.
La méthode aire() calcule l'aire par la formule :
3.14158 * rayon * rayon
La méthode volume() retourne 0.
4) Classe Cylindre
La classe Cylindre étend Cercle et ajoute un attribut réel hauteur.
Elle propose des getters et setters pour la hauteur.
Les méthodes :
aire()calcule :volume()calcule :
2 * aire du cercle + 2 * 3.14159 * rayon * hauteur
aire du cercle * hauteur
La méthode toString() affiche centre, rayon et hauteur.
5) Tester l'implémentation avec FormeTest
On crée :
- Un point (5,5)
- Un cercle de centre (10,15) et rayon 8.5
- Un cylindre de centre (30,30), rayon 12.5 et hauteur 20
On affiche les coordonnées, aires, volumes et noms des formes.
Les résultats attendus sont :
[5.0, 5.0]
Aire de Point = 0.0 et volume = 0.0
Centre = [10.0, 15.0], Rayon = 8.5
Aire de Cercle = 226.9798775 et volume = 0.0
Centre = [30.0, 30.0], Rayon = 12.5, hauteur = 20.0
Aire de Cylindre = 2552.541875 et volume = 9817.46875
Ce test valide la bonne implémentation des classes et méthodes.
Exercice 5 : Collections ArrayList et gestion de véhicules
Un collectionneur possède différents types de véhicules (autos, motos, camions) avec marque, modèle et couleur. Il souhaite gérer sa collection avec plusieurs fonctionnalités.
1) Proposer une solution orientée objet pour représenter les véhicules
On crée une classe de base Vehicule avec attributs marque, modèle, couleur.
Les classes Auto, Moto, Camion étendent Vehicule.
Le type du véhicule est géré par l'héritage.
Cette structure permet de représenter tous les véhicules.
2) Implémenter la solution sous Eclipse et tester les classes
On crée des instances de chaque type de véhicule avec leurs attributs et on teste les constructeurs et méthodes d'affichage.
3) Gérer la collection avec ArrayList
On utilise une ArrayList<Vehicule> pour stocker les véhicules, car le nombre de véhicules n'est pas connu à l'avance.
L'affichage se fait avec ou sans itérateur.
4) Créer une classe héritant d'ArrayList pour répondre aux besoins spécifiques
Cette classe ajoute des méthodes pour :
- Afficher les véhicules d'une couleur donnée.
- Rechercher un véhicule par marque et modèle.
- Vendre un véhicule (le retirer de la liste).
5) Interface graphique
Une interface graphique est créée avec une liste de boutons représentant chaque véhicule. Cliquer sur un bouton affiche les informations détaillées du véhicule sélectionné.
Cette solution complète permet de gérer efficacement la collection de véhicules.
Méthodologie récompensée par ce sujet
Ce sujet valorise :
- La compréhension précise des concepts d'héritage, encapsulation, polymorphisme et classes abstraites.
- La capacité à analyser un code existant, identifier ses erreurs et proposer des corrections justifiées.
- La rigueur dans l'implémentation des constructeurs et méthodes, notamment l'appel aux super-constructeurs.
- L'usage correct des modificateurs d'accès et la gestion des attributs selon les règles Java.
- La conception d'une hiérarchie de classes cohérente et adaptée aux besoins fonctionnels.
- L'application du polymorphisme pour gérer des comportements spécifiques selon le type d'objet.
- L'utilisation des collections (ArrayList) et des itérateurs pour gérer des ensembles dynamiques d'objets.
- La clarté dans la présentation des solutions, avec des étapes explicites et des justifications.
Les erreurs pénalisées sont notamment :
- Les fautes de syntaxe et de casse en Java.
- Le non-respect des conventions d'appel des constructeurs.
- L'oubli de l'encapsulation ou l'accès incorrect aux attributs.
- Une mauvaise gestion des types et des hiérarchies.
- Le manque d'explications ou de raisonnement dans les réponses.
En résumé, ce sujet récompense une approche méthodique, rigoureuse et complète de la programmation orientée objets en Java.
Commentaires
Aucun commentaire pour le moment. Posez la première question.