From e88fbf61f0b1fb57419285631a4f93d9f0223a2b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolas=20M=2E=20Thi=C3=A9ry?= <nthiery@users.sf.net>
Date: Mon, 4 Nov 2024 23:02:32 +0100
Subject: [PATCH] Errata

---
 .gradebook.db                       | Bin 176128 -> 180224 bytes
 00-jupyter-indentation.md           |   8 ++--
 bla.txt                             |   3 --
 cours-etat-fichier.md               |   1 -
 cours-fichiers.md                   |   1 -
 cours-flux-chaines-de-caracteres.md |   3 +-
 cours-flux.md                       |   2 +-
 cours.md                            |  12 +++++-
 fichier-ecriture.cpp                |   8 ++--
 index.md                            |  63 ++++++++++++++++++----------
 open_ppm.py                         |   9 ++--
 11 files changed, 68 insertions(+), 42 deletions(-)
 delete mode 100644 bla.txt

diff --git a/.gradebook.db b/.gradebook.db
index 095710177373085e56bbaffc2cac368d729f0c51..1ea2024a3c167792dba03764dcabc2535c3ca34e 100644
GIT binary patch
delta 2389
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
Hlb!zphY75%

delta 1589
zcmYk5Yitx%6vyY@nVsF)dE8wn6fC7f0gK%(?96n#yHZ;;G+<;!gb)EyW_M<6r45w^
zUl8a(5fDl#E4|c5mx2@_P+e*nz6e3%<C8!{k;tR!2Q?uOHHZ;Qyt5^SWHP^*d;a%-
z=A3(`wUuuj^6x707!*Z?I^|km<W_vJA%LFZ2c?PP8sR5tkS`Y&<?K;>rhI$5*UKgg
zllBaJz6QtxSGTjkE3nB)Nn6a!%gO_M`y2>BW?@HvA@TD`mnbwD%|%UUw{%y!gdB7^
zXP=RnDRdHKe!L-PhI^)Zy!p4~JLJrq>{K9RnzE~y$#jy-Ea{N_{=AJzq0a~W`%0wF
zUDe()CYS_^W@pYnFK2f2hk!S8vVSQn)G<k7+S5KO^UQ}$o`;zPahTp;wLc&qmzlr;
zW+)P1&~;)*h0q=J7y2Dt9|#71Knu#pleLG&lG`+a+{#!t=LG&1C43`Y62C)^V2F>A
z&#x0|(Qa{v@Hc-;>X2TPJ{EJr18B0a4b2tr2>oI)Y7$>SmnAu85Ayg{2wctAiG!!0
z494PfAut7u!M7_23h;z5!D##_foGK40Q_7Rkp=N~HxR%dxj^_^7ZU!*g@{Y06Sa_6
zU+X1m9ygE`;Kw^%aCpFt`||OcLnQ9S!)}1Zb7l~DaH9(bce<eQ2?7svJB_c+0P?Jn
zvdbv`CjTX$<zM0F^JVCQ6hw!_pT$9Oi?~D#3B$r!p;u@@uM2fTAxa`y`cwKs>XsU%
z+MNB1pUodmRc7eMB>dz|Z~-$jK`AM|uo{F(@pS}ZL6|8{g0$J#7*^tVK{c2}8qw<t
zM&YwAf_T_P0EZqSKzNA@32z|~#rrlZ`OTtm-%@16kH^6pP(d0~<ATF0UHI@`0>N9s
z6x~Z79Z|Emq?W`zc%BOezvhC*eFOpw5j8jRv3YgZF31cpfqzTfsdAWRFnn_~nHQD~
zQ)n62?eln-u~*n|&K}Rwc9_L0`r$FS&V%JvxSn`tTj60qJCEBi0|0ccY=oyhv|UP$
zzXSFm7TlqHSA0=6z>K3efZR*J0(uh=oQ3<~CP0q+VlUiFs%qX3<1j2cNA|-f0C~W-
z55VbiLQh!{Gi4~6Vrr_DsxnfR8dtP<G_EFeHJ$%u>9$f1*S`->y4y+*!fuzJ9E9z1
zBoWaSGoIEXl~q=x(l89A(o|Dc%8F`MIvyL@Zcp{$_CDCh$zCp5RLs4-+^IeUXVJXb
zBAc(8P0fvF3vN3CRp-nR_$)0aG&Qa2DZ_~BmY!1M<WeKLu9*o<iAJM(-qr2tI6qiV
ziHrHoe%be)_Yd#Wo==%_dL3Awvs1voY3*1pSzOG$5p>Wg*a~Ql<8a4msK|<LrnOi!
z7Ez3tsptt+RV+<WQZchK6^WVms<uO8@K7f_1`3>=yCDYt(RsVJXflcAFp!=3Z$S%?
z0X(q>X2}39?t+JTDlj4{BBBl=!sQq)BGZ&T1*hOX3@4K3uQ1#oN2|<O#L^R1#Hy@}
zX_2%QQ&pEyOE<}}jI?fJ3OR4?g$4kUbF&+M4TQ~QVm`yx29n{fo8h;2;5j_62evVO
z&M@)C9vFe#VmvVmA1tVlTN-3CiMssqsx>XL-e8y&cy<=n`WnkVJDgtKuo|~#p(a<V
zX(eV<DG}Xmu%?k&uoOi#;|VQpn!5IX%l$M}Pw_*(@2UDud#O|344ZvUn+~UWyILXR
dr<tP^zmhx79L?E1jPveRc$#%qu7!J;{{Szdwu1lw

diff --git a/00-jupyter-indentation.md b/00-jupyter-indentation.md
index d1d5480..9aec54e 100644
--- a/00-jupyter-indentation.md
+++ b/00-jupyter-indentation.md
@@ -59,13 +59,13 @@ Exécutez les deux cellules suivantes :
 
 ```{code-cell}
 Maliste=["I","love","Python"]
-for ligne in Maliste :
+for ligne in Maliste:
     print(ligne)
 ```
 
 ```{code-cell}
 Maliste=["I","love","Python"]
-for ligne in Maliste :
+for ligne in Maliste:
 print(ligne)
 ```
 
@@ -88,7 +88,7 @@ for ligne in range (0, len(Maliste)):
 print("Maliste contient ", a, " : ", Maliste[a])
 ```
 
-+++ {"deletable": false, "editable": false, "tags": []}
++++ {"deletable": false, "editable": false}
 
 ## Exercice
 
@@ -98,7 +98,7 @@ de sa souris](../Semaine6/00-jupyter-jeter-sa-souris.md)).
 
 :::{admonition} Raccourcis clavier
 
-* Utilisez <kbd>Tab</kbd> pour indenter .
+* Utilisez <kbd>Tab</kbd> pour indenter.
 * Pour désindenter utilisez <kbd>Maj</kbd>+<kbd>Tab</kbd>.
 * Pour indenter ou désindenter plusieurs lignes d'un coup,
   sélectionnez les avec <kbd>Maj</kbd>+<kbd>↑</kbd> ou <kbd>↓</kbd>
diff --git a/bla.txt b/bla.txt
deleted file mode 100644
index 13462d9..0000000
--- a/bla.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-     Noel    
-     
-         42
diff --git a/cours-etat-fichier.md b/cours-etat-fichier.md
index 2b61684..de8908c 100644
--- a/cours-etat-fichier.md
+++ b/cours-etat-fichier.md
@@ -374,4 +374,3 @@ tel échec au moyen d'une exception**.
 
 La notion d'état d'un flux s'utilise naturellement avec l'idiome «lire
 depuis un flux tant que la lecture se passe bien».
-
diff --git a/cours-fichiers.md b/cours-fichiers.md
index 25702dc..a6de345 100644
--- a/cours-fichiers.md
+++ b/cours-fichiers.md
@@ -225,4 +225,3 @@ lire ou n'en modifier qu'une fraction -- on parler d'accès aléatoire
 (*random access*) -- mais nous n'en aurons pas besoin ce semestre.
 
 :::
-
diff --git a/cours-flux-chaines-de-caracteres.md b/cours-flux-chaines-de-caracteres.md
index dd2c1a2..db8d33e 100644
--- a/cours-flux-chaines-de-caracteres.md
+++ b/cours-flux-chaines-de-caracteres.md
@@ -157,7 +157,7 @@ séparateur, et que l'on peut enchaîner ces lectures :
 slideshow:
   slide_type: fragment
 ---
-string s = "truc 33   bidule   2.5 reste"
+string s = "truc 33 bidule   2.5 reste"
 ```
 
 ```{code-cell}
@@ -470,4 +470,3 @@ Dans cette feuille:
 - Enfin nous avons noté que, grâce au concept de flux, on peut
   utiliser la même syntaxe que pour lire et écrire dans un fichier ou
   pour interagir avec l'utilisateur.
-
diff --git a/cours-flux.md b/cours-flux.md
index 5910aea..bdf666c 100644
--- a/cours-flux.md
+++ b/cours-flux.md
@@ -46,7 +46,7 @@ des données, successivement *l’une après l’autre*.
 
 :::{admonition} Syntaxe
 ```
-flux << expression
+flux << expression;
 ```
 :::
 
diff --git a/cours.md b/cours.md
index 75eab07..ca415f8 100644
--- a/cours.md
+++ b/cours.md
@@ -33,6 +33,17 @@ rise:
 
 ## Prélude
 
++++ {"slideshow": {"slide_type": "fragment"}, "tags": ["instructor-disabled"]}
+
+### Comment vous sentez-vous en ce début de cours?
+
+|                                                                   |         |
+|-------------------------------------------------------------------|---------|
+| <div style="width: 4ex; height: 4ex; background: green;"  ></div> | Curieux |
+| <div style="width: 4ex; height: 4ex; background: magenta;"></div> | Grognon |
+| <div style="width: 4ex; height: 4ex; background: yellow;" ></div> | Inquiet |
+| <div style="width: 4ex; height: 4ex; background: blue;"   ></div> | Épuisé  |
+
 +++ {"slideshow": {"slide_type": "slide"}}
 
 ### Annonces
@@ -217,4 +228,3 @@ Reste à définir la notion de fichier et à voir comment les manipuler en C++.
 - Examen mi semestre : sujet et solution sur la page web
 - Projet: première séance dans deux semaines; avancez d'ici là!
 - Bureau d'Intervention Pédagogique: maths, physique ET informatique
-
diff --git a/fichier-ecriture.cpp b/fichier-ecriture.cpp
index 284ab8f..78be51e 100644
--- a/fichier-ecriture.cpp
+++ b/fichier-ecriture.cpp
@@ -2,9 +2,9 @@
 using namespace std;
 
 int main() {
-    ofstream fichier;                           // Déclaration
-    fichier.open("bla.txt");                    // Ouverture
-    fichier << "Noel " << 42 << endl;           // Écriture
-    fichier.close();                            // Fermeture
+    ofstream flux;                                 // Déclaration
+    flux.open("pi.txt");                           // Ouverture
+    flux << "Pi vaut à peu près " << 3.14 << endl; // Écriture
+    flux.close();                                  // Fermeture
 }
 
diff --git a/index.md b/index.md
index 1200c6a..55aa183 100644
--- a/index.md
+++ b/index.md
@@ -31,6 +31,14 @@ kernelspec:
 
 ## TP
 
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "6ff5819dcd18e689494acb0ba1af242e", "grade": false, "grade_id": "cell-49", "locked": true, "schema_version": 3, "solution": false, "task": false}}
+
+### Exercice 0 : Jupyter : l'indentation
+
+À faire chez vous!
+
+- [Jupyter : l'indentation](00-jupyter-indentation.md)
+
 +++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "9dd26fe469908352fac43de3f823d14a", "grade": false, "grade_id": "cell-50", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 ### Exercice 1 : écrire dans un fichier - 20 minutes
@@ -55,7 +63,7 @@ kernelspec:
 
 ::::
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "932c2abdd5afab28b2820aa3e931555a", "grade": false, "grade_id": "cell-60", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8124382c9ab91f1d2004315ed95e82c1", "grade": false, "grade_id": "cell-60", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 1.  Consultez le fichier [fichier-ecriture.cpp](fichier-ecriture.cpp).
 
@@ -76,8 +84,8 @@ kernelspec:
 6.  Exécutez ce programme puis ouvrez le fichier `essai.txt` afin de
     vérifier son contenu.
 
-7.  Lisez et essayez à nouveau dans le cours les exemples de [lecture
-    depuis le clavier](cours-flux.md).
+7.  Lisez et essayez à nouveau dans le cours l'exemple de [lecture
+    depuis le clavier](cours-flux.md) avec `cin`.
 
 8.  En vous en inspirant, complétez le programme [cin.cpp](cin.cpp)
     pour que, à l’exécution, il demande à l’utilisateur d’entrer deux
@@ -103,16 +111,16 @@ kernelspec:
 
 ### Exercice 2 : ouvrir le smiley - 5 minutes
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "090a1e8ca046f04ddd14e2bfbf53fc87", "grade": false, "grade_id": "cell-80", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "5f1d313afad6f51ebf42d10eb2ea7a42", "grade": false, "grade_id": "cell-80", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 Le fichier [media/smiley.pbm](media/smiley.pbm) (dans le répertoire
 `media` donc!) contient l’image en noir et blanc du TD.
 
--   Ouvrez ce fichier d’abord avec un éditeur de texte. Depuis le
+1.  Ouvrez ce fichier d’abord avec un éditeur de texte. Depuis le
     navigateur de fichiers de JupyterLab: clic droit -> Ouvrir avec ->
     Éditeur.
 
--   Ouvrez ce même fichier avec un logiciel de vision d’images. Pour
+2.  Ouvrez ce même fichier avec un logiciel de vision d’images. Pour
     cela, depuis Jupyter, vous pouvez utiliser la cellule ci-dessous :
 
 ```{code-cell}
@@ -143,9 +151,9 @@ Alternativement :
 
 ### Exercice 3 : petit damier - 15 minutes
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "9abf0ebd131e32fb6dbf281385829a2c", "grade": false, "grade_id": "cell-90", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "7a193c543e70cced08244a1a71520334", "grade": false, "grade_id": "cell-90", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
--   Utilisez un éditeur de texte pour écrire à la main un **fichier
+1.  Utilisez un éditeur de texte pour écrire à la main un **fichier
     texte** `damier.pbm` contenant une image au format PBM
     ([*Portable Bit Map*](http://fr.wikipedia.org/wiki/Portable_bitmap))
     de taille 10×10 représentant un damier :
@@ -155,7 +163,7 @@ Alternativement :
     :alt: un damier
     :::
 
--   Visualisez le résultat, par exemple avec :
+2.  Visualisez le résultat, par exemple avec :
 
 ```{code-cell}
 from open_ppm import open_ppm
@@ -174,10 +182,10 @@ im.resize((256*im.width // im.height, 256))
 - Vérifiez l'entête de l'image:
     - la première ligne contient `P1` (format PBM), `P2` (format PGM)
       ou `P3` (format PPM);
-	- la deuxième ligne (sans compter les lignes de commentaires
+    - la deuxième ligne (sans compter les lignes de commentaires
       commençant par `#`) contient deux entiers: le nombre $c$ de
       colonnes et le nombre $l$ de lignes;
-	- pour les fichiers `pbm` ou `ppm`: la troisième ligne contient un
+    - pour les fichiers `pbm` ou `ppm`: la troisième ligne contient un
       entier $m$.
 - Vérifiez que le reste du fichier consiste d'entiers séparés par des
   espaces ou des sauts de ligne:
@@ -218,18 +226,28 @@ im = open_ppm("damier-automatique.pbm")
 im.resize((512*im.width // im.height, 512))
 ```
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "42c17d610a555a3332ff112e8938eea3", "grade": false, "grade_id": "cell-120", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8b8ba5a75745c14276324532d144a1fe", "grade": false, "grade_id": "cell-120", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 :::{hint} Indications
 
 -   Vous pouvez vous inspirer de [fichier-ecriture.cpp](fichier-ecriture.cpp).
 -   Commencez par un programme pour un damier 10×10 avant de passer à
     100×100.
+-   L'exécution de votre programme devrait être instantanée ou
+    presque. Si ce n'est pas le cas, interrompez le avec
+    <kbd>Ctrl</kbd>-<kbd>C</kbd>.
+-   Vérifiez la taille du fichier produit en tapant la commande suivante dans
+    le terminal :
+    ```
+    ls -lh *.pbm
+    ```
+    Il devrait faire dans les 20 kilo octets (20K). Veillez à le
+    supprimer s'il fait nettement plus que cela.
 -   Si le fichier produit ne donne pas l’image attendue, ou si vous
-    n'arrivez pas à le visualiser: reportez vous aux [indications
-	de l'exercice précédent](#indications_images).
--	Vous pouvez aussi dans un premier temps, si cela vous aide,
-    afficher le texte produit à l’écran avec `cout`; puis l'écrire
+    n'arrivez pas à le visualiser: reportez vous aux [indications de
+    l'exercice précédent](#indications_images).
+-   Si cela vous aide, vous pouvez aussi dans un premier temps
+    afficher le texte produit à l’écran avec `cout`; puis écrivez le
     dans le fichier dans un deuxième temps.
 
 :::
@@ -276,11 +294,11 @@ Tests automatiques :
 assert im.size == (10, 10), "l'image produite n'est pas de taille 10×10"
 ```
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "56e70fa9f0f44730cf722730c5fae9ab", "grade": false, "grade_id": "cell-150", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "65f16b8b10337cf30c2a8273bd57ff79", "grade": false, "grade_id": "cell-150", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 2.  Implantez un programme [degrade.cpp](degrade.cpp) qui écrit un
-	fichier contenant une image `degrade.pgm` de taille 128x128, avec
-	un dégradé de gris comme celui-ci :
+    fichier contenant une image `degrade.pgm` de taille 128x128, avec
+    un dégradé de gris comme celui-ci :
 
     :::{image} media/degrade.png
     :width: 20%
@@ -288,7 +306,8 @@ assert im.size == (10, 10), "l'image produite n'est pas de taille 10×10"
     :::
 
 ```{code-cell}
-open_ppm("degrade.pgm").resize((256*im.width // im.height, 256))
+im = open_ppm("degrade.pgm")
+im.resize((256*im.width // im.height, 256))
 ```
 
 Tests automatiques :
@@ -330,7 +349,7 @@ réciproquement).
 
 ### Exercice 7 : dégradé circulaire de rouge ♣
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "1aec375701d7e1a9221f311b7e4b07ec", "grade": false, "grade_id": "cell-210", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "a4badd45d2e8d7c755437d2bcc49f9bc", "grade": false, "grade_id": "cell-210", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 1.  Implantez un programme [degrade-circulaire.cpp](degrade-circulaire.cpp)
     qui écrit un fichier contenant une image `degrade-circulaire.ppm`
@@ -342,5 +361,5 @@ réciproquement).
     :alt: un dégradé circulaire
     :::
 
-			2.  Répétez, avec une image de taille 100×100.
+2.  Répétez, avec une image de taille 100×100.
 
diff --git a/open_ppm.py b/open_ppm.py
index 3a7e93c..6fe59bc 100644
--- a/open_ppm.py
+++ b/open_ppm.py
@@ -2,7 +2,10 @@ import os.path
 from PIL import Image
 def open_ppm(file):
     png = file[:-4]+".png"
-    os.system(f"convert {file} {png}")
-    image = Image.open(png)
-    os.unlink(png)
+    if os.path.isfile(png):
+        image = Image.open(png)
+    else:
+        os.system(f"convert {file} {png}")
+        image = Image.open(png)
+        os.unlink(png)
     return image
-- 
GitLab