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 :

🐍 Script Python
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] et duree_mois[i] indiquent le nom et la durée du mois d'indice i. 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 liste mois.

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 et x = 5, on doit obtenir "septembre".
  • Avec numero_mois = 8 et x = 4, on doit obtenir "décembre".
  • Avec numero_mois = 10 et x = 3, on doit obtenir "janvier".
Réponse
  • (numero_mois - 1 + x) % 12 renvoie l'indice du mois dans x 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

🐍 Console Python
>>> 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
🐍 Script Python
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)