Exercices du cours C++
- 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
- 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.
- 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...
- 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
- 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.
- 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
- 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.
- 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
- 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 ?
- 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.
-
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.
-
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
-
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.
-
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
-
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).
-
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.
- 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 seond constructeur 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.
- corrigé: code, html
Ecrire un objet (en fait deux classes amies) qui implémente un pointeur avec comptage de référence.
- 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
- 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
Emmanuel Courcelle <emmanuel.courcelle@toulouse.inra.fr>