/* Tri a bulle d'un tableau de dates */ public class TriBulleTableauDeDates { ///////////////////////////////////////////////// /* 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 ) { Ecran.afficher("0"); } Ecran.afficher(d.jour); Ecran.afficher("/"); if ( d.mois < 10 ) { Ecran.afficher("0"); } Ecran.afficher(d.mois); Ecran.afficher("/"); if ( d.annee < 10 ) { Ecran.afficher("0"); } if ( d.annee < 100 ) { Ecran.afficher("0"); } if ( d.annee < 1000 ) { Ecran.afficher("0"); } Ecran.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]); Ecran.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) { int n; Date [] td; Ecran.afficher("Nombre de Date ? "); n = Clavier.saisirInt(); td = new Date[n]; for ( int i = 0 ; i < n ; i++ ) { td[i] = dateAleatoire(); } Ecran.sautDeLigne(); affichage(td); Ecran.sautDeLigne(); triBulleTableauDeDate(td); affichage(td); } }