{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Préambule"},{"metadata":{},"cell_type":"markdown","source":"<div class = \"alert alert-warning\">\nCe fichier  est un notebook Python.\n\nIl comporte deux types de cellules :\n\n* les cellules d'édition dans lesquelles vous pouvez saisir du texte éventuellement enrichi de mises en formes ou de liens hypertextes avec la syntaxe du langage HTML simplifié qui s'appelle Markdown. Voir http://daringfireball.net/projects/markdown/ pour la syntaxe de Markdown.\n\n* les cellules de code où l'on peut saisir du code Python3 puis le faire exécuter avec la combinaison de touches `CTRL + RETURN`\n\nUne cellule peut être éditée  de deux façons différentes :\n\n* en mode _commande_ lorsqu'on clique sur sa marge gauche qui est surlignée alors en bleu, on peut alors  :\n\n    - changer le type de la cellule en appuyant sur `m` pour passer en cellule Markdown ou sur `y` pour passer en cellule de code\n    \n    - insérer une cellule juste au-dessus en appuyant sur `a`\n    \n    - insérer une cellule juste en-dessous en appuyant sur `b`\n    \n    - couper la cellule en appuyant sur `x` etc ...\n    \n* en mode _édition_ lorsqu'on clique sur l'intérieur de la cellule.\n\nL'aide complète sur les raccourcis claviers est accessible depuis le bouton `Help` dans la barre d'outils ci-dessus.\n<div>"},{"metadata":{},"cell_type":"markdown","source":"## Exercice 1 Q1"},{"metadata":{},"cell_type":"markdown","source":"L'Indice de Masse Corporelle se calcule par la formule $\\text{IMC}=\\frac{\\text{masse}}{\\text{taille}^2}$ où la masse est en kilogrammes et la taille en mètres. Un IMC est considéré comme normal s'il est compris entre 18,5 et 25. En dessous de $18,5$, la personne est en sous-poids et au-dessus de 25 elle est en sur-poids.\n\nÉcrire une fonction d'en-tête `imc(m, t)` qui renvoie la  classification de l'IMC correspondant à une masse de `m` kilogrammes et une taille de  `t` mètres : classe $0$ pour  sous-poids, $1$ pour normal et $2$ pour surpoids."},{"metadata":{"trusted":true},"cell_type":"code","source":"def imc(m, t):\n    \"\"\"\n    Renvoie la classification de l'IMC pour une taille t\n    et une masse m:\n    0 pour sous-poids\n    1 pour normal\n    2 pour surpoids\n    \n    \n    Parameters:\n    -----------\n    m: int\n    t: int\n    \n    Préconditions :   \n        0 <= m <= 200\n        0 <= t < 2.5\n    \n    \n    Returns:\n    --------\n    int    \n    \"\"\"\n    #préconditions\n    assert 0 <= m <= 200 and 0 <= t < 2.5\n    #à compléter\n    \n    \n#Tests unitaires qui doivent être vérifiés par la fonction\nassert imc(80, 1.5) == 2\nassert imc(80, 1.8) == 1\nassert imc(59, 1.8) == 0","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \nVersion 1 (avec structures conditionnelles imbriquées) :    \n    \n```python\ndef imc(m, t):\n    \"\"\"\n    Reenvoie la classification de l'IMC pour une taille t\n    et une masse m:\n    0 pour sous-poids\n    1 pour normal\n    2 pour surpoids\n    \n    Parameters:\n    -----------\n    m: int\n    t: int\n    \n    Préconditions :   \n        0 <= m <= 200\n        0 <= t < 2.5\n    \n    \n    Returns:\n    --------\n    int    \n    \"\"\"\n    #préconditions\n    assert 0 <= m <= 200 and 0 <= t < 2.5\n    #à compléter\n    mesure = m / t ** 2\n    if mesure < 18.5:\n        return 0\n    else:\n        if mesure <= 25:\n            return 1\n        else:\n            return 2    \n```\n    \nVersion 2 (avec `if ... elif ... else`) :    \n    \n```python\ndef imc(m, t):\n    \"\"\"\n    Reenvoie la classification de l'IMC pour une taille t\n    et une masse m:\n    0 pour sous-poids\n    1 pour normal\n    2 pour surpoids\n    \n    Parameters:\n    -----------\n    m: int\n    t: int\n    \n    Préconditions :   \n        0 <= m <= 200\n        0 <= t < 2.5\n    \n    \n    Returns:\n    --------\n    int    \n    \"\"\"\n    #préconditions\n    assert 0 <= m <= 200 and 0 <= t < 2.5\n    #à compléter\n    mesure = m / t ** 2\n    if mesure < 18.5:\n        return 0\n    elif mesure <= 25:\n        return 1\n    else:\n        return 2    \n```\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Exercice 1 Q2"},{"metadata":{},"cell_type":"markdown","source":"### Question 2) a)"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction`max2(a, b)` qui renvoie le maximum de deux nombre `a` et `b`."},{"metadata":{"trusted":false},"cell_type":"code","source":"def max2(a, b):\n    \"\"\"\n    Renvoie le maximum de deux entiers a et b\n    \n    Parameters:\n    -----------\n    a: int\n    b: int    \n        \n    Returns:\n    --------\n    int    \n    \"\"\"\n    #à compléter\n    \n#tests unitaires => à vous de les compléter en couvrant le plus de cas possible\nassert max2(5, 5) == 5\nassert max2(-10, 5) == 5\nassert max2(-10, 0) == 0","execution_count":1,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \nVersion 1 (avec structures conditionnelles imbriquées) :    \n    \n```python\ndef max2(a, b):\n    \"\"\"\n    Renvoie le maximum de deux entiers a et b\n    \n    Parameters:\n    -----------\n    a: int\n    b: int    \n        \n    Returns:\n    --------\n    int    \n    \"\"\"\n    if a > b:\n        return a\n    else:\n        return b\n```\n    \nL'exécution d'une instruction `return` provoque une sortie de la fonction donc on peut omettre le `else`\n    \n```python\ndef max2(a, b):\n    \"\"\"\n    Renvoie le maximum de deux entiers a et b\n    \n    Parameters:\n    -----------\n    a: int\n    b: int    \n        \n    Returns:\n    --------\n    int    \n    \"\"\"\n    if a > b:\n        return a\n    return b \n```\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"### Question 2) b)"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction`max3(a, b)` qui renvoie le maximum de trois entiers `a`,  `b` et `c`."},{"metadata":{"trusted":false},"cell_type":"code","source":"def max3(a, b, c):\n    \"\"\"\n    Renvoie le maximum de trois entiers a, b et c\n    \n    Parameters:\n    -----------\n    a: int\n    b: int   \n    c:int\n        \n    Returns:\n    --------\n    int    \n    \"\"\"\n    #à compléter\n    \n#tests unitaires => à vous de les compléter en couvrant le plus de cas possible\nassert max3(5, 5, 5) == 5\nassert max3(5, -4, 3) == 5\nassert max3(3, -4, 5) == 5","execution_count":3,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \nVersion 1 (avec structures conditionnelles imbriquées) :    \n    \n```python\ndef max3(a, b, c):\n    \"\"\"\n    Renvoie le maximum de trois entiers a, b et c\n    \n    Parameters:\n    -----------\n    a: int\n    b: int   \n    c:int\n        \n    Returns:\n    --------\n    int   \n    \"\"\"\n    if a >= b:\n        if a >= c:\n            return a\n        else:\n            return c\n    else:\n        if b >= c:\n            return b\n        else:\n            return c\n```\n    \nOn peut utiliser `max2(a, b)`.\n    \n```python\ndef max3(a, b, c):\n    \"\"\"\n    Renvoie le maximum de trois entiers a, b et c\n    \n    Parameters:\n    -----------\n    a: int\n    b: int   \n    c:int\n        \n    Returns:\n    --------\n    int   \n    \"\"\"\n    return max2(a, max2(b, c))\n```\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Exercice 2"},{"metadata":{},"cell_type":"markdown","source":"### Question 1)"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction `aumoinsun(a,b,c)` qui renvoie un booléen indiquant si l'un au moins des entiers  `a, b` ou `c` est positif"},{"metadata":{"trusted":true},"cell_type":"code","source":"def aumoinsun(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant si au moins un des trois entiers\n    a,b ou c est positif ou nul\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"    \n    #à compléter\n\n\n#tests unitaires : à compléter pour qu'ils couvrent le plus de cas possibles\nassert aumoinsun(-1, -1, 2)\nassert aumoinsun(2, -1, -1)\nassert not  aumoinsun(-1, -1, -1)","execution_count":7,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \nVersion 1 avec code pas beau :    \n    \n```python\ndef aumoinsun(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant si au moins des trois entiers\n    a,b ou c est positif ou nul\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"\n    if  a >= 0 or b >= 0 or c >= 0:\n        return True\n    else:\n        return False\n```\n    \nOn n'écrira pas :\n    \n```python\nif condition:\n    return True\nelse:\n    return False    \n```\nmais de façon plus élégante : \n    \n```python\nreturn condition    \n```\n\nce qui nous amène à :\n    \n```python\ndef aumoinsun(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant si au moins des trois entiers\n    a,b ou c est positif ou nul\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"\n    return  a >= 0 or b >= 0 or c >= 0\n```\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"### Question 2)"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction `tous(a,b,c)` qui renvoie un booléen indiquant si tous les  entiers `a, b, c` sont positifs ou nuls."},{"metadata":{"trusted":true},"cell_type":"code","source":"def tous(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant les trois entiers\n    a,b et c sont positifs ou nuls\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"    \n    #à compléter\n\n\n#tests unitaires : à compléter pour qu'ils couvrent le plus de cas possibles\nassert not tous(-1, -1, 2)\nassert not tous(2, -1, 3)\nassert tous(2,2,2)","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \nVersion 1 avec code pas beau :    \n    \n```python\ndef tous(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant si les trois entiers\n    a,b et c sont positifs ou nuls\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool\n    \"\"\"\n    if   a >= 0 and b >= 0 and c >= 0:\n        return True\n    else:\n        return False\n```\n    \nOn n'écrira pas :\n    \n```python\nif condition:\n    return True\nelse:\n    return False    \n```\nmais de façon plus élégante : \n    \n```python\nreturn condition    \n```\n\nce qui nous amène à :\n    \n```python\ndef tous(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant si les trois entiers\n    a,b et c sont positifs ou nuls\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool\n    \"\"\"\n    return a >= 0 and b >= 0 and c >= 0\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"### Question 3)"},{"metadata":{},"cell_type":"markdown","source":" Écrire une fonction  `croissant(a,b,c)` qui renvoie un booléen indiquant si trois entiers  `a, b, c` sont dans l'ordre croissant."},{"metadata":{"trusted":true},"cell_type":"code","source":"def croissant(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant si les trois entiers\n    a,b et c sont dans l'ordre croissant.\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"    \n    #à compléter\n    \n    \n#tests unitaires\nassert croissant(10, 10 , 10)\nassert croissant(-10, -10 , -10)\nassert croissant(-10, 0 , 10)\nassert not croissant(10, 10, 9)\nassert not croissant(10, 11, 9)\nassert croissant(9, 11, 12)\nassert not croissant(-9, -4, -5)","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \nVersion 1 avec code pas beau :    \n    \n```python\ndef croissant(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant les trois entiers\n    a,b et c sont dans l'ordre croissant.\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"    \n    if a <= b and b <= c:\n        return True\n    else:\n        return False\n```\n    \nOn n'écrira pas :\n    \n```python\nif condition:\n    return True\nelse:\n    return False    \n```\nmais de façon plus élégante : \n    \n```python\nreturn condition    \n```\n\nce qui nous amène à :\n    \n```python\ndef croissant(a, b, c):\n    \"\"\"\n    Renvoie un booléen indiquant les trois entiers\n    a,b et c sont dans l'ordre croissant.\n         \n    Parameters:\n    -----------\n    a: int\n    b: int\n    c:int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"    \n    return a <= b and b <= c\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"### Question 4)"},{"metadata":{},"cell_type":"markdown","source":"Une année est bissextile si elle est divisible par 400 ou si elle n'est pas divisible par 100 et qu'elle est divisible par $4$.\t\nÉcrire une fonction `bissextile(a)` qui renvoie un booléen indiquant si l'année  `a`  est bissextile."},{"metadata":{"trusted":false},"cell_type":"code","source":"def bissextile(a):\n    \"\"\"\n    Renvoie un booléen indiquant si l'année a\n    est bissextile.\n         \n    Parameters:\n    -----------\n    a: int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"   \n    #à compléter\n    \n#Tests unitaires\nassert bissextile(2020)\nassert bissextile(2000)\nassert not bissextile(1900)\nassert not bissextile(2021)    ","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\ndef bissextile(a):\n    \"\"\"\n    Renvoie un booléen indiquant si l'année a\n    est bissextile.\n         \n    Parameters:\n    -----------\n    a: int\n      \n    Returns:\n    --------\n    bool \n    \"\"\"   \n    return a % 400 == 0 or (a % 100 != 0 and a % 4 == 0)\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"## Entrainement 1"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction`mention(note)` qui prend en paramètre une note et renvoie la chaîne de  caractères `'R'` si note $<$ 10,   `'A'` si 10 <=  note <12,  'AB' si 12 <= note <14, 'B' si 14 <= note< 16 et 'TB' sinon."},{"metadata":{"trusted":true},"cell_type":"code","source":"def mention(note):\n    \"\"\"\n    Prend en paramètre une note et renvoie\n    une chaîne de caractères :\n    - 'R' si note < 10\n    - 'A' si 10 <= note < 12 \n    - 'AB' si 12 <= note < 14\n    - 'B' si 14 <= note < 16\n    - 'TB' si 16 <= note\n    \n    Parameters:\n    -----------\n    note: int\n    \n    précondition    0 <= note <= 20\n      \n    Returns:\n    --------\n    str\n    \"\"\"\n    #à compléter\n    \n#tests unitaires à compléter pour couvrir tous les cas possibles\nassert mention(8)  == 'R'\nassert mention(10)  == 'A'\nassert mention(11)  == 'A'","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\ndef mention(note):\n    \"\"\"Prend en paramètre une note et renvoie\n    une chaîne de caractères :\n    - 'R' si note < 10\n    - 'A' si 10 <= note < 12 \n    - 'AB' si 12 <= note < 14\n    - 'B' si 14 <= note < 16\n    - 'TB' si 16 <= note\n    \n    Parameters:\n    -----------\n    note: int\n    \n    précondition    0 <= note <= 20\n      \n    Returns:\n    --------\n    str\n    \"\"\"\n    if note < 10:\n        return 'R'\n    elif note < 12:\n        return 'A'\n    elif note < 14:\n        return 'AB'\n    elif note < 16:\n        return 'B'\n    else:\n        return 'TB'\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"## Exercice 3"},{"metadata":{"trusted":false},"cell_type":"code","source":"from random import randint\n\ndef sommeDe(n):\n    \"\"\"\n    Renvoie la somme des résultats obtenus en lançant n \n    dés à 6 faces :\n\n    Parameters:\n    -----------\n    n: int\n    \n    précondition    0 <= n\n      \n    Returns:\n    --------\n    int\n    \"\"\"\n    #à compléter\n    \n\ndef urne():\n    \"\"\"\n    Renvoie le numéro d'une boule choisie dans une urne\n    contenant 5 boules de numéro 1, 3 boules de numéro 2,\n    et deux boules de numéro3  :\n\n    Parameters:\n    -----------\n    aucun\n    \n      \n    Returns:\n    --------\n    int\n    \"\"\"\n    #à compléter\n    \n    \n    \n#Pas de tests unitaires, fonctions aléatoires\n    ","execution_count":10,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\ndef sommeDe(n):\n    \"\"\"\n    Renvoie la somme des résultats obtenus en lançant n \n    dés à 6 faces :\n\n    Parameters:\n    -----------\n    n: int\n    \n    précondition    0 <= n\n      \n    Returns:\n    --------\n    int\n    \"\"\"\n    #à compléter\n    s = 0\n    for k in range(n):\n        de = randint(1, 6)\n        s = s + de\n    return s   \n\ndef urne():\n    \"\"\"\n    Renvoie le numéro d'une boule choisie dans une urne\n    contenant 5 boules de numéro 1, 3 boules de numéro 2,\n    et deux boules de numéro3  :\n\n    Parameters:\n    -----------\n    aucun\n    \n      \n    Returns:\n    --------\n    int\n    \"\"\"\n    #à compléter\n    choix = randint(1, 10)\n    if choix <= 5:\n        return 1\n    elif choix <= 8:\n        return 2\n    else:\n        return 3\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"## Entrainement 2"},{"metadata":{},"cell_type":"markdown","source":"* Écrire une fonction `moyenneDe(n)` qui renvoie la valeur moyenne des faces obtenues sur un échantillon de `n` lancers.\n*  Écrire une fonction `premier6()` qui renvoie le rang du premier 6 obtenu lorsqu'on lance successivement le dé.\n* Écrire une fonction `tempsAttente(n)` qui renvoie le temps d'attente moyen du premier 6 sur un  échantillon de \n`n` lancers. "},{"metadata":{"trusted":true},"cell_type":"code","source":"1 + 1","execution_count":3,"outputs":[{"output_type":"execute_result","execution_count":3,"data":{"text/plain":"2"},"metadata":{}}]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\nfrom random import randint\n\ndef moyenneDe(n):\n    \"\"\"Renvoie la moyennes sur un échantillon de na lancers de dés\"\"\"\n    s = 0\n    for k in range(n):\n        s = s + randint(1, 6)\n    return s / n\n\ndef premier6():\n    \"\"\"Renvoie le rang du premier 6\"\"\"\n    k = 1\n    while randint(1, 6) != 6:\n        k = k + 1\n    return k\n\ndef tempsAttente(n):\n    \"\"\"Renvoie le temps d'attente moyen du premier 6\n    sur un échantillon de n lancers\"\"\"\n    t = 0\n    for k in range(n):\n        t = t + premier6()\n    return t / n\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"## Exercice 4"},{"metadata":{},"cell_type":"markdown","source":"### Question 1)"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction `spirale1(n)` qui permet de tracer une spirale constituée de  `n`  carrés déformés.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef spirale1(n):\n    \"\"\"Trace une spirale constituée de n carrés déformés\"\"\"\n    #à compléter\n    \n\nspirale1(10)\nmainloop()","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\nfrom turtle import *\n\ndef spirale1(n):\n    \"\"\"Trace une spirale constituée de n carrés déformés\"\"\"\n    penup()\n    goto(0,0)\n    pendown()\n    c = 5\n    for i in range(n):\n        for j in range(4):\n            forward(c)\n            c = c + 10 \n            left(90)\n    \n\nspirale1(10)\nmainloop()\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"### Question 2)"},{"metadata":{},"cell_type":"markdown","source":"Écrire une fonction `spirale2(n, m)` qui permet de tracer une spirale constituée de  `n` polygones déformés à `m` côtés."},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef spirale2(n, m):\n    \"\"\"Trace une spirale constituée de n polygones déformés\n    à m cotés\"\"\"\n    #à compléter\n\n\nspirale2(4, 6)\nmainloop()","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\nfrom turtle import *\n\ndef spirale2(n, m):\n    \"\"\"Trace une spirale constituée de n polygones déformés\n    à m cotés\"\"\"\n    penup()\n    goto(0,0)\n    pendown()\n    c = 5\n    for i in range(n):\n        for j in range(m):\n            forward(c)\n            c = c + 10 \n            left(360/m)\n    \n\n\nspirale2(4, 6)\nmainloop()\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"## Entrainement 3"},{"metadata":{},"cell_type":"markdown","source":" Écrire une fonction `spirale3(n, m)` qui permet de tracer une spirale constituée  de `n`   polygones réguliers concentriques  à `m` côtés."},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\nfrom math import sin, pi\n\ndef spirale3(n, m):\n    shape('turtle')\n    #à compléter\n\n\nspirale3(4, 10)\nmainloop()","execution_count":null,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\nfrom turtle import *\nfrom math import sin, pi\n\ndef spirale3(n, m):\n    shape('turtle')\n    ecart = 10\n    rayon = 20\n    cote = 20\n    for i in range(n):\n        penup()\n        goto(0,0)\n        setheading(0)\n        forward(rayon)\n        pendown()\n        #la difficulté est de calculer l'orientation de la tortue pour le tracé du premier coté\n        setheading(90+180/m)\n        cote = 2 * rayon * sin(pi/m)\n        for j in range(m):\n            forward(cote)\n            left(360/m)\n        rayon = rayon + ecart\n  \n    \nspirale3(4, 10)\nmainloop()\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"## Exercice 5"},{"metadata":{},"cell_type":"markdown","source":"### Question 1 "},{"metadata":{},"cell_type":"markdown","source":" On décide de ranger des oeufs dans des boîtes de six. Programmer la fonction `nb_boites(n)` qui prend en argument un entier `n` correspondant à un nombre d'oeufs et renvoie le nombre de boîtes nécessaires pour ranger les oeufs.  \n\nOn observera attentivement le jeu de tests et on fera quelques exemples à la main avant de commencer."},{"metadata":{"trusted":true},"cell_type":"code","source":"def nb_boites(n):\n    \"\"\"\n    Renvoie le nombre de boites de 6 oeufs nécessaires\n    pour ranger  n oeufs\n\n    Parameters:\n    -----------\n    n: int\n    \n    précondition    0 <= n\n      \n    Returns:\n    --------\n    int\n    \"\"\"\n    #à compléter\n    \n    \n    \n    \n    \n       \n#tests unitaires\nassert nb_boites(8) == 2      \nassert nb_boites(3) == 1      \nassert nb_boites(6) == 1      \nassert nb_boites(38) == 7\nassert nb_boites(600) == 100\nassert nb_boites(601) == 101\nassert nb_boites(0) == 0","execution_count":11,"outputs":[]},{"metadata":{"editable":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\ndef nb_boites(n):\n    \"\"\"\n    Renvoie le nombre de boites de 6 oeufs nécessaires\n    pour ranger  n oeufs\n\n    Parameters:\n    -----------\n    n: int\n    \n    précondition    0 <= n\n      \n    Returns:\n    --------\n    int\n    \"\"\"\n    if n%6 == 0:  \n        return n//6\n    else:\n        return n//6 + 1\n```\n</div>\n</details>\n"},{"metadata":{},"cell_type":"markdown","source":"### Question 2"},{"metadata":{},"cell_type":"markdown","source":"Programmer une fonction `est_pair(n:int)->bool` qui indique, en renvoyant True ou False, si un entier  `n` est pair ou pas. Reformuler les tests unitaires qui sont exprimés maladroitement."},{"metadata":{"trusted":true},"cell_type":"code","source":"def est_pair(n):\n    \"\"\"\n    Détermine si un entier est pair\n\n    Parameters:\n    -----------\n    n: int\n       \n    Returns:\n    --------\n    bool\n    \"\"\"\n    #à compléter\n    \n        \n\n\n#Test unitaires (écriture maladroite, à reformuler)\nassert est_pair(778) == True\nassert est_pair(37)  == False\nassert est_pair(-3)  == False\nassert est_pair(0) == True\nassert est_pair(-4) == True","execution_count":null,"outputs":[]},{"metadata":{"editabl":false,"deletable":false},"cell_type":"markdown","source":"<details>\n<summary style=\"border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan\"> Solution </summary>  \n    \n<div style=\"border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan\"> \n\n    \n```python\ndef est_pair(n):\n    \"\"\"\n    Détermine si un entier est pair\n\n    Parameters:\n    -----------\n    n: int\n       \n    Returns:\n    --------\n    bool\n    \"\"\"\n    return n%2 == 0\n    \n        \n\n\n#Test unitaires (écriture maladroite, à reformuler)\nassert est_pair(778)\nassert not est_pair(37)\nassert not est_pair(-3)\nassert est_pair(0)\nassert est_pair(-4)\n```\n</div>\n</details>\n"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.8"},"celltoolbar":"Edit Metadata"},"nbformat":4,"nbformat_minor":2}