Jour de la semaine

GW-Basic, utilisé par PC-Basic
Programme avec Texte Seulement
PC-BASIC

L'arithmétique modulaire peut être utilisée à des fins intéressantes, par exemple, trouver le jour de la semaine de n'importe quelle date, à partir du 01/01/0000.

Afin de rendre le processus de calcul de la date aussi simple que possible, nous supposerons que le calendrier grégorien, qui a remplacé le calendrier julien au XVIe siècle, était en vigueur le premier jour du premier millénaire et a été respecté à l'avenir.

Il existe un certain nombre de façons de déterminer le jour de la semaine à une date donnée, mais peut-être que la plus simple - et qui se prête à la traduction algorithmique BASIC - disponible se trouve dans le délicieux livre

The Magic of Math: Solving for x and Figuring Out Why (2015) du mathématicien Arthur Benjamin.

Sa méthode est résumée ci-dessous.

Attribuez d'abord à chaque jour de la semaine un code numérique, de 0 à 7 :

1 = lundi
2 = mardi
3 = mercredi
4 = jeudi
5 = vendredi
6 = samedi
7 ou 0 = dimanche

Ces affectations numériques ne sont pas arbitraires ; ils se connectent plutôt à la composante arithmétique modulaire de la formule, que nous verrons bientôt. Comme l'explique Benjamin,

"Il est logique que la formule utilise l'arithmétique modulaire, mod de travail 7, car il y a 7 jours dans une semaine.

Une date, c'est-à-dire 28 jours à partir d'aujourd'hui auront le même jour de la semaine, puisque 28 est un multiple de 7."

Comme les sept jours de la semaine, les douze mois de l'année doivent également être associés à des codes numériques. De plus, plusieurs de ces codes varieront selon que le mois se trouve dans une année bissextile ou non.

Janvier = 6 (ou 5 si année bissextile)
Février = 2 (ou 1 si année bissextile)
mars = 2
avril = 5
Mai = 0
juin = 3
juillet=5
août = 1
Septembre = 4
octobre = 6
novembre = 2
décembre = 4

Ce qui soulève une question pertinente : comment déterminer si une année est une année bissextile ou non (le "non" est généralement appelé "année commune") ?

Les années bissextiles se produisent tous les quatre ans, à moins que l'année ne soit au début d'un siècle. Ces années de début de siècle ne sont des années bissextiles que si elles sont divisibles par 400, ce qui signifie qu'une année bissextile ne commence un siècle qu'une fois tous les quatre cents ans (l'année 2000 était l'une de ces années bissextiles de début de siècle, puisque 2000 est divisible à la fois par 4 et 400).

Ainsi, nous devrons également utiliser l'arithmétique modulaire pour vérifier si une année est une année bissextile ou une année commune.

Sans surprise, les années doivent également se voir attribuer des codes numériques. Lorsqu'un siècle commence par une année bissextile, on lui attribue le chiffre 0.

Ainsi, par exemple, l'an 2000 = 0.

Pour chaque année suivante, on ajoute 1 au code jusqu'à atteindre 7, qui revient à 0. De plus, lorsque nous rencontrons une année bissextile, nous ajoutons 2 (pour "sauter" sur une année) au lieu de simplement 1.

Ainsi, un ensemble de codes d'année à partir de 2000 ressemble à ceci :

Année 2000 = 0 (une année bissextile)
Année 2001 = 1
Année 2002 = 2
Année 2003 = 3
Année 2004 = 5 (une année bissextile)
Année 2005 = 6
Année 2006 = 0 (réinitialisations)
Année 2007 = 1
Année 2008 = 3 (une année bissextile)
Année 2009 = 4
etc.

Notez que l'année 0, puisqu'elle est divisible par 4 et 400, a pour code 0.

Nous sommes maintenant prêts à voir la formule. Pour trouver le jour de la semaine, procédez comme suit :

(Code mois + date + code année) mod 7

Par exemple, je suis né le 22 août ****. Le code du mois d'août est 1, que **** soit une année bissextile ou non. La date est 22 et le code de l'année est 1.

Par conséquent, (1 + 22 + 1) mod 7 = 3

Cela signifie que lorsque 24 est divisé par 7, le reste est 3. Le jour de la semaine avec la valeur numérique 3 est mercredi. Je suis donc né un mercredi, dont je n'ai évidemment aucun souvenir.* Hélas, il n'y a pas de formule pour calculer la météo de cette journée mouvementée, ni le relatif bonheur (?) de mes parents en me voyant pour la première fois.

Le programme DAY.BAS rend le processus de recherche de date presque instantané : tapez le mois, la date et l'année, et le jour de la semaine apparaît.

La partie du programme la plus délicate à comprendre est la sous-routine qui calcule le code de l'année (elle commence à la ligne 500). Une boucle parcourt toutes les années, de l'année 1 à l'année saisie YEAR, parcourant les codes numériques en un clin d'œil.

Comme défi mathématique, voyez si vous pouvez trouver une liste d'années possibles plausibles au cours desquelles je suis né.

Amélioration de DAY.BAS signifie élargir son domaine d'années possibles : bien que nous puissions avancer dans le temps autant que nous le souhaitons, qu'en est-il des années avant l'ère commune (c'est-à-dire avant l'année 0) ?

Envisagez également de penser aux équivalences d'années en utilisant des multiples (par exemple, tous les quatre cents ans, les codes se répètent) pour accélérer un peu le programme ; entrez une année trop loin dans le futur, et vous devrez peut-être attendre un temps interminable avant d'arriver au jour.

5 REM DAY.BAS
10 KEY OFF:CLS:COLOR 15,0
15 CODEYEAR=0:COUNTERYEAR=0:MONCODE=0:LEAPYEAR=1
20 PRINT "--- JOUR DE LA SEMAINE : DE TOUTE ANNÉE DU CALENDRIER GRÉGORIEN ---"
30 PRINT
40 INPUT "Entrez le mois (1 to 12)";MONTH
45 IF MONTH<1 OR MONTH>12 THEN 40
50 INPUT "Entrez la date (1 to 31)";DATE
60 IF DATE<1 OR DATE>31 THEN 50
70 INPUT "Entrez l'année (l'année 0 est le minimum)";YEAR
80 IF YEAR<0 THEN 70
100 'Déterminer si l'année est une année bissextile
110 'Les années bissextiles se produisent tous les quatre ans
120 'Mais au tournant du siècle, si l'année
130 'n'est pas divisible par 400, ce n'est PAS une année bissextile
140 'Début à l'année 0 = Code = 0 (divisible par 400 et 4, donc une année bissextile)
150 'Sauter 2 unités si l'année est bissextile
160 'Les codes vont de 0 à 6, puis reviennent à 0
170 'Tout d'abord, déterminez si YEAR est inférieur, égal ou supérieur à 2000
180 IF YEAR=0 THEN CODEYEAR=0 ELSE GOSUB 500
300 'Ensuite, déterminez le code du mois
310 IF MONTH=1 AND LEAPYEAR=1 THEN MONCODE=5
315 IF MONTH=1 AND LEAPYEAR=0 THEN MONCODE=6
320 IF MONTH=2 AND LEAPYEAR=1 THEN MONCODE=1
325 IF MONTH=2 AND LEAPYEAR=0 THEN MONCODE=2
330 IF MONTH=3 THEN MONCODE=2
340 IF MONTH=4 THEN MONCODE=5
350 IF MONTH=5 THEN MONCODE=0
360 IF MONTH=6 THEN MONCODE=3
370 IF MONTH=7 THEN MONCODE=5
380 IF MONTH=8 THEN MONCODE=1
390 IF MONTH=9 THEN MONCODE=4
400 IF MONTH=10 THEN MONCODE=6
410 IF MONTH=11 THEN MONCODE=2
420 IF MONTH=12 THEN MONCODE=4
430 'Calculer le code du jour de la semaine
440 DAYCODE=(MONCODE+DATE+CODEYEAR) MOD 7
450 PRINT "Le code du jour de la semaine est (";MONCODE;"+";DATE;"+";CODEYEAR;") MOD 7 = ";DAYCODE
460 IF DAYCODE=1 THEN PRINT "La date : un Lundi"
465 IF DAYCODE=2 THEN PRINT "La date : un Mardi"
470 IF DAYCODE=3 THEN PRINT "La date : un Mercredi"
475 IF DAYCODE=4 THEN PRINT "La date : un Jeudi"
480 IF DAYCODE=5 THEN PRINT "La date : un Vendredi"
485 IF DAYCODE=6 THEN PRINT "La date : un Samedi"
490 IF DAYCODE=7 OR DAYCODE=0 THEN PRINT "La date : un Dimanche."
495 INPUT "Un autre? (Type O ou N)";ANOTHER$
496 IF ANOTHER$="O" OR ANOTHER$="o" THEN 10 ELSE END
500 FOR A=COUNTERYEAR+1 TO YEAR
510 IF (A MOD 4)=0 AND (A MOD 400)=0 AND INT(A/100)=(A/100) THEN CODEYEAR=CODEYEAR+2:LEAPYEAR=1:GOTO 520
515 IF (A MOD 4)=0 AND INT(A/100)<>(A/100) THEN CODEYEAR=CODEYEAR+2:LEAPYEAR=1:GOTO 520
517 CODEYEAR=CODEYEAR+1:LEAPYEAR=0
520 IF CODEYEAR=7 THEN CODEYEAR=0
530 IF CODEYEAR=8 THEN CODEYEAR=1
540 NEXT A
550 RETURN 'Renvoie le code de l'année correct

 

 

 

 

 

 

 

Recherche personnalisée