Karine Zampieri, St´ ephane Rivi` ere
Unisciel algoprog Version 21 mai 2018
Table des mati` eres
1 Utilitaires Dates 2
1.1 Type DateJMA . . . 2
1.2 Proc´edure afficherDT (affichage d’une date) . . . 2
1.3 Fonction bissextile (test de bissextilit´e) . . . 2
1.4 Fonction dateEnChaine (date en chaˆıne) . . . 2
1.5 Fonction datumDT (validit´e d’une date) . . . 3
1.6 Fonction dernierJour (dernier jour d’un mois et ann´ee) . . . 3
1.7 Fonction gregorienneDT (test date gr´egorienne) . . . 4
1.8 Fonction jsemaineDT (jour de la semaine) . . . 4
1.9 Fonction njours (nombre de jours d’un mois et ann´ee) . . . 5
1.10 Fonction nomJSemaine (jour de semaine en toutes lettres) . . . 5
1.11 Fonction nomMois (nom d’un mois en toutes lettres) . . . 6
1.12 Fonction premierJSemaine (premier jour semaine) . . . 6
1.13 Proc´edure saisirDT (saisie d’une date) . . . 7
1.14 Proc´edure saisirGregDT (saisie d’une date) . . . 7
Java - Utilitaires Dates (TP)
Mots-Cl´es Dates et Heures
Requis Axiomatique imp´erative (sauf Fichiers)
Objectif
Ce module contient un ensemble d’utilitaires «Dates» sous forme de probl`emes exter- nalis´es.
1
1 Utilitaires Dates
1.1 Type DateJMA
D´efinissez le type DateJMA sous la forme d’un triplet d’entiers contenant : le num´ero de jour, le num´ero de mois et le mill´esime de l’ann´ee.
1.2 Proc´ edure afficherDT (affichage d’une date)
Ecrivez une proc´´ edure afficherDT(dt) qui affiche une DateJMA dt sous la forme (o`u [x]
d´esigne le contenu de x) : [jr]/[mm]/[an]
1.3 Fonction bissextile (test de bissextilit´ e)
D´efinition
Soit une ann´ee post´erieure `a 1582 (d´ebut du calendrier gr´egorien).
Elle est bissextilesi et seulement si son mill´esime est :
• Divisible par 4mais non divisible par 100.
• Ou divisible par 400.
Exemples
• 1986 : non (non divisible par 4)
• 1988 : oui (divisible par 4et non divisible par 100)
• 1900 : non (divisible par4 et par 100)
• 2000 : oui (divisible par 400)
Ecrivez une fonction´ bissextile(an) qui teste et renvoie Vrai si le mill´esime d’une ann´ee
an (entier sup´erieur `a 1582) est bissextile,Faux sinon.
1.4 Fonction dateEnChaine (date en chaˆıne)
Traduction dateEnChaine
Pour traduire un triplet d’entiers (jour, mois, ann´ee) en chaˆıne de caract`eres, une strat´egie consiste `a traduire le num´ero de jour j, le num´ero de mois m et l’ann´ee a en chaˆıne.
Exemples :
dateEnChaine(12,3,6) ==> "12/3/06"
dateEnChaine(12,3,2006) ==> "12/3/2006"
Ecrivez une fonction´ dateEnChaine(dt)qui calcule et renvoie la traduction sous forme d’une chaˆıne "[jr]/[mm]/[an]" (o`u [x] d´esigne le contenu de x) d’uneDateJMA dt.
Aide m´ethodologique
Distinguez le cas o`u l’ann´eeanest sup´erieure `a100 pour tenir compte du z´ero significatif dans les dizaines.
1.5 Fonction datumDT (validit´ e d’une date)
D´efinition
Un triplet d’entiers (j, m, a) est une date validesi :
• Le mill´esime de l’ann´eea est un entier positif.
• Le num´ero du mois m est compris entre 1 et12.
• Le num´ero du jour j est compris entre 1 et le nombre de jours du mois m de l’ann´eea.
Exemples
Les 30/4/1950 et 29/2/1996 sont des dates valides.
Mais ne sont pas valides :
• Le 29/2/1987 (le jour est sup´erieur au dernier jour du mois de l’ann´ee consid´er´ee)
• Le 25/13/2000 (le mois n’est pas un num´ero valide)
• Le 5/5/-2000 (l’ann´ee n’est pas positive)
Ecrivez une fonction´ datumDT(dt)qui teste et renvoieVraisi et seulement si uneDateJMA dt repr´esente une date valide, Fauxsinon.
1.6 Fonction dernierJour (dernier jour d’un mois et ann´ ee)
Propri´et´e
Pour les ann´ees post´erieures `a1582 (ann´ee du calendrier Gr´egorien) :
• Les mois num´eros 1, 3,5, 7, 8, 10et 12ont 31jours.
• Ceux de num´eros 4, 6,9 et11 en ont 30.
• Le mois num´ero 2 a 29jours si l’ann´ee est bissextile,28 dans le cas contraire.
Ecrivez une fonction´ dernierJour(mm,an) qui calcule et renvoie le dernier jour d’un num´ero de moismm (entier compris entre 1 et12) d’une ann´ee an(entier sup´erieur `a1582), selon l’algorithme suivant :
• Si le mois vaut2 : le dernier jour est 28(ou 29 si l’ann´ee est bissextile).
• Sinon si le mois est impair et ≤7 ou pair et >7 : le dernier jour est31.
• Sinon le dernier jour est30.
1.7 Fonction gregorienneDT (test date gr´ egorienne)
D´efinition
Gr´egoire XIII a impos´e sa r´eforme du calendrier Gr´egorien le jeudi 4 octobre 1582 qui fut alors suivi du vendredi 15 octobre 1582 (nous avons effectivement «saut´e» dix jours).
Ecrivez une fonction´ gregorienneDT(dt) qui teste et renvoieVrai si uneDateJMA dt est pos- t´erieure `a la r´eforme du calendrier du jeudi 4 octobre 1582,Faux sinon.
1.8 Fonction jsemaineDT (jour de la semaine)
Ce probl`eme d´etermine le num´ero du jour de la semaine (c.-`a-d. 0=dimanche, 1=lundi, etc.) d’une date (jour, mois, ann´ee).
D´efinition
La formule deZeller(´enonc´ee ci-apr`es) permet de calculer le jour de semaine d’une date du calendrier Gr´egorien1. Pour l’utiliser, il faut d´ecaler la date de deux mois. L’ann´ee de Zeller commence au mois de mars. Ainsi la date gr´egorienne 7/2/2010 doit ˆetre transform´ee en 7/12/2009 pour Zeller, et la date gr´egorienne 5/4/2010 en 5/2/2010 pourZeller.
Formule de Zeller
Soit d un jour de la semaine dans [0..6]avec d= 0 pour le dimanche.
Soient :
• m : le num´ero du mois dans l’ann´ee deZeller
• a : le num´ero de l’ann´ee de Zeller
• j : le num´ero du jour dans le mois de Zeller
• n=a mod 100 : le num´ero de l’ann´ee dans le si`ecle deZeller
• s : le num´ero du si`ecle de Zeller
1. Le calendrier Gr´egorien fut adopt´e en France, Italie, Espagne et Portugal le 15/10/1582, en Pologne en 1587, en Grande-Bretagne en1753, au Japon en 1911, en Chine en 1917, en URSS et en Gr`ece en 1926.
La formule de Zellerest
d=f mod 7 avec
f =j+n+ 5s+n div4 +s div 4 + (13m−1)div 5
o`u l’op´erateur div d´esigne la division enti`ere et l’op´erateur mod le reste de la division enti`ere.
Remarque
Gr´egoire XIII a impos´e la r´eforme du calendrier le jeudi 4 octobre 1582 qui fut alors suivi du vendredi 15 octobre 1582. Avant ce changement, la formule de Zeller fonc- tionne en ajoutant 3 `af.
Ecrivez une fonction´ jsemaineDT(dt)qui calcule et renvoie le num´ero de jour de la semaine d’une DateJMA dten appliquant la formule de Zeller.
1.9 Fonction njours (nombre de jours d’un mois et ann´ ee)
Propri´et´e
Pour les ann´ees post´erieures `a1582 (ann´ee du calendrier Gr´egorien) :
• Les mois num´eros 4, 6,9 et11 ont30 jours.
• Le mois num´ero 2 a 29jours si l’ann´ee est bissextile,28 sinon.
• Sinon c’est 31jours pour tous les autres mois 1, 3, 5, 7, 8, 10et12.
Ecrivez une fonction´ njours(mm,an) qui calcule et renvoie le nombre de jours d’un num´ero de mois mm (entier compris entre1 (pour janvier) et 12(pour d´ecembre)) d’une ann´eean
(entier sup´erieur `a 1582).
Aide m´ethodologique Pr´ef´erez une structure Selon.
1.10 Fonction nomJSemaine (jour de semaine en toutes lettres)
Ecrivez une fonction´ nomJSemaine(jsem) qui calcule et renvoie le nom d’un num´ero de jour de semaine jsem en toutes lettres, dimanche ´etant le num´ero 0 et samedi le num´ero 6.
L’entier jsem est suppos´e compris dans [0..6].
1.11 Fonction nomMois (nom d’un mois en toutes lettres)
Ecrivez une fonction´ nomMois(mm) qui renvoie le nom d’un num´ero de mois mm en toutes lettres, janvier ´etant le num´ero 1 et d´ecembre le num´ero 12. L’entier mm est suppos´e compris dans[1..12].
1.12 Fonction premierJSemaine (premier jour semaine)
Ce probl`eme donne l’index du premier jour d’un mois et ann´ee donn´es (0 signifie Di- manche, 1 Lundi, etc.).
Propri´et´e
Le calcul du jour o`u tombe le1er janvier d’une ann´ee est donn´ee dans l’ouvrage«A Col- lection of Programming Problems and Techniques»,H.A. MaurerandM.R. Williams, Prentice-Hall 1972 :
(36 +y+y div 4−y div 100 +y div 400) mod NJOURSSEM avec y=annee−1et NJOURSSEM(= 7) le nombre de jours dans une semaine.
Ecrivez une fonction´ premierJSemJanvier(annee) qui calcule et renvoie le premier jour se- maine du 1er janvier d’une ann´eeannee (entier) donn´ee selon l’algorithme ci-dessus.
Connaissant l’index du premier jour d’une ann´eean, comment en calculer le premier jour d’un mois mm?
Aide simple
Admettons que Janvier commence un Mercredi en ann´eean, c.-`a-d. quepremierJSemJanvier(an)
renvoie 3(=MER). Pour calculer sa valeur en F´evrier, on additionne le nombre de jours du mois de Janvier (ici 31). Nous obtenons 34(= 3 + 31) et le reste de la division de 34 par
NJOURSSEM (ici 7) donne 6 ce qui fait que F´evrier commence un Samedi.
Ecrivez une fonction´ premierJSemaine(mois,annee) qui calcule et renvoie le premier jour semaine d’un mois mois (entier) et ann´eeannee (entier) donn´es.
1.13 Proc´ edure saisirDT (saisie d’une date)
Ecrivez une proc´´ edure saisirDT(dt) qui saisit une DateJMA dans dt. La date doit ˆetre demand´ee tant qu’elle n’est pas valide. Affichez l’invite :
jr/mm/an?
1.14 Proc´ edure saisirGregDT (saisie d’une date)
Ecrivez une proc´´ edure saisirGregDT(dt) qui saisit une DateJMA dans dt. La date doit ˆetre demand´ee tant qu’elle n’est pas une date gr´egorienne valide. Affichez les invites :
Millesime de l’annee?
Numero du mois?
Numero du jour?