TP 1 de Programmation 2e Année Informatique 2004-2005 : C++, Makefile

Exercice 1

Soit le programme Test.cpp :

#include 
#include 
using namespace std;

class chaine {
private:
  string s;
public:
  chaine() {cout << "appel du constructeur par défaut de chaine" << endl;}
  chaine(const string & _s) {
    s= _s;
  }
  
  chaine(const chaine & c) {
    s= c.getValue();
    cout << "appel du constructeur de copies de chaine pour " << s << endl;
  }
  
  string getValue() {return s;}  
  void setValue(const string & _s) {s= _s;} 
};

class Etudiant {
private:
  int id;
  chaine nom;
public:
  Etudiant(int _id, chaine _nom) {
    id= _id;
    nom= _nom;
  }

  chaine getNom() {return nom;}

  int getID() {return id;}
  
};

int main(int argc, char ** argv) {
  cout << "construction de la chaine toto\n";
  chaine toto("toto");
  cout << "construction de l'étudiant\n";
  Etudiant e(1, toto);
  cout << "nom de l'étudiant :\n";
  cout << e.getNom().getValue() << endl;
}
    

Question 1

Compilez le programme et corrigez l'erreur qu'annonce le compilateur.

Question 2

Expliquez (en commentant le main) l'affichage effectué par le programme.

Question 3

Modifiez la classe Étudiant (en ajoutant systématiquement des références là où c'est possible) pour éliminer certains de ces affichages. Théoriquement, vous devriez obtenir :
construction de la chaine toto
construction de l'étudiant
appel du constructeur de copies de chaine pour toto
nom de l'étudiant :
toto
    

Exercice 2

On veut écrire une bibliothèque de listes chaînées d'entiers en C++. On récupèrera tous les fichiers du répertoire source.

On créera deux classes : Liste et ElementListe. Une Liste contient un pointeur vers son premier élément. Dans le cas de la liste vide, ce pointeur vaut 0. Un ElementListe a la forme :

class ElementListe {
private:
      int valeur;
      ElementListe * suivant;
      ElementListe(int val);
      ~ElementListe();
      // La déclaration suivante autorise
      // la classe Liste à accéder aux éléments privés
      // de ElementListe
      friend Liste;
};      
    

Question 1

Écrire le constructeur de Liste, La fonction d'ajout d'un entier dans la liste, et le destructeur de Liste.

Question 2

Écrivez un constructeur de copie pour Liste et testez-le.

Question 3

Il est possible en C++ de surcharger les opérateurs, et en particulier <<, de manière à pouvoir afficher directement n'importe quelle valeur. En déclarant dans la classe Liste :
      friend ostream & operator<<(ostream &s, const Liste &l);
    
On dit que l'opérateur <<, quand il prend comme argument une sortie et une liste, a accès à la représentation interne de Liste.

Il ne vous reste plus qu'à implémenter l'opérateur pour qu'il écrive les éléments de Liste&nobr;:

ostream & operator<<(ostream &s, const Liste &l) {
      // Affiche le contenu de la liste ....

      // Retourne le flux de sortie (pour composition cout << a << b...)
      return s;
}
    

Question 4

Écrire la méthode enlever(int val), qui enlève la valeur val à la liste si elle s'y trouve.

Question 5

redéfinissez les opérateurs d'affectation et de comparaison pour les listes.
Serge ROSMORDUC