---
exports:
- format: pdf
  output: TD.pdf
  template: ../../template/TD
- format: tex
  output: TDmd.tex
  template: ../../template/TD
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: C++17
  language: C++17
  name: xcpp17
---

# TD 8 : fichiers et images numériques

+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f5852144d8c280849593821fe14b589d", "grade": true, "grade_id": "10", "locked": false, "points": 0, "schema_version": 3, "solution": true}}

::::{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`

+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "0812c1751ace43387eb607cd62e2923f", "grade": true, "grade_id": "20", "locked": false, "points": 0, "schema_version": 3, "solution": true}}

::::{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`

+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "24007710de979a91f90921eddb7c2898", "grade": true, "grade_id": "30", "locked": false, "points": 0, "schema_version": 3, "solution": true}}

::::{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`

+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "541fa69d3773a8dd58dce87cd6cc360e", "grade": true, "grade_id": "40", "locked": false, "points": 0, "schema_version": 3, "solution": true}}

::::{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`

+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "ff94652b6b0c0841380bf757f3cdfde6", "grade": true, "grade_id": "50", "locked": false, "points": 0, "schema_version": 3, "solution": true}}

::::{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`

+++ {"deletable": false, "nbgrader": {"cell_type": "markdown", "checksum": "1320618450fde0e0ff505b92d9327517", "grade": true, "grade_id": "60", "locked": false, "points": 0, "schema_version": 3, "solution": true}}

::::{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

::::