Exercices POO – Didacticiel de programmation Java – comment ecrire un livre d’heroic fantasy

Exercices sur les classes

Ex: Le Cercle Classe (Introduction aux classes et aux instances)

Ce premier exercice vous guidera à travers tous les concepts de base en POO.

ExerciseOOP_Circle.png

Une classe appelée cercle est conçu comme indiqué dans le diagramme de classes suivant. Il contient:

  • Deux privé variables d'instance: rayon (du type double) et Couleur (du type Chaîne), avec la valeur par défaut de 1,0 et "rouge", respectivement.
  • Deux surchargé constructeurs – a défaut constructeur sans argument, et un constructeur qui prend un double argument pour radius.
  • Deux Publique méthodes: getRadius () et getArea (), qui renvoient respectivement le rayon et la surface de cette instance.

Les codes sources pour Circle.java est comme suit:




classe publique Cercle 
   
   double rayon privé;
   couleur de chaîne privée;
   
   
   cercle public () 
      rayon = 1,0;
      couleur = "rouge";
   
   
   
   cercle public (double r) 
      rayon = r;
      couleur = "rouge";
   
   
   
   public double getRadius () 
     rayon de retour;
   
   
   
   public double getArea () 
      rayon de retour * rayon * Math.PI;
   

Compiler "Circle.java". Pouvez-vous exécuter le Cercle classe? Pourquoi?

Ce Cercle la classe n'a pas de principale() méthode. Par conséquent, il ne peut pas être exécuté directement. Ce Cercle classe est un «bloc de construction» et est destiné à être utilisé dans un autre programme.

Laissez-nous écrire un programme de test appelé TestCircle (dans un autre fichier source appelé TestCircle.java) qui utilise le Cercle classe, comme suit:


classe publique TestCircle 
   public static void main (String () args) 
      
      Cercle c1 = nouveau cercle ();
      
      System.out.println ("Le cercle a un rayon de"
         + c1.getRadius () + "et zone de" + c1.getArea ());
   
      
      Cercle c2 = nouveau cercle (2.0);
      
      System.out.println ("Le cercle a un rayon de"
         + c2.getRadius () + "et zone de" + c2.getArea ());
   

Maintenant, lancez le TestCircle et étudier les résultats.

Concepts POO plus basiques
  1. Constructeur: Modifier la classe Cercle d'inclure un troisième constructeur pour la construction d'un Cercle exemple avec deux arguments – un double pour rayon et un Chaîne pour Couleur.
    
    cercle public (double r, chaîne c) ......

    Modifier le programme de test TestCircle construire une instance de Cercle en utilisant ce constructeur.

  2. Getter: Ajouter un getter pour variable Couleur pour récupérer le Couleur de cette instance.
    
    public String getColor () ......

    Modifiez le programme de test pour tester cette méthode.

  3. Publique contre. privé: Dans TestCircle, pouvez-vous accéder à la variable d'instance rayon directement (par exemple, System.out.println (c1.radius)) ou assigner une nouvelle valeur à rayon (par exemple., c1.radius = 5.0)? Essayez-le et expliquez les messages d'erreur.
  4. Setter: Est-il nécessaire de changer les valeurs de rayon et Couleur d'un Cercle exemple après qu'il soit construit? Si oui, ajoutez deux Publique méthodes appelées les setters pour changer le rayon et Couleur d'un Cercle exemple comme suit:
    
    setRadius (double newRadius) vide public 
       rayon = newRadius;
    
     
    
    public void setColor (String newColor) ......

    Modifier le TestCircle pour tester ces méthodes, par exemple,

    Cercle c4 = nouveau cercle ();
    c4.setRadius (5,0);
    System.out.println ("radius is:" + c4.getRadius ());
    c4.setColor (......);
    System.out.println ("color is:" + c4.getColor ());
    
    
    System.out.println (c4.setRadius (4.0));
  5. Mot-clé "ce": Au lieu d'utiliser des noms de variables tels que r (pour rayon) et c (pour Couleur) dans les arguments des méthodes, il est préférable d'utiliser des noms de variables rayon (pour rayon) et Couleur (pour Couleur) et utilisez le mot clé spécial "ce"pour résoudre le conflit entre les variables d’instance et les arguments des méthodes. Par exemple,
    
    double rayon privé;
    
    
    cercle public (double rayon) 
       this.radius = rayon;
       couleur = .......
    
    
    
    setRadius (double rayon) vide public 
       this.radius = rayon;
    

    Modifier TOUS les constructeurs et les setters dans le Cercle classe à utiliser le mot clé "ce".

  6. Méthode toString (): Chaque classe Java bien conçue doit contenir un Publique méthode appelée toString () qui renvoie une brève description de l'instance (dans un type de retour de Chaîne). le toString () méthode peut être appelée explicitement (via nom de l'instance.toString ()) comme toute autre méthode; ou implicitement à travers println (). Si une instance est transmise au println (une instance) méthode, la toString () méthode de cette instance sera invoquée implicitement. Par exemple, inclure ce qui suit toString () méthodes à la Cercle classe:
    
    chaîne publique toString () 
       retourne "Cercle (rayon =" + rayon + "couleur =" + couleur + ")";
    

    Essayez d'appeler toString () méthode explicitement, comme toute autre méthode:

    Cercle c1 = nouveau cercle (5,0);
    System.out.println (c1.toString ());   

    toString () est appelé implicitement quand une instance est passée à println () méthode, par exemple,

    Cercle c2 = nouveau cercle (1.2);
    System.out.println (c2.toString ());
    System.out.println (c2);
    System.out.println ("L'opérateur '+' appelle toString () aussi:" + c2);  

Le diagramme de classe final pour le Cercle la classe est la suivante:

ExerciseOOP_Circle_Final.png

Ex: un simplifié Cercle Classe

ExerciseOOP_Circle_Simplified.png

Ex: Le Rectangle Classe

ExerciseOOP_Rectangle.png

Ex: Le Employé Classe

ExerciseOOP_Employee.png

Ex: Le FactureItem Classe

ExerciseOOP_InvoiceItem.png

Ex: Le Compte Classe

ExerciseOOP_Account.png

Ex: Le Rendez-vous amoureux Classe

ExerciseOOP_Date.png

Ex: Le Temps Classe

ExerciseOOP_Time.png

Exercices de composition

Ex: Le Auteur et Livre Classes (Introduction à la composition POO)

Ce premier exercice vous guidera à travers tous les concepts impliqués dans la composition POO.

ExerciseOOP_Author.png

Une classe appelée Auteur (comme indiqué dans le diagramme de classes) est conçu pour modéliser l'auteur d'un livre. Il contient:

Écrire le Auteur classe. Également écrire un pilote d'essai appelé TestAuteur pour tester tous les Publique des méthodes, par exemple,


Auteur ahTeck = nouvel auteur ("Tan Ah Teck", "ahteck@nowhere.com", "m");
System.out.println (ahTeck);
ahTeck.setEmail ("paulTan@nowhere.com");
System.out.println ("nom est:" + ahTeck.getName ());
System.out.println ("eamil est:" + ahTeck.getEmail ());
System.out.println ("gender est:" + ahTeck.getGender ()); 

ExerciseOOP_Book.png

Une classe appelée Livre (conçu dans le diagramme de classes) pour modéliser un livre écrit par un auteur. Il contient:

  • Quatre privé variables d'instance: prénom (Chaîne), auteur (de la classe Auteur vous venez de créer, supposez qu'un livre a un et un seul auteur), prix (double), et quantité (int)
  • Deux constructeurs:
    livre public (nom de chaîne, auteur auteur, double prix) ......
    livre public (nom de chaîne, auteur auteur, prix double, quantité int) ......
  • méthodes publiques getName (), getAuthor (), getPrice (), fixer le prix(), getQty (), setQty ().
  • UNE toString () qui revient "Livre (nom = ?, Auteur (nom = ?, email = ?, genre =?), Prix =?, Quantité =?". Vous devriez réutiliser AuteurDes toString ().

Écrire le Livre classe (qui utilise le Auteur classe écrite plus tôt). Également écrire un pilote de test appelé TestBook pour tester tous les Publique méthodes dans la classe Livre. Notez que vous devez construire une instance de Auteur avant de pouvoir construire une instance de Livre. Par exemple.,




Auteur ahTeck = nouvel auteur ("Tan Ah Teck", "ahteck@nowhere.com", "m");
System.out.println (ahTeck);

Book dummyBook = new Book ("Java pour le mannequin", ahTeck, 19.95, 99);
System.out.println (dummyBook);


dummyBook.setPrice (29,95);
dummyBook.setQty (28);
System.out.println ("nom est:" + dummyBook.getName ());
System.out.println ("price is:" + dummyBook.getPrice ());
System.out.println ("la quantité est:" + dummyBook.getQty ());
System.out.println ("Author is:" + dummyBook.getAuthor ());
System.out.println ("Le nom de l'auteur est:" + dummyBook.getAuthor (). GetName ());
System.out.println ("Le courrier électronique de l'auteur est:" + dummyBook.getAuthor (). GetEmail ());


Réserver un autre livre = nouveau livre ("plus de Java",
      nouvel auteur ("Paul Tan", "paul@somewhere.com", 'm'), 29.95);
System.out.println (un autre livre);  

Prendre note que les deux Livre et Auteur les classes ont une variable appelée prénom. Cependant, il peut être différencié via l'instance de référencement. Pour un Livre l'instance dit un livre, aBook.name se réfère à la prénom du livre; alors que pour un Auteurl'instance de dire auuteur, unAuteur.nom se réfère à la prénom de l'auteur. Il n'est pas nécessaire (et non recommandé) d'appeler les variables bookName et nom de l'auteur.

ESSAYER:

  1. Impression du prénom et email de l'auteur d'un Livre exemple. (Allusion: aBook.getAuthor (). getName (), aBook.getAuthor (). getEmail ()).
  2. Introduire de nouvelles méthodes appelées getAuthorName (), getAuthorEmail (), getAuthorGender () dans le Livre classe pour retourner le prénom, email et le sexe de l'auteur du livre. Par exemple,
    public String getAuthorName () 
       retour author.getName ();
          
    

Exercice (avancé): Livre et Auteur Classes Again – Un tableau d'objets en tant que variable d'instance

ExerciseOOP_BookAuthorAgain.png

dans le exercice précédent, un livre est écrit par un et un seul auteur. En réalité, un livre peut être écrit par un ou plusieurs auteurs. Modifier le Livre classe pour supporter un ou plusieurs auteurs en changeant la variable d'instance auteurs à un Auteur tableau.

Remarques:

  • Les constructeurs prennent un tableau de Auteur (c'est à dire., Auteur()), au lieu d'un Auteur exemple. Dans cette conception, une fois par Livre instance est constructeur, vous ne pouvez pas ajouter ou supprimer un auteur.
  • le toString () méthode doit retourner "Livre (nom = ?, auteurs = Auteur (nom = ?, email = ?, genre =?), ......, prix =?, Quantité =?)".

Vous devez:

  1. Écrivez le code pour le Livre classe. Vous devrez réutiliser le Auteur classe écrite plus tôt.
  2. Écrivez un pilote de test (appelé TestBook) pour tester le Livre classe.

Astuces:




Author () authors = new Author (2);
auteurs (0) = nouvel auteur ("Tan Ah Teck", "AhTeck@somewhere.com", "m");
auteurs (1) = nouvel auteur ("Paul Tan", "Paul@nowhere.com", 'm');


Book javaDummy = new Book ("Java for Dummy", auteurs, 19.99, 99);
System.out.println (javaDummy);  

Ex: Le Mon point Classe

ExerciseOOP_MyPoint.png

Une classe appelée Mon point, qui modélise un point 2D avec X et y coordonnées, est conçu comme indiqué dans le diagramme de classes. Il contient:

  • Deux variables d'instance X (int) et y (int).
  • Un constructeur par défaut (ou "sans argument" ou "sans argument") qui construit un point à l'emplacement par défaut de (0, 0).
  • Un constructeur surchargé qui construit un point avec le donné X et y coordonnées.
  • Getter et setter pour les variables d'instance X et y.
  • Une méthode setXY () pour définir les deux X et y.
  • Une méthode getXY () qui retourne le x et y dans un 2-element int tableau.
  • UNE toString () méthode qui renvoie une description de chaîne de l'instance au format "(X, y)".
  • Une méthode appelée distance (int x, int y) qui renvoie la distance de ce pointer vers un autre point à la donnée (x, y) coordonnées, par exemple,
    MyPoint p1 = new MyPoint (3, 4);
    System.out.println (p1.distance (5, 6));
  • Un surchargé distance (MyPoint autre) qui renvoie la distance de ce pointer vers le donné Mon point instance (appelée un autre), par exemple.,
    MyPoint p1 = new MyPoint (3, 4);
    MyPoint p2 = new MyPoint (5, 6);
    System.out.println (p1.distance (p2));
  • Un autre surchargé distance() méthode qui renvoie la distance de ce pointer sur l'origine (0,0), par exemple.,
    MyPoint p1 = new MyPoint (3, 4);
    System.out.println (p1.distance ());

Vous devez:

  1. Écrivez le code pour la classe Mon point. Également écrire un programme de test (appelé TestMyPoint) pour tester toutes les méthodes définies dans la classe.

    Astuces:

    
    
    double distance publique (int x, int y) 
       int xDiff = this.x - x;
       int yDiff = ......
       return Math.sqrt (xDiff * xDiff + yDiff * yDiff);
    
      
    
    double distance publique (un autre MyPoint) 
       int xDiff = this.x - another.x;
       .......
    
    
    
    
    MyPoint p1 = new MyPoint ();
    System.out.println (p1);
    p1.setX (8);
    p1.setY (6);
    System.out.println ("x est:" + p1.getX ());
    System.out.println ("y est:" + p1.getY ());
    p1.setXY (3, 0);
    System.out.println (p1.getXY () (0));
    System.out.println (p1.getXY () (1));
    System.out.println (p1);
    
    MyPoint p2 = new MyPoint (0, 4);
    System.out.println (p2);
    
    System.out.println (p1.distance (p2));
    System.out.println (p2.distance (p1));
    System.out.println (p1.distance (5, 6));
    System.out.println (p1.distance ());      
    
  2. Écrire un programme qui alloue dix points dans un tableau de Mon pointet initialise à (1, 1), (2, 2), … (10, 10).

    Astuces: Vous devez allouer le tableau, ainsi que chacun des 10 Mon point les instances. En d'autres termes, vous devez émettre 11 Nouveau, 1 pour le tableau et 10 pour le Mon point les instances.

    MyPoint () points = new MyPoint (10);
    pour (int i = 0; i <points.longueur; i ++) 
       points (i) = nouveau MyPoint (...);
    
    
    

Remarques: Point est une entité si commune que JDK a certainement fournie dans toutes les saveurs.

Ex: Le Mon cercle et Mon point Des classes

ExerciseOOP_MyCircle.png

Une classe appelée Mon cercle, qui modélise un cercle avec un centre (x, y) et un rayon, est conçu comme indiqué dans le diagramme de classes. le Mon cercle la classe utilise une instance de Mon point classe (créée dans l'exercice précédent) en tant que centre.

La classe contient:

  • Deux privé variables d'instance: centre (une instance de Mon point) et rayon (int).
  • Un constructeur qui construit un cercle avec le centre donné (X, y) et rayon.
  • Un constructeur surchargé qui construit un Mon cercle Donné un Mon point exemple comme centre, et rayon.
  • UNE défaut constructeur qui construit un cercle avec le centre à (0,0) et rayon de 1.
  • Différents getters et setters.
  • UNE toString () méthode qui retourne une description de chaîne de cette instance au format "MonCircle (rayon =r, centre = (X,y))". Vous devez réutiliser le toString () de Mon point.
  • getArea () et getCircumference () méthodes qui renvoient la surface et la circonférence de ce cercle dans double.
  • UNE distance (MyCircle un autre) méthode qui renvoie la distance des centres de ce par exemple et le donné Mon cercle exemple. Tu devrais utiliser Mon pointDes distance() méthode pour calculer cette distance.

Écrire le Mon cercle classe. Également écrire un pilote de test (appelé TestMyCircle) pour tester toutes les méthodes publiques définies dans la classe.

Astuces:




public MyCircle (int x, int y, int radius) 
   
   center = new MyPoint (x, y);
   this.radius = rayon;

public MyCircle (centre MyPoint, rayon int) 
   
   this.center = center;
   ......

public MyCircle () 
   center = new MyPoint (.....);
   this.radius = ......



public int getCenterX () 
   return center.getX ();



public double distance (MyCircle autre) 
   return center.distance (autre.centre);

Ex: Le Mon Triangle et Mon point Des classes

ExerciseOOP_MyTriangle.png

Une classe appelée Mon Triangle, qui modélise un triangle avec 3 sommets, est conçu comme indiqué. le Mon Triangle classe utilise trois Mon point instances (créées dans l’exercice précédent) en tant que ses trois sommets.

Il contient:

  • Trois privé variables d'instance v1, v2, v3 (exemples de Mon point), pour les trois sommets.
  • Un constructeur qui construit un Mon Triangle avec trois ensembles de coordonnées, v1 = (x1, y1), v2 = (x2, y2), v3 = (x3, y3).
  • Un constructeur surchargé qui construit un Mon Triangle étant donné trois cas de Mon point.
  • UNE toString () méthode qui renvoie une description de chaîne de l'instance au format "MyTriangle (v1 = (X1,y1), v2 = (X2y2), v3 = (X3y3)".
  • UNE getPerimeter () méthode qui renvoie la longueur du périmètre en double. Vous devriez utiliser le distance() méthode de Mon point pour calculer le périmètre.
  • Une méthode printType (), qui imprime "équilatéral"si les trois côtés sont égaux,"isocèle"si deux des trois côtés sont égaux, ou"scalène"si les trois côtés sont différents.

Écrire le Mon Triangle classe. Également écrire un pilote de test (appelé TestMonTriangle) pour tester tous les Publique méthodes définies dans la classe.

Ex: Le Mon rectangle et Mon point Des classes

Concevoir un Mon rectangle classe qui est composée de deux Mon point instances comme en haut à gauche et en bas à droite coins. Dessinez les diagrammes de classes, écrivez les codes et écrivez les pilotes de test.

Ex: Le Client et Facture d'achat Des classes

ExerciseOOP_Customer.png

le Client modèles de classe qu'un client est conçu, comme indiqué dans le diagramme de classes. Écrivez les codes pour le Client classe et un pilote de test pour tester tous les Publique méthodes.

ExerciseOOP_Invoice.png

le Facture d'achat class, design comme indiqué dans le diagramme de classes, compose un Client instance (écrite plus tôt) en tant que membre. Écrivez les codes pour le Facture d'achat classe et un pilote de test pour tester tous les Publique méthodes.

Ex: Le Client et Compte Des classes

ExerciseOOP_CustomerAccount.png

le Client modèles de classe qu'un client est conçu, comme indiqué dans le diagramme de classes. Écrivez les codes pour le Client classe et un pilote de test pour tester tous les Publique méthodes.

ExerciseOOP_AccountCustomer.png

le Compte classe modélise un compte bancaire, la conception, comme indiqué dans le diagramme de classes, compose un Client instance (écrite plus tôt) en tant que membre. Écrivez les codes pour le Compte classe et un pilote de test pour tester tous les Publique méthodes.

Plus d'exercices sur les classes

Ex: Le Mon complexe classe

ExerciseOOP_MyComplex.png

Une classe appelée Mon complexe, qui modélise des nombres complexes x + yi, est conçu comme indiqué dans le diagramme de classes. Il contient:

  • Deux variables d'instance nommées réal (double) et imag (double) qui stocke les parties réelle et imaginaire du nombre complexe, respectivement.
  • Un constructeur qui crée un Mon complexe exemple avec les valeurs réelles et imaginaires données.
  • Un constructeur par défaut qui crée un MyComplex à 0,0 + 0,0i.
  • Getters et setters pour les variables d'instance réal et imag.
  • Une méthode setValue () pour définir la valeur du nombre complexe.
  • UNE toString () qui revient "(x + yi)" où X et y sont les parties réelle et imaginaire, respectivement.
  • Les méthodes est vrai() et isImaginary () qui revient vrai si ce nombre complexe est réel ou imaginaire, respectivement.
    Astuces:

    return (imag == 0);
  • Une méthode est égal à (double réel, double imag) qui revient vrai si ce nombre complexe est égal au nombre complexe donné (réel, imag).
    Astuces:

    return (this.real == real && this.imag == imag);
  • Un surchargé est égal à (MyComplex un autre) qui revient vrai si ce nombre complexe est égal à la donnée Mon complexe exemple un autre.
    Astuces:

    return (this.real == une autre.real && this.imag == une autre.imag);
  • Une méthode ordre de grandeur() qui renvoie l'ampleur de ce nombre complexe.
    magnitude (x + yi) = Math.sqrt (x * x + y * y)
  • Les méthodes argument() qui retourne l'argument de ce nombre complexe en radians (double).
    arg (x + yi) = Math.atan2 (y, x) (en radians)

    Noter la Math bibliothèque a deux méthodes arc-tangente, Math.atan (double) et Math.atan2 (double, double). Nous utilisons couramment le Math.atan2 (y, x) au lieu de Math.atan (y / x) éviter la division par zéro. Lire la documentation de Math classe en paquet java.lang.

  • Les méthodes ajouter (MonComplexe à droite) et soustraire (MonComplexe à droite) qui ajoute et soustrait la donnée Mon complexe instance (appelée droite), dans / depuis ce instance et retourne ce exemple.
    (a + bi) + (c + di) = (a + c) + (b + d) i
    (a + bi) - (c + di) = (a-c) + (b-d) i

    Astuces:

    retournez ceci;  
  • Les méthodes addNew (MyComplex right) et subtractNew (MyComplex right) qui ajoute et soustrait ce exemple avec le donné Mon complexe instance appelée droiteet retourne un nouveau Mon complexe instance contenant le résultat.
    Allusion:

    
    renvoyer le nouveau MyComplex (..., ...);
  • Les méthodes multiplier (mon complexe à droite) et diviser (MonComplexe à droite) qui multiplie et divise ce exemple avec le donné Mon complexe exemple droiteet conserve le résultat ce instance, et retourne cette instance.
    (a + bi) * (c + di) = (ac - bd) + (ad + bc) i
    (a + bi) / (c + di) = ((a + bi) * (c - di)) / (c * c + d * d)
  • Une méthode conjuguer() qui fonctionne sur ce instance et retourne ce instance contenant le Conjugaison compliquée.
    conjugué (x + yi) = x - yi

Vous devez:

  1. Écrire le Mon complexe classe.
  2. Ecrivez un pilote de test pour tester tous les Publique méthodes définies dans la classe.
  3. Écrire une application appelée MyComplexApp qui utilise le Mon complexe classe. L’application doit inviter l’utilisateur à entrer deux nombres complexes, imprimer leurs valeurs, vérifier si elles sont réelles, imaginaires et égales, et effectuer toutes les opérations arithmétiques.
    Entrez le complexe numéro 1 (partie réelle et imaginaire): 1,1 2,2
    Entrez le complexe numéro 2 (partie réelle et imaginaire): 3,3 4,4
      
    Le numéro 1 est: (1.1 + 2.2i)
    (1.1 + 2.2i) n'est pas un nombre réel pur
    (1.1 + 2.2i) N'EST PAS un nombre imaginaire pur
      
    Le numéro 2 est: (3.3 + 4.4i)
    (3.3 + 4.4i) N'EST PAS un nombre réel pur
    (3.3 + 4.4i) N'EST PAS un nombre imaginaire pur
       
    (1.1 + 2.2i) n'est pas égal à (3.3 + 4.4i)
    (1.1 + 2.2i) + (3.3 + 4.4i) = (4.4 + 6.6000000000000005i)
    (1.1 + 2.2i) - (3.3 + 4.4i) = (-2.199999999999999997 + -2.2i)

Prenez note que la conception de cette classe présente quelques défauts qui ont été introduits uniquement à des fins pédagogiques:

  • Comparant doublepéché égal() en utilisant "=="peut produire un résultat inattendu. Par exemple, (2.2 + 4.4) == 6.6 résultats faux. Il est courant de définir un petit seuil appelé EPSILON (réglé à environ 10 ^ -8) pour comparer des nombres en virgule flottante.
  • La méthode addNew (), soustraireNouveau () produire de nouvelles instances, alors que ajouter(), soustraire(), multiplier(), diviser() et conjuguer() modifier ce exemple. Il y a une incohérence dans la conception (introduite à des fins d'enseignement).

Notez également que des méthodes telles que ajouter() retourne une instance de Mon complexe. Par conséquent, vous pouvez placer le résultat dans un System.out.println () (qui invoquent implicitement le toString ()). Vous pouvez également chaîner les opérations, par exemple, c1.add (c2) .add (c3) (pareil que (c1.add (c2)). ajouter (c3)), ou c1.add (c2) .subtract (c3).

Ex: Le MonPolynomial Classe

ExerciseOOP_MyPolynomial.png

Une classe appelée MonPolynomial, qui modélise des polynômes de degrén (voir équation), est conçu comme indiqué dans le diagramme de classes.

ExerciseOOP_MyPolynomialEqn.png

Il contient:

  • Une variable d'instance nommée coeff, qui stocke les coefficients de npolynôme de degré dans un double tableau de taille n + 1, où c0 est maintenu à l'index 0.
  • Un constructeur MyPolynomial (coeffs: double ...) cela prend un nombre variable de doubles pour initialiser le tableau de coeffs, où le premier argument correspond à c0.

    Les trois points sont connus comme varargs (nombre variable d'arguments), qui est une nouvelle fonctionnalité introduite dans JDK 1.5. Il accepte un tableau ou une séquence d'arguments séparés par des virgules. Le compilateur compresse automatiquement les arguments séparés par des virgules dans un tableau. Les trois points ne peuvent être utilisés que pour le dernier argument de la méthode.

    Astuces:

    Classe publique MyPolynomial 
       privé double () coeffs;
       public MyPolynomial (double ... coeffs) 
          this.coeffs = coeffs;
       
       ......
    
       
    
    MyPolynomial p1 = nouveau MyPolynomial (1.1, 2.2, 3.3);
    MyPolynomial p1 = nouveau MyPolynomial (1.1, 2.2, 3.3, 4.4, 5.5);
    
    Double coeffs = 1,2, 3,4, 5,6, 7,8
    MyPolynomial p2 = new MyPolynomial (coeffs);
  • Une méthode obtenir le degré() cela retourne le degré de ce polynôme.
  • Une méthode toString () qui retourne "cnx ^ n + cn-1x ^ (n-1) + … + c1x + c0".
  • Une méthode évaluer (double x) qui évaluent le polynôme pour le donné X, en substituant le donné X dans l'expression polynomiale.
  • Les méthodes ajouter() et multiplier() qui ajoute et multiplie ce polynôme avec le donné MonPolynomial exemple un autreet retourne ce instance qui contient le résultat.

Écrire le MonPolynomial classe. Également écrire un pilote de test (appelé TestMyPolynomial) pour tester tous les Publique méthodes définies dans la classe.

Question: Avez-vous besoin de conserver le degré du polynôme en tant que variable d’instance dans MonPolynomial classe en Java? Que diriez-vous de C / C ++? Pourquoi?

Ex: Utilisation de JDK BigInteger Classe

Rappelez-vous ce type primitif entier octet, court, int et longue représentent des entiers signés de 8, 16, 32 et 64 bits, respectivement. Vous ne pouvez pas les utiliser pour des entiers supérieurs à 64 bits. L'API Java fournit une classe appelée BigInteger dans un paquet appelé java.math. Etudiez l'API du BigInteger classe (API Java ⇒ Dans "Packages", choisissez "java.math", "dans" classes ", choisissez" BigInteger "" Etudiez les constructeurs (choisissez "CONSTR") pour savoir comment construire un BigInteger exemple, et les méthodes publiques disponibles (choisissez "METHOD"). Rechercher des méthodes pour ajouter et multiplier deux BigIntegers.

Ecrivez un programme appelé TestBigInteger cette:

  1. ajoute "11111111111111111111111111111111111111111111111111111111111111" à "2222222222222222222222222222222222222222222222" et affiche le résultat.
  2. multiplie les deux nombres ci-dessus et affiche le résultat.

Astuces:


importer java.math.BigInteger
classe publique TestBigInteger 
   public static void main (String () args) 
      BigInteger i1 = new BigInteger (...);
      BigInteger i2 = new BigInteger (...);
      System.out.println (i1.add (i2));
      .......
   

Ex: Le Mon temps Classe

ExerciseOOP_MyTime.png

Une classe appelée Mon temps, qui modélise une instance de temps, est conçu comme indiqué dans le diagramme de classes.

Il contient les éléments suivants privé variables d'instance:

  • heure: entre 0 et 23.
  • minute: entre 0 et 59.
  • Seconde: entre 0 et 59.

Vous devez effectuer validation d'entrée.

Il contient les éléments suivants Publique méthodes:

  • setTime (int heure, int minute, int seconde): Il vérifiera si la donnée heure, minute et seconde sont valides avant de définir les variables d'instance.
    (Avancé: Sinon, il lancera un Exception d'argument illégal avec le message "heure, minute ou seconde non valide!".)
  • Setters setHour (int heure), setMinute (int minute), setSecond (int seconde): Il vérifiera si les paramètres sont valides, comme ci-dessus.
  • Getters getHour (), getMinute (), getSecond ().
  • toString (): résultats "HH: MM: SS".
  • nextSecond (): Met à jour cette instance à la seconde suivante et renvoie cette instance. Prendre note que le nextSecond () de 23:59:59 est 00:00:00.
  • nextMinute (), nextHour (), previousSecond (), previousMinute (), previousHour (): similaire à ce qui précède.

Écrivez le code pour le Mon temps classe. Également écrire un pilote de test (appelé TestMyTime) pour tester tous les Publique méthodes définies dans le Mon temps classe.

Ex: Le Mon rendez-vous Classe

ExerciseOOP_MyDate.png

Une classe appelée Mon rendez-vous, qui modélise une instance de date, est défini comme indiqué dans le diagramme de classes.

le Mon rendez-vous la classe contient les éléments suivants privé variables d'instance:

  • année (int): Entre 1 à 9999.
  • mois (int): Entre 1 (Jan) à 12 (Déc).
  • journée (int): Entre 1 à 28 | 29 | 30 | 31, où le dernier jour dépend du mois et s’il s’agit d’une année bissextile pour février (28 | 29).

Il contient également les éléments suivants privé statique variables (dessinées avec soulignées dans le diagramme de classes):

  • mois (Chaîne()), les journées (Chaîne()), et jour en mois (int ()): statique variables, initialisées comme indiqué, qui sont utilisées dans les méthodes.

le Mon rendez-vous la classe a la suivante Publique statique méthodes (dessinées avec soulignées dans le diagramme de classes):

  • isLeapYear (année int): résultats vrai si le donné année est une année bissextile. Une année est une année bissextile si elle est divisible par 4 mais pas par 100 ou divisible par 400.
  • isValidDate (int année, int mois, int jour): résultats vrai si le donné année, mois, et journée constituer une date valide. Suppose que année est entre 1 et 9999, mois est entre 1 (Jan) à 12 (Déc) et journée doit être entre 1 et 28 | 29 | 30 | 31 en fonction de la mois et que ce soit une année bissextile en février
  • getDayOfWeek (int année, int mois, int jour): renvoie le jour de la semaine, où 0 pour Sun, 1 pour lundi, …, 6 pour Sam, pour la date donnée. Supposons que la date est valide. Lis le exercice plus tôt sur la façon de déterminer le jour de la semaine (ou Wiki "Détermination du jour de la semaine").

le Mon rendez-vous La classe a un constructeur, qui prend 3 paramètres: année, mois et journée. Il invoquera régler la date() méthode (à décrire plus tard) pour définir les variables d’instance.

le Mon rendez-vous la classe a la suivante Publique méthodes:

  • setDate (int année, int mois, int jour): Il invoquera le statique méthode isValidDate () pour vérifier que le donné année, mois et journée constituer une date valide.
    (Avancé: Sinon, il lancera un Exception d'argument illégal avec le message "Année, mois ou jour invalide!".)
  • setYear (int year): Il vérifiera que le donné année est entre 1 et 9999.
    (Avancé: Sinon, il lancera un Exception d'argument illégal avec le message "Année invalide!".)
  • setMonth (int month): Il vérifiera que le donné mois est entre 1 et 12.
    (Avancé: Sinon, il lancera un Exception d'argument illégal avec le message "Mois invalide!".)
  • setDay (int day): Il vérifiera que le donné journée est entre 1 et dayMax, où dayMax Depend de mois et si c'est une année bissextile pour février
    (Avancé: Sinon, il lancera un Exception d'argument illégal avec le message "Mois invalide!".)
  • getYear (), getMonth (), getDay (): retourne la valeur pour le année, mois et journée, respectivement.
  • toString (): retourne une chaîne de date au format "xxxday d mmm aaaa", par exemple," mardi 14 février 2012 ".
  • le prochain jour(): mettre à jour ce par exemple au lendemain et revenir ce exemple. Prendre note que le prochain jour() pour 31 décembre 2000 doit être 1er janvier 2001.
  • le mois prochain(): mettre à jour ce par exemple au mois prochain et revenir ce exemple. Prendre note que le mois prochain() pour 31 oct 2012 doit être 30 nov. 2012.
  • l'année prochaine(): mettre à jour ce par exemple à l'année prochaine et revenir ce exemple. Prendre note que l'année prochaine() pour 29 février 2012 doit être 28 février 2013.
    (Avancé: lancer un IllegalStateException avec le message "Année hors de portée!" si année> 9999.)
  • jour précédent(), le mois précédent(), année précédente(): similaire à ce qui précède.

Écrivez le code pour le Mon rendez-vous classe.

Utilisez les instructions de test suivantes pour tester la Mon rendez-vous classe:


MyDate d1 = new MyDate (2012, 2, 28);
System.out.println (d1);
System.out.println (d1.nextDay ());
System.out.println (d1.nextDay ());
System.out.println (d1.nextMonth ());
System.out.println (d1.nextYear ());

MyDate d2 = new MyDate (2012, 1, 2);
System.out.println (d2);
System.out.println (d2.previousDay ());
System.out.println (d2.previousDay ());
System.out.println (d2.previousMonth ());
System.out.println (d2.previousYear ());

MyDate d3 = new MyDate (2012, 2, 29);
System.out.println (d3.previousYear ());

// MyDate d4 = new MyDate (2099, 11, 31);
// MyDate d5 = new MyDate (2011, 2, 29);  

Ecrivez un programme de test qui teste le le prochain jour() en boucle, en imprimant les dates de 28 déc 2011 à 2 mars 2012.

Ex: Bouncing Balls – Ballon et Récipient Des classes

ExerciseOOP_Ball.png

Une classe appelée Ballon est conçu comme indiqué dans le diagramme de classes.

le Ballon la classe contient les éléments suivants privé variables d'instance:

  • X, y et rayon, qui représente le centre du ballon (x, y) coordonnées et le rayon, respectivement.
  • xDelta (Δx) et yDelta (Δy), qui représentent le déplacement (mouvement) par pas, dans le X et y direction respectivement.

le Ballon la classe contient les éléments suivants Publique méthodes:

  • Un constructeur qui accepte X, y, rayon, la vitesse, et direction comme arguments. Pour la convivialité, l'utilisateur spécifie la vitesse (en pixels par pas) et direction (en degrés dans la gamme de (-180 °, 180 °)). Pour les opérations internes, le la vitesse et direction doivent être convertis en (Δx, Δy) dans la représentation interne. Notez que l’axe des ordonnées du système de coordonnées graphiques Java est inversé, c’est-à-dire que (0, 0) est situé dans le coin en haut à gauche.
    ExerciseOOP_BallCoord.png

    
    Δx = d × cos (θ)
    Δy = -d × sin (θ)
  • Getter et setter pour toutes les variables d'instance.
  • Une méthode bouge toi() qui déplace la balle d'un pas.
    x + = Δx
    y + = Δy
  • reflectHorizontal () qui réfléchit la balle horizontalement
    Δx = -Δx
    Δy aucun changement
  • reflectVertical () (la balle frappe un mur horizontal).
    Δx pas de changement
    Δy = -Δy
  • toString () qui imprime le message "Balle à (x, y) de la vitesse (Δx, Δy)".

Écrire le Ballon classe. Également écrire un programme de test pour tester toutes les méthodes définies dans la classe.

ExerciseOOP_Container.png

Une classe appelée Récipient, qui représente la boîte qui entoure la balle, est conçu comme indiqué dans le diagramme de classes. Il contient:

Utilisez les instructions suivantes pour tester votre programme:


Balle balle = balle neuve (50, 50, 5, 10, 30);
Boîte à conteneurs = nouveau conteneur (0, 0, 100, 100);
pour (int step = 0; step <100; ++ step) 
   ball.move ();
   box.collidesWith (balle);
   System.out.println (balle);

Ex: Le Ballon et Joueur Des classes

ExerciseOOP_BallPlayer.png

le Ballon La classe, qui reproduit le ballon dans un match de football, est conçue comme indiqué dans le diagramme de classe. Écrivez les codes pour le Ballon classe et un pilote de test pour tester tous les Publique méthodes.

ExerciseOOP_PlayerBall.png

le Joueur class, qui représente les joueurs dans un match de football, est conçu comme indiqué dans le diagramme de classes. Le joueur interagit avec le ballon (écrit plus tôt). Écrivez les codes pour le Joueur classe et un pilote de test pour tester tous les Publique méthodes. Faites votre hypothèse pour le donner un coup().

Pouvez-vous écrire un jeu de football très simple avec 2 équipes de joueurs et un ballon, à l'intérieur d'un terrain de football?

Exercices sur l'héritage

Ex: Le Cercle et Cylindre Des classes

Cet exercice vous guidera à travers les concepts importants en héritage.

ExerciseOOP_CircleCylinder.png

Dans cet exercice, une sous-classe appelée Cylindre est dérivé de la superclasse Cercle comme indiqué dans le diagramme de classes (où une flèche pointe de la sous-classe vers la super-classe). Étudier comment la sous-classe Cylindre invoque les constructeurs de la superclasse (via super() et super (rayon)) et hérite des variables et méthodes de la superclasse Cercle.

Vous pouvez réutiliser le Cercle classe que vous avez créée dans l'exercice précédent. Assurez-vous de garder "Circle.class"dans le même répertoire.


classe publique Le cylindre s'étend sur le cercle 
   double hauteur privée;
   
   
   cylindre public () 
      super();
      hauteur = 1,0;
   
   
   cylindre public (double hauteur) 
      super();
      this.height = height;
   
   
   Cylindre public (double rayon, double hauteur) 
      super (rayon);
      this.height = height;
   
   
   
   public double getHeight () 
      hauteur de retour;
   
  
   
   public double getVolume () 
      retourne getArea () * height;
   

Écrire un programme de test (dit TestCylinder) pour tester le Cylindre classe créée, comme suit:


classe publique TestCylinder 
   public static void main (String () args) 
      
      Cylindre c1 = nouveau cylindre ();
      System.out.println ("Cylinder:"
            + "rayon =" + c1.getRadius ()
            + "hauteur =" + c1.getHeight ()
            + "base area =" + c1.getArea ()
            + "volume =" + c1.getVolume ());
   
      
      Cylindre 2 = nouveau cylindre (10,0);
      System.out.println ("Cylinder:"
            + "rayon =" + c2.getRadius ()
            + "hauteur =" + c2.getHeight ()
            + "base area =" + c2.getArea ()
            + "volume =" + c2.getVolume ());
   
      
      Cylindre c3 = nouveau cylindre (2,0, 10,0);
      System.out.println ("Cylinder:"
            + "rayon =" + c3.getRadius ()
            + "hauteur =" + c3.getHeight ()
            + "base area =" + c3.getArea ()
            + "volume =" + c3.getVolume ());
   

Méthode prioritaire et "super": La sous-classe Cylindre hérite getArea () méthode de son cercle superclasse. Essayer primordial la getArea () méthode dans la sous-classe Cylindre calculer la surface (= 2π × rayon × hauteur + 2 × surface de base) du cylindre au lieu de la surface de base. C'est, si getArea () est appelé par un Cercle par exemple, il renvoie la zone. Si getArea () est appelé par un Cylindre Par exemple, il renvoie la surface du cylindre.

Si vous remplacez le getArea () dans la sous-classe Cylindre, la getVolume () ne fonctionne plus. C'est parce que le getVolume () utilise le dépassé getArea () méthode trouvée dans la même classe. (Le moteur d’exécution Java effectuera une recherche dans la super-classe uniquement s’il ne parvient pas à localiser la méthode dans cette classe). Repare le getVolume ().

Astuces: Après avoir dépassé le getArea () en sous-classe Cylindre, vous pouvez choisir d’invoquer le getArea () de la superclasse Cercle en appelant super.getArea ().

ESSAYER:

Fournir un toString () méthode à la Cylindre classe, qui annule la toString () hérité de la superclasse Cercle, par exemple.,


@Passer outre
chaîne publique toString () 
   return "Cylinder: sous-classe de" + super.toString ()
          + "hauteur =" + hauteur;

Essayez le toString () méthode en TestCylinder.

Remarque: @Passer outre est connu comme annotation (introduit dans JDK 1.5), qui demande au compilateur de vérifier s’il existe une telle méthode dans la superclasse à remplacer. Cela aide grandement si vous mal orthographiez le nom du toString (). Si @Passer outre n'est pas utilisé et toString () est mal orthographié ToString (), elle sera traitée comme une nouvelle méthode dans la sous-classe, au lieu de remplacer la superclasse. Si @Passer outre est utilisé, le compilateur signalera une erreur. @Passer outre L'annotation est facultative, mais certainement agréable à avoir.

Ex: Superclasse La personne et ses sous-classes

ExerciseOOP_PersonAndSubclasses.png

Ex: Point2D et Point3D

ExerciceOOP_Point2DPoint3D.png

Ex: Point et MovablePoint

ExerciseOOP_PointMovablePoint.png

Ex: Superclasse Forme et ses sous-classes Cercle, Rectangle et Carré

ExerciseOOP_ShapeAndSubclasses.png

Ecrire une super classe appelée Forme (comme indiqué dans le diagramme de classes), qui contient:

  • Deux variables d'instance Couleur (String) et rempli (booléen).
  • Two constructors: a no-arg (no-argument) constructor that initializes the Couleur to "green" and rempli à vrai, and a constructor that initializes the Couleur et rempli to the given values.
  • Getter and setter for all the instance variables. By convention, the getter for a booléen variable xxx est appelé isXXX() (instead of getXxx() for all the other types).
  • UNE toString() method that returns "A Shape with color of xxx and filled/Not filled".

Write a test program to test all the methods defined in Shape.

Write two subclasses of Shape appelé Cercle et Rectangle, as shown in the class diagram.

le Cercle class contains:

  • An instance variable rayon (double).
  • Three constructors as shown. The no-arg constructor initializes the radius to 1,0.
  • Getter and setter for the instance variable rayon.
  • Les méthodes getArea() et getPerimeter().
  • Override the toString() method inherited, to return "A Circle with radius=xxx, which is a subclass of yyy", where yyy is the output of the toString() method from the superclass.

le Rectangle class contains:

  • Two instance variables largeur (double) et longueur (double).
  • Three constructors as shown. The no-arg constructor initializes the largeur et longueur à 1,0.
  • Getter and setter for all the instance variables.
  • Les méthodes getArea() et getPerimeter().
  • Override the toString() method inherited, to return "A Rectangle with width=xxx and length=zzz, which is a subclass of yyy", where yyy is the output of the toString() method from the superclass.

Write a class called Carré, as a subclass of Rectangle. Convince yourself that Carré can be modeled as a subclass of Rectangle. Carré has no instance variable, but inherits the instance variables width and length from its superclass Rectangle.

Exercises on Composition vs Inheritance

They are two ways to reuse a class in your applications: composition et héritage.

Ex: The Point et Ligne Classes

Let us begin with composition with the statement "a line composes of two points".

Complete the definition of the following two classes: Point et Ligne. The class Ligne composes 2 instances of class Point, representing the beginning and ending points of the line. Also write test classes for Point et Ligne (says TestPoint et TestLine).


classe publique Point 
   
   private int x;    
   private int y;    
   
   
   public Point (int x, int y) ......
   
   
   public String toString() 
      return "Point: (" + x + "," + y + ")";
   
   
   public int getX() ......
   public int getY() ......
   public void setX(int x) ......
   public void setY(int y) ......
   public void setXY(int x, int y) ......

classe publique TestPoint 
   public static void main(String() args) 
      Point p1 = new Point(10, 20);   
      System.out.println(p1);
      
      ......
   

classe publique Ligne 
   
   private Point begin;    
   private Point end;      
   
   
   public Line (Point begin, Point end)   
      this.begin = begin;
      ......
   
   public Line (int beginX, int beginY, int endX, int endY) 
      begin = new Point(beginX, beginY);   
      ......
   
   
   
   public String toString()  ...... 
   
   public Point getBegin()  ...... 
   public Point getEnd()  ...... 
   public void setBegin(......)  ...... 
   public void setEnd(......)  ...... 
   
   public int getBeginX()  ...... 
   public int getBeginY()  ...... 
   public int getEndX()  ...... 
   public int getEndY()  ...... 
   
   public void setBeginX(......)  ...... 
   public void setBeginY(......)  ...... 
   public void setBeginXY(......)  ...... 
   public void setEndX(......)  ...... 
   public void setEndY(......)  ...... 
   public void setEndXY(......)  ...... 
   
   public int getLength()  ......  
   public double getGradient()  ......  

classe publique TestLine 
   public static void main(String() args) 
      Line l1 = new Line(0, 0, 3, 4);
      System.out.println(l1);
   
      Point p1 = new Point(...);
      Point p2 = new Point(...);
      Line l2 = new Line(p1, p2);
      System.out.println(l2);
      ...
   

The class diagram for composition is as follows (where a diamond-hollow-head arrow pointing to its constituents):

ExerciseOOP_PointLineComp.png

Au lieu de composition, we can design a Ligne class using héritage. Instead of "a line composes of two points", we can say that "a line is a point extended by another point", as shown in the following class diagram:

ExerciseOOP_PointLineInherit.png

Let's re-design the Ligne class (called LineSub) as a subclass of class Point. LineSub inherits the starting point from its superclass Point, and adds an ending point. Complete the class definition. Write a testing class called TestLineSub tester LineSub.


classe publique LineSub extends Point 
   
   Point end;               
   
   
   public LineSub (int beginX, int beginY, int endX, int endY) 
      super(beginX, beginY);             
      this.end = new Point(endX, endY);  
   
   public LineSub (Point begin, Point end)   
      super(begin.getX(), begin.getY());      
      this.end = end;
   
   
   
   public String toString()  ... 
   
   public Point getBegin()  ... 
   public Point getEnd()  ... 
   public void setBegin(...)  ... 
   public void setEnd(...)  ... 
   
   public int getBeginX()  ... 
   public int getBeginY()  ... 
   public int getEndX()  ... 
   public int getEndY()  ... 
   
   public void setBeginX(...)  ... 
   public void setBeginY(...)  ... 
   public void setBeginXY(...)  ... 
   public void setEndX(...)  ... 
   public void setEndY(...)  ... 
   public void setEndXY(...)  ... 
   
   public int getLength()  ...        
   public double getGradient()  ...   

Summary: There are two approaches that you can design a line, composition ou héritage. "A line composes two points" or "A line is a point extended with another point"”. Compare the Ligne et LineSub designs: Ligne les usages composition et LineSub les usages héritage. Which design is better?

Ex: The Cercle et Cylinder Classes Using Composition

ExerciseOOP_CircleCylinderComp.png

Try rewriting the Circle-Cylinder of the previous exercise using composition (as shown in the class diagram) instead of héritage. That is, "a cylinder is composed of a base circle and a height".


classe publique Cylinder 
   private Circle base;   
   private double height;
   
   
   public Cylinder() 
      base = new Circle(); 
      height = 1.0; 
   
   ......

Which design (inheritance or composition) is better?

Exercises on Polymorphism, Abstract Classes and Interfaces

Ex: Abstract Superclass Shape and Its Concrete Subclasses

Rewrite the superclass Shape and its subclasses Cercle, Rectangle et Carré, as shown in the class diagram.

ExerciseOOP_ShapeAbstract.png

In this exercise, Shape shall be defined as an abstrait class, which contains:

  • Deux protégé variables d'instance Couleur(String) et rempli(booléen). le protégé variables can be accessed by its subclasses and classes in the same package. They are denoted with a '#' sign in the class diagram.
  • Getter and setter for all the instance variables, and toString().
  • Deux abstrait les méthodes getArea() et getPerimeter() (shown in italics in the class diagram).

The subclasses Cercle et Rectangle doit passer outre la abstrait les méthodes getArea() et getPerimeter() and provide the proper implementation. Ils aussi passer outre la toString().

Write a test class to test these statements involving polymorphism and explain the outputs. Some statements may trigger compilation errors. Explain the errors, if any.


Shape s1 = new Circle(5.5, "RED", false);  
System.out.println(s1);                    
System.out.println(s1.getArea());          
System.out.println(s1.getPerimeter());     
System.out.println(s1.getColor());
System.out.println(s1.isFilled());
System.out.println(s1.getRadius());
   
Circle c1 = (Circle)s1;                   
System.out.println(c1);
System.out.println(c1.getArea());
System.out.println(c1.getPerimeter());
System.out.println(c1.getColor());
System.out.println(c1.isFilled());
System.out.println(c1.getRadius());
   
Shape s2 = new Shape();
   
Shape s3 = new Rectangle(1.0, 2.0, "RED", false);   
System.out.println(s3);
System.out.println(s3.getArea());
System.out.println(s3.getPerimeter());
System.out.println(s3.getColor());
System.out.println(s3.getLength());
   
Rectangle r1 = (Rectangle)s3;   
System.out.println(r1);
System.out.println(r1.getArea());
System.out.println(r1.getColor());
System.out.println(r1.getLength());
   
Shape s4 = new Square(6.6);     
System.out.println(s4);
System.out.println(s4.getArea());
System.out.println(s4.getColor());
System.out.println(s4.getSide());
  

Rectangle r2 = (Rectangle)s4;
System.out.println(r2);
System.out.println(r2.getArea());
System.out.println(r2.getColor());
System.out.println(r2.getSide());
System.out.println(r2.getLength());
   

Square sq1 = (Square)r2;
System.out.println(sq1);
System.out.println(sq1.getArea());
System.out.println(sq1.getColor());
System.out.println(sq1.getSide());
System.out.println(sq1.getLength());

What is the usage of the abstrait method and abstrait class?

Ex: Polymorphism

Examine the following codes and draw the class diagram.


abstract public class Animal 
   abstract public void greeting();

classe publique Cat extends Animal 
   @Override
   public void greeting() 
      System.out.println("Meow!");
   

classe publique Dog extends Animal 
   @Override
   public void greeting() 
      System.out.println("Woof!");
   
   
   public void greeting(Dog another) 
      System.out.println("Woooooooooof!");
   

classe publique BigDog extends Dog 
   @Override
   public void greeting() 
      System.out.println("Woow!");
   
   
   @Override
   public void greeting(Dog another) 
      System.out.println("Woooooowwwww!");
   

Explain the outputs (or error) for the following test program.


classe publique TestAnimal 
   public static void main(String() args) 
      
      Cat cat1 = new Cat();
      cat1.greeting();
      Dog dog1 = new Dog();
      dog1.greeting();
      BigDog bigDog1 = new BigDog();
      bigDog1.greeting();
       
      
      Animal animal1 = new Cat();
      animal1.greeting();
      Animal animal2 = new Dog();
      animal2.greeting();
      Animal animal3 = new BigDog();
      animal3.greeting();
      Animal animal4 = new Animal();
      
      
      Dog dog2 = (Dog)animal2;
      BigDog bigDog2 = (BigDog)animal3;
      Dog dog3 = (Dog)animal3;
      Cat cat2 = (Cat)animal2;
      dog2.greeting(dog3);
      dog3.greeting(dog2);
      dog2.greeting(bigDog2);
      bigDog2.greeting(dog2);
      bigDog2.greeting(bigDog1);
   

Ex: Interface Movable and its implementations MovablePoint et MovableCircle

Suppose that we have a set of objects with some common behaviors: they could move up, down, left or right. The exact behaviors (such as how to move and how far to move) depend on the objects themselves. One common way to model these common behaviors is to define an interface appelé Movable, avec abstrait les méthodes moveUp(), moveDown(), moveLeft() et moveRight(). The classes that implement the Movable interface will provide actual implementation to these abstrait méthodes.

Let's write two concrete classes – MovablePoint et MovableCircle – that implement the Movable interface.

ExerciseOOP_Movable.png

The code for the interface Movable is straight forward.


public interface Movable 
   public void moveUp();
   ......

Pour le MovablePoint class, declare the instance variable X, y, xSpeed et ySpeed with package access as shown with '~' in the class diagram (i.e., classes in the same package can access these variables directly). Pour le MovableCircle class, use a MovablePoint to represent its center (which contains four variable X, y, xSpeed et ySpeed). En d'autres termes, le MovableCircle composes a MovablePoint, and its rayon.


classe publique MovablePoint implements Movable 
   
   int x, y, xSpeed, ySpeed;     
   
   
   public MovablePoint(int x, int y, int xSpeed, int ySpeed) 
      this.x = x;
      ......
   
   ......
   
   
   @Override
   public void moveUp() 
      y -= ySpeed;   
   
   ......

classe publique MovableCircle implements Movable 
   
   private MovablePoint center;   
   private int radius;
   
   
   public MovableCircle(int x, int y, int xSpeed, int ySpeed, int radius) 
      
      center = new MovablePoint(x, y, xSpeed, ySpeed);
      ......
   
   ......
   
   
   @Override
   public void moveUp() 
      center.y -= center.ySpeed;
   
   ......

Write a test program and try out these statements:


Movable m1 = new MovablePoint(5, 6, 10, 15);     
System.out.println(m1);
m1.moveLeft();
System.out.println(m1);
   
Movable m2 = new MovableCircle(1, 2, 3, 4, 20);  
System.out.println(m2);
m2.moveRight();
System.out.println(m2);

Write a new class called MovableRectangle, which composes two MovablePoints (representing the top-left and bottom-right corners) and implementing the Movable Interface. Make sure that the two points has the same speed.

ExerciseOOP_MovableRectangle.png

What is the difference between an interface and an abstract class?

Ex: Interfaces GeometricObject et Resizable

ExerciseOOP_GeometricObject.png

  1. Write the interface appelé GeometricObject, which declares two abstrait methods: getParameter() et getArea(), as specified in the class diagram.

    Hints:

    public interface GeometricObject 
       public double getPerimeter();
       ......
    
  2. Write the implementation class Cercle, with a protected variable rayon, which implements the interface GeometricObject.
    Hints:

    classe publique Cercle implements GeometricObject 
       
       ......
    
       
       ......
    
       
       @Override
       public double getPerimeter()  ...... 
    
       ......
    
  3. Write a test program called TestCircle to test the methods defined in Cercle.
  4. The class ResizableCircle is defined as a subclass of the class Cercle, which also implements an interface called Resizable, as shown in class diagram. The interface Resizable declares an abstrait méthode resize(), which modifies the dimension (such as rayon) by the given percentage. Write the interface Resizable and the class ResizableCircle.

    Hints:

    public interface Resizable 
       public double resize(...);
    
    
    classe publique ResizableCircle extends Circle implements Resizeable 
     
       
       public ResizableCircle(double radius) 
          super(...);
       
     
       
       @Override
       public double resize(int percent)  ...... 
    
  5. Write a test program called TestResizableCircle to test the methods defined in ResizableCircle.

More Exercises on OOP

Ex: The Discount System

You are asked to write a discount system for a beauty saloon, which provides services and sells beauty products. It offers 3 types of memberships: Premium, Gold and Silver. Premium, gold and silver members receive a discount of 20%, 15%, and 10%, respectively, for all services provided. Customers without membership receive no discount. All members receives a flat 10% discount on products purchased (this might change in future). Your system shall consist of three classes: Customer, Remise et Visite, as shown in the class diagram. It shall compute the total bill if a customer purchases $x of products and $y of services, for a visit. Also write a test program to exercise all the classes.

ExerciseOOP_Discount.png

The class DiscountRate contains only statique variables and methods (underlined in the class diagram).

Ex: Polyline de Points avec ArrayList

ExerciseOOP_Polyline.png

A polyline is a line with segments formed by points. Let's use the ArrayList (dynamically allocated array) to keep the points, but upcast to liste in the instance variable. (Take note that array is of fixed-length, and you need to set the initial length).


classe publique Point 
   private int x;
   private int y;
   public Point(int x, int y)  ...... 
   public int getX()  ...... 
   public int getY()  ...... 
   public void setX(int x)  ...... 
   public void setY(int y)  ...... 
   public int() getXY()  ...... 
   public void setXY(int x, int y)  ...... 
   public String toString()  ...... 
   public double distance(Point another)  ...... 

import java.util.*;
classe publique PolyLine 
   private List points;   

      
   public PolyLine()   
      points = new ArrayList();  
   
   public PolyLine(List points) 
      this.points = points;
   
 
   
   public void appendPoint(int x, int y) 
      Point newPoint = new Point(x, y);
      points.add(newPoint);
   
 
   
   public void appendPoint(Point point) 
      points.add(point);
   
 
   
   public String toString() 
      
      StringBuilder sb = new StringBuilder("");
      for (Point aPoint : points) 
          sb.append(aPoint.toString());
      
      sb.append("");
      return sb.toString();
   

   
   public double getLength()  ...... 
}



import java.util.*;
public class TestPolyLine 
   public static void main(String() args) 
      
      PolyLine l1 = new PolyLine();
      System.out.println(l1);  

      
      l1.appendPoint(new Point(1, 2));
      l1.appendPoint(3, 4);
      l1.appendPoint(5, 6);
      System.out.println(l1);  

      
      liste points = new ArrayList();
      points.add(new Point(11, 12));
      points.add(new Point(13, 14));
      PolyLine l2 = new PolyLine(points);
      System.out.println(l2);  
   

Exercises on Data Structures

Ex: MyIntStack

A stack is a first-in-last-out queue. Write a program called MyIntStack, which uses an array to store the contents, restricted to int.

OOP_MyIntStack.java

Write a test program.


1
2
3
4
5
6
7
8
9
dix
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

public class MyIntStack 
   private int() contents;
   private int tos;  
 
   
   public MyIntStack(int capacity) 
      contents = new int(capacity);
      tos = -1;
   
 
   public void push(int element) 
      contents(++tos) = element;
   
 
   public int pop() 
      return contents(tos--);
   
 
   public int peek() 
      return contents(tos);
   
 
   public boolean isEmpty() 
      return tos < 0;
   
 
   public boolean isFull() 
      return tos == contents.length - 1;
   

Essayer:

  1. Modify the push() method to throw an IllegalStateException if the stack is full.
  2. Modify the push() revenir vrai if the operation is successful, or faux autrement.
  3. Modify the push() to increase the capacity by reallocating another array, if the stack is full.

Exercise (Nodes, Link Lists, Trees, Graphs):

(TODO)

  • Study the existing open source codes, including JDK.
  • Specialized algorithms, such as shortest path.

Exercise (Maps):

(TODO)

  • Representation of map data.
  • Specialized algorithms, such as shortest path.

Exercise (Matrix Operations for 3D Graphics):

(TODO)

  • Study the existing open source codes, including JDK's 2D Graphics and JOGL's 3D Graphics.
  • Efficient and specialized codes for 3D Graphics (4D matrices). Handle various primitive types such as int, flotte et double efficiently.

#ecrire mon livre en ligne
#ecrire un livre technique
#ecrire un livre therapie

Laisser un commentaire