diff --git a/.gradebook.db b/.gradebook.db index 095710177373085e56bbaffc2cac368d729f0c51..1ea2024a3c167792dba03764dcabc2535c3ca34e 100644 Binary files a/.gradebook.db and b/.gradebook.db differ diff --git a/00-jupyter-indentation.md b/00-jupyter-indentation.md index d1d548014f5629e52ad93777f129f9001570cea4..9aec54e319fc64966ca586cfbe7e8610ca9175c9 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 13462d90664b2c2813189bda60489ffe67e0cb52..0000000000000000000000000000000000000000 --- a/bla.txt +++ /dev/null @@ -1,3 +0,0 @@ - Noel - - 42 diff --git a/cours-etat-fichier.md b/cours-etat-fichier.md index 2b61684b457d5ff1e2fb9a5d69afe96e8ace7dbc..de8908c70cb92a2bc2b3834c06e2919000ae920f 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 25702dc55dc5bd076c1d38575935938603e60913..a6de34551878f86bb14e25d6d07e3c0f271e37c5 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 dd2c1a238f20acceb23f2e40b4a1ecf4b338ab8f..db8d33ed1d550a4f137fe2a03dfe6f07985358a8 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 5910aea76564d1dd4aa244d7cc6fbc45af57c2a0..bdf666c4ba6840701d40bd359b4f42c693f7b7d7 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 75eab07ac400e954a728e2d88410756d283c8ec2..ca415f8343d6b8287fc6a83e92d7b955d31897e7 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 284ab8f29560f4ad33f85f3135f47195d350481e..78be51ee6ac09987bb7fc35846a94fb20a415375 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 1200c6af874136d94a454e4135c831a5841760ec..55aa183f0c4b00b55ef7f6eafc333e771f209197 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 3a7e93c6cf9e9bc438dea6daab0c5314b908f32b..6fe59bcd0e0b047e240d6b5e95809dfe1b78dada 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