Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 13-04-2021 17:33:30

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

[Python] Calendrier mois par mois et jours particuliers

Bonjour,

Dans la lignée du dernier développement de l'affichage réalisé d'un mois quelconque du calendrier connaissant l'année et le n° de ce mois, j'avais décidé de compléter l'affichage de la répartition des nos jours par noms desdits jours, par l'affichage des jours particuliers (s'ils existent) du mois choisi : jours de fêtes, jours fériés... entre 1800 et 2200.

Quelques bémols :
la fête des mères date (en France) de 1926, la fête des pères de 1950 (officialisée en 1952),
la célébration du 1er mai date de 1889, et ce jour est devenu férié et chômé en 1947,
la célébration du 8 mai 1945 date de 1953,
le 11 novembre 1918 n'est célébré que depuis 1922.

Conclusion : ces dates, si vous choisissez une année antérieure à 1952 n'auront sinon aucune du moins certaines, pas d'existence réelle...

Ce fut un rude travail auquel je m'attendais pas : j'aurais pu restreindre l'intervalle à [1952;2200], mais cela aurait privé ceux qui les auraient cherché, des dates de Mardi Gras, Pâques, Ascension et Pentecôte...
Si vous tenez à cette restriction, dans le code ci-dessous, la ligne :
elif an<1800 or an>2200:
         en
elif an<1952 or an>2200:


# usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
from operator import itemgetter

def titre():
    print("       *********************************")
    print("       *                               *")
    print("       *  Page de Calendrier et fêtes  *")
    print("       *                               *")
    print("       *********************************")
    print("\n")
   
def datepaques(an):
    mil,du=divmod(an,100)
    c,d=divmod(3*(mil+25),4)    
    e,f=(8*(mil+11))//25,(5*mil+du)%19    
    g=(19*f+c-e)%30
    h=(f+11*g)//319
    j,k=(60*(5-d)+du)//4,(60*(5-d)+du)%4
    m=(2*j-k-g+h)%7
    n=(g-h+m+114)//31
    jour=1+(g-h+m+114)%31
    mois=n
    return jour, mois

def TousJours(an,calendrier,Nb_Jours_mois,bis):
    JoursCumuls,F,J=[31,59+bis,90+bis,120+bis],[],""
    CompN=" et Ascension"
    J_Pa,M_Pa=datepaques(an)
    J_MG,M_MG=JoursCumuls[M_Pa-2]+J_Pa-78,2
    if J_MG>28+bis:
        J_MG-=28*(bis==0)
        M_MG=3
    i,J=0,calendrier[0][0][0]
    while J>"dimanche":
        i+=1
        J=calendrier[0][i][0]
        J_Ep=8 if i==0 else i+1
    F=[(1,1,"Jour de l'an"),(1,J_Ep,"Épiphanie"),(2,2,"Chandeleur"),(M_MG,J_MG,"Mardi Gras")]
    F.append((7,14,"Fête Nationale"))
    F.append((8,15,"Assomption"))
    F.append((11,1,"Fête de Toussaint"))
    F.append((11,11,"Armistice de 1918"))
    F.append((12,25,"Noël"))    
    if M_Pa==3:
        J_Asc,M_Asc=J_Pa-22+30*(J_Pa==22),5-(J_Pa==22)
        F.append((3,J_Pa,"Pâques"))
        F.append((3+(J_Pa==31),J_Pa+1-31*(J_Pa==31),"Lundi de Pâques"))
        if J_Asc==1:
            F.append((5,1,"Fête du Travail"+CompN))
            F.append((5,8,"Victoire de 1945"))
            F.append((5,11,"Pentecôte"))
            F.append((5,12,"Lundi de Pentecôte"))
        elif J_Asc==8:
            F.append((5,1,"Fête du Travail"))
            F.append((5,8,"Victoire de 1945"+CompN))
            F.append((5,18,"Pentecôte"))
            F.append((5,19,"Lundi de Pentecôte"))
        else:      
            F.append((5,1,"Fête du Travail"))
            F.append((5,8,"Victoire de 1945"))
            F.append((5,J_Asc,"Ascension"))
            F.append((5,J_Asc+10,"Pentecôte"))
            F.append((5,J_Asc+11,"Lundi de Pentecôte"))
    else:
        F.append((4,J_Pa,"Pâques"))
        F.append((4,J_Pa+1,"Lundi de Pâques"))
        J_Asc,M_Asc=J_Pa+9-31*(J_Pa>22),5+(J_Pa>22)
        J_Pnt,M_Pnt=J_Asc+10-31*(J_Asc>21),M_Asc+(J_Asc>21)
        F.append((5,1,"Fête du Travail"))
        F.append((5,8,"Victoire de 1945"))
        F.append((M_Asc,J_Asc,"Ascension"))
        F.append((M_Pnt,J_Pnt,"Pentecôte"))
        F.append((M_Pnt+(J_Pnt==31),J_Pnt+1-31*(J_Pnt==31),"Lundi de Pentecôte"))
        i,J=30,calendrier[4][30][0]
        while J>"dimanche":
            i-=1
            J=calendrier[4][i][0]
        if M_Pnt==5 and J_Pnt==i:
            M_Fm,J_Fm=6,i-22
        else:
            M_Fm,J_Fm=5,i+1
        i,J=0,calendrier[5][0][0]
        while J>"dimanche":
            i+=1
            J=calendrier[5][i][0]
        J_Fp=i+15
        F.append((M_Fm,J_Fm,"Fête des mères"))
        F.append((6,J_Fp,"Fête des pères"))
    F.sort(key=itemgetter(0,1))
    Dico,E,t0={1:[]},[],1
    for a,b,c in F:
        if a in Dico:
            Dico[a].append((b,c))
        else:
            Dico.update({a:[(b,c)]})
    return Dico

chx_an,chx_mois,Go=1,1,1
Noms_mois =["janvier", "février", "mars", "avril", "mai","juin","juillet", "août", "septembre", "octobre","novembre", "décembre"]
Noms_jours=["lundi","mardi", "mercredi","jeudi", "vendredi", "samedi", "dimanche" ]
print()
while Go:
    while chx_an==1:
        try:
            a=input("Choisissez votre année (de 1800 à 2200) : ")
            an=int(a)
            if int(float(an))!=an:
                print("Un nombre entier était attendu, Recommencez s'il vous plaît")
            elif an<1800 or an>2200:
                print("Année hors intervalle : pas de garantie sur la dâte de Pâques !")
            else:
                break
        except ValueError:
            print("Vous n'avez pas entré un nombre. Recommencez s'il vous plaît")
    print()
    while chx_mois==1:
        try:
            a=input("Choisissez un mois (de 1 à 12) : ")
            mois=int(a)
            z1=mois
            if int(float(mois))!=mois:
                print("Un nombre entier était attendu. Recommencez s'il vous plaît")
                print()
            elif mois<1 or mois>12:
                print("Le numéro être compris entre 1 et 12. Recommencez s'il vous plaît")
            else:
                break
        except ValueError:
            print("Vous n'avez pas entré un nombre. Recommencez s'il vous plaît")
    print()
    if chx_an==1:
        b=(an%4==0 and an%100!=0) or an%400==0 #= 1 ou 0 selon bissextile ou pas
        ja=datetime(an,1,1).isoweekday()-1     # n° du jour de l'an
        cr=ja+b                                #correctif
        Cumul=[ja,31+ja,59+cr,90+cr,120+cr,151+cr,181+cr,212+cr,243+cr,273+cr,304+cr,334+cr]
        Nb_Jours_mois=[31,28+b,31,30,31,30,31,31,30,31,30,31]

        #Construction du calendrier de l'année
        calendrier=[]
        for i in range(12):
            nb_jours,total,Mois=Nb_Jours_mois[i],Cumul[i],[]
            for j in range(nb_jours):
                Mois.append([Noms_jours[(total+j)%7],j+1,Noms_mois[i]])
            calendrier.append(Mois)

        D=TousJours(an,calendrier,Nb_Jours_mois,b)

    #Affichage du mois choisi
    titre()
    mois-=1
    M_A=Noms_mois[mois].capitalize()
    lg=(21-len(M_A))//2
    print (" "*lg+"Mois d"+["e ","'"][mois==3]+M_A,an)
    print ()
    print ("Lu  Ma  Me  Je  Ve  Sa  Di")
    no_jr=Noms_jours.index(calendrier[mois][0][0])
    for i,liste in enumerate(calendrier[mois]):
        if i==0:
            print (" "*4*no_jr+str("%2i" %(i+1)),end="  ")
        else:
            if (i+no_jr)%7==0:
                print()
            print ("%2i" %(i+1),end="  ")

    cle=mois+1
    if cle in D:
        print("\n")
        print("   Jours particuliers de ce mois :\n")
        for (j,f)in D[cle]:
            print(calendrier[mois][j-1][0].capitalize().ljust(9," "),"%2i" %j,f)

    while 1:
        print("\n\n")
        print("      ---------------------")
        print()
        print("        ** Voulez-vous **\n\n")
        print("- Choisir une autre année                      (A) ?")
        print("- Choisir un autre mois sans changer d'année   (B) ?")
        print("- Quitter le programme                         (Q) ?")
        print("\n")
        chx=input("      Votre choix : ").upper()
        if chx in ["A","B"]:
            if chx=="A":
                chx_an,chx_mois=1,1
                break
            elif chx=="B":
                chx_an,chx_mois=0,1
                break
            else:
                break
        if chx=="Q":
            print()
            print("Au revoir,  Goodbye, Auf Wiedersehen, Arrivederci, Hasta la vista, Da svidania !")
            Go=0
            break
 

Exemple de sortie :



Choisissez votre année (de 1800 à 2200) : 2021

Choisissez un mois (de 1 à 12) : 5

       *********************************
       *                               *
       *  Page de Calendrier et fêtes  *
       *                               *
       *********************************


         Mois de Mai 2021

Lu  Ma  Me  Je  Ve  Sa  Di
                     1   2  
 3   4   5   6   7   8   9  
10  11  12  13  14  15  16  
17  18  19  20  21  22  23  
24  25  26  27  28  29  30  
31  

   Jours particuliers de ce mois :

Samedi     1 Fête du Travail
Samedi     8 Victoire de 1945
Jeudi     13 Ascension
Dimanche  23 Pentecôte
Lundi     24 Lundi de Pentecôte
Dimanche  30 Fête des mères



      ---------------------

        ** Voulez-vous **


- Choisir une autre année                      (A) ?
- Choisir un autre mois sans changer d'année   (B) ?
- Quitter le programme                         (Q) ?


      Votre choix :

Je ne suis qu'à moitié satisfait du codage de la fonction TousJours, je la pense perfectible : ce ne sera pas pour tout de suite, j'éprouve le besoin de faire une pause...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#2 03-05-2021 17:24:11

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python] Calendrier mois par mois et jours particuliers

Bonjour à tous,

J'ai modifié la fonction def Toujours a minima pour être moins lourd qu'avec l'emploi de append()...
Mais je ne serais satisfait que si je peux supprimer des calculs et des if...

Cela posé, un petit point d'explication.
Dans cette fonction, la liste F est une liste de tuples...
Chaque tuple présente cette structure : (n° mois, n° du jour, événement).
Je les rentre dans n'importe quel ordre...
Mais à la fin :
1. Je trie les tuples de F par ordre de nos de mois croissants et de nos de jours croissants grâce à l'import d'itemgetter...
2. A partir la liste F triée, je passe en revue l'ensemble des tuples et je construis un dictionnaire en prenant comme clé le 1er élément du tuple : la valeur associée à la  clé 5 (mois de mai) pour 2021 est une liste de 5 tuples...
Tant que je ne change pas de mois, je complète la liste valeur associée à la clé n° du mois.
Si quelqu'un est capable de traiter ça plus vite, je prends...
Pourquoi remplacer la liste F par un dictionnaire ? Parce que ça me permets d'accéder directement et sans autre forme de procès, à la liste valeur associée à un n° de mois donné, et de lire l'ensemble des jours et des événements associés du mois donné.

Alors à ce stade, il devrait vous être facile d'adapter la fonction def TouJours pour en faire un agenda de rendez-vous, d'anniversaires, des jours fériés et  fêtes de votre pays ou autre...
J'ai ajouté un jour particulier : la Journée Internationale des Droits des Femmes.

# usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
from operator import itemgetter

def titre():
    print("       ************************")
    print("       *                      *")
    print("       *  Page de Calendrier  *")
    print("       *          et          *")
    print ("      *  Jours pariculiers   *")
    print("       *                      *")
    print("       ************************")
    print("\n")
   
def datepaques(an):
    mil,du=divmod(an,100)
    c,d=divmod(3*(mil+25),4)    
    e,f=(8*(mil+11))//25,(5*mil+du)%19    
    g=(19*f+c-e)%30
    h=(f+11*g)//319
    j,k=(60*(5-d)+du)//4,(60*(5-d)+du)%4
    m=(2*j-k-g+h)%7
    n=(g-h+m+114)//31
    jour=1+(g-h+m+114)%31
    mois=n
    return jour, mois

def TousJours(an,calendrier,Nb_Jours_mois,bis):
    JoursCumuls,F,J=[31,59+bis,90+bis,120+bis],[],""
    Co=[" et Ascension"," et Journée Internationale des droits des Femmes"]
    J_Pa,M_Pa=datepaques(an)
    J_MG,M_MG=JoursCumuls[M_Pa-2]+J_Pa-78,2
    if J_MG>28+bis:
        J_MG-=28*(bis==0)
        M_MG=3      
    i,J=0,calendrier[0][0][0]
    while J>"dimanche":
        i+=1
        J=calendrier[0][i][0]
    J_Ep=8 if i==0 else i+1  
    F=[(1,1,"Jour de l'an"),(1,J_Ep,"Épiphanie"),(2,2,"Chandeleur")]
    F+=[(7,14,"Fête Nationale"),(8,15,"Assomption"),(11,1,"Fête de Toussaint"),(11,11,"Armistice de 1918")]
    F+=[(12,25,"Noël")]  
    if M_Pa==3:
        J_Asc,M_Asc=J_Pa-22+30*(J_Pa==22),5-(J_Pa==22)
        F+=[(3,J_Pa,"Pâques"),(3+(J_Pa==31),J_Pa+1-31*(J_Pa==31),"Lundi de Pâques")]
        F+=[(M_MG,J_MG,"Mardi Gras"),(3,8,Co[1][4:])]  
        if J_Asc==1:
            F+=[(5,1,"Fête du Travail"+Co[0]),(5,8,"Victoire de 1945"),(5,11,"Pentecôte")]
            F+=[(5,12,"Lundi de Pentecôte")]
        elif J_Asc==8:
            F+=[(5,1,"Fête du Travail"),(5,8,"Victoire de 1945"+Co[0]),(5,18,"Pentecôte")]
            F+=[(5,19,"Lundi de Pentecôte")]
        else:      
            F+=[(5,1,"Fête du Travail"),(5,8,"Victoire de 1945"),(5,J_Asc,"Ascension")]
            F+=[(5,J_Asc+10,"Pentecôte"),(5,J_Asc+11,"Lundi de Pentecôte")]
    else:
        J_Asc,M_Asc=J_Pa+9-31*(J_Pa>22),5+(J_Pa>22)
        J_Pnt,M_Pnt=J_Asc+10-31*(J_Asc>21),M_Asc+(J_Asc>21)
        F+[(M_MG,J_MG,"Mardi Gras"+Co[1]*(J_MG==8)),(4,J_Pa,"Pâques")]
        F+=[(4,J_Pa+1,"Lundi de Pâques"),(5,1,"Fête du Travail")]
        F+=[(5,8,"Victoire de 1945"),(M_Asc,J_Asc,"Ascension"),(M_Pnt,J_Pnt,"Pentecôte")]
        F+=[(M_Pnt+(J_Pnt==31),J_Pnt+1-31*(J_Pnt==31),"Lundi de Pentecôte")]
        i,J=30,calendrier[4][30][0]
        while J>"dimanche":
            i-=1
            J=calendrier[4][i][0]
        if M_Pnt==5 and J_Pnt==i:
            M_Fm,J_Fm=6,i-22
        else:
            M_Fm,J_Fm=5,i+1
        i,J=0,calendrier[5][0][0]
        while J>"dimanche":
            i+=1
            J=calendrier[5][i][0]
        J_Fp=i+15
        F+=[(M_Fm,J_Fm,"Fête des mères"),(6,J_Fp,"Fête des pères")]
    F.sort(key=itemgetter(0,1))
    Dico={1:[]}
    for a,b,c in F:
        if a in Dico:
            Dico[a].append((b,c))
        else:
            Dico.update({a:[(b,c)]})
    return Dico

chx_an,chx_mois,Go=1,1,1
Noms_mois =["janvier", "février", "mars", "avril", "mai","juin","juillet", "août", "septembre",\
            "octobre","novembre", "décembre"]
Noms_jours=["lundi","mardi", "mercredi","jeudi", "vendredi", "samedi", "dimanche" ]
print()
while Go:
    while chx_an==1:
        try:
            a=input("Choisissez votre année (de 1800 à 2200) : ")
            an=int(a)
            if int(float(an))!=an:
                print("Un nombre entier était attendu, Recommencez s'il vous plaît")
            elif an<1800 or an>2200:
                print("Année hors intervalle : pas de garantie sur la dâte de Pâques !")
            else:
                break
        except ValueError:
            print("Vous n'avez pas entré un nombre. Recommencez s'il vous plaît")
    print()
    while chx_mois==1:
        try:
            a=input("Choisissez un mois (de 1 à 12) : ")
            mois=int(a)
            z1=mois
            if int(float(mois))!=mois:
                print("Un nombre entier était attendu. Recommencez s'il vous plaît")
                print()
            elif mois<1 or mois>12:
                print("Le numéro être compris entre 1 et 12. Recommencez s'il vous plaît")
            else:
                break
        except ValueError:
            print("Vous n'avez pas entré un nombre. Recommencez s'il vous plaît")
    print()
    if chx_an==1:
        b=(an%4==0 and an%100!=0) or an%400==0 #= 1 ou 0 selon bissextile ou pas
        ja=datetime(an,1,1).isoweekday()-1     # n° du jour de l'an
        cr=ja+b                                #correctif
        Cumul=[ja,31+ja,59+cr,90+cr,120+cr,151+cr,181+cr,212+cr,243+cr,273+cr,304+cr,334+cr]
        Nb_Jours_mois=[31,28+b,31,30,31,30,31,31,30,31,30,31]

        #Construction du calendrier de l'année
        calendrier=[]
        for i in range(12):
            nb_jours,total,Mois=Nb_Jours_mois[i],Cumul[i],[]
            for j in range(nb_jours):
                Mois.append([Noms_jours[(total+j)%7],j+1,Noms_mois[i]])
            calendrier.append(Mois)

        D=TousJours(an,calendrier,Nb_Jours_mois,b)

    #Affichage du mois choisi
    titre()
    mois-=1
    M_A=Noms_mois[mois].capitalize()
    lg=(21-len(M_A))//2
    print (" "*lg+"Mois d"+["e ","'"][mois==3]+M_A,an)
    print ()
    print ("Lu  Ma  Me  Je  Ve  Sa  Di")
    no_jr=Noms_jours.index(calendrier[mois][0][0])
    for i,liste in enumerate(calendrier[mois]):
        if i==0:
            print (" "*4*no_jr+str("%2i" %(i+1)),end="  ")
        else:
            if (i+no_jr)%7==0:
                print()
            print ("%2i" %(i+1),end="  ")

    cle=mois+1
    if cle in D:
        print("\n")
        print("   Jours particuliers de ce mois :\n")
        for (j,f)in D[cle]:
            print(calendrier[mois][j-1][0].capitalize().ljust(9," "),"%2i" %j,f)

    while 1:
        print("\n\n")
        print("      ---------------------")
        print()
        print("        ** Voulez-vous **\n\n")
        print("- Choisir une autre année                      (A) ?")
        print("- Choisir un autre mois sans changer d'année   (B) ?")
        print("- Quitter le programme                         (Q) ?")
        print("\n")
        chx=input("      Votre choix : ").upper()
        if chx in ["A","B"]:
            if chx=="A":
                chx_an,chx_mois=1,1
                break
            elif chx=="B":
                chx_an,chx_mois=0,1
                break
            else:
                break
        if chx=="Q":
            print()
            print("Au revoir, Goodbye, Auf Wiedersehen, Arrivederci, Hasta la vista, Da svidania !")
            Go=0
            break
 

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 14-05-2021 18:17:33

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : [Python] Calendrier mois par mois et jours particuliers

Bonjour,

J'ai découvert et corrigé 2 bugs dans l'affichage des jours particuliers
- La journée des Droits des Femmes ne s'affichait pas toujours
- Télescopage entre la Fête des mères et le dimanche de Pentecôte lorsque celui-ci se trouve être le dernier dimanche de mai...

Maintenant, il ne devrait plus y avoir d'erreurs (certitude à 99,9%).

# usr/bin/env python
# -*- coding: utf-8 -*-

from datetime import datetime
from operator import itemgetter


def titre():
    print("       ************************")
    print("       *                      *")
    print("       *  Page de Calendrier  *")
    print("       *          et          *")
    print("       *  Jours pariculiers   *")
    print("       *                      *")
    print("       ************************")
    print("\n")
   
def datepaques(an):
    mil,du=divmod(an,100)
    c,d=divmod(3*(mil+25),4)    
    e,f=(8*(mil+11))//25,(5*mil+du)%19    
    g=(19*f+c-e)%30
    h=(f+11*g)//319
    j,k=(60*(5-d)+du)//4,(60*(5-d)+du)%4
    m=(2*j-k-g+h)%7
    n=(g-h+m+114)//31
    jour=1+(g-h+m+114)%31
    mois=n
    return jour, mois

def TousJours(an,calendrier,Nb_Jours_mois,bis):
    JoursCumuls,J=[31,59+bis,90+bis,120+bis],""
    Co=[" et Ascension","Journée Internationale des droits des Femmes"]
    i,Mai=-1,calendrier[4][23:]
    while Mai[i][0]!="dimanche":
         i-=1
    J_ddm,J_Fp=32+i, 22+i
    F=[(6,J_Fp,"Fête des pères")]
    J_Pa,M_Pa=datepaques(an)
    J_MG,M_MG=JoursCumuls[M_Pa-2]+J_Pa-78,2
    if J_MG>28+bis:
        J_MG-=28*(bis==0)
        M_MG=3      
    i,J=0,calendrier[0][0][0]
    while J>"dimanche":
        i+=1
        J=calendrier[0][i][0]
    J_Ep=8 if i==0 else i+1  
    F+=[(1,1,"Jour de l'an"),(1,J_Ep,"Épiphanie"),(2,2,"Chandeleur")]
    F+=[(7,14,"Fête Nationale"),(8,15,"Assomption"),(11,1,"Fête de Toussaint"),(11,11,"Armistice de 1918")]
    F+=[(12,25,"Noël"),(3,8,Co[1])]  
    if M_Pa==3:
        J_Asc,M_Asc=J_Pa-22+30*(J_Pa==22),5-(J_Pa==22)
        F+=[(3,J_Pa,"Pâques"),(3+(J_Pa==31),J_Pa+1-31*(J_Pa==31),"Lundi de Pâques")]
        F+=[(M_MG,J_MG,"Mardi Gras")]  
        if J_Asc==1:
            M_Pnt,J_Pnt=5,11
            F+=[(5,1,"Fête du Travail"+Co[0]),(5,8,"Victoire de 1945"),5,12,"Lundi de Pentecôte"]
        elif J_Asc==8:
            M_Pnt,J_Pnt=5,18
            F+=[(5,1,"Fête du Travail"),(5,8,"Victoire de 1945"+Co[0]),(5,19,"Lundi de Pentecôte")]
        else:
            M_Pnt,J_Pnt=5,J_Asc+10
            F+=[(5,1,"Fête du Travail"),(5,8,"Victoire de 1945"),(5,J_Asc,"Ascension")]
            F+=[(5,J_Asc+11,"Lundi de Pentecôte")]
        F+=[(M_Pnt,J_Pnt,"Pentecôte")]
    else:
        J_Asc,M_Asc=J_Pa+9-31*(J_Pa>22),5+(J_Pa>22)
        J_Pnt,M_Pnt=J_Asc+10-31*(J_Asc>21),M_Asc+(J_Asc>21)        
        F+=[(M_MG,J_MG,"Mardi Gras"),(4,J_Pa,"Pâques")]
        F+=[(4,J_Pa+1,"Lundi de Pâques"),(5,1,"Fête du Travail")]
        F+=[(5,8,"Victoire de 1945"),(M_Asc,J_Asc,"Ascension"),(M_Pnt,J_Pnt,"Pentecôte")]
        F+=[(M_Pnt+(J_Pnt==31),J_Pnt+1-31*(J_Pnt==31),"Lundi de Pentecôte")]
    if M_Pnt==5 and J_Pnt==J_ddm:
        M_Fm,J_Fm=6,J_Fp-14
    else:
        M_Fm,J_Fm=5,J_ddm  
    F+=[(M_Fm,J_Fm,"Fête des mères")]
    F.sort(key=itemgetter(0,1))
    Dico={1:[]}
    for a,b,c in F:
        if a in Dico:
            Dico[a].append((b,c))
        else:
            Dico.update({a:[(b,c)]})
    return Dico

chx_an,chx_mois,Go=1,1,1
Noms_mois =["janvier", "février", "mars", "avril", "mai","juin","juillet", "août", "septembre",\
            "octobre","novembre", "décembre"]
Noms_jours=["lundi","mardi", "mercredi","jeudi", "vendredi", "samedi", "dimanche" ]
print()
while Go:
    while chx_an==1:
        try:
            a=input("Choisissez votre année (de 1800 à 2200) : ")
            an=int(a)
            if int(float(an))!=an:
                print("Un nombre entier était attendu, Recommencez s'il vous plaît")
            elif an<1800 or an>2200:
                print("Année hors intervalle : pas de garantie sur la dâte de Pâques !")
            else:
                break
        except ValueError:
            print("Vous n'avez pas entré un nombre. Recommencez s'il vous plaît")
    print()
    while chx_mois==1:
        try:
            a=input("Choisissez un mois (de 1 à 12) : ")
            mois=int(a)
            z1=mois
            if int(float(mois))!=mois:
                print("Un nombre entier était attendu. Recommencez s'il vous plaît")
                print()
            elif mois<1 or mois>12:
                print("Le numéro être compris entre 1 et 12. Recommencez s'il vous plaît")
            else:
                break
        except ValueError:
            print("Vous n'avez pas entré un nombre. Recommencez s'il vous plaît")
    print()
    if chx_an==1:
        b=(an%4==0 and an%100!=0) or an%400==0 #= 1 ou 0 selon bissextile ou pas
        ja=datetime(an,1,1).isoweekday()-1     # n° du jour de l'an
        cr=ja+b                                #correctif
        Cumul=[ja,31+ja,59+cr,90+cr,120+cr,151+cr,181+cr,212+cr,243+cr,273+cr,304+cr,334+cr]
        Nb_Jours_mois=[31,28+b,31,30,31,30,31,31,30,31,30,31]

        #Construction du calendrier de l'année
        calendrier=[]
        for i in range(12):
            nb_jours,total,Mois=Nb_Jours_mois[i],Cumul[i],[]
            for j in range(nb_jours):
                Mois.append([Noms_jours[(total+j)%7],j+1,Noms_mois[i]])
            calendrier.append(Mois)

        D=TousJours(an,calendrier,Nb_Jours_mois,b)

    #Affichage du mois choisi
    titre()
    mois-=1
    M_A=Noms_mois[mois]
    lg=(21-len(M_A))//2
    print (" "*lg+"Mois d"+["e ","'"][mois in (3,7,9)]+M_A,an)
    print ()
    print ("Lu  Ma  Me  Je  Ve  Sa  Di")
    no_jr=Noms_jours.index(calendrier[mois][0][0])
    for i,liste in enumerate(calendrier[mois]):
        if i==0:
            print (" "*4*no_jr+str("%2i" %(i+1)),end="  ")
        else:
            if (i+no_jr)%7==0:
                print()
            print ("%2i" %(i+1),end="  ")

    cle=mois+1
    if cle in D:
        print("\n")
        print("   Jours particuliers de ce mois :\n")
        for (j,f)in D[cle]:
            print(calendrier[mois][j-1][0].capitalize().ljust(9," "),"%2i" %j,f)

    while 1:
        print("\n\n")
        print("      ---------------------")
        print()
        print("        ** Voulez-vous **\n\n")
        print("- Choisir une autre année                      (A) ?")
        print("- Choisir un autre mois sans changer d'année   (B) ?")
        print("- Quitter le programme                         (Q) ?")
        print("\n")
        chx=input("      Votre choix : ").upper()
        if chx in ["A","B"]:
            if chx=="A":
                chx_an,chx_mois=1,1
                break
            elif chx=="B":
                chx_an,chx_mois=0,1
                break
            else:
                break
        if chx=="Q":
            print()
            print("Au revoir, Goodbye, Auf Wiedersehen, Arrivederci, Hasta la vista, Da svidania !")
            Go=0
            break
 

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt plus trois
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums