Les calculs du calendrier
Le calendrier est plein de règles : des mois de 30 ou 31 jours, un mois de février capricieux, des années bissextiles... Un excellent terrain pour s'entraîner à traduire des règles en fonctions.
L'année bissextile
Une année bissextile compte 366 jours : février a 29 jours au lieu de 28. La règle exacte :
- une année divisible par 400 est bissextile ;
- sinon, une année divisible par 100 ne l'est pas ;
- sinon, une année divisible par 4 l'est.
On traduit chaque ligne par un test, dans le même ordre :
fonction estBissextile(annee)
si annee mod 400 = 0 alors
retourne vrai
fin si
si annee mod 100 = 0 alors
retourne faux
fin si
retourne annee mod 4 = 0
fin fonction
affiche estBissextile(2024) // vrai
affiche estBissextile(2025) // faux
affiche estBissextile(1900) // faux : divisible par 100, pas par 400
affiche estBissextile(2000) // vrai : divisible par 400
annee mod 4 = 0 signifie « le reste de la division par 4 est nul », donc « divisible par 4 ». La dernière ligne renvoie directement le résultat de ce test.
Question : L'année 2100 sera-t-elle bissextile ? — Non, car 2100 est divisible par 100 mais pas par 400. 2100 / 400 = 5,25 : pas divisible par 400. Mais 2100 est divisible par 100 : la deuxième règle s'applique, l'année n'est pas bissextile.
Le nombre de jours d'un mois
Plutôt qu'une longue série de si, on range les douze valeurs dans un tableau. Le mois numéro 1 est à l'index 0.
fonction estBissextile(annee)
si annee mod 400 = 0 alors
retourne vrai
fin si
si annee mod 100 = 0 alors
retourne faux
fin si
retourne annee mod 4 = 0
fin fonction
fonction joursDuMois(mois, annee)
durees est un tableau vaut [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
si mois = 2 et estBissextile(annee) alors
retourne 29
fin si
retourne durees[mois - 1]
fin fonction
affiche joursDuMois(1, 2025) // 31
affiche joursDuMois(2, 2025) // 28
affiche joursDuMois(2, 2024) // 29
affiche joursDuMois(9, 2025) // 30
joursDuMois s'appuie sur estBissextile : une fonction en appelle une autre.
Le numéro du jour dans l'année
Le 1er janvier est le jour 1, le 31 décembre le jour 365 (ou 366). Pour une date quelconque, on additionne les jours de tous les mois déjà passés, puis le jour du mois. Ajoute cette fonction sous les deux précédentes :
fonction numeroDuJour(jour, mois, annee)
total est un nombre vaut jour
pour m de 1 à mois - 1
total ajoute joursDuMois(m, annee)
fin pour
retourne total
fin fonction
affiche numeroDuJour(1, 1, 2026) // 1
affiche numeroDuJour(14, 7, 2026) // 195
affiche numeroDuJour(14, 7, 2024) // 196 : une année bissextile
affiche numeroDuJour(31, 12, 2026) // 365
Pour le 14 juillet 2026 : 31 + 28 + 31 + 30 + 31 + 30 = 181 jours de janvier à juin, plus 14 : c'est le 195e jour de l'année.
Pour janvier, la boucle va de 1 à 0 : elle ne tourne pas du tout, et le total reste le jour du mois. C'est exactement ce qu'on veut.
Une date est-elle valide ?
Le 30 février n'existe pas, le 31 avril non plus. Toujours sous les fonctions précédentes :
fonction dateValide(jour, mois, annee)
si mois < 1 ou mois > 12 alors
retourne faux
fin si
retourne jour >= 1 et jour <= joursDuMois(mois, annee)
fin fonction
affiche dateValide(29, 2, 2024) // vrai
affiche dateValide(29, 2, 2025) // faux
affiche dateValide(31, 4, 2025) // faux : avril a 30 jours
affiche dateValide(15, 13, 2025) // faux : pas de mois 13
L'ordre des tests compte : on vérifie d'abord le mois. Sans ce garde-fou, joursDuMois(13, ...) irait lire une case qui n'existe pas dans le tableau.
Les jours restants
Avec ces briques, d'autres questions deviennent faciles :
fonction joursRestants(jour, mois, annee)
total est un nombre vaut 365
si estBissextile(annee) alors
total vaut 366
fin si
retourne total - numeroDuJour(jour, mois, annee)
fin fonction
affiche 'Jours restants après le 14 juillet 2026 : ' + joursRestants(14, 7, 2026)
365 - 195 = 170 jours.
CoddyRun possède déjà est_bissextile(annee) et jours_entre(date1, date2). Les réécrire soi-même est un exercice : dans un vrai programme, on utilise les fonctions natives.
En résumé
- Bissextile : divisible par 400, ou divisible par 4 sans l'être par 100.
- Un tableau de 12 valeurs remplace une longue série de
si. - Le numéro du jour s'obtient en additionnant les mois déjà passés.
- On construit des fonctions de plus en plus riches en s'appuyant sur les précédentes.