public class Chrono {

    private int heure, minute, seconde;

    public Chrono(int h, int m, int s) {
        this.heure = h;
        this.minute = m;
        this.seconde = s;
    }

    public String toString() {
        return this.heure + " heures, " + this.minute + " minutes, et "
            + this.seconde + " secondes";
    }

    public int toSeconds() {
        return this.seconde + this.minute * 60 + this.heure * 3600;
    }

    public boolean egale(Chrono c) {
        return this.heure == c.heure
            && this.minute == c.minute
            && this.seconde == c.seconde;
    }

    public boolean equals(Object o) {
        if (!(o instanceof Chrono)) return false;
        return this.egale((Chrono)o);
    }

    public boolean avant(Chrono c) {
        if (this.heure < c.heure) return true;
        if (this.heure == c.heure && this.minute < c.minute) return true;
        return this.heure == c.heure && this.minute == c.minute && this.seconde <= c.seconde;
    }

    public Chrono clone() {
        return new Chrono(this.heure, this.minute, this.seconde);
    }
   
    private void normalise() {
        if (this.seconde >= 60) {
            this.minute += this.seconde / 60;
            this.seconde = this.seconde % 60;
        }
        if (this.minute >= 60) {
            this.heure += this.minute / 60;
            this.minute = this.minute % 60;
        }
    }

    public void tic() {
        this.avance(1);
    }

    public void avance(int n) {
        this.seconde += n;
        this.normalise();
    }

    public Chrono retire(Chrono c) {
        assert (c.avant(this));
        int h = this.heure - c.heure - ((this.minute<c.minute)?1:0);
        int m = this.minute - c.minute - ((this.seconde<c.seconde)?1:0);
        int s = this.seconde - c.seconde;
        return new Chrono(h, m, s);
    }
 
}
