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

Exo 2.1

public class Date {
    private int annee;
    private int mois;
    private int jour;
    private int jourSemaine;

    public Date(int jour, int mois, int annee) {
        boolean dateInvalide = mois < 1 || mois > 12 
                || jour < 1 || jour > 31 
                || jour == 31 && (mois == 4 || mois == 6 || mois == 9 || mois == 11)
                || jour == 30 && mois == 2 
                || jour == 29 && mois == 2 && annee % 4 != 0;
        if (dateInvalide) {
            System.out.println("Date incorrecte");
            System.exit(0);
        }
        this.jour = jour;
        this.mois = mois;
        this.annee = annee;
        this.jourSemaine = jourSemaine(jour, mois, annee);
    }

    public int getJour() {
        return jour;
    }

    public int getMois() {
        return mois;
    }

    public int getAnnee() {
        return annee;
    }

    int getJourSemaine() {
        return jourSemaine;
    }

    public String toString() {
        return nomsDesJours[jourSemaine] + " " + jour + " "
                + nomsDesMois[mois - 1] + " " + annee;
    }

    public boolean infeg(Date d) {
        return annee < d.annee || annee == d.annee && mois < d.mois
                || annee == d.annee && mois == d.mois && jour <= d.jour;
    }

    private String[] nomsDesJours = { "lundi", "mardi", "mercredi", "jeudi",
            "vendredi", "samedi", "dimanche" };

    private String[] nomsDesMois = { "janvier", "fevrier", "mars", "avril", "mai",
            "juin", "juillet", "août", "septembre", "octobre", "novembre",
            "decembre" };

    private int jourSemaine(int jour, int mois, int annee) {
        java.util.Calendar c = java.util.Calendar.getInstance();
        c.set(annee, mois - 1, jour);
        return (c.get(java.util.Calendar.DAY_OF_WEEK) + 5) % 7;
    }

    public static void main(String[] args) {
        Date a = new Date(8, 12, 2006);
        Date b = new Date(10, 7, 1949);
        System.out.println(a);
        System.out.println(b);
        System.out.println(a.infeg(b) + " " + b.infeg(a) + " " + a.infeg(a));
    }
}

Exo 2.2

Fichier Point.java :

public class Point {
    private double x, y;

    public Point(double a, double b) {
        x = a;
        y = b;
    }
    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 x1 = cosa * x - sina * y;
        y = sina * x + cosa * y;
        x = x1;
    }
    public String toString() {
        return "(" + x + "," + y + ")";
    }
}

Fichier LignePol.java :

import java.util.Vector;

class LignePol {
    private Vector points = new Vector();

    public void ajouterPoint(Point p) {
        points.addElement(p);
    }
    public void homothétie(double k) {
        for (int i = 0; i < points.size(); i++)
            ((Point) points.elementAt(i)).homothétie(k);
    }
    public void translation(double dx, double dy) {
        for (int i = 0; i < points.size(); i++)
            ((Point) points.elementAt(i)).translation(dx, dy);
    }
    public void rotation(double a) {
        for (int i = 0; i < points.size(); i++)
            ((Point) points.elementAt(i)).rotation(a);
    }
    public String toString() {
        return points.toString();
} static public void main(String[] args) { LignePol l = new LignePol(); for (int i = 0; i < 6; i++) l.ajouterPoint(new Point(i, 2 * i)); System.out.println(l); l.translation(10, -10); System.out.println(l); } }
Une autre manière de faire qu'un objet LignePol contienne un objet Vector :
import java.util.Vector;

class LignePol extends Vector {

    public void ajouterPoint(Point p) {
        addElement(p);
    }
    public void homothétie(double k) {
        for (int i = 0; i < size(); i++)
            ((Point) elementAt(i)).homothétie(k);
    }
    public void translation(double dx, double dy) {
        for (int i = 0; i < size(); i++)
            ((Point) elementAt(i)).translation(dx, dy);
    }
    public void rotation(double a) {
        for (int i = 0; i < size(); i++)
            ((Point) elementAt(i)).rotation(a);
    }

    static public void main(String[] args) {
        LignePol l = new LignePol();
        for (int i = 0; i < 6; i++)
            l.ajouterPoint(new Point(i, 2 * i));
        System.out.println(l);
        l.translation(10, -10);
        System.out.println(l);
    }
}
Dans un cas comme dans l'autre, une autre manière d'obtenir le parcours du vecteur :
import java.util.*;

class LignePol {
    private Vector points = new Vector();

    public void ajouterPoint(Point p) {
        points.addElement(p);
    }
    public void homothétie(double k) {
        Iterator iter = points.iterator();
        while (iter.hasNext())
            ((Point) iter.next()).homothétie(k);
    }
    public void translation(double dx, double dy) {
        Iterator iter = points.iterator();
        while (iter.hasNext())
            ((Point) iter.next()).translation(dx, dy);
    }
    etc.
}
Essai sommaire : fichier TestLignePol.java :
 public class TestLignePol {
    public static void main(String[] args) {
        LignePol ligne = new LignePol();
        for (int i = 0; i < 10; i++)
            ligne.ajouterPoint(new Point(Math.random(), Math.random()));
        System.out.println("avant : " + ligne);
        
                /* Exemple de transformation: rotation de 45 degrés */
                /* autour du point (1, 1) */
        ligne.translation(-1, -1);
        ligne.rotation(Math.PI / 4);
        ligne.translation(1, 1);
        System.out.println("après : " + ligne);
    }
}
Nouveau fichier Point.java :
public class Point {
    private double r, t;

    public Point(double x, double y) {
        r = Math.sqrt(x * x + y * y);
        t = Math.atan2(y, x);
    }
    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;     // ou une autre notation...
    }

}

Exo 2.3

Fichier Mangenombres.java :

class Mangenombres {
    int valeur;
    Mangenombres suivant;

    Mangenombres(int v) {
        valeur = v;
        suivant = null;
        System.out.print(valeur + " ");
    }

    void manger(int n) {
        if (n % valeur != 0)
            if (suivant != null)
                suivant.manger(n);
            else
                suivant = new Mangenombres(n);
    }

    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        Mangenombres deux = new Mangenombres(2);
        for (int i = 3; i < n; i++)
            deux.manger(i);
    }
}

Exo 2.4

Fichier Ensemble.java :

public class Ensemble {
    static public int N = 32;

    private int[] tab = new int[N];
    private int nbr = 0;

    public int cardinal() {
        return nbr;
    }

    public boolean contient(int x) {
        for (int i = 0; i < nbr; i++)
            if (tab[i] == x)
                return true;
        return false;
    }

    public void ajout(int x) {
        if ( ! contient(x))
            tab[nbr++] = x;
    }

    public String toString() {
        if (nbr == 0)
            return "{}";
        else {
            String r =  "{" + tab[0];
            for (int i = 1; i < nbr; i++)
                r += "," + tab[i];
            return r + "}";
        }
    }

    static public void main(String[] args) {
        Ensemble e = new Ensemble();

        int x = Lire.entier("x ? ");
        while (x >= 0) {
            e.ajout(x);
            x = Lire.entier("x ? ");
        }
        System.out.println("e = " + e);
    }
}

Classe auxiliaire Lire.java :

import java.io.*;

public class Lire {
    static public int entier(String prompt) {
        System.out.print(prompt);
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            return Integer.parseInt(in.readLine());
        }
        catch (Exception e) {
            System.out.println("Erreur de lecture " + e.getMessage());
            System.exit(-1);
        }
        return 0;
    }
}

Deuxième implémentation des ensembles. Un autre fichier Ensemble.java :

import java.util.Vector;
import java.util.Iterator;

public class Ensemble {
    Vector table = new Vector();

    public int cardinal() {
        return table.size();
    }

    public boolean contient(int x) {
        return table.contains(new Integer(x));
    }

    public void ajout(int x) {
        if ( ! contient(x))
            table.add(new Integer(x));
    }

    public String toString() {
        if (table.size() == 0)
            return "{}";
        else {
            Iterator it = table.iterator();
            String r =  "{" + it.next();
            while (it.hasNext())
                r += "," + it.next();
            return r + "}";
        }
    }

    static public void main(String[] args) {
        ...
    }
}