Enseignement > Programmation orientée objet > Delphi > Travaux Dirigés > Première classe et manipulation de dates  

Un horaire est défini par 3 entiers HH, MM, SS
Exemple 9H 45M 30S

1.Concevoir une classe THeure et définir un constructeur avec 3 paramètres entiers (h, m s)
Effectuer un contrôle de validité des paramètres

Const NBMaxSec = 60 ;
Const NBMaxMin = 60 ;
Const NBMaxHeure = 24 ;
Type THeure = class
Heure : [0..NBMaxHeure-1] ;
Minute : [0..NBMaxMin-1] ;
Seconde : [0..NBMaxSec-1] ;

Constructeur THeure.Create(h,m,s :entier)
debut
  si h >=0 et h < NBMaxHeure et m>=0 et m< NBMaxMin et s>=0 et s< NBMaxSec
  alors debut
   
Heure := h ;
    Minute := m ;
    Seconde := s ;
  fin
 sinon self := nil;
fin

2.Ecrire une méthode AjouteSeconde (s : entier) qui ajoute s secondes à la date

Procedure AjouteSeconde (s : entier
 Debut
 
seconde := (seconde + s) mod NBMaxSec ;
  minute := (minute + s div NBMaxSec) mod NbMaxMin ;
  heure := (heure + (minute + s div NBMaxSec) div NbMaxMin) mod NBMaxHeure ;
 
Fin

On considère les dates du calendrier grégorien.

3.Connaissez-vous d'autres calendriers ?
Calendrier julien, hébraique, arabe, républicain

Quelles sont les différences avec le calendrier grégorien ?
Calendrier julien : différence d'une dizaine de jours du à la réforme du pape Grégoire VII au XVIème siècle
Calendrier républicain : 10 mois, des semaines de 10 jours

4. Une date est définie par 6 entiers ANNEE, MOIS, JOUR, HH, MM, SS
Exemple : 2001 / 09 / 30 14H 35M 28S
Ecrire une date sous la forme AAAAMMJJHHMMSS présente un intérêt. Lequel ?

Il est très facile de trier des dates sous cette forme : l'ordre (alphabétique) de cette forme est l'ordre chronologique

5. Concevoir une classe TDate, utilisant la classe THeure et définir un constructeur avec les 6 paramètres définis 4
On considère que l'on dispose d'une procédure NBJoursMois(mois, année : entier) :entier qui donne le nombre de jours pour le mois d'une année donnée
Effectuer un contrôle de validité des paramètres

Const NBMaxJour = 31 ;
Const NBMaxMois = 12;

Type TDate = class
  Jour : [1..NBMaxJour] ;
  Mois : [1..NBMaxMois] ;
  Année : entier ;
 Fin ;

Constructeur TDate.Create(j,mo,a,h,mi,s :entier)
  debut
   Heure := THeure.Create(h,mi,s) ;
   si heure<> nil
      et jour >=1
      et jour <=NBJoursMois(mo,a) et mo>=1 et mo<= NBMaxMois
   alors debut
     Jour := j ;
     Mois := mo ;
     Annee := a ;
    fin
   sinon self := nil ;
  fin

6. Ecrire une méthode qui retourne vrai si l'année est bissextile
Une année bissextile se présente toutes les années divisibles par 400 (400, 800, 1200..., 2000) ou toutes les années divisibles par 4 mais pas divisibles par 100. Ainsi, 1996 est une année bissextile parce qu'elle est divisible par 4 mais pas divisible par 100. L'année 2000 est bissextile parce qu'elle est divisible par 400, mais 1900 n'était pas bissextile

Function Tdate.Bissextile : booleen
  Debut
  
Bissextile := (Annee MOD 400=0) OR ((Annee MOD 4=0) AND (Annee MOD 100<>0));
 
Fin

7. Ecrire une méthode ajoute une date à une autre date

Function TDate.Ajoute(d : TDate) 
  Debut
   Heure.Seconde := Heure.Seconde + d.Heure.Seconde
   Si Heure.Seconde>= NBMaxSec alors
    Debut
     Heure.Seconde := Heure.Seconde- NBMaxSec ;
     Heure.Minute := Heure.Minute+1 ;
    Fin
   Heure.Minute := Heure.Minute + d.Heure.Minute
   Si Heure.Minute>= NBMaxMinute alors
    Debut
     Heure.Minute := Heure.Minute - NBMaxSec ;
     Heure.Heure := Heure.Heure + 1 ;
    Fin
   Heure.Heure := Heure.Heure + d.Heure.Heure
   Si Heure.Heure >= NBMaxHeure alors
    Debut
     Heure.heure := Heure.Heure - NBMaxHeure ;
     jour := jour + 1 ;
    Fin
   Jour := jour+d.jour
   Si jour > NBJoursMois(Mois,Annee) alors
    Debut
     Jour := Jour -  NBJoursMois(Mois,Annee);
    
mois := mois+1 ;
    Fin
   Mois := mois + d.mois
   Si mois > NBMaxMois alors
    Debut
     Mois := mois - NBMaxMois
     annee := annee + 1 ;
    Fin ;
   Annee := annee+ d.annee
  Fin

8. Ecrire le destructeur de la classe Tdate

Destructeur TDate.Free ;
 Debut
  Heure.Free ;
  Inherited ;
 Fin