Vidéo 15 : Booléens : année bissextile ?¶
Année bissextile¶
Une année bissextile est une année multiple de 4, non multiple de 100 à moins qu’elle ne soit multiple de 400. Ainsi,
- 2019 n’est pas bissextile puisque 2019 n’est pas un multiple de 4 ;
- 2020 est bissextile car elle est multiple de 4 et non multiple de 100 ;
- 3000 n’est pas bissextile car elle est multiple de 100 sans être multiple de 400;
- 2000 était bissextile car 2000 est multiple de 400.
Soit n
une année. En considérant que les restes de n
par 4, 100 ou 400 sont nuls ou pas, écrire un booléen estBissext
qui vaut True
si n
est bissextile et False
sinon.
Solution
Si on fait un dessin de toutes les années en distinguant les multiples de 4, de 100 et de 400, on voit que les années bissextiles se répartissent dans les deux zones rouges disjointes ci-dessous :
On distingue une couronne rouge et le disque rouge au centre. La couronne rouge représente les années \(\mathtt{n}\) multiples de 4 ET qui ne sont pas multiples de 100. Donc la couronne rouge représente le booléen
n % 4 == 0 and n % 100 != 0
Le disque au centre représente les années \(\mathtt{n}\) multiples de 400, donc le booléen n % 400 == 0
.
Une année est bissextile exactement si elle est dans la couronne OU dans le disque central, ce qui se traduit par le OU booléen suivant :
estBissext = (n % 4 == 0 and n % 100 != 0) or n % 400 == 0
On pouvait aussi remarquer que n
est bissextile si elle est multiple de 4 et ne fait pas partie des années telle 1900 ou 3000 qui sont multiples de 100 et pas de 400 (la couronne verte du dessin), autrement dit si : n
n’est pas multiple de 100 ou est multiple de 400. D’où le booléen suivant :
estBissext = (n % 4 == 0) and (n % 100 != 0 or n % 400 == 0)
D’où le code suivant qui traite les quatre cas possibles :
n=2017
p = (n % 4)==0
q = (n % 100)==0
r = (n % 400)==0
estBissextile = p and (not q or r)
print(n, "->", estBissextile)
print("-------------------------------")
n=2020
p = (n % 4)==0
q = (n % 100)==0
r = (n % 400)==0
estBissextile = p and (not q or r)
print(n, "->", estBissextile)
print("-------------------------------")
n=3000
p = (n % 4)==0
q = (n % 100)==0
r = (n % 400)==0
estBissextile = p and (not q or r)
print(n, "->", estBissextile)
print("-------------------------------")
n=2000
p = (n % 4)==0
q = (n % 100)==0
r = (n % 400)==0
estBissextile = p and (not q or r)
print(n, "->", estBissextile)
print("-------------------------------")
2017 -> False
-------------------------------
2020 -> True
-------------------------------
3000 -> False
-------------------------------
2000 -> True
-------------------------------
Alternative¶
Il aurait aussi été possible d’écrire un booléen estNonBissextile
traduisant qu’une année n
est non bissextile en disant qu’elle n’est pas multiple de 4 (traduction : not p
) ou alors (traduction or
) qu’elle est multiple de 100 et pas multiple de 400 (traduction : q and not r
) puis en prenant la négation de estNonBissextile
:
n=3000
p = (n % 4)==0
q = (n % 100)==0
r = (n % 400)==0
estNonBissextile =(not p) or (q and not r)
estBissextile =not estNonBissextile
print(n, "->", estBissextile)