Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (5)
No preview for this file type
......@@ -16,26 +16,25 @@ kernelspec:
:::{admonition} Objectif pédagogique
Mieux comprendre les deux types de cellules qui
composent un carnet Jupyter et permettent d'alterner texte riche et
code exécutable.
Mieux comprendre les deux types de cellules qui composent un carnet
Jupyter et permettent d'entrelacer texte riche et code exécutable.
:::
+++ {"deletable": false, "editable": false}
L'intérêt des carnets numériques est de permettre d'entremêler, au
L'intérêt des carnets numériques est de permettre d'entrelacer, au
sein d'un même document, **narration**, **interaction**, **calcul**,
**visualisation** et **programmation**. Pour cela, Jupyter propose un
modèle très simple : un carnet Jupyter est une simple succession de
cellules de deux types :
* Des cellules de texte riche, au format ***Markdown*** ;
* Des cellules de texte riche, au format ***Markdown*** / ***MyST***;
* Des cellules de code exécutable.
:::{admonition} [Markdown](https://fr.wikipedia.org/wiki/Markdown) : Kesako ?
* Un langage à balisage léger pour écrire du texte riche;
* Un langage à balisage léger pour écrire du texte riche.
* Avec une syntaxe facile à lire et écrire.
Markdown vous permet ainsi de rédiger du texte ***mis en forme*** et
......@@ -56,10 +55,22 @@ structuré (sections, listes à puces, ...) avec, par exemple :
:::
**Exercice 1 :**
:::{admonition} [MyST](https://mystmd.org)
- Consultez les cellules de texte riche de ce document pour voir
comment elles ont été rédigées en Markdown.
MyST est une extension de Markdown fournissant des structures
supplémentaires (encarts, références croisées, citations, inclusions,
...), doublée d'une collection d'outils pour publier des documents
scientifiques offrant une [navigation web riche](https://mystmd.org/guide).
:::
:::{admonition} Exercice 1
Consultez les cellules de texte riche de ce document pour voir comment
elles ont été rédigées en Markdown/MyST.
:::
+++ {"deletable": false, "editable": false}
......@@ -67,17 +78,19 @@ structuré (sections, listes à puces, ...) avec, par exemple :
* À la souris : dans la barre d'outil de la feuille, sélectionnez
`Markdown` ou `Code`.
* Au clavier: passez en mode commande (voir le
[tutoriel](concept-mode-edition-vs-commande.md)) puis utilisez
<kbd>Y</kbd> pour convertir une cellule Markdown en cellule de code.
* Au clavier : passez en [mode
commande](../Semaine2/00-jupyter-mode-edition-vs-commande.md) puis
utilisez <kbd>Y</kbd> pour convertir une cellule Markdown en cellule
de code.
* Inversement, toujours en mode commande, utilisez <kbd>M</kbd> pour
convertir une cellule de code en cellule de Markdown.
+++ {"deletable": false, "editable": false}
**Exercice 2 :** La cellule ci-dessous est « accidentellement » une
cellule de texte. Changez-la en cellule de code pour pouvoir
l'exécuter :
:::{admonition} Exercice 2
La cellule ci-dessous est « accidentellement » une cellule de
texte. Changez-la en cellule de code pour pouvoir l'exécuter.
:::
+++ {"deletable": false, "editable": false}
......@@ -86,12 +99,13 @@ codecs.decode('Oenib!', 'rot_13')
+++ {"deletable": false, "editable": false}
## En savoir plus sur la syntaxe Markdown
## En savoir plus sur la syntaxe Markdown
Voici quelques tutoriels :
Voici quelques tutoriels que vous pourrez explorer après le TP :
* [Tutoriel Markdown (SNDS)](https://documentation-snds.health-data-hub.fr/contribuer/guide_contribution/tutoriel_markdown.html)
* [La syntaxe Markdown (Framasoft)](https://docs.framasoft.org/fr/grav/markdown.html)
* Le chapitre «Authoring» du [guide de MyST](https://mystmd.org/guide)
+++ {"deletable": false, "editable": false}
......
......@@ -14,11 +14,13 @@ kernelspec:
# TP : premières fonctions
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "7c56137d066444109bb04444924dccca", "grade": false, "grade_id": "cell-8b56bb2323e686a8", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "fa28aa0e65e07eb070cacc788c8bae4d", "grade": false, "grade_id": "cell-8b56bb2323e686a8", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition} Exercice 1 : renvoyer versus afficher
1. Exécutez les cellules suivantes qui définissent deux fonctions.
1. Les deux cellules suivantes définissent respectivement les
fonctions `abs` et `afficheAbs`; notez les différences entre ces
deux fonctions, puis exécutez les cellules.
:::
......@@ -90,9 +92,9 @@ void afficheAbs(int a) {
}
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "7e7caeab8de8f579ae9909114c065692", "grade": false, "grade_id": "cell-ebbfec0d5cb0e626", "locked": true, "schema_version": 3, "solution": false, "task": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "07d4990e2e6eb3cd10eda103227d8b50", "grade": false, "grade_id": "cell-ebbfec0d5cb0e626", "locked": true, "schema_version": 3, "solution": false, "task": false}}
:::{admonition}
:::{admonition} Exercice 1 (suite)
2. Observez les appels suivants; y a-t-il une différence entre `abs` et `afficheAbs`?
......@@ -184,23 +186,23 @@ nbgrader:
afficheAbs(-3) == 3
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "16917a0a8c100643d2750beb8dbe5e60", "grade": false, "grade_id": "cell-6f19e46ffe7ff87b", "locked": true, "schema_version": 3, "solution": false, "task": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "9d5904ef8252d11c5039bde5c1927164", "grade": false, "grade_id": "cell-6f19e46ffe7ff87b", "locked": true, "schema_version": 3, "solution": false, "task": false}}
:::{hint} Explication
`abs` **renvoie** une valeur alors que `afficheAbs` ne fait
qu'**afficher** une valeur. On notera ci-dessus que, avec `abs(3);`,
Jupyter ne montre pas du tout la valeur alors que, avec `abs(3)`,
Jupyter montre la valeur avec son type (`int`). Inversement
`afficheAbs` affiche la valeur mais ne la renvoie pas.
`abs` **renvoie** une valeur alors que `afficheAbs` l'**affiche**. On
notera ci-dessus que, avec `abs(3);`, Jupyter ne montre pas du tout la
valeur alors que, avec `abs(3)`, Jupyter montre la valeur avec son
type (`int`). Inversement `afficheAbs` affiche la valeur mais ne la
renvoie pas.
:::
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "91faf38ccc11ad8e27da683b0e4b19ee", "grade": false, "grade_id": "cell-d95a34f5ac81eb33", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "008fd5d8f8e30dc8a1f669ebaf169b3a", "grade": false, "grade_id": "cell-d95a34f5ac81eb33", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition}
:::{admonition} Exercice 1 (suite)
3. Essayez de deviner le résultat des appels suivants puis exécutez pour
vérifier :
vérifier :
:::
```{code-cell}
......@@ -239,7 +241,7 @@ afficheAbs(-5) + afficheAbs(3)
% REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "d7702f1f71ea6744ffc03e096f8cfe3e", "grade": false, "grade_id": "cell-b9cda32e468d6d8b", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "5c22358233e1f18c4b65007666d256c8", "grade": false, "grade_id": "cell-b9cda32e468d6d8b", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition} Exercice 2 : une fonction utilisant une fonction
......@@ -249,6 +251,8 @@ afficheAbs(-5) + afficheAbs(3)
précédentes, `afficheAbs` ou `abs`; laquelle faut-il choisir?
Pourquoi?** ⚠️
:::
```{code-cell}
---
deletable: false
......@@ -272,22 +276,23 @@ int distance(int a, int b) {
}
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "04d10b0e8310abdeffc474e92f24f0e5", "grade": false, "grade_id": "cell-cf373e1ce7210f3a", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "78fd3c6d1136c7c9a067ca0637bbb03d", "grade": false, "grade_id": "cell-cf373e1ce7210f3a", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition}
2. Vérifiez le comportement de votre fonction `distance` sur l'exemple
ci-dessous; essayez sur quelques autres exemples; corrigez la fonction
si nécessaire :
:::{admonition} Exercice 2 (suite)
2. Vérifiez le comportement de votre fonction `distance` sur
l'exemple ci-dessous; essayez sur quelques autres exemples;
corrigez la fonction si nécessaire :
:::
```{code-cell}
distance(5,3)
```
:::{admonition}
:::{admonition} Exercice 2 (suite)
3. Les tests ci-dessous automatisent partiellement la vérification du
comportement de votre fonction; comme la valeur attendue est
spécifiée. Vérifiez que l'on obtient bien `true` à chaque fois :
comportement de la fonction `distance`, en spécifiant chaque fois
la valeur attendue. Vérifiez que l'on obtient bien `true` à chaque
fois :
:::
```{code-cell}
......@@ -338,7 +343,7 @@ nbgrader:
distance(2,-5) == 7
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f35b2e8ae8e366a950fd629dea044cf9", "grade": false, "grade_id": "cell-f389d530bfbe35e0", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f73aeb18a3e712c8fa0421caa3fc2070", "grade": false, "grade_id": "cell-f389d530bfbe35e0", "locked": true, "schema_version": 3, "solution": false}}
::::{admonition} Exercice 3 : tests automatiques
......@@ -350,14 +355,15 @@ savoir d'où il provient, nous allons rassembler les tests en une seule
cellule à l'aide de l'infrastructure d'automatisation des tests vue en
cours.
1. Essayez les exemples suivants. Si vous avez une erreur du type `no
member named 'cerr'`, vous avez probablement redémarré le noyau en
oubliant d'exécuter la première cellule de cette feuille contenant
`#include <iostream>`.
1. Essayez les exemples suivants.
:::{admonition} Astuce
:class: tip
Si vous avez une erreur du type `no member named 'cerr'`, vous avez
probablement redémarré le noyau en oubliant d'exécuter la première
cellule de cette feuille contenant `#include <iostream>`.
À chaque fois que vous redémarrez le noyau, allez ensuite dans
`Cellule` -> `Exécuter toutes les précédentes`. Cela exécute toutes
les cellules qui sont avant celle où vous vous trouvez. Vous éviterez
......@@ -384,19 +390,15 @@ CHECK ( 1 < 2 );
CHECK ( 1 > 2 );
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "4e74432c8558d2e47373df592b782000", "grade": false, "grade_id": "cell-4f9b5f26274b8d47", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8f49d3fe4d88760d05c6d455d3854d7a", "grade": false, "grade_id": "cell-4f9b5f26274b8d47", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition}
2. On remarque que, si la condition en paramètre de `CHECK` est vraie, il
n'y a aucun affichage. Par contre si la condition est fausse, un
message d'erreur indiquant la condition fausse est affiché.
:::
:::{admonition} Exercice 3 (suite)
Notez que, si la condition en paramètre de `CHECK` est vraie, il n'y a
aucun affichage. Par contre si la condition est fausse, un message
d'erreur indiquant la condition fausse est affiché.
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "813e664c8c9349df5e978d2681e9f41c", "grade": false, "grade_id": "cell-c7c30794bfe3d639", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition}
3. Avec `CHECK`, les tests de la fonction `distance` se mettent sous la
forme :
Avec `CHECK`, les tests de la fonction `distance` se mettent sous la
forme :
:::
```{code-cell}
......@@ -418,16 +420,12 @@ CHECK ( distance(-4,2) == 6 );
CHECK ( distance(2,-5) == 7 );
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "382f4acd02d681e81dc7cb369214f0ad", "grade": false, "grade_id": "cell-5a60b1893097e9fd", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition}
Exécutez ces tests. Leur exécution ne devrait rien afficher.
:::
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "5db99dfbb8f4893b20fcaee77e070091", "grade": false, "grade_id": "cell-5a60b1893097e9fd", "locked": true, "schema_version": 3, "solution": false}}
+++
:::{admonition} Exercice 3 (suite)
2. Exécutez ces tests. Leur exécution ne devrait rien afficher.
:::{admonition}
4. Exécutez les deux cellules suivantes pour définir et tester la
3. Exécutez les deux cellules suivantes pour définir et tester la
fonction `maxAbs`. Corrigez la fonction pour qu'elle passe les tests.
:::
......@@ -467,10 +465,10 @@ CHECK( maxAbs(-15, 5) == 15 );
CHECK( maxAbs( -2, -3) == 3 );
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8dee2f9c194145aeed7f4ca64ff3189a", "grade": false, "grade_id": "cell-586e9cd851617645", "locked": true, "schema_version": 3, "solution": false, "task": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8defd9e38add13a8100b5e138df7ddab", "grade": false, "grade_id": "cell-586e9cd851617645", "locked": true, "schema_version": 3, "solution": false, "task": false}}
:::{admonition}
5. Ajoutez un test avec les valeurs 5 et -15, dans cet ordre :
:::{admonition} Exercice 3 (suite)
4. Ajoutez un test avec les valeurs 5 et -15, dans cet ordre :
:::
```{code-cell}
......@@ -489,10 +487,10 @@ nbgrader:
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "d8200e589afa199999dd08f0ab5b6ee3", "grade": false, "grade_id": "cell-d27b0a203d050706", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "e23fcc5f4ec2f1631575f1543948e0b0", "grade": false, "grade_id": "cell-d27b0a203d050706", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition} Exercice 4 (à la maison)
Mêmes consignes que pour l'exercice 1 avec la fonction suivante:
Mêmes consignes que pour l'exercice 2 avec la fonction suivante :
:::
```{code-cell}
......@@ -613,9 +611,9 @@ nbgrader:
// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "47eddfdb2cccf040405fdf006b36e8ea", "grade": false, "grade_id": "cell-e103b2353b1c2e15", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "4264e387a5e1dbe1e94d598f64cec5e5", "grade": false, "grade_id": "cell-e103b2353b1c2e15", "locked": true, "schema_version": 3, "solution": false}}
:::{admonition}
:::{admonition} Exercice 5 (suite)
2. Vérifiez son fonctionnement sur les exemples et tests ci-dessous :
:::
......
......@@ -130,7 +130,7 @@ nbgrader:
(a == b)
```
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "a03b3b94828a1e69046a2b0ffb1bd3c2", "grade": false, "grade_id": "cell-5017bdc388a2f6c4", "locked": true, "schema_version": 3, "solution": false}}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "b176aaa4d92d7a9b9db2491886070c43", "grade": false, "grade_id": "cell-5017bdc388a2f6c4", "locked": true, "schema_version": 3, "solution": false}}
### Précision absolue
......@@ -139,18 +139,17 @@ nbgrader:
Chaque fois que l'on veut comparer deux nombres flottants, il faut
spécifier avec quelle **précision** on veut les comparer.
Le plus simple est de fixer un seuil de ***précision
absolue*** $\eta$, c'est-à-dire la différence de valeur en dessous de
laquelle on considère que deux nombres sont égaux :
Pour cela, on fixe un seuil de ***précision absolue*** $\eta>0$ et on
considère que deux nombres $x$ et $y$ sont égaux à $\eta$ près si :
$$x \simeq y \texttt{si} |x - y| < \eta .$$
$$ |x - y| < \eta .$$
:::
:::{admonition} Exercice 2
Implantez les deux fonctions suivantes dont on vous donne la documentation :
- `abs` mais qui prend cette fois en paramètre un `double` et retourne
- `abs` qui prend cette fois en paramètre un `double` et retourne
un `double`
- `egal` qui prend en paramètres les nombres $x$, $y$ et $\varepsilon$.
......
......@@ -183,8 +183,8 @@ uniquement avec ces instructions
##### Tarte tatin
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
- Ingrédients : 5 belles pommes, ingrédients pour pâte brisée et caramel
- *Préparer une pâte brisée*
- *Préparer un caramel* et le verser au fond du plat à tarte
......@@ -192,11 +192,13 @@ uniquement avec ces instructions
- Faire revenir les pommes dans une poêle avec du beurre
- Disposer les pommes dans le plat, et étaler la pâte au dessus
- Faire cuire 45 minutes et retourner dans une assiette
:::
:::{grid-item-card}
<img src="media/tarte-tatin.jpg" height=20ex alt="une tarte tatin" />
::::
::::{grid-item-card}
:::{image} media/tarte-tatin.jpg
:alt: une tarte tatin
:::
::::
:::::
+++ {"slideshow": {"slide_type": "slide"}}
......@@ -227,10 +229,8 @@ uniquement avec ces instructions
#### Une impression de déjà vu? (1)
<!-- TODO IMG -->
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
```c++
while ( regarde() == Vide ) {
......@@ -258,20 +258,21 @@ while ( regarde() == Vide ) {
}
ouvre();
```
:::
:::{grid-item-card}
<img src="media/laby2c.png" style="float: right;" alt="laby niveau 2c" height="30ex"/>
::::
::::{grid-item-card}
:::{image} media/laby2c.png
:alt: "laby niveau 2c"
:height: 30ex
:::
::::
:::::
+++ {"slideshow": {"slide_type": "slide"}}
#### Une impression de déjà vu? (2)
<!-- TODO IMG -->
::::{grid}
:::{grid-item-card}
:::::{grid}
::::{grid-item-card}
```c++
void avance_tant_que_tu_peux() {
while ( regarde() == Vide ) {
......@@ -291,11 +292,14 @@ droite();
avance_tant_que_tu_peux();
ouvre();
```
:::
:::{grid-item-card}
<img src="media/laby2c.png" alt="laby niveau 2c" height="20ex"/>
::::
::::{grid-item-card}
:::{image} media/laby2c.png
:alt: "laby niveau 2c"
:height: 30ex
:::
::::
:::::
+++ {"slideshow": {"slide_type": "slide"}}
......@@ -372,8 +376,6 @@ slideshow:
pow(2, 3)
```
<!-- -->
+++ {"slideshow": {"slide_type": "slide"}}
#### On remarque
......@@ -475,13 +477,11 @@ slideshow:
factorielle(5) / factorielle(3) / factorielle(2)
```
<!-- -->
+++ {"slideshow": {"slide_type": "slide"}}
### Syntaxe d'une fonction
**Syntaxe :**
:::{admonition} Syntaxe
``` c++
type nom(type1 parametre1, type2 parametre2, ...) {
......@@ -490,11 +490,12 @@ type nom(type1 parametre1, type2 parametre2, ...) {
return expression;
}
```
- `parametre1, parametre2, ...` : les **paramètres formels**
- `parametre1, parametre2, ...` : les ***paramètres formels***
- Le type des paramètres formels est fixé
- Les variables sont appelées **variables locales**
- À la fin, la fonction **renvoie** la valeur de `expression`
- Les variables sont appelées ***variables locales***
- À la fin, la fonction ***renvoie*** la valeur de `expression`
Celle-ci doit être du type annoncé
:::
+++ {"slideshow": {"slide_type": "slide"}}
......@@ -518,7 +519,7 @@ float max(float a, float b) {
+++ {"slideshow": {"slide_type": "fragment"}}
- `max` n'est utilisée que si elle est *appelée*
- `max` n'est utilisée que si elle est ***appelée***
+++ {"slideshow": {"slide_type": "fragment"}}
......@@ -534,7 +535,7 @@ max(1.5, 3.0)
+++ {"slideshow": {"slide_type": "fragment"}}
1. les **paramètres** `a` et `b` sont initialisés avec les valeurs `1.5` et `3.0`
1. les paramètres `a` et `b` sont initialisés avec les valeurs `1.5` et `3.0`
+++ {"slideshow": {"slide_type": "fragment"}}
......@@ -546,7 +547,7 @@ max(1.5, 3.0)
+++ {"slideshow": {"slide_type": "fragment"}}
4. le `return` spécifie la **valeur de retour** de la fonction :
4. le `return` spécifie la ***valeur de retour*** de la fonction :
la valeur de l'expression `max(1.5, 3.0)`
+++ {"slideshow": {"slide_type": "slide"}}
......@@ -557,7 +558,7 @@ max(1.5, 3.0)
### Documentation d'une fonction (syntaxe javadoc)
**Exemple :**
:::{admonition} Exemple
``` c++
/** Fonction qui calcule la factorielle
......@@ -566,21 +567,24 @@ max(1.5, 3.0)
**/
int factorielle(int n) ...
```
:::
+++ {"slideshow": {"slide_type": "fragment"}}
**Une bonne documentation :**
:::{admonition} Une bonne documentation :
:class: hint
- Est concise et précise
- Donne les *préconditions* sur les paramètres
- Décrit le résultat (ce que fait la fonction)
:::
+++ {"slideshow": {"slide_type": "fragment"}}
**Astuce pour être efficace :**
:::{admonition} Astuce pour être efficace
:class: hint
- *Toujours commencer par écrire la documentation*
De toute façon il faut réfléchir à ce que la fonction va faire!
:::
+++ {"slideshow": {"slide_type": "slide"}}
......@@ -619,42 +623,47 @@ CHECK( factorielle(3) == 6 );
CHECK( factorielle(4) == 24 );
```
+++ {"slideshow": {"slide_type": "fragment"}}
<!-- **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 +757,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"}}
......@@ -897,8 +897,6 @@ slideshow:
b
```
<!-- -->
+++ {"slideshow": {"slide_type": "slide"}}
### Passage des paramètres par valeur
......@@ -908,21 +906,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 +939,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
On parle d'**effet de bord**
On parle d'***effet de bord***
+++ {"slideshow": {"slide_type": "fragment"}}
**Exemple :**
:::{admonition} Exemple
``` c++
void avance_tant_que_tu_peux() {
while ( regarde() == Vide ) {
......@@ -952,6 +957,7 @@ void avance_tant_que_tu_peux() {
}
}
```
:::
+++ {"slideshow": {"slide_type": "fragment"}}
......@@ -967,6 +973,7 @@ void avance_tant_que_tu_peux() {
### Fonctions particulières : fonctions récursives ♣
:::{admonition} Exemple
``` c++
int factorielle(int n) {
if ( n == 0 ) {
......@@ -976,23 +983,29 @@ int factorielle(int n) {
}
}
```
:::
+++
+++ {"slideshow": {"slide_type": "fragment"}}
Une ***fonction*** récursive est une fonction qui s'appelle
:::{admonition} Définition
Une ***fonction récursive*** est une fonction qui s'appelle
elle-même.
:::
Cela peut paraître étrange de définir un objet à partir de lui-même,
mais c'est comme pour les suites définies par récurrence en
mathématiques: il faut et il suffit de s'assurer d'avoir un cas de
base et une étape de récurrence bien posée.
**Exercice :**
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Exercice
- Exécuter pas à pas :
- `factorielle(0)`
- `factorielle(3)`
- `factorielle(-1)`
:::
+++ {"slideshow": {"slide_type": "slide"}}
......@@ -1023,7 +1036,3 @@ base et une étape de récurrence bien posée.
- *Tests* : ce que fait la fonction (exemples)
- *Code* : comment elle le fait
```{code-cell}
```
......@@ -10,11 +10,11 @@ kernelspec:
name: xcpp17
---
+++ {"deletable": false, "editable": false}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "6b4cbdb783554a0768adbc2c31d3460f", "grade": false, "grade_id": "cell-a76a81a6d9d9fcd6", "locked": true, "schema_version": 3, "solution": false, "task": false}}
# Semaine 4 : fonctions
+++ {"deletable": false, "editable": false}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "4ebf6e06474b40503e8a90653b021842", "grade": false, "grade_id": "cell-04368656d70a4aa5", "locked": true, "schema_version": 3, "solution": false, "task": false}}
Le but de cette semaine est de vous familiariser avec la programmation
de **fonctions**, avec **tests** et **documentation**, et d'acquérir
......@@ -23,15 +23,37 @@ TD, nous étudierons en sus la sémantique de l'appel de fonction, en
raffinant le modèle de mémoire vu la semaine précédente (introduction
de la *pile*).
+++ {"deletable": false, "editable": false}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f64724baf0aff18d6ef0dc6113085227", "grade": false, "grade_id": "cell-39f9746b54bcb579", "locked": true, "schema_version": 3, "solution": false, "task": false}}
## [Cours](cours.md)
+++ {"deletable": false, "editable": false}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f606f4638795c86ed28c826067056204", "grade": false, "grade_id": "cell-d11abd4b88489034", "locked": true, "schema_version": 3, "solution": false, "task": false}}
## [TD : des fonctions, des tests et de la documentation](https://nicolas.thiery.name/Enseignement/Info111/Devoirs/Semaine4/TD.html)
+++ {"deletable": false, "editable": false}
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "5bc93326a76778f342403a3a2da77e44", "grade": false, "grade_id": "cell-c318c058ced5f224", "locked": true, "schema_version": 3, "solution": false, "task": false}}
## Exercices d'entraînement
+++ {"deletable": false}
:::{admonition} À faire en TP
- [ ] Si vous n'avez pas encore eu l'occasion de le faire, effectuez
la feuille [01-entraînement](../Semaine3/01-entraînement.md) de
la Semaine 3.
:::
:::{admonition} À faire à la maison
- [ ] Une demi heure à une heure d'exercices d'entraînement sur tous
les thèmes jusqu'à «test de fonctions». Idéalement en étalant
sur plusieurs séances courtes pour optimiser la mémorisation.
:::
+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "06c5af98ee2626d63fdc8d6a85d77abf", "grade": false, "grade_id": "cell-63659b16ddee9051", "locked": true, "schema_version": 3, "solution": false, "task": false}}
## TP
......@@ -43,8 +65,8 @@ de la *pile*).
- [ ] [02-exponentielle1.md](02-exponentielle1.md)
- [ ] [02-exponentielle2.md](02-exponentielle2.md)
- [ ] [02-exponentielle3.md](02-exponentielle3.md)
- [ ] [02-exponentielle4.md](02-exponentielle4.md)
- [ ] [02-exponentielle5.md](02-exponentielle5.md)
- [ ] [02-exponentielle4.md](02-exponentielle4.md)
- [ ] [02-exponentielle5.md](02-exponentielle5.md)
- [ ] [Point de chute ♣](03-point-de-chute.md)
- [ ] [Implanter les fonctions sinus et cosinus ♣](04-sinus-cosinus.md)