<!-- **Note :** jusqu'en 2020-2021, ainsi que les trois premières séances de
2021-2022, ce cours utilisait le nom `ASSERT` au lieu de `CHECK`. Le
changement a eu lieu pour assurer la compatibilité avec
l'infrastructure `doctest`. Pour simplifier la transition, dans
l'environnement Jupyter de ce cours, on peut utiliser les deux
indifféremment. -->
+++ {"slideshow": {"slide_type": "slide"}}
#### Tests d'une fonction
**Astuces pour être efficace :**
:::{admonition} Astuces pour être efficace
:class: hint
- *Commencer par écrire les tests d'une fonction*
De toute façon il faut réfléchir à ce qu'elle va faire!
:::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition}
:class: hint
- Tester les cas particuliers
:::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition}
:class: hint
- Tant que l'on est pas sûr que la fonction est correcte :
- Faire des essais supplémentaires
- Capitaliser ces essais sous forme de tests
:::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition}
:class: hint
- Si l'on trouve un bogue :
- Ajouter un test caractérisant le bogue
:::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition}
:class: hint
- Les *effets de bord* sont durs à tester!
:::
+++ {"slideshow": {"slide_type": "slide"}}
...
...
@@ -748,106 +759,97 @@ factorielle(1+2)
+++ {"slideshow": {"slide_type": "fragment"}}
#### Syntaxe
:::{admonition} Syntaxe
``` c++
nom(expression1, expression2, ...)
```
:::
+++ {"slideshow": {"slide_type": "fragment"}}
#### Sémantique
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Sémantique
1. Evaluation des expressions
Leurs valeurs sont les **paramètres réels**
+++ {"slideshow": {"slide_type": "fragment"}}
2. Allocation de mémoire sur la **pile** pour :
Leurs valeurs sont les ***paramètres réels***
2. Allocation de mémoire sur la ***pile*** pour :
- Les variables locales
- Les paramètres formels
+++ {"slideshow": {"slide_type": "fragment"}}
3. Affectation des paramètres réels aux paramètres formels
(par copie; les types doivent correspondre!)
+++ {"slideshow": {"slide_type": "fragment"}}
4. Exécution des instructions
+++ {"slideshow": {"slide_type": "fragment"}}
5. Lorsque `return expression` est rencontré, évaluation de
l'expression qui donne la **valeur de retour de la fonction**
+++ {"slideshow": {"slide_type": "fragment"}}
6. Désallocation des variables et paramètres sur la pile
+++ {"slideshow": {"slide_type": "fragment"}}
7. La valeur de l'expression `nom(...)` est donnée par la valeur de
retour
:::
+++ {"slideshow": {"slide_type": "slide"}}
#### Évolution de la pile sur l'exemple
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
1. État initial
:::
:::{grid-item-card}
<img src="media/pile-etat-initial.png" alt="1 case unique contenant '...'" height="20ex"/>
:::
::::
::::{grid-item-card}
:::{image} media/pile-etat-initial.png
:alt: 1 case unique contenant '...'"
:height: 20ex
::::
:::::
+++ {"slideshow": {"slide_type": "fragment"}}
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
1. Allocation de la mémoire sur la pile
:::
:::{grid-item-card}
<img src="media/pile-allocation.png" alt="3 cases ajoutées contenant 'int n : ? (paramètre formel)' puis 'int resultat : ? (variable locale)' puis 'int k : ? (variable locale)'. Les 3 cases sont entourées d'une accolade avec marqué 'f'" height="20ex"/>
::::
::::{grid-item-card}
:::{image} media/pile-allocation.png
:alt: "3 cases ajoutées contenant 'int n : ? (paramètre formel)' puis 'int resultat : ? (variable locale)' puis 'int k : ? (variable locale)'. Les 3 cases sont entourées d'une accolade avec marqué 'f'"
:height: 20ex
:::
::::
+++ {"slideshow": {"slide_type": "fragment"}}
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
3 : Affectation du paramètre réel au paramètre formel
:::
:::{grid-item-card}
<img src="media/pile-affectation.png" alt="le point d'interrogation après le n est remplacé par 3" height="20ex"/>
:::
::::
::::{grid-item-card}
:::{image} media/pile-affectation.png
:alt: "le point d'interrogation après le n est remplacé par 3"
:height: 20ex
::::
:::::
+++ {"slideshow": {"slide_type": "fragment"}}
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
4 : Exécution des instructions
:::
:::{grid-item-card}
<img src="media/pile-exécution.png" alt="Le point d'intrrogation après résultat est remplacé par '6' et celui après k par '4'" height="20ex"/>
:::
::::
::::{grid-item-card}
:::{image} media/pile-exécution.png
:alt: "Le point d'intrrogation après résultat est remplacé par '6' et celui après k par '4'"
:height: 20ex
::::
:::::
+++ {"slideshow": {"slide_type": "fragment"}}
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
5,6,7 : Désallocation de la mémoire sur la pile et valeur de retour
:::
:::{grid-item-card}
<img src="media/pile-retour.png" alt="les 3 cases de la pile sont supprimées. On revient à l'état de départ. La valeur 6 est écrite juste au dessus de la pile avec indiqué 'valeur de retour'" height="20ex"/>
:::
::::
::::{grid-item-card}
:::{image} media/pile-retour.png
:alt: "les 3 cases de la pile sont supprimées. On revient à l'état de départ. La valeur 6 est écrite juste au dessus de la pile avec indiqué 'valeur de retour'"
:height: 20ex
::::
:::::
+++ {"slideshow": {"slide_type": "slide"}}
...
...
@@ -908,21 +910,29 @@ b
- On peut les modifier.
- Mais ...
#### Rappel
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Rappel
:class: hint
Lors d'un appel de fonction ou de procédure, la valeur du paramètre réel
est **copiée** dans le paramètre formel.
:::
#### Conséquence
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Conséquence
- Une modification du paramètre formel n'affecte pas le paramètre
réel
- Si la variable est volumineuse (tableaux, chaîne de caractères,
etc.), cette copie peut être coûteuse
On dit que les paramètres sont passés **par valeur**.
:::
+++ {"slideshow": {"slide_type": "fragment"}}
On dit que les paramètres sont passés ***par valeur***.
Au second semestre, vous verrez le passage de paramètres **par référence**.
Au second semestre, vous verrez le passage de paramètres ***par référence***.
+++ {"slideshow": {"slide_type": "slide"}}
...
...
@@ -933,18 +943,17 @@ Au second semestre, vous verrez le passage de paramètres **par référence**.
+++ {"slideshow": {"slide_type": "slide"}}
### Fonctions particulières : procédures
### Fonctions particulières : ***procédures***
Besoin de sous-programmes qui *agissent* au lieu de *calculer* :
- On veut produire un effet (affichage, musique, *etc*)
- On veut modifier l'état interne d'une structure de donnée