136 lines
4.4 KiB
Python
136 lines
4.4 KiB
Python
# Fonctions nécessaires au fonctionnement de afficher_calendrier()
|
|
|
|
def est_divisible_par(a, b):
|
|
return a % b == 0
|
|
|
|
def est_bissextile(annee):
|
|
return est_divisible_par(annee, 4) and \
|
|
(not est_divisible_par(annee, 100) or est_divisible_par(annee, 400))
|
|
|
|
def nbre_jours(m, a):
|
|
assert(type(m) is int and m in range(1, 13)), \
|
|
"Le mois doit être un entier compris entre 1 et 12 inclus."
|
|
assert(type(a) is int and a > 1582), \
|
|
"L'année doit être un entier supérieur à 1582."
|
|
|
|
if m in [4, 6, 9, 11]:
|
|
return 30
|
|
elif m == 2:
|
|
if est_bissextile(a):
|
|
return 29
|
|
else:
|
|
return 28
|
|
else:
|
|
return 31
|
|
|
|
def est_date_valide(j, m, a):
|
|
return type(j) is int and type(m) is int and type(a) is int and a > 1582 \
|
|
and m in range(1, 13) and j in range(1, nbre_jours(m, a)+1)
|
|
|
|
def corrige_mois(m, a):
|
|
assert(type(a) is int and a > 1582), \
|
|
"L'année doit être un entier supérieur à 1582"
|
|
assert(type(m) is int and m in range(1, 13)), \
|
|
"Le mois doit être un entier compris entre 1 et 12 inclus"
|
|
|
|
liste_corrections_mois = [4, 0, 0, 3, 5, 1, 3, 6, 2, 4, 0, 2]
|
|
|
|
if est_bissextile(a):
|
|
liste_corrections_mois[0] = 3
|
|
liste_corrections_mois[1] = 6
|
|
|
|
return liste_corrections_mois[m-1]
|
|
|
|
def num_jour(j, m, a):
|
|
assert(est_date_valide(j, m, a)), "La date n'est pas valide"
|
|
|
|
ab = a//100
|
|
cd = a%100
|
|
return (cd//4 + ab//4 + cd + corrige_mois(m, a) + j + 2 + 5 * ab) % 7
|
|
|
|
|
|
# REGARDER À PARTIR D'ICI
|
|
|
|
# Voici une fonction qui affiche un calendier approximatif,
|
|
# sois sûre de la comprendre avant de t'attaquer au complet
|
|
def imprimer_mois_simple(m, a):
|
|
|
|
# Première ligne
|
|
print("Mois", m, " Année", a)
|
|
|
|
# Deuxième ligne
|
|
print("di lu ma me je ve sa")
|
|
|
|
# Nombres
|
|
jour = 1
|
|
nbre_jours_mois = nbre_jours(m, a)
|
|
while jour <= nbre_jours_mois: # On parcourt les lignes
|
|
ligne = ["", "", "", "", "", "", ""] # On remet à zéro la liste des nombres sur la ligne
|
|
for jour_semaine in range(7): # On parcours les colonnes de la ligne
|
|
ligne[jour_semaine] = jour # On met le jour
|
|
jour += 1 # On augumente jour pour le prochain
|
|
print(ligne[0], ligne[1], ligne[2], ligne[3], ligne[4], ligne[5], \
|
|
ligne[6]) # On affiche la ligne
|
|
|
|
# Démonstration
|
|
print("Calendrier simple (et faux)")
|
|
imprimer_mois_simple(9, 2014)
|
|
|
|
|
|
# Voici la fonction complète, qui affichera un calendrier complet,
|
|
# et possède tous les attributs d'une fonction
|
|
def imprimer_mois(m, a):
|
|
"""
|
|
Imprime le calendrier du mois de l'année donné.
|
|
|
|
CU : m entier, a entier, 1 ≤ m ≤ 12, a > 1582
|
|
|
|
Exemple :
|
|
>>> imprimer_mois(9, 2014)
|
|
Septembre 2014
|
|
di lu ma me je ve sa
|
|
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
|
|
"""
|
|
assert(type(a) is int and a > 1582), \
|
|
"L'année doit être un entier supérieur à 1582"
|
|
assert(type(m) is int and m in range(1, 13)), \
|
|
"Le mois doit être un entier compris entre 1 et 12 inclus"
|
|
|
|
# On stocke les mois dans un tableau pour pouvoir y accéder facilement
|
|
liste_mois = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", \
|
|
"Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"]
|
|
|
|
# Première ligne
|
|
print(liste_mois[m-1], a)
|
|
|
|
# Deuxième ligne
|
|
print("di lu ma me je ve sa")
|
|
|
|
# Nombres
|
|
jour = 1
|
|
jour_semaine_1er = num_jour(jour, m, a)
|
|
nbre_jours_mois = nbre_jours(m, a)
|
|
while jour <= nbre_jours_mois: # On parcourt les lignes
|
|
ligne = ["", "", "", "", "", "", ""] # On remet à zéro la liste des nombres sur la ligne
|
|
for jour_semaine in range(7): # On parcours les colonnes de la ligne
|
|
if jour == 1 and jour_semaine < jour_semaine_1er: # Si on est avant
|
|
# le premier jour du mois
|
|
ligne[jour_semaine] = " " # On met un espace
|
|
elif jour <= nbre_jours_mois: # Si on est avant la fin du mois
|
|
ligne[jour_semaine] = jour # On met le jour
|
|
jour += 1 # On augumente jour pour le prochain
|
|
print(ligne[0], ligne[1], ligne[2], ligne[3], ligne[4], ligne[5], \
|
|
ligne[6]) # On affiche la ligne
|
|
|
|
# Test
|
|
print("")
|
|
print("Calendrier complet")
|
|
imprimer_mois(9, 2014)
|
|
|
|
# Comme tu as pu le remarquer, les nombres <10 font un décalage
|
|
# J'ai pas trouvé comment résoudre ça sans utiliser des trucs qu'on
|
|
# a pas vu en cours. |