Exercices du cours C++

Pointeurs et références

  1. corrigé code, html
    Programme p1.cpp:
    • On déclare un tableau d'entiers A de dimension 10
    • Deux sous-programmes, remplitA et impA, permettent de remplir et imprimer le tableau.
    • Déclarer une référence vers l'élément 5 du tableau et incrémenter sa valeur
    • Déclarer un pointeur vers l'élément 7, incrémenter le pointeur et la valeur pointée
  2. corrigé code, html
    Programme p2.cpp:
    • Déclarer un entier
    • Déclarer une référence vers cet entier
    • Déclarer un pointeur vers cet entier
    • Dans les deux cas, imprimer la variable, l'adresse de la variable, la valeur pointée.
  3. corrigé code, html
    En reprenant p1.cpp, déclarer des pointeurs sur A[5], en utilisant ou non les attributs const.
    • Vérifier que certaines instructions ne seront pas compilées
    • Vérifier que, malgré tout, *a peut changer de valeur...
  4. corrigé code, html
    Programme alea.cpp: Soit un tableau de dimension 200. Ecrire une fonction qui renvoie de manière aléatoire chaque cellule du tableau, sous forme de lvalue
  5. corrigé code, html
    Programme alea1.cpp: Même exercice que ci-dessus, mais la taille du tableau est passée en argument du programme. Cela afin d'utiliser quelques fonctions de passage de paramètres de la ligne de commande.

Le type class

  1. corrigé code, html
    Programme stack.cpp:Ecrire une classe pile d'entiers ayant les caractéristiques suivantes:
    • Repose sur un tableau de dimension n, n étant passé au constructeur (allocation dynamique)
    • Permet d'empiler et dépiler les données
    • Une fonction length() permet de savoir combien de données sont empilées
  2. corrigé code, html
    Modifier le programme précédent afin de visualiser les appels de constructeurs et de destructeurs: vérifier les règles de portée des variables.

Surcharge des fonctions et opérateurs

  1. corrigé corrigé code .hpp code .cpp code main, html .hpp html .cpp html main
    Programme tableau.C: définir une classe tableau ayant les caractéristiques suivantes:
    • Repose sur un tableau de dimension n, n étant passé au constructeur (allocation dynamique)
    • Implémenter les opérateurs +=,-=,+,-
    • On accède aux données à l'aide de l'opérateur []. En cas de débordement, cet opérateur imprime un message et ne fera rien de dangereux.
    • Ce programme sera implémenté en utilisant la compilation séparée: un couple de fichiers .hpp, .cpp pour l'objet Tableau et un fichier pour le programme main
  2. Importance du mot explicit: Partir du corrigé de l'exercice précédent, et supprimez l'opérateur +=, dans sa version qui ajoute un entier. Cela ne compilera pas. Supprimez alors le mot explicit devant le constructeur. Tiens, ça compile. Mais est-ce réellement une bonne idée ?
  3. corrigé code .hpp code .cpp code main, html .hpp html .cpp html main
    Reprendre le programme précédent et introduire deux fonctions-membres transform, qui appliqueront une fonction donnée à tout le tableau. La fonction transform aura comme paramètre un objet-fonction. On déclarera donc deux objets-fonction, le premier calculera une homothétie, le second effectuera un écrètage.

Héritage

  1. Corrigé code .hpp code .cpp code traitements .hpp code traitements .cpp code main, html .hpp html .cpp html traitements .hpp html traitements .cpp html main
    Réécrire la fonction transform ci-dessus (tableau), en passant en paramètres une classe de base fonction-objet, afin de gagner en souplesse.
  2. Corrigé
    Partir de l'exercice 1 et écrire plusieurs versions du tableau, qui ne diffèrent que par leur fonction-membre print:
    • La première verion imprimera simplement une cellule par ligne
    • La seconde version écrira le tableau sur deux colonnes, index sur la colonne 1, valeur sur la colonne 2
    On utilisera une classe de base abstraite et deux classes dérivées

Modèles

  1. Corrigé code .hpp code traitements .hpp code main, html .hpp html traitements .hpp html main
    Réécrire le tableau (et les fonctions-objets associés) en remplaçant le type de base du tableau (int) par un modèle.
  2. Corrigé code .hpp code traitements .hpp code main, html .hpp html traitements .hpp html main
    Réécrire à nouveau le tableau en remplaçant la dimension par un paramètre de modèle
  3. Corrigé code .hpp code traitements .hpp code main, html .hpp html traitements .hpp html main
    Ajouter des fonctions permettant de convertir des tableaux de divers types (mais de même taille).

Exceptions

  1. Corrigé code .hpp code traitements .hpp code main, html .hpp html traitements .hpp html main
    Réécrire le tableau en implémentant un mécanisme d'exception lorsqu'on essaie d'accéder à une cellule du tableau en-dehors des limites, lorsqu'on alloue la mémoire, lorsqu'on ajoute des tableaux de tailles différentes.

Gestion de la mémoire

  1. corrigé: code, html
    • Ecrire un objet qui contient deux pointeurs sur des tableaux (le tableau est l'objet de l'exercice ci-dessus), faites en sorte que le constructeur du second tableau génère une exception, mettez tout ça dans une boucle et observez la fuite de mémoire. Remplacez les pointeurs par des auto_ptr pour boucher la fuite.
  2. corrigé: code, html
    Ecrire un objet (en fait deux classes amies) qui implémente un pointeur avec comptage de référence.

bibliothèque standard

  1. corrigé: code, html
    Ecrire un objet (on l'appelle Objet) qui encapsule un entier, définir le constructeur, le constructeur de copie, l'opérateur = et le destructeur, en écrivant sur cerr un message spécifique à chacune de ces fonctions. Définissez alors un array (c++11) et un vecteur d'Objets, histoire de visualiser ce qui se passe (les messages envoyés par les constructeurs le destructeur et l'opérateur = sont très instructifs).
  2. corrigé: code, html
    Ecrire un code qui lise un texte sur l'entrée standard, qui compte les occurrences de chaque mot, et qui imprime sur la sortie standard chaque mot, en ordre alphabétique, suivi du nombre d'occurences de ce mot. On ne gardera que les mots contenant uniquement des lettres, en supprimant les mots contenant des chiffres ou des caractères spéciaux, et on affichera uniquement les mots apparaissant plus de 5 fois
  3. Programme en téléchargement. Téléchargez ce programme, compilez-le en mode -std C++0x (gcc) ou -std c++11 (clang) et exécutez-le comme ceci:./a.out help pour savoir comment il fonctionne

xhtml Licence Creative Commons Emmanuel Courcelle <emmanuel.courcelle@inp-toulouse.fr>