User Tools

Site Tools


in204:tds:sujets:td5:part2

This is an old revision of the document!


Partie II – Manipulation des flux

TD5

Question n°1

Nous considérons toujours notre classe de nombres complexes, nous souhaitons ne plus utiliser la méthode d’affichage sur la console mais définir une première méthode d’affichage sur les flux.

L'opération d'écriture dans un flux est défini par l'opérateur operator « et s'exprime comme suit :

template<class charT, class charTraits>
std::basic_ostream<charT>& operator <<(std::basic_ostream<charT, charTraits>&, const Complex& aValue);

L'opérateur prend comme premier argument un flux en écriture ''std::basic_ostream<charT, charTraits>&'' et comme second argument un nombre Complex. Comme le nombre ne va pas être modifié, il est d'habitude de passer une référence non modifiable, d'où la signature précédente. Comme nous souhaitons associer les opérations d'écriture sur le flux, l'opérateur « retourne une référence sur le flux sur lequel nous venons d'écrire la donnée.

L'opération de lecture à partir d'un flux est défini par l'opérateur operator » et s'exprime comme suit :

template<class charT, class charTraits>
std::basic_istream<charT>& operator <<(std::basic_istream<charT, charTraits>&, Complex& aValue);

L'opérateur prend comme premier argument un flux en lecture ''std::basic_istream<charT, charTraits>&'' et comme second argument un nombre Complex. Comme le nombre va pas être modifié, il est nécessaire de passer une référence à l'objet qui va recevoir la valeur lue du flux, d'où la signature précédente. Comme nous souhaitons associer les opérations d'écriture sur le flux, l'opérateur » retourne une référence sur le flux duquel nous venons de lire la donnée.

Question n°1.1

Nous considérons que l’affichage par défaut s’effectue selon le format

x + i y

Définissez l'opérateur d’affichage d’un objet ayant pour type la classe Complex vers un flux.

Testez cette opération.

Question n°1.2

Nous souhaitons faire l’opération inverse, c’est-à-dire convertir la représentation d’un nombre complexe ayant l’une des représentations suivantes vers un nombre complexe.

x + i y
x - i y
i y
- i y
x

Définissez une opération de lecture d’un flux effectuant cette lecture d’un objet de type Complex.

Pour ce faire, il va falloir déterminer le format au fur et à mesure de la lecture des éléments à partir du flux.


Vous pouvez vous reporter à la documentation de ''std::basic_istream<charT, charTraits>&'' qui vous indiquera les fonctions qu’offrent la classe et qui vous seront utiles pour analyser le flux en entrée.

Pour analyser, il faut tout d'abord tester le premier caractère qui n'est pas un espace. En fonction de cette valeur, nous pouvons soit :

  • être en présence d'un nombre,
  • être en présence d'un signe + ou -,
  • être en présence d'un caractère i ou I

Pour chacun des cas, vous devez avancer dans le flux pour déterminer si la suite du format est compatible avec la lecture des formats précédemment définis. Cependant, si vous constatez que vous avez fait une mauvaise supposition, il sera nécessaire de restaurer la position dans le flux au niveau du premier caractère qui ne fait pas partie de la séquence.

Par exemple, si nous avons 3 + 2 comme expression, nous allons avoir l'analyse suivante :

  1. Analyse de 3 ⇒ partie réelle est 3
  2. Détection du signe ⇒ peut-être suivi d'une partie imaginaire
    1. Analyse de 2, la partie imaginaire peut-être 2,
    2. Absence de 'i' ou 'I' suivant l'item 2, ⇒ absence de partie imaginaire, nous devons repositionner le pointeur de flux au niveau du premier caractère suivant le 3.

Typiquement les fonctions suivantes :

  • ''get'', ''peek'' vous permettent d'avancer dans la lecture des caractères,
  • |''unget'' vous permettent de remettre un caractère que vous venez d'extraire dans le flux,
  • ''tellg'' et ''seekg'' vous permettent d'accéder à la position courant et de revenir à une position antérieur.

pourront vous être utiles.


Question n°1.3 (En dehors du cours !)

Proposer la création d’un modificateur qui va permettre non pas d’écrire un petit « i » mais un grand « I » pour indiquer la partie imaginaire en lieu et place du petit « i ».

Plus d’information est disponible en complément. Ceci dépasse de loin l’objet du TD.

in204/tds/sujets/td5/part2.1570562368.txt.gz · Last modified: 2019/10/08 19:19 by bmonsuez