Vous êtes sur la page 1sur 2

Université Pierre et Marie Curie Master M1 "Mathématiques et Applications"

Période 2 - 2009/2010 Programmation en C/C++


Examen du 12 avril 2010
Deux heures - Sans document.

Exercice 1 (Questions de cours)


1. Ecrire un code complet (en-têtes et fonction main) dans lequel vous devez
– initialiser un vecteur de la librairie standard (STL) de 10 réels aléatoires uniformément répartis entre 0 et 1,
– trier le vecteur,
– afficher le vecteur.
2. Même question avec une liste de la libraire standard à la place du vecteur.

3. Qu’est-ce qu’un itérateur et quelle est la différence entre l’itérateur d’une liste et l’itérateur d’un vecteur ?

Exercice 2
Vous trouvez le code suivant non documenté :
typedef double (* f )( double x , void * params );
2

double g ( f a , void * params , double l , double r , unsigned n ) {


4 double h = (r - l )/( double ) n ;
double sum = 0;
6 int k ;
for ( k = 0; k < n ; k ++) {
8 sum += a ( l + k *h , params ) * h ;
}
10 return sum ;
};

1. Qu’est-ce que f ? Que signifie void * params ?

2. Que fait la fonction g ? Expliquer le rôle de chaque argument.

3. Ecrire une fonction puiss compatible avec f qui calcule xp où x est le premier argument et p est un entier donné
par le second argument.

4. Donner un exemple d’appel de la fonction g avec cette fonction puiss et un entier p.

Vous souhaitez maintenant utiliser cette fonction g pour des fonctions existentes d’un programme C++. Le
problème est que vos fonctions existentes ne sont pas compatibles avec f. Un ami vous propose la solution
(partielle) suivante :
template < typename Obj >
2 struct ptr_fun {
ptr_fun ( Obj const &o , double ( Obj ::* f )( double ) const ) : o ( o ) , f ( f ) {}
4 double operator ()( double x ) { return ( o .* f )( x ); };
private :
6 Obj const & o ;
double ( Obj ::* f )( double ) const ;
8 };

10 template < typename Obj >


double pour_g ( double x , void * params ) {
12 ptr_fun < Obj > * f = _____________
return ________
14 };

5. Que sont Obj et ptr_fun ? Expliquer brièvement le rôle de ses fonctions membres.
Pour quel type de fonctions existentes votre ami a-t-il écrit ptr_fun.

1
6. Compléter la fonction pour_g.

7. Ecrire une petite classe P contenant un entier p en champ privé initialisé par le constructeur et une fonction
membre constante puiss qui prend en argument un réel x et qui renvoie xp .

8. Appliquer la fonction g à la fonction membre puiss de la classe P, c’est à dire la fonction P::puiss.

Exercice 3
On rappelle que la décomposition p-adique (pour un entier p ≥ 2 donné) d’un entier naturel n est donnée par
une suite de coefficients (ak )k≥0 telle que

r−1
X 0 ≤ ak < p pour 0 ≤ k ≤ r − 1,

n= ak pk , où ar−1 6= 0,

k=0 
ak = 0 pour k ≥ r.

1. Créer une classe p_adic qui peut s’initialiser de la façon suivante :


unsigned a [] = { 1 , 2 , 14 , 7 };
2 int p = 19;
int r = 4;
4 p_adic n (p , r , a );

Dans cet exemple l’objet p_adic n correspond à n = 1 + 2 · 19 + 14 · 192 + 7 · 193 .


Pour stocker les coefficients ak vous utiliserez un tableau dynamique d’entiers (c’est à dire un pointeur sur
unsigned).
Quelles fonctions/opérateurs devez-vous redéfinir ? Pourquoi ?

2. Surcharger l’opérateur << pour l’affichage d’un objet p_adic.

3. Définir le constructeur qui permet de créer un objet p_adic à partir d’un entier p ≥ 2 et d’un entier n ≥ 0
donnés.

4. On suppose qu’il existe une fonction membre increment qui incrémente de 1 la valeur du p-adique (c’est à dire
n) défini dans l’objet courant. Cette fonction membre a pour prototype :
void increment ();
En utilisant cette fonction, surcharger les opérateurs ++ : donner précisément les prototypes de ces fonctions et
les endroits où elles doivent être déclarées puis définies.

5. Ecrire le code de la fonction increment.

6. (bonus) Surcharger l’opérateur symétrique +.

Vous aimerez peut-être aussi