Ceci est un projet, c'est à dire un regroupement de problématiques connexes.

Problématique

modifier

Nous 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 types date → 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 et anné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 et FAUX 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

modifier

Solutions

modifier
Function 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