# source_cell

id: 3b6d8fbd47814b5484e995e5eeb438d1
name: cell-11
cell_type: markdown
checksum: aa180c565a76aaf9b3900bf48538ebf7
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  :::{todo} 2025-2026

  Renforcer les tests automatiques, et les faire vérifier par nbgrader.
  Pour cela, il faudra:
  - automatiser la compilation et l'exécution des programmes.
  - enregistrer sous git les images générées à la main.

  Éviter la dépendance en imagemagick, en utilisant par exemple
  [netpbmfile](https://pypi.org/project/netpbmfile/) pour lire et écrire
  des images pbm.

  :::

  <!--

  +++ {"deletable": false, "editable": false}

  ## Planning

  En amphi virtuel lundi matin, nous ferons une séance de questions-réponses sur le [projet](http://nicolas.thiery.name/Enseignement/Info111/projet.html), le [cours](#Cours) et, si le temps le permets, les exercices de TD et de TP ([salles virtuelles](https://ecampus.paris-saclay.fr/course/view.php?id=24335#section-5), [Foire-Aux-Questions](https://hackmd.io/_EOMSwynS1uJ9k_w7XXWWQ)). 

  En TD, nous continuerons les exercices de la feuille de TD.

  En TP, nous continuerons les exercices de TP ci-dessous.

  ## Consignes

  - Avant le TD: avoir lu le <a href="TD.pdf">sujet de TD</a> et commencé les exercices
  - Avant le TP: avoir lu le sujet de TP<br>
    LDD IM et MNSI: avoir fait les exercices de TD

  Plus vous faites d'exercices en amont des TDs et TPs, plus vous êtes efficaces:
  cela vous permet en effet de bénéficier de l'aide de vos enseignants lorsque
  vous en avez le plus besoin.
  !-->


id: 78f439e465da49758586ac002a5711c3
name: cell-20
cell_type: markdown
checksum: dc414efeceffd39f0262e39fbf550a1d
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  ## <a name=Cours/>[Cours](cours.md)

  - Cours : [flux de données](cours-flux.md)
  - Cours : [fichiers](cours-fichiers.md)
  - Cours : [état d'un fichier](cours-etat-fichier.md)
  - Cours : [lecture et écriture dans des chaînes de caractères](cours-flux-chaines-de-caracteres.md)


id: 652e730d9f6847fa880c6e7f6501027c
name: cell-60
cell_type: markdown
checksum: 932c2abdd5afab28b2820aa3e931555a
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  1.  Consultez le fichier [fichier-ecriture.cpp](fichier-ecriture.cpp).

  2.  Essayez de deviner ce que fait ce programme.

  3.  Exécutez ce programme.
      
  4.  Trouvez le fichier `.txt` qui a été créé à l’exécution et l’ouvrir
      avec un éditeur de texte. Que contient-il?

  5.  Copiez le contenu de [fichier-ecriture.cpp](fichier-ecriture.cpp)
      dans [fichier-ecriture-v2.cpp](fichier-ecriture-v2.cpp), et
      adaptez le pour qu’à l’exécution il écrive un fichier nommé
      `essai.txt` contenant le texte «17 fois 23 vaut» suivi de la
      valeur de ce nombre (valeur que le programme calcule par
      lui-même).

  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).

  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
      entiers, puis qu’il écrive un fichier nommé `multiplication.txt`
      contenant un texte similaire au fichier `essai.txt` de la question
      précédente, avec 17 et 23 remplacés respectivement par les deux
      entiers choisis par l’utilisateur.
      
      :::{note}
      
      Pour faire des affichages à l’écran et pour faire saisir des
      données depuis le clavier, il faut inclure la bibliothèque
      `iostream` en écrivant `#include <iostream>`. Pour lire et écrire
      dans un fichier de texte, il faut inclure la bibliothèque
      `fstream` en écrivant `#include <fstream>`

      :::

  9.  Exécutez le programme puis ouvrez le fichier `multiplication.txt`
      pour vérifier son contenu.


id: b026e10b50a3447195caa235c87ac901
name: cell-80
cell_type: markdown
checksum: 090a1e8ca046f04ddd14e2bfbf53fc87
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  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
      navigateur de fichiers de JupyterLab: clic droit -> Ouvrir avec ->
      Éditeur.

  -   Ouvrez ce même fichier avec un logiciel de vision d’images. Pour
      cela, depuis Jupyter, vous pouvez utiliser la cellule ci-dessous :


id: a19f2498f6914b0ca273afeeaaf122eb
name: cell-90
cell_type: markdown
checksum: 9abf0ebd131e32fb6dbf281385829a2c
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  -   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 :

      :::{image} media/damier_svg.png
      :width: 10%
      :alt: un damier
      :::

  -   Visualisez le résultat, par exemple avec :


id: 6621a938285f458bafbfaa1cc2da0e56
name: cell-110
cell_type: markdown
checksum: 792992fb2ce3f4d9bf342c4bee84e65a
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  Complétez le **programme C++** [damier.cpp](damier.cpp) qui, lorsqu’on
  l’exécute, écrit un fichier image `damier-automatique.pbm` comme le
  précédent, mais cette fois pour un damier 100x100.

  Visualisez et vérifiez au fur et à mesure le résultat avec :


id: fbd7914a423d461c8982eb15096d10db
name: cell-120
cell_type: markdown
checksum: 42c17d610a555a3332ff112e8938eea3
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  :::{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.
  -   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
      dans le fichier dans un deuxième temps.

  :::


id: db07a8701883456d84c55a648b1e3e31
name: cell-130
cell_type: markdown
checksum: fec81568499bca600d3cae6fb9dc41c0
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  ### Exercice 5 : dégradé de gris

  Pour créer une image avec des nuances de gris, il faut enregistrer un
  fichier de texte au format PGM ([Portable Gray Map](http://fr.wikipedia.org/wiki/Portable_graymap)). Ce fichier doit
  contenir des nombres entre 0 et une valeur maximale (au choix) qui
  représenteront les différentes nuances de gris.


id: 34c7a56dab6344409c7a6582b4901f0d
name: cell-140
cell_type: markdown
checksum: 3175edfdcd2ba6f573443ce9504466dd
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  1.  Écrivez à la main, dans un éditeur de texte, un fichier
      `essai.pgm` représentant une image de taille 10×10 contenant
      différentes nuances de gris de votre choix. Vérifiez au fur et à
      mesure le résultat avec :


id: b0460c3cf4ba4021bb7a3a190b76d362
name: cell-150
cell_type: markdown
checksum: 56e70fa9f0f44730cf722730c5fae9ab
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  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 :

      :::{image} media/degrade.png
      :width: 20%
      :alt: un dégradé de gris
      :::


id: 56355f584eb04602a7f74549e0d611e5
name: cell-180
cell_type: markdown
checksum: f3fa5bea0ea3429d63f52fd66e7d3369
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  Implantez un programme [videoInverse.cpp](videoInverse.cpp)
  qui lit un fichier contenant une image au format
  PGM (par exemple le fichier `media/image.pgm` fourni), et écrit un fichier
  contenant la même image en vidéo inverse (clair remplacé par sombre et
  réciproquement).


id: e5b3d8afb1f94c3e9200377ac391b2ac
name: cell-190
cell_type: markdown
checksum: 2a4cc77ee0d0dcd169aad954bff7fd0a
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  :::{hint} Indication Implantez une fonction

  ``` c++
      /** Image en vidéo inverse
       * @param image1: le nom du fichier contenant l'image à lire
       * @param image2: le nom du fichier pour l'image à écrire
       **/
      void videoInverse(string image1, string image2);
  ```
  :::


id: 0feceed7c3e54062bf7536baccaf39bd
name: cell-210
cell_type: markdown
checksum: 1aec375701d7e1a9221f311b7e4b07ec
notebook_id: a700c18f4f5040e99cd5f6a837d5fd32
source:
  1.  Implantez un programme [degrade-circulaire.cpp](degrade-circulaire.cpp)
      qui écrit un fichier contenant une image `degrade-circulaire.ppm`
      au format PPM de taille 255×255, avec
      un dégradé circulaire de rouge:  

      :::{image} media/degrade-circulaire.png
      :width: 20%
      :alt: un dégradé circulaire
      :::

  			2.  Répétez, avec une image de taille 100×100.


id: df46a018dd08478ab559a80e20d5d104
name: 10
cell_type: markdown
checksum: f5852144d8c280849593821fe14b589d
notebook_id: b673471bfe93449db32bbd204b4147b7
source:
  ::::{admonition} Exercice 1 : Fichiers

  On considère la fonction `mystere` suivante, avec un exemple d'appel :

  :::{literalinclude} manipulation-fichiers-correction.cpp
  :start-after: BEGIN mystere
  :end-before: END mystere
  :::

  :::{literalinclude} manipulation-fichiers-correction.cpp
  :start-after: BEGIN mystere2
  :end-before: END mystere2
  :::

  Le fichier `truc.txt` contient les premières lignes suivantes :

  ```
  Henry 4
  Messi 2
  Ronaldo 3
  Xavi 2
  ```

  1.  Expliquez ce que fait la fonction `mystere`. Précisez le format
      que doit avoir le fichier. Choisissez des noms plus informatifs
      pour cette fonction et ses variables, et écrivez sa documentation.

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Changez la fonction pour que chaque ligne de la sortie soit de la
      forme :

                Nom : Alfred, note sur 10 : 7, note sur 20 : 14

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  ::::

  % {raw:latex}`\vfil`


id: cda06517017b409196df7a1a36ccbdcb
name: 20
cell_type: markdown
checksum: 0812c1751ace43387eb607cd62e2923f
notebook_id: b673471bfe93449db32bbd204b4147b7
source:
  ::::{admonition} Exercice 2 : Fichiers

  1.  Définissez les deux fonctions suivantes :

      :::{literalinclude} manipulation-fichiers-correction.hpp
      :start-after: BEGIN moyenne
      :end-before: END moyenne
      :::

      :::{literalinclude} manipulation-fichiers-correction.hpp
      :start-after: BEGIN lit_notes
      :end-before: END lit_notes
      :::

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Lorsque cela est possible, écrivez un test.

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  3.  $\clubsuit$ Comment pourrait-on tester la fonction du premier exercice?

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  ::::

  % {raw:latex}`\clearpage`


id: 4fe4aef55c6948a4984146c33336ac3d
name: 30
cell_type: markdown
checksum: 24007710de979a91f90921eddb7c2898
notebook_id: b673471bfe93449db32bbd204b4147b7
source:
  ::::{admonition} Exercice 3 : Images numériques

  Pour manipuler informatiquement une image analogique (continue), on
  doit la numériser, c'est à dire l'encoder sous forme d'une image
  numérique (discrète). Il en existe deux grandes catégories :

  -   Les images vectorielles : une image y est encodée par une
      combinaison de primitives géométriques (lignes, disques, ...)
      auxquelles sont appliquées des transformations.
      En savoir plus : <https://fr.wikipedia.org/wiki/Image_vectorielle>

  -   Les images matricielles, ou « carte de points » (de l'anglais
      bitmap): une image y est constituée d'une matrice -- ou tableau ou
      grille -- où chaque case -- appellée pixel -- possède une couleur
      qui lui est propre. Il s'agit donc d'une juxtaposition de carrés
      de couleur formant, dans leur ensemble, une image.
      En savoir plus : <https://fr.wikipedia.org/wiki/Image_matricielle>

      ![Un exemple d'image matricielle](media/DigitalPicture.jpg) 
  	%{height="5cm"}

  1.  **Images en noir et blanc**.
      Le fichier suivant contient une image en noir et blanc au format
      PBM (*Portable Bit Map*). Devinez comment fonctionne ce format de
      fichier et dessinez l'image correspondante.

      :::{literalinclude} media/smiley.pbm
      :::

      **Indications :** La première ligne précise le format du fichier
      (texte, image noir et blanc); la deuxième est un commentaire; tout
      le reste a un rôle!
      Voir <https://fr.wikipedia.org/wiki/Portable_bitmap>
      pour plus d'informations sur ce format de fichier.

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  2.  **Images en couleur**.
      Le fichier suivant contient une image en couleur au format PPM
      (*Portable Pix Map*). Devinez comment fonctionne ce format de
      fichier et dessinez l'image correspondante.

      :::{literalinclude} media/drapeau.ppm
      :::

      **Indication :** Quelles sont les trois couleurs primaires
      usuelles (pour les écrans)?

      % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  ::::

  % {raw:latex}`\clearpage`


id: 788c6cc4260c479f95d32954d4683aa2
name: 40
cell_type: markdown
checksum: 541fa69d3773a8dd58dce87cd6cc360e
notebook_id: b673471bfe93449db32bbd204b4147b7
source:
  ::::{admonition} Exercice 4 : $\clubsuit$

  Définissez les fonctions suivantes :

  :::{literalinclude} manipulation-fichiers-correction.hpp
  :start-after: BEGIN word_count
  :end-before: END word_count
  :::

  % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  :::{literalinclude} manipulation-fichiers-correction.hpp
  :start-after: BEGIN line_count
  :end-before: END line_count
  :::

  % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  :::{literalinclude} manipulation-fichiers-correction.hpp
  :start-after: BEGIN cat
  :end-before: END cat
  :::

  % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  :::{literalinclude} manipulation-fichiers-correction.hpp
  :start-after: BEGIN copy
  :end-before: END copy
  :::

  **Indication :** la bibliothèque standard fournit la fonction
  suivante :

  ``` c++
  /** lit une ligne d'un flux et la stocke dans une chaîne de caractères
   *  @param flux un flux entrant
   *  @param s une chaîne de caractères
   *  @return le flux entrant
   **/
  istream getline(istream &flux, string &s);
  ```

  % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  ::::

  % {raw:latex}`\vfil`


id: b481dd25699649b1a41f1941df9b6145
name: 50
cell_type: markdown
checksum: ff94652b6b0c0841380bf757f3cdfde6
notebook_id: b673471bfe93449db32bbd204b4147b7
source:
  ::::{admonition} Exercice 5 : $\clubsuit$

  Devinez ce que fait la fonction `mystereEpais` suivante et écrire un
  test :

  :::{literalinclude} manipulation-fichiers-correction.cpp
  :start-after: BEGIN mystereEpais
  :end-before: END mystereEpais
  :::

  % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  ::::

  % {raw:latex}`\clearpage`


id: 8d7ccd403a1745339dddd7e8aa304128
name: 60
cell_type: markdown
checksum: 1320618450fde0e0ff505b92d9327517
notebook_id: b673471bfe93449db32bbd204b4147b7
source:
  ::::{admonition} Exercice 6 : $\clubsuit$

  On dispose de trois fichiers texte nommés `note1.txt`, `note2.txt`, et
  `note3.txt`. Dans chacun d'eux, chaque ligne contient trois
  informations, séparées par des espaces : le nom d'un-e étudiant-e, son
  groupe, une note. Les trois fichiers pourraient par exemple
  correspondre aux notes dans trois matières pour une même promotion.

  Écrivez un programme qui:

  1.  Fusionne ces trois fichiers en un seul fichier `notes.txt` dont
      chaque ligne aura cinq informations séparées par des espaces :
      `<nom> <groupe> <note1> <note2> <note3>`. On vérifiera au passage
      que les trois fichiers de départ contiennent exactement les mêmes
      noms d'étudiant-es et dans le même ordre.

  2.  Crée un fichier par groupe, qui indiquera, pour chaque étudiant-e
      de ce groupe, sa note moyenne (moyenne des trois notes), au format
      `<nom> <note_moyenne>`.  Les fichiers seront nommés
      `groupeB5.txt`, `groupeA1.txt`, `groupeC3.txt`.  Ce programme doit
      pouvoir fonctionner quel que soit le nombre de groupes et quels
      que soient les noms de ces groupes.

  % REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE

  ::::


