Définir une classe
Point
permettant de représenter un point
dans R2. Vous utiliserez proprement les concepts d’encapsulation.
Définir une classe
Cercle
héritant de de la classe
précédente. Vous prendrez soin de ne pas recoder des choses déjà
codées...
Adaptez la pile ci-dessous afin qu’elle puisse contenir des objets de n’importe quel type. Vous testerez la pile avec des données de types différents.
package encapsulation.corriges; public class Pile { /* * Tableau contenant les elements de la pile. */ private int[] tab; /********************************************/ /* * Taille de la pile */ private final int taille; /********************************************/ /* * Indice du premier element non occupe dans le tableau. */ private int firstFree; /********************************************/ /* * Constructeur */ Pile(int taille) { this.taille = taille; tab = new int[taille]; firstFree = 0; } /********************************************/ /* * Constructeur de copie. */ Pile(Pile other) { this(other.taille); firstFree = other.firstFree; for (int i = 0; i < firstFree; i++) tab[i] = other.tab[i]; } /********************************************/ /* * Retourne vrai si et seulement si la pile est vide */ public boolean estVide() { return firstFree == 0; } /********************************************/ /* * Retourne vrai si et seulement si la pile est pleine. */ public boolean estPleine() { return firstFree == taille; } /********************************************/ /* * Retourne l'element se trouvant au sommet de la pile, -1 si la pile est * vide. */ public int sommet() { if (estVide()) return -1; return tab[firstFree - 1]; } /********************************************/ /* * Supprime l'element se trouvant au sommet de la pile, ne fait rien si la * pile est vide. */ public void depile() { if (!estVide()) firstFree--; } /********************************************/ /* * Ajoute data en haut de la pile, ne fait rien si la pile est pleine. */ public void empile(int data) { if (!estPleine()) tab[firstFree++] = data; } /********************************************/ /* * Retourne une representation de la pile au format chaine de caracteres. */ public String toString() { String res = "["; for (int i = 0; i < firstFree; i++) res += " " + tab[i]; return res + " ]"; } /********************************************/ /* * Teste le fonctionnement de la pile. */ public static void main(String[] args) { Pile p = new Pile(30); int i = 0; while (!p.estPleine()) p.empile(i++); System.out.println(p); while (!p.estVide()) { System.out.println(p.sommet()); p.depile(); } } }
Reprenez les classes
Point
et
Cercle
, codez une
méthode
toString()
pour les deux classes (mère et
fille). Vous prendrez soin d’éviter les redondances dans votre code.
Complétez ce code source, sachant qu’un chien dit "Ouaf !", un chat "Miaou !" et une vache "Meuh !".
package heritage; import java.util.ArrayList; @SuppressWarnings("unused") interface Animal { // Setter pour le champ nom public void setNom(String nom); // Getter pour le champ nom public String getNom(); // Retourne le cri de l'animal public String cri(); } //TODO Décommentez le code ci-dessous pour le compléter public class ExempleAnimaux { // public static void main(String[] args) // { // ArrayList<Animal> animaux = new ArrayList<>(); // animaux.add(new Chat("Ronron")); // animaux.add(new Chien("Médor")); // animaux.add(new Vache("Huguette")); // for (Animal animal : animaux) // System.out.println("Je m'appelle " + animal.getNom() // + " et je dis " + animal.cri() + "!"); // } } //class Chat implements Animal //{ //} // //class Chien implements Animal //{ //} // //class Vache implements Animal //{ //}
N’hésitez pas à en ajouter d’autres !
Reprenez la classe
TableauInt
et adaptez-là de sorte
qu’on puisse y placer tout objet dont le type implémente
l’interface
Comparable
ci-dessous.
package heritage; import java.util.ArrayList; import java.util.Random; public class TableauInt { private ArrayList<Integer> t; public TableauInt() { t = new ArrayList<>(); } public TableauInt(TableauInt other) { t = new ArrayList<>(); for (int i = 0 ; i < other.taille() ; i++) t.add(other.get(i)); } public int taille() { return t.size(); } public TableauInt copie() { return new TableauInt(this); } public String toString() { String res = "["; if (taille() >= 1) res += get(0); for (int i = 1 ; i < taille() ; i++) res += ", " + get(i); res += "]"; return res; } public int get(int index) { return t.get(index); } public void set(int index, int value) { int n = taille(); if (index < n) t.set(index, value); if (index == n) t.add(value); if (index > n) System.out.println("Achtung !"); } public void echange(int i, int j) { int temp = get(i); set(i, get(j)); set(j, temp); } public void triSelection() { for (int i = 0 ; i < taille() - 1 ; i++) { int indiceMin = i; for (int j = i + 1 ; j < taille() ; j++) if (get(indiceMin) > get(j)) indiceMin = j; echange(i, indiceMin); } } public static void main(String[] args) { int n = 10 ; Random r = new Random(); TableauInt tab = new TableauInt(); for (int i = 0; i < n; i++) tab.set(i, r.nextInt() % 100); System.out.println(tab); tab.triSelection(); System.out.println(tab); } }
package heritage; public interface Comparable { /* * Retourne un nombre négatif si l'objet courant est plus petit que other, * 0 s'ils sont égaux, et un nombre positif l'objet courant est plus grand * que other. */ public int compareTo(Comparable other); }
Testez
TableauInt
avec
Heure implements Comparable
:
package heritage; import java.util.Random; public class Heure { private int heures, minutes; public Heure(int heures, int minutes) { this.heures = intAbs(heures) % 24; this.minutes = intAbs(minutes) % 60; } public Heure(Random r) { this(r.nextInt(), r.nextInt()); } private int intAbs(int x) { if (x > 0) return x; else return -x; } public int getHeures() { return heures; } public int getMinutes() { return minutes; } public void setHeures(int heures) { this.heures = heures; } public void setMinutes(int minutes) { this.minutes = minutes; } @Override public String toString() { return heures + ":" + minutes; } public int enMinutes() { return 60 * heures + minutes; } }
Reprenez le tp sur les animaux, et faites remonter les
méthodes
setNom
et
getNom
dans la classe mère.
Modifier les classes
Devise
et
Animaux
pour
qu’elles implémentent l’interface
Comparable
.
Tester
ComparableTab
avec des objets de type
Devise
et
Animaux
.
Complétez le code source suivant. Il représente un arbre syntaxique.
package heritage; /** * Fonction d'une variable. */ public abstract class Function { /** * Retourne l'image de x. */ public abstract double evaluate(double x); /** * Retourne la dérivée. */ public abstract Function derivate(); /** * Retourne la fonction simplifiée. */ public abstract Function simplify(); /** * Ssi la fonction ne contient pas de variable. */ public abstract boolean isConstant(); /** * Ssi la fonction est une feuille valant 0. */ public abstract boolean isZero(); /** * Ssi la fonction est une feuille valant 1. */ public abstract boolean isOne(); /** * Retourne l'integrale entre a et b (a < b), calculée avec la * méthode des trapèzes en effectuant nbSubdivisions * subdivisions de l'intervalle à intégrer. */ public double integrate(double a, double b, int nbSubdivisions) { return 0; } public static void main(String args[]) { System.out.println("Hello world !"); } } /** * f(x) = x. */ class Variable extends Function { Variable() { } @Override public boolean isZero() { // TODO à compléter return true; } @Override public boolean isOne() { // TODO à compléter return true; } @Override public boolean isConstant() { // TODO à compléter return true; } @Override public Function derivate() { return null; } @Override public double evaluate(double x) { return 0; } @Override public Function simplify() { return null; } @Override public String toString() { return ""; } } /** * Fonction s'exprimant comme une opération binaire entre deux autres * fonctions. */ abstract class BinaryOperator extends Function { protected Function leftSon; protected Function rightSon; BinaryOperator(Function leftSon, Function rightSon) { } /** * Retourne l'opérateur binaire sous forme de caractère ('+' * pour une addition '-' pour une soustraction, etc). */ public abstract char toChar(); @Override public String toString() { return "(" + leftSon + " " + toChar() + " " + rightSon + ")"; } @Override public boolean isZero() { // TODO à compléter ! return true; } @Override public boolean isOne() { // TODO à compléter ! return true; } @Override public boolean isConstant() { // TODO à compléter ! return true; } /** * Remplace les sous-arbres par leurs versions simplifiées, retourne * une feuille si l'arbre est constant. */ protected Function simplifySubTrees() { return null; } } /** * f(x) = c, où c est une constante réelle. */ class Constant extends Function { private double value; Constant(double value) { } @Override public boolean isZero() { // TODO à compléter return true; } @Override public boolean isOne() { // TODO à compléter return true; } @Override public boolean isConstant() { // TODO à compléter return true; } @Override public Function derivate() { // TODO à compléter return null; } @Override public double evaluate(double x) { // TODO à compléter return 0; } @Override public Function simplify() { // TODO à compléter return null; } @Override public String toString() { // TODO à compléter return ""; } } /** * f(x) = g(x) - h(x), où g et h sont les sous-arbres gauche et droit. */ class Minus extends BinaryOperator { Minus(Function leftSon, Function rightSon) { super(leftSon, rightSon); } @Override public char toChar() { // TODO à compléter return '?'; } @Override public double evaluate(double x) { // TODO à compléter return 0; } @Override public Function derivate() { // TODO à compléter return null; } @Override public Function simplify() { // TODO à compléter return null; } } /** * f(x) = g(x) + h(x), où g et h sont les sous-arbres gauche et droit. */ class Plus extends BinaryOperator { Plus(Function leftSon, Function rightSon) { super(leftSon, rightSon); } @Override public char toChar() { // TODO à compléter return '?'; } @Override public double evaluate(double x) { // TODO à compléter return 0; } @Override public Function derivate() { // TODO à compléter return null; } @Override public Function simplify() { // TODO à compléter return null; } } /** * f(x) = g(x) * h(x), où g et h sont les sous-arbres gauche et droit. */ class Times extends BinaryOperator { Times(Function leftSon, Function rightSon) { super(leftSon, rightSon); } @Override public char toChar() { // TODO à compléter return '?'; } @Override public double evaluate(double x) { // TODO à compléter return 0; } @Override public Function derivate() { // TODO à compléter return null; } @Override public Function simplify() { // TODO à compléter return null; } } /** * f(x) = g(x) / h(x), où g et h sont les sous-arbres gauche et droit. */ class Div extends BinaryOperator { Div(Function leftSon, Function rightSon) { super(leftSon, rightSon); } @Override public char toChar() { // TODO à compléter return '?'; } @Override public double evaluate(double x) { // TODO à compléter return 0; } @Override public Function derivate() { // TODO à compléter return null; } @Override public Function simplify() { // TODO à compléter return null; } }