From f2a63d6309f7e5a734670ab0f5c31d53c2013822 Mon Sep 17 00:00:00 2001
From: Mathieu Schiess <mathieu.schiess@edu.ge.ch>
Date: Thu, 3 Oct 2024 17:56:40 +0200
Subject: [PATCH] Ajout d'exercices au NB sur les fonctions simples de la
 banque de questions

---
 Notebooks/03_fonction_simple.ipynb |   2 +-
 Notebooks/imgs_chap3/croix.png     | Bin 0 -> 2643 bytes
 Notebooks/imgs_chap3/maison.png    | Bin 0 -> 10365 bytes
 Notebooks/imgs_chap3/triangles.png | Bin 0 -> 12836 bytes
 4 files changed, 1 insertion(+), 1 deletion(-)
 create mode 100644 Notebooks/imgs_chap3/croix.png
 create mode 100644 Notebooks/imgs_chap3/maison.png
 create mode 100644 Notebooks/imgs_chap3/triangles.png

diff --git a/Notebooks/03_fonction_simple.ipynb b/Notebooks/03_fonction_simple.ipynb
index b44f6d7..62ed921 100755
--- a/Notebooks/03_fonction_simple.ipynb
+++ b/Notebooks/03_fonction_simple.ipynb
@@ -1 +1 @@
-{"cells":[{"metadata":{},"cell_type":"markdown","source":"<div class = \"alert  alert-danger\"> \n    \nAttention: **veillez à bien sauvegarder votre travail** dans le bon dossier du disque réseau (dossier document) avec le bon nom (et l'extension *.ipynb*), **sinon toutes les modifications seront perdues!**\n\nPour reprendre votre travail, il suffit d'ouvrir le fichier .ipynb en cliquant sur *Fichier ouvrir*\n</div>"},{"metadata":{},"cell_type":"markdown","source":"# Le fonctions simples (brouillon)"},{"metadata":{},"cell_type":"markdown","source":"Rappel de quelques fonction de Turtle avec des exemples qui pourront vous servir\n\n| Fonction |Exemple|Commentaire|\n|:-------- |:------|:----------|\n|forward(x)|forward(150)|Trace un trait de 150 points|\n|backward(x)|backward(150)|Trace un trait “à reculons” de 150 points|\n|left(n)|left(60)|Tourne sur place la tortue de 60° à gauche|\n|right(n)|right(60)|Tourne sur place la tortue de 60° à droite|\n|width(x)|width(5)|Change l’épaisseur à 5 points|\n|color(\"c\")|color(\"yellow\")|Change la couleur du trait (mais aucun trait n’est tracé à ce moment). Notez les guillemets !|\n|penup()|penup()|Lève la tortue (permet de se déplacer sans dessiner)|\n|pendown()|pendown()|Baisse le stylo|\n|circle(R, A)|circle(100, 180)|Dessine un demi-cercle (angle de 180°) de rayon 100 points|\n|stamp()|stamp()|Laisse une impression de la tortue à sa position actuelle|\n|shape(forme)|shape('circle')|Change la forme de la tortue|"},{"metadata":{},"cell_type":"markdown","source":"# Définir - `def`\n\nDans ce chapitre, nous allons découvrir comment augmenter le vocabulaire de notre langage de programmation en définissant de nouvelles instructions, qu'on appelle aussi **fonction**. Ceci permet de rendre un code plus compact, mais surtout plus lisible. Nous allons voir que :\n\n- le mot-clé `def` permet de nommer (définir) une séquence,\n- le bloc qui suit doit être en **indentation** (décalé à droite),"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n \n```\nUne fonction permet de\n\nA) donner un nom à une séquence\nB) augmenter le vocabulaire du langage de programmation\nC) nous dire si ça fonctionne\nD) rendre un programme plus lisible\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nA) donner un nom à une séquence\n\nB) augmenter le vocabulaire du langage de programmation\n\nD) rendre un programme plus lisible\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Nommer une séquence\n\nDessiner un rectangle est assez utile. C'est une forme qu'on pourra réutiliser certainement souvent. Il serait pratique de définir un nom pour ces 8 lignes de code. Pouvons-nous définir de nouvelles commandes ?"},{"metadata":{"trusted":false},"cell_type":"code","source":"forward(160)\nleft(90)\nforward(100)\nleft(90)\nforward(160)\nleft(90)\nforward(100)\nleft(90)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Oui, c'est possible. Avec le mot-clé `def`, nous pouvons définir une nouvelle commande que nous pouvons par exemple appeler `rectangle()`.\nCette façon de créer un raccourci est appelée **définir** une fonction.\nLe code à exécuter suit l'expression `def rectangle():` et se trouve en **indentation** (décalé vers la droite).\n\nEnsuite, il suffit d'écrire `rectangle()` pour dessiner un rectangle. On appelle ceci **appeler** une fonction.\nRappelez-vous ceci :\n\n- on définit une fonction une seule fois,\n- on appelle une fonction autant de fois que l'on veut,\n- si on ne l'appelle pas, elle n'est pas exécutée et il ne se passe rien.\n\nDéfinir une fonction nous permet de réduire le nombre de lignes de code nécessaires.\nChaque fois que nous utilisons `rectangle()`,\nau lieu d'écrire 8 lignes, nous écrivons seulement une ligne de code."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3>\n\nDessinez encore d'autres rectangles en appelant la nouvelle fonction `rectangle()`.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef rectangle():\n    forward(160)\n    left(90)\n    forward(100)\n    left(90)\n    forward(160)\n    left(90)\n    forward(100)\n    left(90)\n\nrectangle()\nleft(90)\nrectangle()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n \n```\nRappel: Une indentation de texte est\n\nA) un décalage vers la gauche\nB) un décalage vers la droite\nC) une mise en paragraphe\nD) une mise en sous-section\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nB) un décalage vers la droite\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Donner du sens\n\nUne fonction ne permet pas seulement d'économiser des lignes de code.\nElle permet aussi de structurer le code et de lui donner un sens. Considérez par exemple le code ci-dessous. Il est presque impossible de comprendre ce que fait le programme en regardant les 17 lignes de code.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Si nous observons la tortue, nous comprenons finalement qu'elle dessine deux fois un rectangle. Nous pouvons même interpréter cette image et donner le sens de bâtiment au premier rectangle, et de porte au second.\n\nEssayons maintenant de découper le code en **sous-programmes** en utilisant deux fonctions `batiment()` et `porte()`.\nEn regardant ces 3 lignes de code, on comprend immédiatement le sens du programme.\n\n``` python\nbatiment()\nforward(30)     # repositionner la tortue\nporte()\n```\n\nLa définition d'une fonction permet d'ajouter de nouveaux mots à un langage de programmation. Contrairement aux commandes natives de Python qui sont toutes en anglais, nous sommes libres de les choisir en français.\n\n**Attention** : écrivez les fonctions sans accents et sans circonflexes : `batiment()`, `carre()`, `boite()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2 </h3>Ajoutez une deuxième porte au bâtiment. Ensuite, faites-en une porte double.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef batiment():\n    forward(200)\n    left(90)\n    forward(100)\n    left(90)\n    forward(200)\n    left(90)\n    forward(100)\n    left(90)\n\ndef porte():\n    forward(30)\n    left(90)\n    forward(50)\n    left(90)\n    forward(30)\n    left(90)\n    forward(50)\n    left(90)\n\nbatiment()\nforward(30)\nporte()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n\nÀ combien de lignes de code la fonction `porte()` est-elle équivalente ?\n\n\n```\nA) 1 ligne\nB) 2 lignes\nC) 8 lignes\nD) 17 lignes\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) 8 lignes\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Définir une fonction\n\nLe fait de donner un nom à une séquence d'instructions est appelé **définir une fonction**. Une **définition de fonction** comporte :\n\n1. le mot-clé `def` (définir),\n1. le nom de la fonction (`batiment/porte`),\n1. les parenthèses `()`,\n1. le deux-points `:`,\n1. un bloc en indentation.\n\nQu'est-ce qu'un bloc en indentation ?\nC'est un bloc de texte qui comporte des espaces vides à gauche. En Python, ces espaces apparaissent en multiples de 4.\n\nL'indentation est très importante en Python. C'est l'indentation qui indique l'étendue des instructions qui font partie de la fonction.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n \n```\nParmi les 4 définitions de fonction ci-dessous, laquelle est correcte ?\n\nA) def() rectangle:\nB) def: rectangle\nC) def rectangle():\nD) def(rectangle):\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) def rectangle():\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Indenter avec un raccourci\n\nComme l'indentation est tellement importante en Python, il en existe un raccourci.\nIl faut d'abord sélectionner **les lignes** de code dont vous voulez changer l'indentation.\nEnsuite, vous appuyez sur :\n\n- la touche **tab** pour augmenter l'indentation\n- la touche **maj+tab** pour diminuer l'indentation\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3 </h3>Essayez ces raccourcis dans le code ci-dessous. Transformez le code en deux fonctions `batiment()` et `porte()`, que vous appelez ensuite.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Voici encore un raccourci très utile : **maj(ou Shift)+Enter** pour exécuter le code.\n\n"},{"metadata":{},"cell_type":"markdown","source":"## Maison avec porte\n\nUne fois qu'une fonction est définie, elle peut être utilisée partout, même dans la définition d'une autre fonction.\n\nIci, nous avons une fonction `porte()`, qui est utilisée à l'intérieur d'une deuxième fonction `maison()`. Pour que ceci soit possible, la définition de porte doit être placée avant la définition de `maison()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 4 </h3>Déplacez la porte vers le milieu de la maison, et dessinez une deuxième maison à coté.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef porte():\n    forward(20)\n    left(90)\n    forward(40)\n    left(90)\n    forward(20)\n    left(90)\n    forward(40)\n    left(90)\n\ndef maison():\n    forward(100)\n    left(90)\n    forward(60)\n    left(45)\n    forward(71)\n    left(90)\n    forward(71)\n    left(45)\n    forward(60)\n    left(90)\n    porte()\n\nmaison()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Plus sur \"La tortue\"\n"},{"metadata":{},"cell_type":"markdown","source":"### Le point `dot()`\n\nLa fonction `dot()` dessine un point à la position actuelle de la tortue."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 5 </h3>Ajoutez un point (`dot`) au sommet du triangle.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef triangle():\n    dot()\n    forward(100)\n    left(120)\n    dot()\n    forward(100)\n    left(120)\n    forward(100)\n\ntriangle()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Lever le stylo\n\nLes deux commandes `up()` et `down()` permettent de lever et de baisser le stylo.\nCeci nous permet de dessiner des formes séparées, comme ici le petit i avec son point.\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 6 </h3>Transformez le i vers un i avec trema (deux points).\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef i():\n    dot()\n    pendown()      # poser le stylo\n    left(90)\n    forward(50)\n    penup()        # lever le stylo\n    forward(50)\n    dot()\n    backward(2*50)\n    right(90)\n    forward(50/2)    # avancer à la prochaine lettre\n\ni()\ni()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercices d'entraînement\n\n<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 7 </h3>\n\nCompléter le programme ci-dessous en utilisant (en appelant) la fonction `forme_mystere()` pour  pour créer le dessin suivant:\n![Image de losange](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap3/quatre_carres.png)"},{"metadata":{"trusted":true},"cell_type":"code","source":"# permet d'utiliser les fonctions pour dessiner\nfrom turtle import *\n\n# Définition de la fonction mystère\ndef forme_mystere():\n    for k in range(4):\n        forward(100)\n        right(90)\n\n### Écrivez votre code ci-dessous\n\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 8 </h3>\n\n1. Testez le programme suivant."},{"metadata":{"trusted":true},"cell_type":"code","source":"# permet d'utiliser les fonctions pour dessiner\nfrom turtle import *\n\n# Code à factoriser\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Définissez une fonction `hexagone()` qui permet de tracer des hexagones et utilisez-là pour réduire le nombre d’instructions du programme précédent."},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 9 </h3>\n\nCréez une fonction `paquebot()` et utilisez pour dessiner deux paquebots."},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(80)\nforward(60)\nleft(100)\nforward(220)\nleft(100)\nforward(60)\n\npenup()\nleft(125)\nforward(30)\nright(45)\n\nfor i in range(6):\n    pendown()\n    circle(10, 360)\n    penup()\n    forward(30)\n    \n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 10 </h3>Coloriez la fleur.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef petale():\n    for _ in range(2):\n        circle(100, 120)\n        left(60)\n\nfor _ in range(6):\n    petale()\n    left(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 11 </h3>\n\nAjoutez une fonction `m()` pour écrire le mot `nom`. Ajoutez ensuite des fonctions qui dessinent les lettres pour écrire votre prénom.\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\nwidth(5)\nr = 30\n\ndef n():\n    down()\n    left(90)\n    forward(2*30)    # montée\n    backward(30)     # retour au milieu\n    circle(-30, 180) # demi-cercle\n    forward(30)      # descente\n    left(90)\n    up()\n    forward(30)      # avance vers la prochaine lettre\n\ndef o():\n    forward(30)      # avance vers milieu\n    down()\n    circle(30)\n    up()\n    forward(2*30)    # avance vers prochaine lettre\n\nn()\no()\nn()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 12</h3>\n\nAvec des rails de chemin de fer, dessinez un circuit en forme d'un rond (deux rails avec les traverses).\n![rails](https://raw.githubusercontent.com/edunumsec2/book/master/src/appr/prog1/media/rails2.png)\n\nUtilisez une boucle `for` pour la répétition des traverses.\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndef traverse():\n    ...\n\nforward(200)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 13</h3>\n\nDessinez et coloriez un jardin. Définissez des fonctions pour des pétales, feuilles et fleurs.\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndot(1000, 'lightgreen')  # background\n\ndef petale():\n    ...\ndef feuille():\n    ...\ndef fleur():\n    dot(50, 'red')\n\nfeuille()\nforward(200)\nfleur()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 14 (meubles) </h3>\n\nDéfinissez 3 fonctions pour dessiner une chaise, une table et un lit.\nEnsuite placez plusieurs meubles dans l'espace\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\ndef chaise():\n   # à compléter...\n\ndef table():\n   # à compléter...\n\ndef lit():\n   # à compléter...\n\nchaise()\ntable()\nlit()\n\ndone()\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","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.10.12"}},"nbformat":4,"nbformat_minor":2}
\ No newline at end of file
+{"cells":[{"metadata":{},"cell_type":"markdown","source":"<div class = \"alert  alert-danger\"> \n    \nAttention: **veillez à bien sauvegarder votre travail** dans le bon dossier du disque réseau (dossier document) avec le bon nom (et l'extension *.ipynb*), **sinon toutes les modifications seront perdues!**\n\nPour reprendre votre travail, il suffit d'ouvrir le fichier .ipynb en cliquant sur *Fichier ouvrir*\n</div>"},{"metadata":{},"cell_type":"markdown","source":"# Le fonctions simples (brouillon)"},{"metadata":{},"cell_type":"markdown","source":"Rappel de quelques fonction de Turtle avec des exemples qui pourront vous servir\n\n| Fonction |Exemple|Commentaire|\n|:-------- |:------|:----------|\n|forward(x)|forward(150)|Trace un trait de 150 points|\n|backward(x)|backward(150)|Trace un trait “à reculons” de 150 points|\n|left(n)|left(60)|Tourne sur place la tortue de 60° à gauche|\n|right(n)|right(60)|Tourne sur place la tortue de 60° à droite|\n|width(x)|width(5)|Change l’épaisseur à 5 points|\n|color(\"c\")|color(\"yellow\")|Change la couleur du trait (mais aucun trait n’est tracé à ce moment). Notez les guillemets !|\n|penup()|penup()|Lève la tortue (permet de se déplacer sans dessiner)|\n|pendown()|pendown()|Baisse le stylo|\n|circle(R, A)|circle(100, 180)|Dessine un demi-cercle (angle de 180°) de rayon 100 points|\n|stamp()|stamp()|Laisse une impression de la tortue à sa position actuelle|\n|shape(forme)|shape('circle')|Change la forme de la tortue|"},{"metadata":{},"cell_type":"markdown","source":"# Définir - `def`\n\nDans ce chapitre, nous allons découvrir comment augmenter le vocabulaire de notre langage de programmation en définissant de nouvelles instructions, qu'on appelle aussi **fonction**. Ceci permet de rendre un code plus compact, mais surtout plus lisible. Nous allons voir que :\n\n- le mot-clé `def` permet de nommer (définir) une séquence,\n- le bloc qui suit doit être en **indentation** (décalé à droite),"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n \n```\nUne fonction permet de\n\nA) donner un nom à une séquence\nB) augmenter le vocabulaire du langage de programmation\nC) nous dire si ça fonctionne\nD) rendre un programme plus lisible\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nA) donner un nom à une séquence\n\nB) augmenter le vocabulaire du langage de programmation\n\nD) rendre un programme plus lisible\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Nommer une séquence\n\nDessiner un rectangle est assez utile. C'est une forme qu'on pourra réutiliser certainement souvent. Il serait pratique de définir un nom pour ces 8 lignes de code. Pouvons-nous définir de nouvelles commandes ?"},{"metadata":{"trusted":true},"cell_type":"code","source":"forward(160)\nleft(90)\nforward(100)\nleft(90)\nforward(160)\nleft(90)\nforward(100)\nleft(90)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Oui, c'est possible. Avec le mot-clé `def`, nous pouvons définir une nouvelle commande que nous pouvons par exemple appeler `rectangle()`.\nCette façon de créer un raccourci est appelée **définir** une fonction.\nLe code à exécuter suit l'expression `def rectangle():` et se trouve en **indentation** (décalé vers la droite).\n\nEnsuite, il suffit d'écrire `rectangle()` pour dessiner un rectangle. On appelle ceci **appeler** une fonction.\nRappelez-vous ceci :\n\n- on définit une fonction une seule fois,\n- on appelle une fonction autant de fois que l'on veut,\n- si on ne l'appelle pas, elle n'est pas exécutée et il ne se passe rien.\n\nDéfinir une fonction nous permet de réduire le nombre de lignes de code nécessaires.\nChaque fois que nous utilisons `rectangle()`,\nau lieu d'écrire 8 lignes, nous écrivons seulement une ligne de code."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3>\n\nDessinez encore d'autres rectangles en appelant la nouvelle fonction `rectangle()`.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef rectangle():\n    forward(160)\n    left(90)\n    forward(100)\n    left(90)\n    forward(160)\n    left(90)\n    forward(100)\n    left(90)\n\nrectangle()\nleft(90)\nrectangle()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n \n```\nRappel: Une indentation de texte est\n\nA) un décalage vers la gauche\nB) un décalage vers la droite\nC) une mise en paragraphe\nD) une mise en sous-section\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nB) un décalage vers la droite\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Donner du sens\n\nUne fonction ne permet pas seulement d'économiser des lignes de code.\nElle permet aussi de structurer le code et de lui donner un sens. Considérez par exemple le code ci-dessous. Il est presque impossible de comprendre ce que fait le programme en regardant les 17 lignes de code.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Si nous observons la tortue, nous comprenons finalement qu'elle dessine deux fois un rectangle. Nous pouvons même interpréter cette image et donner le sens de bâtiment au premier rectangle, et de porte au second.\n\nEssayons maintenant de découper le code en **sous-programmes** en utilisant deux fonctions `batiment()` et `porte()`.\nEn regardant ces 3 lignes de code, on comprend immédiatement le sens du programme.\n\n``` python\nbatiment()\nforward(30)     # repositionner la tortue\nporte()\n```\n\nLa définition d'une fonction permet d'ajouter de nouveaux mots à un langage de programmation. Contrairement aux commandes natives de Python qui sont toutes en anglais, nous sommes libres de les choisir en français.\n\n**Attention** : écrivez les fonctions sans accents et sans circonflexes : `batiment()`, `carre()`, `boite()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2 </h3>Ajoutez une deuxième porte au bâtiment. Ensuite, faites-en une porte double.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef batiment():\n    forward(200)\n    left(90)\n    forward(100)\n    left(90)\n    forward(200)\n    left(90)\n    forward(100)\n    left(90)\n\ndef porte():\n    forward(30)\n    left(90)\n    forward(50)\n    left(90)\n    forward(30)\n    left(90)\n    forward(50)\n    left(90)\n\nbatiment()\nforward(30)\nporte()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n\nÀ combien de lignes de code la fonction `porte()` est-elle équivalente ?\n\n\n```\nA) 1 ligne\nB) 2 lignes\nC) 8 lignes\nD) 17 lignes\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) 8 lignes\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Définir une fonction\n\nLe fait de donner un nom à une séquence d'instructions est appelé **définir une fonction**. Une **définition de fonction** comporte :\n\n1. le mot-clé `def` (définir),\n1. le nom de la fonction (`batiment/porte`),\n1. les parenthèses `()`,\n1. le deux-points `:`,\n1. un bloc en indentation.\n\nQu'est-ce qu'un bloc en indentation ?\nC'est un bloc de texte qui comporte des espaces vides à gauche. En Python, ces espaces apparaissent en multiples de 4.\n\nL'indentation est très importante en Python. C'est l'indentation qui indique l'étendue des instructions qui font partie de la fonction.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:chocolate;background-color:papayawhip;\" > <i class=\"fa fa-question\" aria-hidden=\"true\"> </i> &nbsp; Quizz </h3> \n \n```\nParmi les 4 définitions de fonction ci-dessous, laquelle est correcte ?\n\nA) def() rectangle:\nB) def: rectangle\nC) def rectangle():\nD) def(rectangle):\n```"},{"metadata":{},"cell_type":"markdown","source":"<details>\n<summary style=\"border-left:3px solid #3c763d; border-radius:2pt; width:100%; color:#3c763d; padding:6px; background-color: #dff0d8\"> \nRéponse\n</summary>  \n\n<div style=\"border-left:3px solid #3c763d; border-radius:2pt; color:#3c763d; padding:6px; background-color: #eff0e8\">\nC) def rectangle():\n</div>\n</details>"},{"metadata":{},"cell_type":"markdown","source":"## Indenter avec un raccourci\n\nComme l'indentation est tellement importante en Python, il en existe un raccourci.\nIl faut d'abord sélectionner **les lignes** de code dont vous voulez changer l'indentation.\nEnsuite, vous appuyez sur :\n\n- la touche **tab** pour augmenter l'indentation\n- la touche **maj+tab** pour diminuer l'indentation\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3 </h3>Essayez ces raccourcis dans le code ci-dessous. Transformez le code en deux fonctions `batiment()` et `porte()`, que vous appelez ensuite.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(200)\nleft(90)\nforward(100)\nleft(90)\nforward(30)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\nforward(30)\nleft(90)\nforward(50)\nleft(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Voici encore un raccourci très utile : **maj(ou Shift)+Enter** pour exécuter le code.\n\n"},{"metadata":{},"cell_type":"markdown","source":"## Maison avec porte\n\nUne fois qu'une fonction est définie, elle peut être utilisée partout, même dans la définition d'une autre fonction.\n\nIci, nous avons une fonction `porte()`, qui est utilisée à l'intérieur d'une deuxième fonction `maison()`. Pour que ceci soit possible, la définition de porte doit être placée avant la définition de `maison()`.\n\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 4 </h3>Déplacez la porte vers le milieu de la maison, et dessinez une deuxième maison à coté.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef porte():\n    forward(20)\n    left(90)\n    forward(40)\n    left(90)\n    forward(20)\n    left(90)\n    forward(40)\n    left(90)\n\ndef maison():\n    forward(100)\n    left(90)\n    forward(60)\n    left(45)\n    forward(71)\n    left(90)\n    forward(71)\n    left(45)\n    forward(60)\n    left(90)\n    porte()\n\nmaison()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Plus sur \"La tortue\"\n"},{"metadata":{},"cell_type":"markdown","source":"### Le point `dot()`\n\nLa fonction `dot()` dessine un point à la position actuelle de la tortue."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 5 </h3>Ajoutez un point (`dot`) au sommet du triangle.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef triangle():\n    dot()\n    forward(100)\n    left(120)\n    dot()\n    forward(100)\n    left(120)\n    forward(100)\n\ntriangle()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Lever le stylo\n\nLes deux commandes `up()` et `down()` permettent de lever et de baisser le stylo.\nCeci nous permet de dessiner des formes séparées, comme ici le petit i avec son point.\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 6 </h3>Transformez le i vers un i avec trema (deux points).\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef i():\n    dot()\n    pendown()      # poser le stylo\n    left(90)\n    forward(50)\n    penup()        # lever le stylo\n    forward(50)\n    dot()\n    backward(2*50)\n    right(90)\n    forward(50/2)    # avancer à la prochaine lettre\n\ni()\ni()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Exercices d'entraînement\n\n<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 7 </h3>\n\nCompléter le programme ci-dessous en ajoutant des appels à la fonction `forme_mystere()` pour  pour créer le dessin suivant:\n![Image de quatre carres](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap3/quatre_carres.png)"},{"metadata":{"trusted":true},"cell_type":"code","source":"# permet d'utiliser les fonctions pour dessiner\nfrom turtle import *\n\n# Définition de la fonction mystère\ndef forme_mystere():\n    for k in range(4):\n        forward(100)\n        right(90)\n\n\nforme_mystere()\n# à compléter \n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 8 </h3>\n\n1. Testez le programme suivant."},{"metadata":{"trusted":true},"cell_type":"code","source":"# permet d'utiliser les fonctions pour dessiner\nfrom turtle import *\n\n# Code à factoriser\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\nfor k in range(6):\n    forward(200)\n    right(60)\nright(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"2. Définissez une fonction `hexagone()` qui permet de tracer des hexagones et utilisez-là pour réduire le nombre d’instructions du programme précédent."},{"metadata":{},"cell_type":"markdown","source":""},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 9 </h3>\n\nTestez le programme ci-dessous, puis modifiez le en définissant au début une fonction `carre100()` qui dessine un carré de longueur 100 afin d'obtenir un programme structuré sans répétition inutile."},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\n\nfor _ in range(4):\n    forward(100)\n    left(90)\n\n\nleft(180)\n\n\nfor _ in range(4):\n    forward(100)\n    left(90)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 10 </h3>\nDans le programme ci-dessous:\n\n1. Définissez une fonction `triangle100()` pour dessiner un triangle équilatéral de côté 100 comme dans l’illustration A.\n \n2. Utilisez `triangle100()` pour dessiner une forme comme dans l’illustration B.\n\n![Image de triangles](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap3/triangles.png)"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\n# à compléter\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 11 </h3>\n\nUtilisez les commandes `carre100()` et `triangle100()` définies dans les exercices 9 et 10 pour dessiner une figure semblable à celle représentée ci-dessous.\n![Image de maisons](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap3/maison.png)"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\n# à compléter\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 12 </h3>\n\nDans le programme ci-dessous:\n\n1. Définissez une fonction `carre_ouvert()` qui dessine un carré ouvert comme dans l’illustration A.\n\n \n2. Utilisez `triangle100()` pour dessiner une croix comme dans l’illustration B.\n\n![Image de croix](https://githepia.hesge.ch/info_sismondi/exercices-1ere/-/raw/main/Notebooks/imgs_chap3/croix.png)"},{"metadata":{"trusted":false},"cell_type":"code","source":"from turtle import *\n\n# à compléter\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 9 </h3>\n\nCréez une fonction `paquebot()` et utilisez pour dessiner deux paquebots."},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\nforward(200)\nleft(80)\nforward(60)\nleft(100)\nforward(220)\nleft(100)\nforward(60)\n\npenup()\nleft(125)\nforward(30)\nright(45)\n\nfor i in range(6):\n    pendown()\n    circle(10, 360)\n    penup()\n    forward(30)\n    \n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 10 </h3>Coloriez la fleur.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef petale():\n    for _ in range(2):\n        circle(100, 120)\n        left(60)\n\nfor _ in range(6):\n    petale()\n    left(60)\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 11 </h3>\n\nAjoutez une fonction `m()` pour écrire le mot `nom`. Ajoutez ensuite des fonctions qui dessinent les lettres pour écrire votre prénom.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\nwidth(5)\nr = 30\n\ndef n():\n    down()\n    left(90)\n    forward(2*30)    # montée\n    backward(30)     # retour au milieu\n    circle(-30, 180) # demi-cercle\n    forward(30)      # descente\n    left(90)\n    up()\n    forward(30)      # avance vers la prochaine lettre\n\ndef o():\n    forward(30)      # avance vers milieu\n    down()\n    circle(30)\n    up()\n    forward(2*30)    # avance vers prochaine lettre\n\nn()\no()\nn()\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 12</h3>\n\nAvec des rails de chemin de fer, dessinez un circuit en forme d'un rond (deux rails avec les traverses).\n![rails](https://raw.githubusercontent.com/edunumsec2/book/master/src/appr/prog1/media/rails2.png)\n\nUtilisez une boucle `for` pour la répétition des traverses.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndef traverse():\n    ...\n\nforward(200)\n\ndone()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 13</h3>\n\nDessinez et coloriez un jardin. Définissez des fonctions pour des pétales, feuilles et fleurs.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n# Prénom Nom, classe\n\ndot(1000, 'lightgreen')  # background\n\ndef petale():\n    ...\ndef feuille():\n    ...\ndef fleur():\n    dot(50, 'red')\n\nfeuille()\nforward(200)\nfleur()\n\ndone()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 14 (meubles) </h3>\n\nDéfinissez 3 fonctions pour dessiner une chaise, une table et un lit.\nEnsuite placez plusieurs meubles dans l'espace\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"from turtle import *\n\ndef chaise():\n   # à compléter...\n\ndef table():\n   # à compléter...\n\ndef lit():\n   # à compléter...\n\nchaise()\ntable()\nlit()\n\ndone()\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","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.10.12"}},"nbformat":4,"nbformat_minor":2}
\ No newline at end of file
diff --git a/Notebooks/imgs_chap3/croix.png b/Notebooks/imgs_chap3/croix.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f935b6bb836f4d17266f4e46e03798468cf6231
GIT binary patch
literal 2643
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

literal 0
HcmV?d00001

diff --git a/Notebooks/imgs_chap3/maison.png b/Notebooks/imgs_chap3/maison.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1a73d187dbd95baeee759b575219256364d9e7c
GIT binary patch
literal 10365
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

literal 0
HcmV?d00001

diff --git a/Notebooks/imgs_chap3/triangles.png b/Notebooks/imgs_chap3/triangles.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e97d1359b33b7d2c625f8be7f8ff068c549ae9a
GIT binary patch
literal 12836
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
Axc~qF

literal 0
HcmV?d00001

-- 
GitLab