Faculté des Sciences de Luminy
Programmation Orientée Objets, langage Java
 
Henri Garreta

Exo 3.1

Fichier Document.java :

public class Document {
    private int numero;
    private String titre;

    public Document(int numero, String titre) {
        this.numero = numero;
        this.titre = titre;
    }
    public int numero() {
        return numero;
    }
    public String titre() {
        return titre;
    }
    public String description() {
        return numero + " : " + titre;
    }
}
Fichier Livre.java :
public class Livre extends Document {
    private String auteur;
    private int pages;

    public Livre(int numero, String titre, String auteur, int pages) {
        super(numero, titre);
        this.auteur = auteur;
        this.pages = pages;
    }
    public String auteur() {
        return auteur;
    }
    public int pages() {
        return pages;
    }
    public String description() {
        return super.description() + " de " + auteur + " (" + pages + " pages)";
    }
}
Fichier Dictionnaire.java :
public class Dictionnaire extends Document {
    private String langue;
    private int articles;

    public Dictionnaire(int numero, String titre, String langue, int articles) {
        super(numero, titre);
        this.langue = langue;
        this.articles = articles;;
    }
    public String langue() {
        return langue;
    }
    public int articles() {
        return articles();
    }
    public String description() {
        return super.description() + " dictionnaire " + langue
            + "-français (" + articles + " articles)";
    }
}
Fichier ListeDeDocuments.java :
import java.util.*;

class ListeDeDocuments {
    private Vector liste;
    
    public ListeDeDocuments() {
        liste = new Vector();
    }
    public void ajout(Document d) {
        liste.add(d);
    }

// --- Pour le parcours de la liste ---
    private int pos;
    
    public void initParcours() {
        pos = 0;    
    }
    public boolean encore() {
        return pos < liste.size();
    }
    public Document suivant() {
        return (Document) liste.elementAt(pos++);
    }

// --- Divers ---    
    public void toutesLesDescriptions() {
        initParcours();
        while (encore())
            System.out.println(suivant().description());
    }
    public void tousLesAuteurs() {
        initParcours();
        while (encore()) {
            Document d = suivant();
            if (d instanceof Livre)
                System.out.print(((Livre)d).auteur() + " ");
        }
    }
}
Fichier Bibliotheque.java :
public class Bibliotheque {

    public static void main(String[] args) {
        Document a = new Document(1001, "Mode d'emploi du lave-vaisselle");
        Livre b = new Livre(1002, "Guerre et paix", "Leon Tolstoi", 2750);
        Dictionnaire c = new Dictionnaire(1003, "Larousse", "Espagnol", 32000);
        Livre d = new Livre(1004, "Les miserables", "Victor Hugo", 800);

        System.out.println("a : " + a.description());
        System.out.println("b : " + b.description());
        System.out.println("c : " + c.description());

        ListeDeDocuments l = new ListeDeDocuments();
        l.ajout(a);
        l.ajout(b);
        l.ajout(c);
        l.ajout(d);

        l.tousLesAuteurs();
        
        l.toutesLesDescriptions();
    }
}
Une autre manière de parcourir la liste :
import java.util.*;

class ListeDeDocuments {
    ...
// --- Pour le parcours de la liste ---
    private Iterator iter;
    
    public void initParcours() {
        iter = liste.iterator();    
    }
    public boolean encore() {
        return iter.hasNext();
    }
    public Document suivant() {
        return (Document) iter.next();
    }

// --- Divers ---    
    ...
}
Une autre manière de concevoir ListeDeDocuments : au lieu de dire qu'une ListeDeDocuments contient un Vector, on dit qu'une ListeDeDocuments est un Vector. Dans un cas comme celui-ci, cela ne change pas grand-chose :
import java.util.*;

class ListeDeDocuments extends Vector {
    
    public ListeDeDocuments() {
        super();
    }
    public void ajout(Document d) {
        add(d);
    }

// --- Pour le parcours de la liste ---
    private Iterator iter;
    
    public void initParcours() {
        iter = iterator();  
    }
    public boolean encore() {
        return iter.hasNext();
    }
    public Document suivant() {
        return (Document) iter.next();
    }

// --- Divers ---    
    public void toutesLesDescriptions() {
        initParcours();
        while (encore())
            System.out.println(suivant().description());
    }
    public void tousLesAuteurs() {
        initParcours();
        while (encore()) {
            Document d = suivant();
            if (d instanceof Livre)
                System.out.print(((Livre)d).auteur() + " ");
        }
    }
}

Exo 3.2

Cet exercice n'a qu'un intérêt démonstratif, car nous y refaisons des choses bien établies dans la bibliothèque Java : d'une part, les fonctionnalités de notre classe Liste sont offertes par diverses sortes de collections de la bibliothèque Java, comme les Vector ou les LinkedList.

D'autre part, l'interface ObjetOrdonne et la classe Entier existent également dans la bibliothèque Java, où ils sont respectivement appelés l'interface Comparable et la classe Integer.

Fichier Liste.java :

public class Liste {
    class Maillon {
        Object info;
        Maillon suiv;
        Maillon(Object i, Maillon s) {
            info = i;
            suiv = s;
        }
    }
    protected Maillon premier;
    protected Maillon dernier;

    public Liste() {
        premier = null;
    }
    public boolean vide() {
        return premier == null;
    }
    public void entrer(Object i) {
        Maillon p = new Maillon(i, null);
        if (premier == null)
            premier = p;
        else
            dernier.suiv = p;
        dernier = p;
    }
    public Object sortir() throws Exception {
        if (vide())
            throw new Exception("Extraction d'une liste vide");
        Maillon res = premier;
        premier = premier.suiv;
        return res.info;
    }
    public String toString() {
        String res = "[ ";
        for (Maillon p = premier; p != null; p = p.suiv)
            res += p.info.toString() + " ";
        res += "]";
        return res;
    }
}

Fichier ObjetOrdonne.java :

public interface ObjetOrdonne {
    boolean inferieurOuEgal(ObjetOrdonne o);
}

Fichier ListeTriee.java :

public class ListeTriee extends Liste {

    public void entrer(Object i) {
        ObjetOrdonne j = (ObjetOrdonne) i;
        Maillon pc = premier;
        Maillon pr = null;
        while (pc != null && ((ObjetOrdonne)pc.info).inferieurOuEgal(j)) {
            pr = pc;
            pc = pc.suiv;
        }
        Maillon p = new Maillon(i, pc);
        if (pc == null)
            dernier = p;
        if (pc == premier)
            premier = p;
        else
            pr.suiv = p;
    }
}

Fichier TestListe.java :

public class TestListe {

    public static void main(String[] args) {
     // Liste L = new Liste();
        Liste L = new ListeTriee();

        for (int i = 0; i < 10; i++)
            L.entrer(new Entier((int)(100 * Math.random())));

        System.out.println("L : " + L);

        try {
            while ( ! L.vide())
                System.out.print(L.sortir() + " ");
        }
        catch(Exception e) {
            System.out.println("Problème : " + e.getMessage());
        }
    }
}

Fichier Entier.java :

class Entier implements ObjetOrdonne {
    private int valeur;

    public Entier(int v) {
        valeur = v;
    }
    public int valeur() {
        return valeur;
    }
    public boolean inferieurOuEgal(ObjetOrdonne o) {
        Entier e = (Entier) o;  	// possibilité (voulue) d'exception
        return valeur <= e.valeur;
    }
    public String toString() {
        return valeur + "";
    }
}

Exo 3.3

Fichier Point.java :

public interface Point {
    double x();
    double y();
    double rho();
    double theta();
    void homothétie(double k);
    void translation(double dx, double dy);
    void rotation(double a);
}

Fichier PointCart.java :

public class PointCart implements Point {
    double x, y;

    public PointCart(double abs, double ord) {
        x = abs;
        y = ord;
    }
    public PointCart(double mod, double arg, int vain) {
        x = mod * Math.cos(arg);
        y = mod * Math.sin(arg);
    }
    public double x() {
        return x;
    }
    public double y() {
        return y;
    }
    public double rho() {
        return Math.sqrt(x * x + y * y);
    }
    public double theta() {
        return Math.atan2(y, x);
    }
    public void homothétie(double k) {
        x *= k;
        y *= k;
    }
    public void translation(double dx, double dy) {
        x += dx;
        y += dy;
    }
    public void rotation(double a) {
        double cosa = Math.cos(a);
        double sina = Math.sin(a);
        double u = x * cosa - y * sina;
        y = x * sina + y * cosa;
        x = u;
    }
    public String toString() {
        return "(" + x + "," + y + ")";
    }
}

Fichier PointPol.java :

public class PointPol implements Point {
    double r, t;

    public PointPol(double abs, double ord) {
        r = Math.sqrt(abs * abs + ord * ord);
        t = Math.atan2(ord, abs);
    }
    public PointPol(double mod, double arg, int vain) {
        r = mod;
        t = arg;
    }
    public double x() {
        return r * Math.cos(t);
    }
    public double y() {
        return r * Math.sin(t);
    }
    public double rho() {
        return r;
    }
    public double theta() {
        return t;
    }
    public void homothétie(double k) {
        r *= k;
    }
    public void translation(double dx, double dy) {
        double x = x() + dx;
        double y = y() + dy;
        r = Math.sqrt(x * x + y * y);
        t = Math.atan2(y, x);
    }
    public void rotation(double a) {
        t += a;
    }
    public String toString() {
        return r + "<" + t + ">";
    }
}

Fichier TestPoint.java :

public class TestPoint {

    public static void main(String args[]) {
        Point p = new PointCart(3, 4);
        Point q = new PointCart(5, Math.atan2(4, 3), 0);
        Point r = new PointPol(3, 4);
        Point s = new PointPol(5, Math.atan2(4, 3), 0);

        montre(p, "p");
        montre(q, "q");
        montre(r, "r");
        montre(s, "s");
    }

    private static void montre(Point p, String n) {
        System.out.println(n + " : " + p + " (" + p.x() + ", " + p.y() + ")");
    }
}