7
Testons votre niveau Programmation objet – TP1 EX 1 : Les articles du supermarché Écrivez une classe Article pour représenter les articles vendus dans un supermarché. Chacun comporte quatre variables d’instance private long reference un numéro qui caractérise l’article de manière unique private String intitule – la description de l’article sous forme de texte private float prixHT – le prix unitaire hors taxes de l’article private int quantiteEnStock le nombre d’unités de l’article disponibles et dispose d’un certain nombre de méthodes public Article(long reference, String intitule, float prixHT, int quantiteEnStock) constructeur «immédiat» qui donne une valeur à chacune des variables d’instance, public long getReference(), public String getIntitule(), public int getQuantiteEnStock() – les « accesseurs » permettant d’obtenir la valeur de chaque variable d’instance public void approvisionner(int nombreUnites) méthode pour augmenter la quantité disponible de l’article public boolean vendre(int nombreUnites) cette méthode enregistre la vente d’un certain nombre d’unités de l’article, dont il faut donc diminuer en conséquence la quantité disponible en stock. Si nombreUnites est supérieur à la quantité disponible alors le stock n’est pas modifié et la méthode renvoie false ; autrement elle renvoie true. public float prixHT() cette méthode calcule et renvoie le prix HT de l’article public float prixTTC() cette méthode calcule et renvoie le prix TTC de l’article public String toString() chaîne de caractères exprimant la référence, l’intitulé et le prix de l’article. public boolean equals(Article unArticle) a.equals(b) est true si et seulement si a et b représentent le même article (c’est-à-dire s’ils ont la même référence). Pour tester cette classe écrivez une méthode main qui crée un tableau comportant trois articles (au moins) et qui essaie toutes ces méthodes. EX 2 : Dates Pour cet exercice faites semblant de ne pas savoir qu’il existe dans la bibliothèque Java des classes java.util.Date et java.util.Calendar qui offrent probablement les services demandés ici.

Testons votre niveau - bdafflon.eu

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Testons votre niveau - bdafflon.eu

TestonsvotreniveauProgrammationobjet–TP1

EX1:LesarticlesdusupermarchéÉcrivez une classe Article pour représenter les articles vendus dans un supermarché. Chacun comporte quatre variables d’instance

• private long reference – un numéro qui caractérise l’article de manière unique

• private String intitule – la description de l’article sous forme de texte• private float prixHT – le prix unitaire hors taxes de l’article• private int quantiteEnStock – le nombre d’unités de l’article disponibles

et dispose d’un certain nombre de méthodes

• public Article(long reference, String intitule, float prixHT, int quantiteEnStock) – constructeur «immédiat» qui donne une valeur à chacune des variables d’instance,

• public long getReference(), public String getIntitule(), public int getQuantiteEnStock() – les « accesseurs » permettant d’obtenir la valeur de chaque variable d’instance

• public void approvisionner(int nombreUnites) – méthode pour augmenter la quantité disponible de l’article

• public boolean vendre(int nombreUnites) – cette méthode enregistre la vente d’un certain nombre d’unités de l’article, dont il faut donc diminuer en conséquence la quantité disponible en stock. Si nombreUnites est supérieur à la quantité disponible alors le stock n’est pas modifié et la méthode renvoie false ; autrement elle renvoie true.

• public float prixHT() – cette méthode calcule et renvoie le prix HT de l’article

• public float prixTTC() – cette méthode calcule et renvoie le prix TTC de l’article

• public String toString() – chaîne de caractères exprimant la référence, l’intitulé et le prix de l’article.

• public boolean equals(Article unArticle) – a.equals(b) est true si et seulement si a et b représentent le même article (c’est-à-dire s’ils ont la même référence).

Pour tester cette classe écrivez une méthode main qui crée un tableau comportant trois articles (au moins) et qui essaie toutes ces méthodes.

EX2:DatesPour cet exercice faites semblant de ne pas savoir qu’il existe dans la bibliothèque Java des classes java.util.Date et java.util.Calendar qui offrent probablement les services demandés ici.

Page 2: Testons votre niveau - bdafflon.eu

Écrivez une classe Date dont chaque instance représente une date précise. Mettez-y quatre variables d’instance privées : annee (un entier non négatif), mois (un entier compris entre 1 et 12), jour (un entier compris entre 1 et une borne supérieure qui dépend du mois) et jourSemaine (un entier indiquant le jour de la semaine : 0 pour lundi, 1 pour mardi, etc. Écrivez les méthodes

• public Date(int jour, int mois, int annee) – initialisation d’une date, à partir des trois nombres donnés. La validité des ces nombres doit être vérifiée (voyez ci-dessous comment) et, en cas de date incohérente, un message doit être affiché et le programme abandonné. C’est ici que le jour de la semaine doit être déterminé (voyez ci-dessous une manière simple de le faire).

• int getJour(), int getMois(), int getAnnee(), int getJourSemaine() – des « accesseurs » pour obtenir les valeurs correspondantes

• public String toString() – renvoie l’expression d’une date sous forme de texte, comme "vendredi 8 décembre 2006"

• public boolean infeg(Date d) – comparaison : a.infeg(b) renvoie true si la date a est antérieure ou égale à la date b, sinon cela renvoie false.

• Pour simplifier, supposez qu’une année est bissextile si et seulement si son millésime est divisible par quatre

EX3:Fractions La bibliothèque Java ne comporte pas de classe pour représenter les fractions (comme celles de l’école primaire, avec un numérateur et un dénominateur). On se propose ici de pallier ce manque, en définissant une classe Fraction munie des méthodes suivantes :

• public Fraction(BigInteger num, BigInteger den) – constructeur basique • public Fraction(int n, int d) – construction d’une fraction à partir de deux

entiers (qu’il faudra convertir en BigInteger) • public Fraction(int n) – construction d’une fraction à partir d’un entier (pour

transformer un entier en fraction on met 1 comme dénominateur) • public Fraction add(Fraction f) – addition de deux fractions • public Fraction sub(Fraction f) – soustraction de fractions • public Fraction mult(Fraction f) – multiplication de fractions • public Fraction divi(Fraction f) – division de fractions • public String toString() – conversion d’une fraction en chaîne de caractères • public double doubleValue() – obtention d’une valeur décimale qui est une

approximation de la fraction C'est pour éviter les problèmes de débordement qu'il est conseillé de représenter le numérateur et le dénominateur d’une fraction par des objets BigInteger.

EX4Polygones Pour cet exercice vous devez disposer d’une classe Point avec – au moins – deux membres d’instance privés x et y de type double (par exemple), un constructeur et des accesseurs :

• public Point(double x, double y), • public double x() et

Page 3: Testons votre niveau - bdafflon.eu

• public double y() • public String toString().

Définissez une classe Polygone comportant la variable membre :

• protected Point[] sommets – tableau contenant les sommets du polygone et les méthodes :

• public Polygone(Point[] sommets) – construction d’un polygone à partir du tableau de ses sommets

• protected Polygone(int nbrSommets) – début de la construction d’un polygone à partir du nombre de ses sommets ; ces derniers restent ndéterminés (ou plutôt valent null) et devront être donnés

• public double aire() – calcul de la surface du polygone (voir indications ci-dessous)

• public String toString() – expression textuelle du polygone ; par exemple "[(1.0,1.0),(5.0,1.0),(3.0,2.0)]"

Définissez une classe Triangle, sous-classe de Polygone, avec un constructeur public Triangle(Point a, Point b, Point c) Définissez une classe Rectangle (sous-entendu, avec des côtés parallèles aux axes), sous-classe de Polygone, munie d’un constructeur public Rectangle(double xMin, double xMax, double yMin, double yMax) – construction d’un rectangle parallèle aux axes Définissez une classe PolygoneRegulier, sous-classe de Polygone, disposant d’un constructeur public PolygoneRegulier(Point centre, double rayon, int nombreSommets) – construction du polygone régulier ayant le centre, le rayon et le nombre de sommets indiqués. Écrivez une classe TestPolygone avec une méthode main construisant et affichant des polygones de diverses sortes et permettant de vérifier que la méthode aire est correcte.

Ex5:Abstraction,classesabstraites,interfaces

Dans cet exercice on vous demande de définir un ensemble de classes pour représenter des fonctions d’une variable formées avec des constantes, des occurrences de la variable x, les quatre opérations arithmétiques +, –, ×, / et des appels de quelques fonctions convenues comme sin, cos exp, log, etc. Par exemple :

12 x + sin(3x – 5)

Dansunprogramme,uneexpressioncommecelle-làpeutêtreefficacementreprésentéeparunestructurearborescente,organiséecommelemontrelafigureci-contre,faitedefeuilles(lesconstantesetlesvariables),denœudsàdeux«descendants»(lesopérateursbinaires)etdenœudsàundescendant(lesfonctionsd’unevariable).

Page 4: Testons votre niveau - bdafflon.eu

Lesclassesqu’ilfautdéfinirsontdestinéesàreprésenterlesnœudsd’untelarbre.Ilyenadoncdeplusieurssortes:unnœudreprésentantuneconstanteporteunnombre,lavaleurdelaconstante, unnœudreprésentantuneoccurrencedelavariablexneporteaucuneautre information,unnœudreprésentantuneaddition,unesoustraction,unemultiplicationouunedivisionportedeuxinformations:lesexpressionsquisontsesopérandes,unnœudreprésentantl’appeld’unefonctionportecommeinformationl’expressionsquiestsonargument.Définissezlesclassessuivantes:

• Expression – (interface) représentantcequ’ontencommuntouteslesexpressionsarithmétiques(c’est-à-diretouteslessortesdenœudsdenotrestructurearborescente):ellesecomposed’uneseuleméthode:public double valeur(double x); quirenvoielavaleurdel’expressionpourlavaleurdexdonnée.Bienentendu,touteslesclassesconcrètesdecettehiérarchiedevrontfournirunedéfinitiondelaméthodevaleur.EllesfournirontaussiunereéfinitionintéressantedelaméthodeString toString().

• Constante –(classeconcrète)dontchaqueinstancereprésenteuneoccurrenced’uneconstante.Cetteclasseaunmembre:lavaleurdelaconstante.

• Variable –(classeconcrète)dontchaqueinstancereprésenteuneoccurrencedelavariablex.Cetteclassen’abesoind’aucunmembre.

• OperationBinaire –(classeabstraite)rassemblantcequ’ontencommuntouslesopérateursàdeuxopérandes.Elleadoncdeuxmembresd’instance,detypeExpression,représentantlesdeuxopérandes,etleconstructeurquivaavec.

• Addition,Soustraction,Multiplication,Division –(classesconcrètes)pourreprésenterlesopérationsbinaires.C’esticiqu’ontrouveunedéfinitionpertinentedelaméthodevaleur promisedansl’interfaceExpression.

• OperationUnaire –(classeabstraite)rassemblantcequ’ontencommuntouslesopérateursàunopérande.Elledoitavoirunmembred’instance,detypeExpression,représentantl’opérandeenquestion.

• Sin,Cos,Log,Exp,etc.–(classesconcrètes)pourreprésenterlesfonctionsstandard.Iciondoittrouverunedéfinitionpertinentedelaméthodevaleur promisedansl’interfaceExpression.

Ecrireunprogrammequipermetdecréeruntelarbreetdelerésoudre.

Ex6:ListestriéesÉcrivezunprogrammequiconstruitunecollectiontriéecontenantnnombresentiers(représentéspardesobjetsInteger)tirésauhasarddontlavaleurestcompriseentre0et1000.Avotrechoix,lavaleurdenestlueaudébutdel’exécutionouestunargumentduprogramme.Ensuite,cedernieraffichelacollectionconstruiteafinqu’onpuisseconstaterqu’elleestbientriée.DanslapremièreversionduprogrammelacollectionestunesortedeList<Integer>(parexempleunArrayListouuneLinkedList)quevoustriez,aprèslaconstruction,enutilisantuneméthodestatiqueadhocdelaclasseCollections.

Page 5: Testons votre niveau - bdafflon.eu

Dansunedeuxièmeversion,lacollectionestunesortedeSet<Integer>(c’est-à-direunHashSetouunTreeSet)sibienqu’elleestconstammenttriée.

EX7:Arborescences

Une arborescence (avec moins de rigueur on dit parfois arbre) est une structure de données formée d’un ensemble E et d’une relation qui à chaque élément de E – sauf un, appelé la racine de l’arborescence – associe un autre élément appelé son père.

Les éléments d’une arborescence sont appelés nœuds ; à chaque nœud n est donc associée une liste, éventuellement vide, de nœuds dont n est le père ; on les appelle les fils de n. Lorsqu’un nœud n’a pas de fils, on dit que c’est une feuille.

Pour fixer les idées nous supposerons ici que les informations portées par les nœuds sont des chaînes de caractères.

Écrivez une classe Noeud pour représenter les [nœuds des] arborescences. Elle aura deux variables privées

• info, de type String, pour représenter l’information portée par le nœud, • fils, de type ArrayList<Noeud>, pour représenter la liste des fils du nœud. et les méthodes publiques suivantes :

• Noeud(String info) – construction d’un nœud portant l’information indiquée, • String info() – renvoie l’information portée par le nœud, • boolean estFeuille() – vrai si et seulement si le nœud n’a pas de fils, • void ajouterFils(Noeud fils) – ajoute le nœud indiqué comme fils du nœud en question, • Iterator fils() – renvoie un itérateur permettant de parcourir la liste des fils du nœud ; le comportement est indéfini si le nœud est une feuille, • void afficher() – affiche le nœud et tous ses descendants (ses fils, les fils de ses fils, etc.) à raison de un nœud par ligne ; la hiérarchie (c.-à-d. « qui est fils de qui ? ») est exprimée par une marge à gauche de, par exemple, trois espaces par niveau.

Pour essayer la classe Noeud, écrivez une classe de test qui construit et affiche l’arborescence des fichiers et répertoires ayant pour racine le répertoire de travail.

Pour vous promener dans les fichiers et répertoires, les méthodes suivantes de la classe java.io.File vous seront utiles : getName(), isDirectory(), listFiles().

Pour améliorer votre conception, transformez Noeud en classe abstraite, et créez deux classes filles NoeudInterne et Feuille. Supprimez donc la méthode estFeuille() et ses appels, la méthode ajouterFils() est seulement présente dans un NoeudInterne. Modifiez éventuellement votre classe de test.

EX8:LesthreadsUn"compteur"aunnom(Totoparexemple)etilcomptede1àn(nombreentierpositifquelconque).Ilmarqueunepausealéatoireentrechaquenombre(de0à5000millisecondesparexemple).Uncompteuraffichechaquenombre(Toto

Page 6: Testons votre niveau - bdafflon.eu

afficheraparexemple,"Toto:3")etilafficheunmessagedutype"***Totoafinidecompterjusqu'à10"quandilafini.Ecrivezlaclassecompteurettestez-laenlançantplusieurscompteursquicomptentjusqu'à10.Voyezceluiquiafinileplusvite.ModifiezlaclasseCompteurpourquechaquecompteuraffichesonordred'arrivée:lemessagedefinestdutype:"Totoafinidecompterjusqu'à10enposition3".ModifiezlaclasseCompteurpourquechaquecompteurdonneuncoupdepouceàundesautrescompteurs(choisiauhasard)justeaprèsavoiraffichéunnombre:ilinterromptlapausedecetautrecompteur(pauseentrel'affichagede2nombres),cequiraccourcitledélaientrel'affichagede2nombres.

Ex8:CommunicationreseauOnveutcréeruneapplicationclient/serveurquipermetdesavoirsiunemachineestactive.CetteapplicationutilisedessocketsTCP.

• Leserveurattendunerequêteduclientsurleport1027etluienvoieunmessage(parexemplecontenantl’heurelocale).Leserveurdoitdoncêtrecapabledegérerplusieursclientssimultanément.

• Leclientlituneadresseauclavieretenvoieunerequêteauserveurdela

machinecorrespondantepoursavoirsielleestactive.Dansl’affirmative,ilaffichelemessageenvoyéparleserveur.

Modifierl’applicationprécédentepourque

• Leserveurattendunerequêteduclientsurleport1027puisenvoieunmessagerégulièrement.L’arrêtdelacommunicationsefaitàl’initiativeduclient.

• Leclientlituneadresseauclavieretenvoieunerequêteauserveurdelamachinecorrespondantepoursavoirsielleestactive.Dansl’affirmative,ilaffichelesmessagesenvoyésparleserveurjusqu’àcequel’utilisateurdemanded’arrêter.

EX9:Lesfichiers

L'objectif de cet exercice est d'écrire un fichier texte du type suivant : reference:nom:prenom Par exemple le fichier clients.txt contient :

12:Bob:Morane 3:Bruce:Wayne 18:Corben:Dallas

Page 7: Testons votre niveau - bdafflon.eu

1. Ecrivez rapidement une classe Client contenant trois attributs : nom, prenom et reference.

2. Ajoutez un constructeur à trois paramètres, trois accesseurs en lecture et le toString().

3. Ecrivez une classe WFichierClient sans attribut et possédant uniquement le constructeur par défaut.

4. Ajoutez une méthode ayant la signature suivante : public void ecrire(Client[] myClients, String myFile) throws IOException Cette méthode devra écrire un tableau de Client dans un fichier myFile. Utilisez le package java.io ainsi que les classes File, BufferedWriter et FileWriter.

5. Ajoutez un main à la classe WFichierClient où vous créez un tableau de trois Client et les écrivez dans un fichier clients.txt.

Ecrivez une classe RFichierClient identique à WFichierClient, mais contenant une méthode avec la signature suivante : public Client[] lire(String myFile) throws IOException

Cette method devra lire un tableau de Client dans un fichier myFile.

Utilisez le package java.io ainsi que les classes File, BufferedReader et FileReader. Pour "découper" chaque chaîne lue, utilisez les méthodes lastIndexOf et subString de la classe String.

Ajoutez un main à la classe RFichierClient où vous lirez un tableau de trois clients à partir du fichier clients.txt de la question 1.

EX10Exception Écrivez la classe TropViteException héritant de la classe Exception. La classe TropViteException constructeur prend un entier en paramètre et appelle le super-constructeur avec le message "C'est une exception de type TropViteException. Vitesse en cause : " + l'entier.

Écrivez la classe Vehicule qui n'a pas d'attributs. La classe Vehicule propose un constructeur vide qui ne contient rien et une seule méthode testVitesse(). La méthode testVitesse() prend un entier en paramètre, ne renvoie rien. Si l'entier est supérieur à 90, la méthode lance une TropViteException.

Ajoutez un main à la classe Vehicule. Créez un objet de type Vehicule et appelez la méthode testVitesse() avec 50 puis avec 100. Affichez la pile d'appel de l'exception.