Structures de données/Dates
Ceci est un projet, c'est à dire un regroupement de problématiques connexes.
Problématique
modifierNous souhaitons effectuer des opérations sur les dates de la forme « jour, mois, année ».
À cette fin, nous avons déclaré le type suivant :
date = enregistrement j : entier (* représentant le jour *) m : entier (* représentant le mois *) a : entier (* représentant l'année *) fin
Il est demandé de proposer des algorithmes pour les fonctions suivantes :
- le constructeur
creerDate : entier, entier, entier → date
- fonction qui renvoie une date donnée par les trois entiers passés en paramètres.
- les 3 observateurs
jour
,mois
,année
toutes de typesdate → entier
- ces trois fonctions donnant accès respectivement au jour, au mois et à l'année de la date passée en paramètre. On aura donc
jour(creerDate(a,b,c))=a
,mois(creerDate(a,b,c))=b
etannée(creerDate(a,b,c))=c
- un prédicat
EstBissextile : entier → booléen
- ce prédicat renvoie
VRAI
si l'année passée en paramètre est bissextile.FAUX
sinon. - un prédicat
EstDateValide : date → booléen
- ce prédicat renvoie
VRAI
si la date passée en paramètre est valide etFAUX
sinon. à expliciter - une fonction
NbJourMois : date → entier
- cette fonction renvoie le nombre de jour du mois de l'année de la date passée en paramètre. Gérer les années bissextiles.
- une fonction
DiffDate : date, date → entier
- fonction qui donne en nombre de jours l'écart entre deux dates. On considère que le temps entre un jour et ce même jour est 0 et 1 entre un jour et son lendemain.
- une fonction
JourDeLaSemaine : date → chaîne
- qui renvoie le jour (au sens "lundi", "mardi", ..., "dimanche") de la date passée en paramètre.
Programme qui permet de saisir une date de la forme jj/mm/aaaa et affiche le nombre de jours du mois
modifierSolutions
modifierFunction CreerDate(j, m, a : entier) : date Lexique NouvelleDate : date (* la nouvelle date que nous allons remplir et renvoyer *) Début (* Remplissons tous les champs de la date avec les données en paramètres *) NouvelleDate.j ← j NouvelleDate.m ← m NouvelleDate.a ← a (* la nouvelle date est remplie : on la retourne *) retourner NouvelleDate Fin
Fonction jour(d : date) : entier Début retourner d.j Fin
Fonction mois(d : date) : entier Début retourner d.m Fin
Fonction année(d : date) : entier Début retourner d.a Fin
Fonction NbJourMois(d : date) : entier (* On suppose la date valide *) Début Sélectionner d.m parmi 1,3,5,7,8,10,12 : retourner 31 (* c'est un mois à 31 jours *) 4,6,9,11 : retourner 30 (* c'est un mois à 30 jours *) (* Il reste février où il faut gérer le cas de l'année bissextile : *) 2 : si EstBissextile(d.a) retourner 29 sinon retourner 28 FS Fin
Fonction EstDateValide(d : date) : booléen Début (* on suppose que l'année peut-être un entier quelconque : pas de test sur d.a *) (* il faut simplement vérifier que le jour de la date est bien un jour du mois *) retourner d.j <= NbJourMois(d) Fin
Fonction EstBissextile(année : entier) : booléen Début (* l'année ne peut être bissextile (et donc renvoyer VRAI) que de deux façons *) (* l'année est divisible par 4 mais non divisibles par 100 *) (* l'année est divisible par 400 *) (* l'année est bissextile si elle vérifie l'une ou l'autre des conditions *) retourner (année mod 4 = 0 et année mod 100 <> 0) ou (année mod 400 = 0); Fin
Fonction JourDeLaSemaine (d : date) : chaîne Lexique Jours : tableau de 1 à 7 de chaînes de caractères (* contient les chaînes de caractères de chaque jour *) Début (* On remplit le tableau : les indices sont choisis en fonction du résultat du mod 7 qui sera obtenu *) Jours[0]←"Dimanche" Jours[1]←"Lundi" Jours[2]←"mardi" Jours[3]←"Mercredi" Jours[4]←"Jeudi" Jours[5]←"Vendredi" Jours[6]←"Samedi" (* le premier janvier de l'an 0 était un dimanche nous voulons le nombre de jour écoulés depuis cette date : DiffDate(d,creerDate(1,1,0)). Nous mettrons ce nombre modulo 7. Ainsi si il s'est écoulé un nombre exact de semaines (7 jours) on retombe un dimanche, au début du tableau. *) retourner Jours[DiffDate(d,creerDate(1,1,0)) mod 7] Fin