/* Tri a bulle d'un tableau de dates           */

public class TriBulleTableauDeDatesEnConsole {

/////////////////////////////////////////////////

/* Type agrege de stockage d'une date      */
/* formee d'un numero de jour, d'un numero */
/* de mois et d'un numero d'annee          */

  static class Date {
    int jour = 1;
    int mois = 1;
    int annee = 1901; };

/* Fonction de comparaison de deux Date        */
/* vis a vis de l'ordre chronologique          */
/* Valeur entiere retournee:                   */
/*   0  si Date egales                         */
/*   -1 si la premiere Date est anterieure     */
/*      a la seconde                           */
/*   1  si la premiere Date est posterieure    */
/*      a la seconde                           */

  static int ordre(Date d1,Date d2) {
    int res;
    if ( d1.annee < d2.annee ) {
      res = -1; }
      else {
      if ( d1.annee > d2.annee ) {
        res = 1; }
        else {
        if ( d1.mois < d2.mois ) {
          res = -1; }
          else {
          if ( d1.mois > d2.mois ) {
            res = 1; }
            else {
            if ( d1.jour < d2.jour ) {
              res = -1; }
              else {
              if ( d1.jour > d2.jour ) {
                res = 1; }
                else {
                res = 0; } } } } } }
    return(res);
  }

/* Fonction de tri par ordre alphabetique      */
/* d'un tableau de Date                        */
/* Technique de tri: Tri a bulle               */

  static void triBulleTableauDeDate(Date [] t) {
    Date aux;
    boolean permutation;
    int np = t.length-1;
    do {
      permutation = false;
      for ( int j = 0 ; j < np ; j++ ) {
        if ( ordre(t[j],t[j+1]) > 0 ) {
          aux = t[j];
          t[j] = t[j+1];
          t[j+1] = aux;
          permutation = true; } }
      np--; }
    while ( permutation ) ;
  }

/////////////////////////////////////////////////

/* Affichage d'une date au format jj/mm/aaaa   */

  static void afficher(Date d) {
    if ( d.jour < 10 ) {
      Console.afficher("0"); }
    Console.afficher(d.jour);
    Console.afficher("/");
    if ( d.mois < 10 ) {
      Console.afficher("0"); }
    Console.afficher(d.mois);
    Console.afficher("/");
    if ( d.annee < 10 ) {
      Console.afficher("0"); }
    if ( d.annee < 100 ) {
      Console.afficher("0"); }
    if ( d.annee < 1000 ) {
      Console.afficher("0"); }
    Console.afficher(d.annee);
  }

/* Fonction d'affichage d'un tableau de Date   */

  static void affichage(Date [] td) {
    for ( int i = 0 ; i < td.length ; i++ ) {
      afficher(td[i]);
      Console.sautDeLigne(); }
  }

/* Fonction de tirage au sort d'un nombre      */
/* entier compris dans un intervalle [min,max] */

  static int random(int min,int max) {
    int v;
    v = min +(int) (Math.random()*(max-min+1));
    return v;
  }

/* Test si une annee est bissextile            */

  static boolean testBissextile(int annee) {
    boolean res;
    if ( annee%400 == 0 ) {
      res = true; }
      else {
      if ( annee%100 == 0 ) {
        res = false; }
        else {
        if ( annee%4 == 0 ) {
          res = true; }
          else {
          res = false; } } }
    return res;
  }

/* Calcul du nombre de jours d'un mois         */

  static int nombreJoursMois(int mois,int annee) {
    int res;
    switch (mois) {
      case 1 :
      case 3 :
      case 5 :
      case 7 :
      case 8 :
      case 10 :
      case 12 : {
        res = 31; }
        break;
      case 4 :
      case 6 :
      case 9 :
      case 11 : {
        res = 30; }
        break;
      case 2 : {
        if ( testBissextile(annee) == true ) {
          res = 29; }
          else {
          res = 28; } }
        break;
      default : {
        res = -1; }
        break; }
    return res;
  }

/* Fonction de creation d'une Date tiree       */
/* au sort entre le 01/01/2000                 */
/* et le 31/12/2012                            */

  static Date dateAleatoire() {
    Date d = new Date();
    d.annee = random(2000,2012);
    d.mois = random(1,12);
    d.jour = random(1,nombreJoursMois(d.mois,d.annee));
    return(d);
  }

/* Programme principal                         */

  public static void main(String [] args) {
    Console.setTitle("TriBulleTableauDeDates");
    int n;
    Date [] td;
    Console.afficher("Nombre de Date   ? ");
    n = Console.saisirInt();
    td = new Date[n];
    for ( int i = 0 ; i < n ; i++ ) {
      td[i] = dateAleatoire(); }
    Console.sautDeLigne();
    affichage(td);
    Console.sautDeLigne();
    triBulleTableauDeDate(td);
    affichage(td);
  }
}