RETROGICIEL
LE CYCLE LUNAIRE
RETROGICIEL
LE CYCLE LUNAIRE
⇩. Présentation
La perception de notre satellite naturel, vue de la Terre, évolue en fonction de sa partie illuminée par le Soleil. L'apparence de la Lune revient à l'identique après un cycle (lunaire), ou révolution synodique de la Lune, parfois aussi nommé lunaison, après 29j et 12:44:03, en moyenne.
Une lunaison se divise en 4 phases : la nouvelle lune (jour 0), le premier quartier (jour 7), la pleine lune (jour 15), le dernier quartier (jour 22). L'age de la Lune, dans un cycle lunaire, est le temps écoulé depuis la dernière nouvelle lune, en général, exprimé en jour. Au moment d'une nouvelle lune, son age est 0 jour, le jour suivant 1 jour et le dernier jour d'un cycle 29 jours.
Donc, théoriquement, il est possible de connaitre l'age de la Lune à une date donnée, en connaissant l'age qu'elle avait à n'importe quel autre jour. Actuellement, la date la plus retenue, comme référence pour cette estimation, est celle de la nouvelle lune du 6 janvier 2000, à 14:24. obtenue par l'algorithme de Stephen R. Schmitt.
Sous Python, les méthodes datetime.date.fromordinal ( ) et datetime.date.toordinal ( ), du module datetime de la bibliothèque standard, seront d'un secours précieux pour ces calculs. Mais avec QB64, il vous faudra faire preuve d'ingéniosité pour les substituer.
Pour ce petit défi, nous vous proposons de prendre les valeurs suivantes comme références :
- durée d'un cycle : 29,5305891 jours ;
- nombre de jours entre le 1 janvier 1 et le 6 janvier 2000 : 730125 jours ;
- durée d'une année terrestre astronomique : 365,2427 jours ;
- les calculs seront effectués à 00:00:00 UTC de la date recherchée.
Bien entendu, du fait que les cycles astrologiques soient soumis à de nombreux aléas, et que des arrondis interviennent dans les calculs, la réponse retournée ne sera pas toujours exact au jour prêt, surtout pour des dates très éloignées de la référence.
⇩. Consignes
Le programme doit :
afficher la date du jour ;
calculer et afficher l'age de la lune ;
calculer et afficher :
le jour de la nouvelle lune précédente ;
le jour du premier quartier de ce cycle ;
le jour de la pleine lune de ce cycle ;
le jour du troisième quartier de ce cycle ;
le jour de la nouvelle lune suivante ;
demander à l'utiliateur s'il veut une estimation pour une autre date ;
si oui, demander à l'utilisateur :
l'année de la date, en proposant l'année en cours par défaut ;
le mois de la date, en proposant le mois en cours par défaut ;
le jour de la date, en proposant le jour en cours par défaut ;
calculer et afficher les estimations correspondantes sinon ;
quitter le programme.
D'abord, faite-le fonctionner. Ensuite, faite-le beau. Enfin, faite-le performant.
Amusez-vous bien !
Télécharger RETROGICIEL - Le cycle lunaire.
Cette présentation nécessite que Python 3 soit installé sur votre machine.
Après avoir téléchargé le fichier Le cycle lunaire.7z, décompressez-le dans le répertoire de votre choix.
Ouvrez le répertoire qui vient d'être créé.
Lancez le fichier Retrogiciel.py.
Cliquez sur l'onglet RUN et testez le programme.
Créez votre propre script dans un des langages proposés ou un autre de votre choix.
Le répertoire contient aussi :
- Python.py, l'exemple en PYTHON sans tkinter ;
- Tkinter.py, l'exemple en PYTHON avec tkinter ;
- Qb84.bas, l'exemple en QBASIC avec qb64 ;
- Bbc.bas, l'exemple en BBC BASIC avec bbc sdl.
# --- Origine Nerd ---
# --- RETROGICIEL - PYTHON ---
# --- Le cycle lunaire ---
# -*- coding: utf-8 -*-
# --- IMPORTATION DES MODULES ---
import datetime
# --- INITIALISATION GENERALE ---
DCT_Donnees = { "minimum" : datetime.date.fromordinal ( 1 ) ,
"maximum" : datetime.date.fromordinal ( datetime.date.fromordinal ( 1 ).max.toordinal ( ) ) }
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Calcul de l'age du cycle lunaire à la date donnée ---
def FNC_Age ( Q ) :
kreference = datetime.datetime ( 2000 , 1 , 6 ).toordinal ( ) # nouvelle lune à 00:00:44
kcycle = 29.530588853 # durée moyenne d'un cycle lunaire
kdate = Q.toordinal ( ) # référence du jour recherché
kdifference = kdate - kreference # nombre de jours entre les 2 dates
kage = kdifference % 29.530588853
knouvelle = kdate - int ( kage )
print ( f"Age de la lune à 00:00............. : {kage:.2f} jour(s)." )
print ( f"Date de la nouvelle lune précédente : {datetime.date.fromordinal ( knouvelle ) }.")
print ( f"Date du premier quartier........... : {datetime.date.fromordinal ( knouvelle + 7 ) }.")
print ( f"Date de la pleine lune............. : {datetime.date.fromordinal ( knouvelle + 15 ) }.")
print ( f"Date du dernier quartier........... : {datetime.date.fromordinal ( knouvelle + 22 ) }.")
print ( f"Date de la nouvelle lune suivante.. : {datetime.date.fromordinal ( knouvelle + 29 ) }.")
# --- PRESENTATION ---
print ( "AGE DE LA LUNE DANS UN CYCLE LUNAIRE." )
print ( )
print ( "Aujourd'hui nous somme le......... :" , datetime.date.today ( ) )
FNC_Age ( datetime.date.today ( ) )
# --- BOUCLE PRINCIPALE ---
while True :
# --- Recommencer avec une autre date ou pas ---
kchoix = input ( "\nSouhaitez-vous saisir une autre date (O ou N) ? " )
if kchoix.upper ( ) == "N" : break
# --- Saisie et controle de validité de la date ---
print ( "Saisiez une date entre le" , DCT_Donnees [ "minimum" ] , "et le" , DCT_Donnees [ "maximum" ] ,"." )
try : kannee = int ( input ( "Entez l'année ... " ) )
except : kannee = datetime.date.today ( ).year
try : kmois = int ( input ( "Entez le mois ... " ) )
except : kmois = datetime.date.today ( ).month
try : kjour = int ( input ( "Entez le jour ... " ) )
except : kjour = datetime.date.today ( ).day
# --- Analyse du cycle lunaire en fonction de la date ---
kdate = datetime.datetime ( kannee , kmois , kjour )
print ( "A la date du...................... :" , kdate )
FNC_Age ( kdate )
# --- FIN DU PROGRAMME ---
print ( "Au revoir" )
# --- Programme : JFB ---
# --- Juillet 2024 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON sans tkinter.
# --- Origine Nerd ---
# --- RETROGICIEL - TKINTER ---
# --- Le cycle lunaire ---
# -*- coding: utf-8 -*-
# --- IMPORTATION DES MODULES ---
# --- Modules de la bibliothèque standard ---
import tkinter
import datetime
# --- INITIALISATION GÉNÉRALE ---
DCT_Donnees = { "minimum" : datetime.date.fromordinal ( 1 ).strftime ( "%d %m %Y" ) ,
"maximum" : datetime.date.fromordinal ( datetime.date.fromordinal ( 1 ).max.toordinal ( ) ).strftime ( "%d %m %Y" ) }
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Calcul de l'age du cycle lunaire à la date donnée ---
def FNC_Age ( Q ) :
kreference = datetime.datetime ( 2000 , 1 , 6 ).toordinal ( )
kcycle = 29.530588853
kdate = Q.toordinal ( )
kdifference = kdate - kreference
kage = kdifference % 29.530588853
knouvelle = kdate - int ( kage )
LAB_Date [ "text" ] = f"{ Q.strftime ( '%d %m %Y' ) }."
LAB_Age [ "text" ] = f"{kage:.2f} jour(s)."
LAB_Precedente [ "text" ] = f"{datetime.date.fromordinal ( knouvelle ).strftime ( '%d %m %Y' ) }."
LAB_Premier [ "text" ] =f"{datetime.date.fromordinal ( knouvelle + 7 ).strftime ( '%d %m %Y' ) }."
LAB_Pleine [ "text" ] = f"{datetime.date.fromordinal ( knouvelle + 15 ).strftime ( '%d %m %Y' ) }."
LAB_Dernier [ "text" ] =f"{datetime.date.fromordinal ( knouvelle + 22 ).strftime ( '%d %m %Y' ) }."
LAB_Suivante [ "text" ] = f"{datetime.date.fromordinal ( knouvelle + 29 ).strftime ( '%d %m %Y' ) }."
# --- Controle la validité d'une date ---
def FNC_Date ( ) :
try :
FNC_Age ( datetime.datetime ( TKI_Annee.get ( ) , TKI_Mois.get ( ) , TKI_Jour.get ( ) ) )
except :
LAB_Date [ "text" ] = "erreur de saisie"
LAB_Age [ "text" ] = ""
LAB_Precedente [ "text" ] = ""
LAB_Premier [ "text" ] = ""
LAB_Pleine [ "text" ] = ""
LAB_Dernier [ "text" ] = ""
LAB_Suivante [ "text" ] = ""
# --- CREATION DE L'INTERFACE GRAPHIQUE ---
# --- Création de la fenêtre principale ---
TKI_Principal = tkinter.Tk ( )
TKI_Principal.title ( "RETROGICIEL - Le cycle lunaire" )
# --- Création des vaiables de controles ---
TKI_Annee = tkinter.IntVar ( )
TKI_Jour = tkinter.IntVar ( )
TKI_Mois = tkinter.IntVar ( )
# --- Création des controles nommées ---
ENT_Jour = tkinter.Entry ( TKI_Principal , justify = "center" , textvariable = TKI_Jour , width = 5 )
ENT_Mois = tkinter.Entry ( TKI_Principal , justify = "center" , textvariable = TKI_Mois , width = 5 )
ENT_Annee = tkinter.Entry ( TKI_Principal , justify = "center" , textvariable = TKI_Annee , width = 5 )
LAB_Date = tkinter.Label ( TKI_Principal )
LAB_Age = tkinter.Label ( TKI_Principal )
LAB_Precedente = tkinter.Label ( TKI_Principal )
LAB_Premier = tkinter.Label ( TKI_Principal )
LAB_Pleine = tkinter.Label ( TKI_Principal )
LAB_Dernier = tkinter.Label ( TKI_Principal )
LAB_Suivante = tkinter.Label ( TKI_Principal )
# --- Mise en place des controles (anonymes et nommés) dans la fenêtre principale ---
tkinter.Label ( TKI_Principal , text = "LE CYCLE LUNAIRE" ).grid ( row = 0 , column = 0 , columnspan = 5 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = f"\nEntrez une date entre\nle { DCT_Donnees [ 'minimum' ] } et le { DCT_Donnees [ 'maximum' ] }.\n" ).grid ( row = 1 , column = 0 , columnspan = 5 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "jour" ).grid ( row = 2 , column = 0 , sticky = "nesw" )
ENT_Jour.grid ( row = 3 , column = 0 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "mois" ).grid ( row = 2 , column = 1 , sticky = "nesw" )
ENT_Mois.grid ( row = 3 , column = 1 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "année" ).grid ( row = 2 , column = 2 , sticky = "nesw" )
ENT_Annee.grid ( row = 3 , column = 2 , sticky = "nesw" )
tkinter.Button ( TKI_Principal , text = "Calculer" , command = FNC_Date ).grid ( row = 2 , column = 3 , rowspan = 2 , sticky = "nesw" )
tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy ).grid ( row = 2 , column = 4 , rowspan = 2 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "Date de référence :" , justify = "right" ).grid ( row = 4 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Date.grid ( row = 4 , column = 3 , columnspan = 2 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Age de la lune à 00:00 :" , justify = "right" ).grid ( row = 5 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Age .grid ( row = 5 , column = 3 , columnspan = 2 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Date de la nouvelle lune précédente :" , justify = "right" ).grid ( row = 6 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Precedente.grid ( row = 6 , column = 3 , columnspan = 2 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Date du premier quartier :" , justify = "right" ).grid ( row = 7 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Premier.grid ( row = 7 , column = 3 , columnspan = 2 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Date de la pleine lune :" , justify = "right" ).grid ( row = 8 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Pleine.grid ( row = 8 , column = 3 , columnspan = 2 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Date du dernier quartier :" , justify = "right" ).grid ( row = 9 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Dernier.grid ( row = 9 , column = 3 , columnspan = 2 , sticky = "w" )
tkinter.Label ( TKI_Principal , text = "Date de la nouvelle lune suivante :" , justify = "right" ).grid ( row = 10 , column = 0 , columnspan = 3 , sticky = "e" )
LAB_Suivante.grid ( row = 10 , column = 3 , columnspan = 2 , sticky = "w" )
# --- Mise à jour de controle ---
TKI_Annee.set ( datetime.date.today ( ).year )
TKI_Jour.set ( datetime.date.today ( ).day )
TKI_Mois.set ( datetime.date.today ( ).month )
FNC_Date ( )
# --- DEBUT DU PROGRAMME ---
TKI_Principal.mainloop ( )
# --- Programme : JFB ---
# --- Juillet 2024 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON avec tkinter.
' --- Origine Nerd propose pour ---
' --- RETROGICIEL - QB64 ---
' --- Le cycle lunaire ---
' --- INITIALISATION GENERALE ---
' --- Declaration des variables globales ---
DIM SHARED LST_Durees(12)
DIM SHARED LST_Date(2)
' --- Initialisation du nombre de jours pour chaque mois ---
LST_Durees(1) = 31: LST_Durees(2) = 28: LST_Durees(3) = 31: LST_Durees(4) = 30
LST_Durees(5) = 31: LST_Durees(6) = 30: LST_Durees(7) = 31: LST_Durees(8) = 31
LST_Durees(9) = 30: LST_Durees(10) = 31: LST_Durees(11) = 30: LST_Durees(12) = 31
' --- initialisation de la date du jour ---
LST_Date(0) = VAL(MID$(DATE$, 4, 2)) ' s'initialiseau le jour d'aujourd'hui
LST_Date(1) = VAL(LEFT$(DATE$, 2)) ' s'initialiseau le mois d'aujourd'hui
LST_Date(2) = VAL(RIGHT$(DATE$, 4)) ' s'initialiseau l'annee d'aujourd'hui
' --- DEBUT DU PROGRAMME ---
PRINT "LE CYCLE LUNAIRE."
' --- BOUCLE PRINCIPALE ---
DO WHILE 0 <> 1
' --- Age de la lune à la date choisie ---
kjours = INT(FNC_Date)
kage = FNC_Age(kjours)
PRINT "A la date du .......................:"; LST_Date(0); LST_Date(1); LST_Date(2)
PRINT "Age de la lune a 00:00 .............:"; kage
' --- Données du cycle lunaire correspondant ---
PRINT "Date de la nouvelle lune precedente :"; FNC_Phase(-(kage - 1)); LST_Date(1); LST_Date(2)
PRINT "Date du premier quartier ...........:"; FNC_Phase(7); LST_Date(1); LST_Date(2)
PRINT "Date de la pleine lune .............:"; FNC_Phase(8); LST_Date(1); LST_Date(2)
PRINT "Date du dernier quartier ...........:"; FNC_Phase(7); LST_Date(1); LST_Date(2)
PRINT "Date de la nouvelle lune suivante ..:"; FNC_Phase(7); LST_Date(1); LST_Date(2)
' --- Bouclage du programme ---
PRINT ""
INPUT "Voulez-vous saisir une autre date [ O ou N ] "; kchoix$
IF kchoix$ = "N" OR kchoix$ = "n" THEN EXIT DO
' --- Saisie d'une date par l'utilisateur ---
FNC_Saisie
LOOP
' --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
' --- DEFINITION DES FONCTIONS PERSONALISEES ---
' --- Recherche de l'age de la lune a la date choisie ---
FUNCTION FNC_Age (Q)
kdifference = Q - 730125 ' --- rang du jour de reference le 2020 01 06 ---
kcycles = INT(kdifference / 29.530588853)
krestant = kdifference - (kcycles * 29.530588853)
FNC_Age = INT(krestant * 100) / 100
END FUNCTION
' --- Rang (nombre de jours) de la date choisie ---
FUNCTION FNC_Date
kjours = (LST_Date(2) - 1) * 365.2427
FOR kmois = 1 TO (LST_Date(1) - 1)
kjours = kjours + LST_Durees(kmois)
NEXT
kjours = kjours + LST_Date(0)
FNC_Date = kjours
END FUNCTION
' --- Calculer la date d'une des phases de la lune ---
FUNCTION FNC_Phase (Q)
LST_Date(0) = LST_Date(0) + INT(Q)
IF LST_Date(0) < 0 THEN
LST_Date(1) = LST_Date(1) - 1
IF LST_Date(1) < 1 THEN LST_Date(1) = 12: LST_Date(2) = LST_Date(2) - 1
LST_Date(0) = LST_Durees(LST_Date(1)) + LST_Date(0)
ELSEIF LST_Date(0) > LST_Durees(LST_Date(1)) THEN
LST_Date(0) = LST_Date(0) - LST_Durees(LST_Date(1))
LST_Date(1) = LST_Date(1) + 1
IF LST_Date(1) > 12 THEN LST_Date(1) = 1: LST_Date(2) = LST_Date(2) + 1
END IF
FNC_Phase = LST_Date(0)
END FUNCTION
' --- Saisie d'une date par l'utilisateur et controle de sa validite ---
SUB FNC_Saisie
CLS
PRINT "LE CYCLE LUNAIRE."
PRINT "Entrez une date entre le 01 01 1 et le 31 12 9999."
INPUT "Entrez l'annee [ de 1 a 9999 ] ... "; LST_Date(2)
IF LST_Date(2) < 1 OR LST_Date(2) > 9999 THEN LST_Date(2) = VAL(RIGHT$(DATE$, 4))
INPUT "Entrez le mois [ de 1 a 12 ] ... "; LST_Date(1)
IF LST_Date(1) < 1 OR LST_Date(1) > 12 THEN LST_Date(1) = VAL(LEFT$(DATE$, 2))
PRINT "Entrez le jour [ de 1 a"; LST_Durees(LST_Date(1)); "] ... ";
INPUT LST_Date(0)
IF LST_Date(0) < 1 OR LST_Date(0) > LST_Durees(LST_Date(1)) THEN LST_Date(0) = VAL(MID$(DATE$, 4, 2))
END SUB
' --- Programme : JFB ---
' --- Juillet 2024 ---
' --- Fin ---
Pour mieux comprendre l'exemple en QB64.
REM --- Origine Nerd propose pour ---
REM --- RETROGICIEL - BBC BASIC ---
REM --- Le cycle lunaire ---
REM --- INITIALISATION GENERALE ---
REM --- Declaration des variables globales ---
DIM LST_Durees(12)
DIM LST_Date{jour,mois,annee}
REM --- nombre de jours par mois ---
LST_Durees(1) = 31: LST_Durees(2) = 28: LST_Durees(3) = 31: LST_Durees(4) = 30
LST_Durees(5) = 31: LST_Durees(6) = 30: LST_Durees(7) = 31: LST_Durees(8) = 31
LST_Durees(9) = 30: LST_Durees(10) = 31: LST_Durees(11) = 30: LST_Durees(12) = 31
REM --- Initialisation des valeurs : memorisation de la date du jour ---
PROC_Aujourdhui
REM --- DEBUT DU PROGRAMME ---
PRINT "LE CYCLE LUNAIRE."
REM --- BOUCLE PRINCIPALE ---
REPEAT
REM --- Age de la lune a une date donnée ---
kage = FN_Age
PRINT "A la date du .......................: "; LST_Date.jour ; " " ; LST_Date.mois ; " " ; LST_Date.annee ; "."
PRINT "Age de la lune a 00:00 .............: "; kage
REM --- Donnees du cycle lunaire correspondant ---
PRINT "Date de la nouvelle lune precedente : "; FN_Phase(-(kage - 1)) ; " " ; LST_Date.mois ; " " ; LST_Date.annee
PRINT "Date du premier quartier ...........: "; FN_Phase(7) ; " " ; LST_Date.mois ; " " ; LST_Date.annee
PRINT "Date de la pleine lune .............: "; FN_Phase(8) ; " " ; LST_Date.mois ; " " ; LST_Date.annee
PRINT "Date du dernier quartier ...........: "; FN_Phase(7) ; " " ; LST_Date.mois ; " " ; LST_Date.annee
PRINT "Date de la nouvelle lune suivante ..: "; FN_Phase(7) ; " " ; LST_Date.mois ; " " ; LST_Date.annee
REM --- Bouclage du programme ---
PRINT "Voulez-vous recommencer [ O ou N ] ? " ;
kchoix$ = GET$
IF kchoix$ = "n" OR kchoix$ = "N" THEN EXIT REPEAT
REM --- Saisie d'une nouvelle date par l'utiisateur ---
PROC_Saisie
UNTIL 1 = 0
REM --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
REM --- DEFINITION DES FONCTIONS PERSONALISEES ---
REM --- Analyse de la validité de la date et calcul de l'age de la lune ---
DEF FN_Age
kjours = FN_Rang
kdifference = kjours - 730125 REM --- rang du jour de reference le 2020 01 06 ---
kcycles = INT(kdifference / 29.530588853)
krestant = kdifference - (kcycles * 29.530588853)
= INT(krestant * 100) / 100
REM --- Conversion et reformatage de la date du jour ---
DEF PROC_Aujourdhui
LST_Date.jour = VAL(MID$(TIME$,5,2))
kmois$ = MID$(TIME$,8,3)
CASE kmois$ OF
WHEN "Jan" : LST_Date.mois = 1
WHEN "Fev" : LST_Date.mois = 2
WHEN "Mar" : LST_Date.mois = 3
WHEN "Apr" : LST_Date.mois = 4
WHEN "May" : LST_Date.mois = 5
WHEN "Jun" : LST_Date.mois = 6
WHEN "Jul" : LST_Date.mois = 7
WHEN "Aug" : LST_Date.mois = 8
WHEN "Sep" : LST_Date.mois = 9
WHEN "Oct" : LST_Date.mois = 10
WHEN "Nov" : LST_Date.mois = 11
WHEN "Dec" : LST_Date.mois = 12
ENDCASE
LST_Date.annee = VAL(MID$(TIME$,12,4))
ENDPROC
REM --- Rang, en jours, de la date à analyser ---
DEF FN_Rang
kjours = (LST_Date.annee - 1) * 365.2427
FOR kmois = 1 TO (LST_Date.mois - 1)
kjours = kjours + LST_Durees(kmois)
NEXT
kjours = kjours + LST_Date.jour
= kjours
REM --- Calcul de la date d'une des phase de la lune ---
DEF FN_Phase(Q)
LST_Date.jour = LST_Date.jour + INT(Q)
IF LST_Date.jour < 0 THEN
LST_Date.mois = LST_Date.mois - 1
IF LST_Date.mois < 1 THEN
LST_Date.mois = 12
LST_Date.annee = LST_Date.annee - 1
ENDIF
LST_Date.jour = LST_Durees(LST_Date.mois) + LST_Date.jour
ENDIF
IF LST_Date.jour > LST_Durees(LST_Date.mois) THEN
LST_Date.jour = LST_Date.jour - LST_Durees(LST_Date.mois)
LST_Date.mois = LST_Date.mois + 1
IF LST_Date.mois > 12 THEN
LST_Date.mois = 1
LST_Date.annee = LST_Date.annee + 1
ENDIF
ENDIF
= LST_Date.jour
REM --- Saisie d'une date par l'utilisateur et controle de sa validite ---
DEF PROC_Saisie
PROC_Aujourdhui REM - Réinitialise les données par défaut à la date du jour
CLS
PRINT "LE CYCLE LUNAIRE."
PRINT "Entrez une date entre le 01 01 1 et le 31 12 9999."
INPUT "Entrez l'annee [ de 1 a 9999 ] ... "; kannee
IF kannee > 0 AND kannee < 10000 THEN LST_Date.annee = kannee
INPUT "Entrez le mois [ de 1 a 12 ] ... "; kmois
IF kmois > 0 AND kmois <13 THEN LST_Date.mois = kmois
PRINT "Entrez le jour [ de 1 a "; LST_Durees(LST_Date.mois); "] ... ";
INPUT kjour
IF kjour > 0 AND kjour < LST_Durees(LST_Date.mois) THEN LST_Date.jour = kjour
ENDPROC
REM --- Programme : JFB ---
REM --- Mars 2023 ---
REM --- Fin ---
Pour mieux comprendre l'exemple en BBC BASIC.