L2 Tulear TD CPP 2021
L2 Tulear TD CPP 2021
L2 Tulear TD CPP 2021
1. Affichez les résultats du programme suivant et écrire correctement en C ce programme qui est correct
en C++.
#include<iostream>
using namespace std;
const int nb = 10; const int exclus = 5;
main()
{ int valeurs[nb], i, nbval = 0;
cout<<˝Saisissez ˝<<nb<<˝valeurs : \n˝;
for(i=0 ; i<nb ; i++) cin>>valeurs[i];
for(i=0 ; i<nb ; i++)
switch (valeurs[i])
{ case exclus-1 :
case exclus :
case exclus+1 : nbval ++;
}
cout<<nbval<<˝ valeurs sont interdites \n ˝;
}
SPECIFICITES DE C++
2. Ecrivez une fonction swap ayant en paramètres 2 entiers nb1 et nb2 qui échange les contenus de nb1 et
de nb2 en utilisant la transmission par pointeur.
3. Ecrivez un programme C++ dans lequel : on déclare un tableau d’entiers tab de dimension 10. Deux
fonctions, remplitab et printab, permettent de remplir et imprimer le tableau, utilisez ces fonctions
dans le programme. Déclarez une référence vers l’élément 5 du tableau et incrémentez sa valeur.
Déclarez un pointeur vers l’élément 7, incrémentez le pointeur et la valeur pointée.
4. Ecrivez un programme C++ dans lequel :
- On déclare un entier nb = 10 ;
- Déclarez une référence vers cet entier ;
- Déclarez un pointeur vers l’adresse de cet entier ;
- Dans les 2 cas, affichez la variable, l’adresse de la variable et la valeur pointée.
5. Ecrivez une fonction qui renvoie dans 2 paramètres passés par référence la surface area et la
circonférence circumference d’un cercle. Et faites un jeu d’essai dans lequel on saisit le rayon r et
affiche les résultats : surface et circonférence.
6. Soit le modèle de structure :
struct essai
{ int n; float x;
}
Ecrivez une fonction raz permettant de remettre à zéro les 2 champs d’une structure de ce type,
transmise en argument : par pointeur, puis par référence. Dans les 2 cas, on écrira un programme d’essai
de la fonction ; il affichera les valeurs d’une structure de ce type, après appel de ladite fonction.
7. Ecrivez en C++, les instructions suivantes en utilisant les opérateurs new et delete.
#include<stdio.h>
#include<malloc.h>
main()
{ int nbval, *adi ; double *add, *adtab;
adi = (int*) malloc (sizeof(int));
add = (double *) malloc (sizeof(double)*100);
printf(˝ Combien de valeurs ? ˝); scanf(˝%d˝, &nbval);
adtab = (double *) malloc (sizeof(double)*nbval);
1
…
}
8. Ecrivez un programme C++ allouant des emplacements mémoire pour des tableaux d’entiers dont la
taille est fournie en donnée (saisie au clavier). Les allocations se poursuivront jusqu’à ce que l’on
aboutisse à un débordement mémoire. L’exécution de ce programme se présentera ainsi :
Taille souhaitée ? 6000
Allocation bloc numero : 1
Allocation bloc numero : 2
Allocation bloc numero : 3
Allocation bloc numero : 4
Allocation bloc numero : 5
Allocation bloc numero : 6
…
Mémoire insuffisante – arret exécution.
9. a) Transformez le programme suivant pour que la fonction devienne une fonction en ligne.
#include<iostream>
using namespace std;
main()
{ int fct (char, int);
int p, n = 150; char c = ‘s’;
p = fct (c, n);
cout<<˝fct (\’ ˝<<c<<˝\’, ˝<<n<< ˝) vaut : ˝<<p;
}
int fct (char car, int nb)
{ int res;
if(car==’a’) res = nb+car;
else if(car==’s’) res = nb-car;
else res = nb*car;
return res;
}
b) Comment faudrait-il procéder si l’on souhaitait que la fonction fct soit compilée séparemment ?
Notions de classe, constructeur et destructeur
10. Réaliser une classe Rational permettant de manipuler un rationnel de 2 nombres entiers. On prévoira un
constructeur recevant en argument le numérateur et le dénominateur du rationnel, une fonction membre convert
retournant le résultat du rationnel en réel double précision, une fonction membre invert qui inverse le
numérateur en dénominateur et vice-versa, une fonction membre print se contentant d’afficher le rationnel
comme (num/den).
Les numérateur et dénominateur sont des données privées de la classe. Ecrivez un programme d’essai,
déclarant un rationnel, l’affichant, calculant son résultat en réel double, l’inversant et l’affichant de nouveau.
11. Changez la classe Rational afin qu’on puisse créer par le constructeur un objet sans paramètre, avec un
seul paramètre et avec 2 paramètres (utilisez des valeurs d’arguments par défaut).
12. Fonctions d’accès de la classe Rational sont des fonctions membres publiques donnant accès aux
données membres privées ou publiques.
Réalisez la même classe Rational, mais ne comportant pas la fonction print. Pour respecter le principe
d’encapsulation des données, prévoyez 2 fonctions membres publiques (nommées numerator et denominator)
fournissant en retour le numérateur et le dénominateur du rationnel. Ecrivez un programme d’essai pour cette
nouvelle classe.
13. Soit la classe Rational créée à l’exercice 10. Adaptez cette classe de manière à ce qu’elle gère un
compteur qui comptabilise le nombre d’objets de cette classe.
Utilisez un programme d’essai pour qu’il affiche le résultat suivant :
Maintenant il y a 2 rationnels,
Maintenant il y a 6 rationnels,
Maintenant il y a 2 rationnels,
Maintenant il y a 3 rationnels,
2
14. Implémentez une classe chaine. Chaque objet de cette classe représente une chaine de caractères. Les
données membres sont la longueur et la chaine de caractères en elle-même. En plus des constructeur, destructeur,
fonctions d’accès et fonction d’affichage, définissez une fonction d’extraction de caractère.
3
b) Créer dans le programme principal un pointeur sur la classe personnel et un objet de la classe patron. Le
pointeur sur la classe de base contient l’adresse de la classe dérivée. Appeler la fonction affiche en utilisant le
pointeur sur la classe de base (il faut qu’elle affiche les informations sur la classe dérivée).
21. Créer une classe nombre formée d’une unique variable entière et d’une méthode affiche_nombre, puis
définir 3 classes dérivées afin d’afficher la variable aux formats hexadécimal, octal et décimal à l’aide d’une
méthode affiche_nombre.