User Tools

Site Tools


in204:tds:sujets:td5:part2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
in204:tds:sujets:td5:part2 [2019/10/08 19:19]
bmonsuez
in204:tds:sujets:td5:part2 [2022/11/18 10:48] (current)
Line 24: Line 24:
  
 L'​opérateur prend comme premier argument un flux en lecture [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream|''​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. L'​opérateur prend comme premier argument un flux en lecture [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream|''​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 ==== ==== Question n°1.1 ====
Line 40: Line 35:
  
 Testez cette opération. Testez cette opération.
 +
 +<hidden Correction>​
 +
 +L'​opérateur ''​std::​basic_ostream<​charT,​ traits>&​ operator << (std::​basic_ostream<​charT,​ traits>&,​ const Complex&​)''​ doit être défini en dehors de la classe ''​Complex''​ puisqu'​il prend comme premier argument un argument de type différent de ''​Complex''​. Cependant, cet opérateur doit pouvoir accéder aux champs internes de la classe. ​
 +
 +Nous avons deux possibilités,​ soit nous décidons d'​avoir une méthode interne d'​affichage :
 +
 +<code cpp>
 +class Complex
 +{
 +   ...
 +public:
 +   ...
 +   ​template<​class charT, class traits>
 +   void print(const std::​basic_ostream<​charT,​ traits>, & aStream)
 +   {
 +       ​aStream << mRealPart;
 +       ​aStream << "+ i ";
 +       ​aStream << mImaginaryPart;​
 +   }
 +   ​... ​
 +};
 +
 +template<​class charT, class traits>
 +std::​basic_ostream<​charT,​ traits>&​ operator<​charT,​ traits> << (std::​basic_ostream<​charT,​ traits>&​ aStream, const Complex&​ aNumber)
 +{
 +    aNumber.print(aStream);​
 +}
 +</​code>​
 +
 +L'​autre possibilité consiste à déclarer l'​opérateur ''​std::​basic_ostream<​charT,​ traits>&​ operator << (std::​basic_ostream<​charT,​ traits>&,​ const Complex&​)''​ comme étant "​ami"​ de la classe, ce qui lui donne accès aux méthodes et champs privés et protégés de la classe.
 +
 +<code cpp>
 +class Complex
 +{
 +   ...
 +public:
 +   ...
 +   ​template<​class charT, class traits>
 +   ​friend std::​basic_ostream<​charT,​ traits>&​ operator<​charT,​ traits> << (std::​basic_ostream<​charT,​ traits>&​ aStream, ​   const Complex&​ aNumber)
 +   {
 +   }
 +   ​... ​
 +};
 +
 +template<​class charT, class traits>
 +std::​basic_ostream<​charT,​ traits>&​ operator<​charT,​ traits> << (std::​basic_ostream<​charT,​ traits>&​ aStream, const Complex&​ aNumber)
 +{
 +   ​aStream << aNumber.mRealPart;​
 +   ​aStream << "+ i ";
 +   ​aStream << aNumber.mImaginaryPart;​
 +   ​return aStream;
 +}
 +</​code>​
 +
 +Il serait cependant préférable de pouvoir effectuer un affichage minimaliste des nombres complexes. Ainsi, nous nous contentons d'​afficher la partie réelle si la partie imaginaire et nulle ou la seule partie imaginaire si la partie réelle est nulle. Cet affichage plus proche de l'​affiche courant peut être fourni pas le code suivant :
 +
 +<code cpp>
 +template<​class charT, class charTraits>​
 +std::​basic_ostream<​charT>&​ operator <<(
 +    std::​basic_ostream<​charT,​ charTraits>&​ aStream, ​
 +    const Complex&​ aValue)
 +{
 +    if(aValue.mRealPart != 0 &&
 +        aValue.mImaginaryPart != 0)
 +        aStream << aValue.mRealPart << "​+"​ << aValue.mImaginaryPart << "​i";​
 +    else if(aValue.mImaginaryPart != 0)
 +        aStream << aValue.mImaginaryPart << "​i";​
 +    else
 +        aStream << aValue.mRealPart;​
 +}
 +</​code>​
 +</​hidden>​
  
 ==== Question n°1.2 ==== ==== Question n°1.2 ====
Line 46: Line 114:
  
 <code cpp> <code cpp>
-x + i y+x + i y 
 x - i y x - i y
 i y i y
Line 52: Line 120:
 x x
 </​code>​ </​code>​
 +
  
 Définissez une opération de lecture d’un flux effectuant cette lecture d’un objet de type ''​Complex''​. Définissez une opération de lecture d’un flux effectuant cette lecture d’un objet de type ''​Complex''​.
Line 76: Line 145:
 Typiquement les fonctions suivantes : Typiquement les fonctions suivantes :
   * [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​get|''​get''​]],​ [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​peek|''​peek''​]] vous permettent d'​avancer dans la lecture des caractères, ​   * [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​get|''​get''​]],​ [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​peek|''​peek''​]] vous permettent d'​avancer dans la lecture des caractères, ​
-  * [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​unget||''​unget''​]] vous permettent de remettre un caractère que vous venez d'​extraire dans le flux,+  * [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​unget|''​unget''​]] vous permettent de remettre un caractère que vous venez d'​extraire dans le flux,
   * [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​tellg|''​tellg''​]] et [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​seekg|''​seekg''​]] vous permettent d'​accéder à la position courant et de revenir à une position antérieur.   * [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​tellg|''​tellg''​]] et [[https://​en.cppreference.com/​w/​cpp/​io/​basic_istream/​seekg|''​seekg''​]] vous permettent d'​accéder à la position courant et de revenir à une position antérieur.
 pourront vous être utiles. pourront vous être utiles.
  
 ---- ----
 +
 +<hidden Correction>​
 +
 +Nous començons à nous intéresser à l'​affichage selon le format:
 +
 +</​hidden>​
  
 ==== Question n°1.3 (En dehors du cours !) ====  ==== Question n°1.3 (En dehors du cours !) ==== 
in204/tds/sujets/td5/part2.1570562368.txt.gz · Last modified: 2019/10/08 19:19 by bmonsuez