Vidéo 40 : Découpage en tâches

\(\newcommand{\ds}{\displaystyle}\) \(\newcommand{\Frac}{\ds\frac}\) \(\renewcommand{\r}{\mathbb{ R}}\) \(\newcommand{\C}{\mathbb{ C}}\) \(\newcommand{\n}{\mathbb{ N}}\) \(\newcommand{\z}{\mathbb{ Z}}\) \(\newcommand{\Q}{\mathbb{ Q}}\) \(\newcommand{\N}{\mathbb{ N}}\) \(\newcommand{\n}{\mathbb{ N}}\) \(\newcommand{\ol}{\overline}\) \(\newcommand{\abs}[1]{\left| \,{#1} \right|}\) \(\newcommand{\pv}{\;;\;}\) \(\newcommand{\ens}[1]{\left\{ {#1} \right\}}\) \(\newcommand{\mens}[1]{\setminus\left\{ {#1} \right\}}\) \(\newcommand{\Par}[1]{\left({#1}\right)}\)

Vidéo 40 : Découpage en tâches

Périodes de l’année

Dans cet exercice, on va considérer des périodes sous la forme

\(\mathtt{a}\) années, \(\mathtt{m}\) mois et \(\mathtt{j}\) jours

\(\mathtt{1\leq m \leq 12}\) et \(\mathtt{1\leq j \leq 30}\)\(\mathtt{a, m}\) et \(\mathtt{j}\) sont des entiers. Pour simplifier, on considérera qu’une année comportera 12 mois et qu’un mois dure toujours 30 jours (et donc qu’une année comporte 360 jours et non 365).

  1. Écrire une fonction amj_to_j(a, m, j) qui retourne le nombre de jours d’une période exprimée en années, mois et jours. Vérifier que 27 ans, 9 mois et 10 jours correspondent à 10000 jours.

  2. Cette question est indépendante de ce qui précède. Dans cette question, l’usage de la méthode append est inapproprié.

    Écrire une fonction j_to_amj(jours) qui prend en paramètre une période exprimée en jours et la retourne exprimée en années, mois et jours sous forme de liste [a, m, j]. Bien sûr, on aura \(\mathtt{1\leq m \leq 12}\) et \(\mathtt{1\leq j \leq 30}\). Vérifier que 10000 jours correspondent à 27 ans, 9 mois et 10 jours.

  3. Cette question est indépendante de ce qui précède. Écrire une procédure afficher_periode qui prend en paramètre une liste de 3 entiers correspondant à une période de \(\mathtt{a}\) années, \(\mathtt{m}\) mois et \(\mathtt{j}\) jours et qui affiche

    a années m mois et j jours
    

    Par exemple, afficher_periode([27, 9, 1]) affiche exactement :

    27 années 9 mois et 1 jours

  4. Votre réponse à cette question doit utiliser les fonctions définies dans les questions précédentes. Cette question ne demande pas de définir de nouvelle fonction.

    Un père a un âge de 42 ans, 4 mois et 2 jours et sa fille a un âge de 14 ans 6 mois et 22 jours. Écrire un programme qui affiche la différence d’âge, exprimée en années, mois et jours, entre le père et sa fille.

    Il est attendu que votre code tienne sur une seule ligne.

Solution

  1. D’après les hypothèses simplificatrices de l’énoncé, le nombre de jours dans une période de a années, m mois et j jours est donné par la formule :

360*a+30*m+j

d’où le code :

1
2
3
4
def amj_to_j(a, m, j):
    return 360*a+30*m+j

print(amj_to_j(10, 4, 22))
5
3742
  • Ligne 5 : on retrouve bien le nombre de jours annoncés.
  1. Une périodes jours contient jours // 360 années entières avec un reliquat de jours % 360 jours. De la même façon, on convertit ce reliquat de jours en mois et jours. D’où le code :
1
2
3
4
5
6
7
8
def j_to_amj(jours):
    a=jours//360
    r=jours%360
    m=r//30
    j=r%30
    return [a, m, j]

print(j_to_amj(10000))
9
[27, 9, 10]
  • Ligne 9 : on retrouve bien 27 ans, 49 mois et 10 jours.
  1. Il s’agit d’écrire une procédure d’affichage. La fonction reçoit un argument sous forme de liste [j, m, a]. Mais le paramètre ne peut avoir cette forme, un paramètre étant toujours un nom de variable, disons ici periode. Dans le code de définition de la fonction, on accède aux années, mois et jours en utilisant un indice puisque periode représente une liste de 3 entiers. D’où le code :
1
2
3
4
5
def afficher_periode(periode):
    print(periode[0], "années",  periode[1],
          "mois", "et", periode[2], "jours")

afficher_periode([27, 9, 1])
6
27 années 9 mois et 1 jours
  1. Pour calculer un écart entre deux durées, il suffit de
  • convertir chaque durée en jours avec la fonction amj_to_j
  • de faire la différence des durées en jours
  • de reconvertir cette durée en jours en une période en années, mois et jours avedc la fonction j_to_amj.

Enfin, il restera à afficher la durée avec la fonction afficher_periode.

D’où le code :

1
afficher_periode(j_to_amj(amj_to_j(42, 4, 2)-amj_to_j(9, 9, 28)))
2
32 années 6 mois et 9 jours