Jour suivant au format `(jour, j, m, a)`
D'après 2022, Centres étrangers, J1, Ex. 1
On dispose des listes jours
, mois
et duree_mois
suivants :
jours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
mois = [
"janvier", "février", "mars", "avril",
"mai", "juin", "juillet", "aout",
"septembre", "octobre", "novembre", "décembre",
]
duree_mois = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
Pour un indice
i
de 0 à 11,mois[i]
etduree_mois[i]
indiquent le nom et la durée du mois d'indicei
. On considèrera donc dans cet exercice que tous les mois de février durent 28 jours.
1.a. À partir de la liste jours
, comment obtenir l'élément "lundi"
?
Réponse
Les indices d'une liste commencent à 0, ainsi jours[1]
renvoie "lundi"
.
Opérateur %
On rappelle que l'opérateur %
(« modulo ») renvoie le reste de la division entière (division euclidienne).
Exemple : 7 % 3
renvoie 1
qui est le reste de la division de 7 par 3. (Le quotient serait 2.)
1.b. Que renvoie l'instruction jours[18 % 7]
?
Réponse
Dans \(18\), il y a deux fois \(7\), et il reste \(18 - 2×7 = 4\), ainsi 18 % 7
est égal à \(4\).
jours[18 % 7]
renvoie donc "jeudi"
.
2. On rappelle que jours.index(element)
renvoie l'indice de element
dans la liste jours
.
Par exemple, jours.index("mercredi")
renvoie 3
.
Le nom du jour actuel est stocké dans une variable nom_jour
(par exemple : nom_jour = "mardi"
).
Recopier et compléter l'instruction suivante permettant d'obtenir l'indice du
jour de la semaine n
jours plus tard :
indice_jour = (jours.index( ... ) + ...) % ...
Réponse
indice_jour = (jours.index(nom_jour) + n) % 7
3.a. À partir de la liste mois
, comment obtenir le nombre de jours du mois
de mars ?
Réponse
mois.index("mars")
renvoie l'indice du mois de mars dans la listemois
.
duree_mois[mois.index("mars")]
renvoie donc le nombre de jours du mois de mars.
3.b. Les mois sont numérotés de 1 pour janvier à 12 pour décembre. Le numéro du mois actuel est stocké dans une variable numero_mois
,
écrire le code permettant d'obtenir le nom du mois qu'il sera x
mois plus tard
à partir de la liste mois
.
Par exemple :
- Avec
numero_mois = 4
etx = 5
, on doit obtenir"septembre"
. - Avec
numero_mois = 8
etx = 4
, on doit obtenir"décembre"
. - Avec
numero_mois = 10
etx = 3
, on doit obtenir"janvier"
.
Réponse
-
(numero_mois - 1 + x) % 12
renvoie l'indice du mois dansx
mois ; -
mois[(indice_mois - 1 + x) % 12]
renvoie le nom du mois demandé.
Il est important d'enlever 1 au numéro, pour travailler avec l'indice qui commence à zéro.
4. On définit une date comme un tuple :
(nom_jour, numero_jour, numero_mois, annee)
4.a. Par exemple, pour stocker la date du samedi 21 octobre 1995, on exécute date = ("samedi", 21, 10, 1995)
. On peut alors extraire les champs de valeurs avec nom_jour, numero_jour, numero_mois, annee = date
. Que renvoie alors l'instruction mois[numero_mois - 1]
?
Réponse
mois[numero_mois - 1]
renvoie "octobre"
; on décrémente de 1 le numéro pour obtenir l'indice du mois.
4.b. Écrire une fonction jour_suivant
qui prend en paramètre une date
sous forme de tuple et qui renvoie un tuple désignant la date
du lendemain.
Par exemple
>>> jour_suivant(("samedi", 21, 10, 1995))
("dimanche", 22, 10, 1995)
>>> jour_suivant(("mardi", 31, 10, 1995))
("mercredi", 1, 11, 1995)
Rappel : on ne tient pas compte des années bissextiles et on considère que le mois de février comporte toujours 28 jours.
Réponse
def jour_suivant(date):
nom_jour, numero_jour, numero_mois, annee = date
# nom du jour suivant
nom_jour = jours[(jours.index(nom_jour) + 1) % 7]
# numéro du jour suivant
if numero_jour < duree[numero_mois - 1]:
numero_jour += 1
else:
# on passe au 1 du mois suivant
numero_jour = 1
numero_mois += 1
if numero_mois == 13:
# on passe au 1 janvier de l'année suivante
numero_mois = 1
annee += 1
return (nom_jour, numero_jour, numero_mois, annee)