TD 5 C++: Portée des noms, const, classes et listes doublement chaînées

Corrigés: 1.1.txt 1.2.txt 2.1.cc 2.2.h 2.2.cc 2.3.h 2.3.cc 3.1.h 3.1.cc

Attention: RENDU

Rappels


Exercice 1: Portée des noms; surcharge

  1. Simulez l'éxécution de ce programme dans votre tête. Qu'affichera-t'il?

    RENDU: 1.1.txt contenant la réponse (juste un nombre, rien d'autre!)

  2. Que se passera-t'il si dans la classe A on ajoute une valeur par défaut à la fonction int a(int a), comme cela:
    int a(int a = 77) {
      ...
    }
    RENDU: 1.2.txt contenant la réponse avec une explication brève.


Exercice 2: Déclarations/Définition et const

  1. Écrivez un fichier 2.1.cc qui implémente la classe Pixel déclarée dans le fichier 2.1.h.
    Vérifiez en faisant:
    wget --no-cache http://fabien.viger.free.fr/cpp/td5/2.tar.gz
    tar xf 2.tar.gz
    make 2.1
    RENDU: 2.1.cc

  2. Copiez 2.1.h dans 2.2.h et modifiez-le uniquement en ajoutant le mot-clé const le plus de fois possible.
    Écrivez aussi l'implémentation 2.2.cc (qui pourra elle aussi partir de 2.1.cc comme modèle).
    Vérifiez avec: make 2.2

    RENDUS: 2.2.h et 2.2.cc

  3. Faites de même avec les fichiers 2.3.h et 2.3.cc: Vérifiez avec: make 2.3

    RENDUS: 2.3.h et 2.3.cc, modifiés.


Exercice 3: Listes doublement chainée

Dans cet exercice on va aborder une structure de données: les listes doublement chainées.
Le contenu pourrait être arbitraire; ici pour simplifier on prendra un contenu de type double.
On fera ça a l'aide d'une classe encapsulant une struct: Toutes les opérations ci-dessus doivent fonctionner en temps constant!
  1. Écrivez le prototype dans un fichier 3.1.h et l'implémentation dans un fichier 3.1.cc Vérifiez avec:
    wget --no-cache http://fabien.viger.free.fr/cpp/td5/3.tar.gz
    tar xf 3.tar.gz
    make 3.1
    RENDUS: 3.1.h et 3.1.cc (Note: un rendu partiel pourra être pris en compte mais vous devrez quand même définir toutes les méthodes, en les faisant renvoyer nullptr ou autre valeur "défaut" si besoin)

  2. Ajoutez la fonction Find(double d) (dans la classe List) qui renvoie un pointeur vers le premier élément de la liste dont la valeur est égale à d, ou nullptr si aucun élément n'est égal à d.

    Vérifiez avec: make 3.2

    RENDUS: 3.1.h et 3.1.cc, avec la fonction en plus.

  3. (*) Ajoutez une fonction void List::InsertListAfter(const List* other, Element* position) qui insère tout le contenu d'une autre liste après un élément donné de la liste courante (ou nullptr pour l'insérer au début).
    Par exemple, si on insère (1,2,3) après l'élément "4" de (3,4,5) on obtiendra (3,4,1,2,3,5).

    Comment faire pour que cette fonction marche en temps constant?
    Indice: n'hésitez pas à ajouter des champs dans votre class Liste.

    Vérifiez avec: make 3.3

    RENDUS: 3.1.h et 3.1.cc, avec la fonction en plus.