Outils pour utilisateurs

Outils du site


nsi:premiere:fonctions_macros

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:premiere:fonctions_macros [2021/06/21 12:05] goupillwikinsi:premiere:fonctions_macros [2022/08/28 22:56] (Version actuelle) goupillwiki
Ligne 8: Ligne 8:
 ===== Problème ===== ===== Problème =====
  
-{{:nsi:premiere:3_carres_100.png?nolink&400 |}}+{{:nsi:premiere:exercices:3_carres_100.png?nolink&400 |}}
  
-On souhaite réaliser avec le module ''%%turtle%%'' (Tortue)  le dessin des 3 carrés ci-contre -- il ne faut pas dessiner la grille en bleue.+On souhaite réaliser avec le module ''%%turtle%%'' (Tortue)  le dessin des 3 carrés rouges ci-contre -- il ne faut pas dessiner la grille en bleu.
  
 Je vous donne la structure de fichier de base, à compléter. Je vous donne la structure de fichier de base, à compléter.
Ligne 21: Ligne 21:
 shape("turtle") shape("turtle")
 pencolor("red") pencolor("red")
-pensize(4)+pensize(2)
 setheading(0) setheading(0)
  
 # tracé - à compléter # tracé - à compléter
  
-tfin de la zone à compléter+fin de la zone à compléter
 exitonclick() exitonclick()
 </code> </code>
  
-On identifie facilement les morceaux de codes dessinant les carrés. Ils sont 3 fois identiques : lignes 12-14 ; 18 - 20 ; 24 - 26.+<WRAP clear/>
  
-Cette façon de faire a deux gros défauts : +Complétez le programme et testez.
-  * On est obligé de réécrire plusieurs fois la même chose, +
-  * On ne voit pas clairement ce que fait le programme.+
  
-===== Utiliser une fonction pour le carré =====+===== Utiliser des fonctions =====
  
-L'idée est d'associer un nom au bloc+> Peut-être avez-vous déjà eu la bonne idée d'utiliser des fonctions. Dans ce cas, bravo. Comme il s'agit de bien vous faire comprendre, je poursuis en supposant que vous n'y avez pas pensé / n'avez pas su le faire.
  
-<code python linenums> +Nous avons trois carrés de taille 100, identiques à tracerLe tracer d'un carré peut se faire par exemple par :
-for i in range(4): +
-    forward(100+
-    left(90) +
-</code> +
- +
-De préférenceun nom qui parle et qui évite des explications.+
  
 +<WRAP group>
 +<WRAP half column>
 <code python linenums> <code python linenums>
-def tracer_carre_100(): +forward(100) 
-    for i in range(4): +left(90) 
-        forward(100) +forward(100) 
-        left(90)+left(90) 
 +forward(100
 +left(90
 +forward(100) 
 +left(90)
 </code> </code>
- 
-Le rôle des ''%%()%%'' sera plus clair plus loin. 
- 
-<WRAP info> 
-La ligne de la définition, ''%%def tracer_carre_100():%%'' est appelée la **signature** de la fonction. 
 </WRAP> </WRAP>
- +<WRAP half column> 
-Vous comprenez qu'ici, ''%%tracer_carre_100()%%'' remplace toujours le même morceau de programme. C'est ce qu'on appelle une macro. +ou mieux :
- +
-=== Rendre la fonction plus générale === +
- +
-Notre fonction ne sait tracer que des carré de côté 100. Que ferons nous si nous voulons tracer un carré de côté 50 ? Faudra-t-il définir une autre fonction ? +
- +
-Bien sûr que non. On peut fournir à la fonction un **argument** qui agit comme un paramètre de réglage de la fonction.+
  
 <code python linenums> <code python linenums>
-def tracer_carre(taille): +for i in range(4): 
-    for i in range(4): +    forward(100
-        forward(taille+    left(90)
-        left(90)+
 </code> </code>
  
-Lorsque l'on appellera la fonction, il faudra fournir une valeur pour ''%%taille%%''.+Dans les deux cas, on doit reproduire 3 fois ce morceau de code. On voit bien que ce n'est pas idéal. 
 +</WRAP> 
 +</WRAP>
  
-=== Documenter la fonction ===+Ce qu'il serait plus naturel de faire c'est :
  
-Pour rendre le programme encore plus clair, on documente la fonction, c'est à dire que l'on ajoute un commentaire juste après la signature. +<code lang-none linenums> 
- +se positionner, crayon levé, en (0,0
-<code python linenums> +tracer un carré de taille 100 
-def tracer_carre(taille)+se positionner, crayon levé, en (20,20
-    """ +tracer un carré de taille 100 
-    Trace un carré +se positionner, crayon levé, en (40,40) 
-    taille: dimension du côté +tracer un carré de taille 100
-    """ +
-    for i in range(4): +
-        forward(taille) +
-        left(90)+
 </code> </code>
  
 +Aucune de ces lignes ne correspond à une instruction disponible dans le langage, même en tenant compte des fonctions supplémentaires apportées par la bibliothèque ''%%turtle%%''.
  
-===== Utiliser une fonction pour le déplacement de crayon ===== +Il faut les définirReprenez le programme en complétant la définition des fonctions.
- +
-Le bloc correspondant au déplacement de crayon levé se retrouve aussi beaucoup. +
-On peut lui associer une macro. Mais il y a une différence : le crayon ne se déplace pas toujours au même endroit. Il faut donc pouvoir préciser. +
- +
-<code python linenums> +
-def deplacer_crayon(x,y): +
-    up() +
-    goto(x,y) +
-    down() +
-</code> +
- +
-C'est donc l'usage des ''%%()%%'' de la fonction : elles permettent de préciser des entrées.+
  
 <WRAP tip> <WRAP tip>
-Nous voulions nommer la fonction "déplacer crayon". Nous préférons éviter l'accent et nous n'avons pas le droit à un nom avec espaceIl existe pour cela plusieurs conventions. En voici deux : +Les fonctions doivent être définies avant qu'on les appelleElles sont donc définies en début de programmeComme les fonctions utilisent des outils définis dans les bibliothèqueson appelle les bibliothèques encore avant.
-  * ''%%snake_case%%'', la [[https://fr.wikipedia.org/wiki/Snake_case|casse du serpent]] : tout en minuscule, mots séparés par ''%%_%%''. Ici donc ''%%deplacer_crayon%%''. C'est la convention recommandée en Python. +
-  * ''%%camelCase%%''la [[https://fr.wikipedia.org/wiki/Camel_case|casse du chameau]] : changement de mot avec une majuscule. Ici donc ''%%deplacerCrayon%%''.+
 </WRAP> </WRAP>
- 
-=== Documenter la fonction === 
- 
-Pour rendre le programme encore plus clair, on documente la fonction, c'est à dire que l'on ajoute un commentaire juste après la signature. 
  
 <code python linenums> <code python linenums>
-def deplacer_crayon(x,y): +from turtle import *
-    """ +
-    Déplace le crayon levé. +
-    x, y: coordonnées de la destination +
-    """ +
-    up() +
-    goto(x,y) +
-    down() +
-</code> +
- +
-===== Programme final ===== +
- +
- +
-<code python linenums> +
-from turtle import * # import de la bibliothèque turtle+
  
-définitions fonctions +définition fonctions 
-def tracer_carre(taille):+def tracer_carre(taille:int):
     """     """
-    Trace un carré +    taille: taille en pixels du côté du carré
-    taille: dimension du côté+
     """     """
-    for i in range(4): +    # à vous de compléter
-        forward(taille) +
-        left(90)+
  
-def deplacer_crayon(x,y):+def positionner_crayon_sans_tracer(x:int, y:int):
     """     """
-    Déplace le crayon levé. 
     x, y: coordonnées de la destination     x, y: coordonnées de la destination
 +    amène le crayon à la position (x,y) sans tracer
     """     """
-    up() +    # à vous de compléter 
-    goto(x,y) +     
-    down() +initialisations de l'espace de dessin
- +
-initialisation+
 speed(5) speed(5)
 shape("turtle") shape("turtle")
 pencolor("red") pencolor("red")
-pensize(4)+pensize(2)
 setheading(0) setheading(0)
  
-tracé +programme principal 
-deplacer_crayon(0,0)+positionner_crayon_sans_tracer(0,0)
 tracer_carre(100) tracer_carre(100)
-deplacer_crayon(20,20)+positionner_crayon_sans_tracer(20,20)
 tracer_carre(100) tracer_carre(100)
-deplacer_crayon(40,40)+positionner_crayon_sans_tracer(40,40)
 tracer_carre(100) tracer_carre(100)
-#tracé terminé+ 
 +fin
 exitonclick() exitonclick()
 </code> </code>
  
 voilà qui est plus simple à comprendre ! voilà qui est plus simple à comprendre !
 +
 +<WRAP tip>
 +Les fonctions définies ici ne renvoies rien. Elles se contentent de faire quelque chose. De telles fonctions sont appelées **procédures**. En Python, si une fonction arrive à son terme sans qu'aucun ''%%return%%'' n'ait été rencontré, alors la fonction renvoie ''%%None%%'' ce que l'on peut comprendre comme "Rien".
 +</WRAP>
  
 ===== Exercices ===== ===== Exercices =====
Ligne 178: Ligne 131:
 === Exercice 1 === === Exercice 1 ===
  
-Inspirez-vous de ce qui précède pour tracer la figure ci-dessous. Les carrés ont des tailles de 100, 80, 60 et 40.+Inspirez-vous de ce qui précède pour tracer la figure ci-dessous.
  
-{{ :nsi:premiere:daltons.png?nolink&400 |}}+{{ :nsi:premiere:exercices:spirale_carres_100.png?nolink&400 |}}
  
 === Exercice 2 === === Exercice 2 ===
Ligne 188: Ligne 141:
 J'ai numéroté les carré pour que ce soit plus clair. J'ai numéroté les carré pour que ce soit plus clair.
  
-{{ :nsi:premiere:golden.png?nolink&400 |}}+{{ :nsi:premiere:exercices:golden.png?nolink&400 |}}
  
 === Exercice 3 === === Exercice 3 ===
  
 Écrivez une fonction ''%%tracer_polygone_regulier(n, taille)%%'' dont on donne le nombre de côtés ''%%n%%'' (au moins 3) et la taille du côté. Écrivez une fonction ''%%tracer_polygone_regulier(n, taille)%%'' dont on donne le nombre de côtés ''%%n%%'' (au moins 3) et la taille du côté.
nsi/premiere/fonctions_macros.1624269909.txt.gz · Dernière modification : de goupillwiki