This repository has been archived on 2019-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
s1-tp/S1/TP 3/date Camille demo.py
2014-10-07 19:32:31 +02:00

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.