Vous êtes sur la page 1sur 3

Université Denis Diderot Paris 7

UFR d’informatique
L3 Licence d’informatique

Examen de Programmation
(janvier 2007)
durée trois heures ; documents manuscrits autorisés
3 pages

Les questions 1, 2 et 3 sont indépendantes. Le barème est donné à titre indicatif.


1. (3 points) On considère le programme suivant :
class F {
void f(){System.out.print("F.f() ");this.g();}
void g(){System.out.println("F.g() ");}
}
class Fbis extends F{
void f(){System.out.print("Fbis.f() ");this.g();}
void g(){System.out.println("Fbis.g() ");super.f();}
}

Le code suivant : F f=new Fbis() ; ((F)f).f() ;


n’est pas correct, que provoque-t-il et pourquoi.
2. (a) (1 point) Écrire une classe A contenant deux données membres int privées nommées i et j. Cette
classe aura un constructeur public, A(int a, int b) qui initialise ces deux données membres et
une méthode publique getj qui retourne la valeur de la donnée membre j. Redéfinir la méthode
toString de façon à obtenir une chaîne de caractères donnant les valeurs des données membres.
(b) (2 points) Écrire une classe B dérivée de la classe A et qui contient une nouvelle donnée membre
privée de type int nommée j. Combien de données membres contient un objet B ?
Définir un constructeur B(int a, int b, int c) pour B qui initialise toutes les données membres
de B.
Si un objet de B est créé par new B(1,2,3), que retournera la méthode getj appliquée à cet
objet.
Redéfinir toString de façon à obtenir une chaîne de caractères donnant les valeurs de toutes les
données membres.
(On prendra garde au fait que les données membres de A sont privées.)
(c) (3 points)
i. Que produira le code suivant (erreur à la compilation, à l’exécution, et s’il n’y a pas d’erreur
quelle en est la sortie) :
A[] ta= new A[10];
for (int i = 0; i < ta.length; i++) {
ta[i]=new B(i,i+1,i+2);
}
System.out.println(ta[1]);

ii. Même question pour :


B[] tb= new B[10];
for (int i = 0; i < ta.length; i++) {
tb[i]=new B(i,i+1,i+2);

1
}
A[] tab=tb;
System.out.println(tab[1]);

iii. Même question pour :


A[] tac= new B[10];
tac[1]= new A(1,2);
System.out.println(tac[1]);

(d) (3 points) On rappelle qu’en Java si Y est une classe dérivée de X alors Y[] est aussi dérivée de
X[]. Ainsi si tx est déclarée comme un tableau de X, tx peut référencer un tableau de Y. Quel
problème pose alors le code :
Y[] y=new Y[1];
X[] x=y;
x[0]=new X();
System.out.println(y[1]);
L’erreur peut-elle être détectée à la compilation ?
Si au lieu de considérer des tableaux on considère des List<X> et des List<Y> le comportement
est-il le même (cette question est optionnelle et est hors barême (+2 points).
3. Dans la suite on veut à partir d’une fonction f retournant un double et ayant un paramètre int (1)
Pi=n
calculer la somme des valeurs de cette fonction entre 0 et n (c’est-à-dire i=0 f (i)), (2) calculer la
Pi=n
moyenne (c’est-à-dire n1 i=0 f (i)) des valeurs de cette fonction entre 0 et n, et (3) calculer une valeur
médiane entre 0 et n de f (une valeur médiane M est une valeur de la fonction qui partage l’ensemble
0, ..., n en deux sous ensembles A et B de même taille telle que pour tout x appartenant à A f (x) ≤ M
et pour tout x appartenant à B f (x) ≥ M ) (plus intuitivement : il y a autant de valeurs plus petites
que M que de valeurs plus grandes).
En Java une méthode ne peut pas avoir une autre méthode en argument, on peut cependant contourner
cela en utilisant une méthode (abstraite) définie dans la classe qui sera définie dans des classes dérivées.
Les questions qui suivent illustrent plus ou moins cela.
(a) (3 points) Écrire une classe abstraite Stat contenant une méthode abstraite nommée f ayant
comme argument un entier et retournant un double, une méthode somme(int n), une méthode
moyenne(int n) et une méthode médiane(int n)qui calculent respectivement la somme, la
moyenne et une médiane pour f entre 0 et n.
Pour calculer la médiane, un algorithme simple consiste à construire un tableau des valeurs de la
fonction entre 0 et n, à trier ensuite ce tableau et à choisir la valeur correspondant au milieu du
tableau. On pourra donc définir une méthode qui construit un tableau de n éléments correspondant
aux valeurs f (0), ..., f (n), et ensuite utiliser la méthode Arrays.sort(double[]) du package
java.util.
Comment, avec Stat, calculer la médiane et la moyenne pour la fonction f (i) = i ?
Si on veut calculer la médiane seule pour une fonction donnée, peut-on procéder sans créer expli-
citement une nouvelle classe ? Si oui écrire le code correspondant.
(b) (2 points) On veut maintenant calculer la somme, la moyenne et la médiane à partir d’un tableau
de doubles.
Définir une classe StatTab ayant comme donnée membre un tableau data de doubles et ayant
les méthodes somme, moyenne et médiane calculant respectivement la somme, la moyenne et une
médiane pour le tableau considéré. On définira dans cette classe deux constructeurs : le premier
ayant comme argument un entier n qui instanciera le tableau data par un tableau de doubles de
taille n, le deuxième ayant comme argument un tableau de doubles qui servira à initialiser data.
On prendra garde à ce que, pour une instanciation de StatTab par le constructeur avec un tableau
en paramètre, ce tableau ne soit pas modifié.

2
(c) (2 points) Dans les questions suivantes, on va utiliser cette classe StatTab pour calculer la somme,
la moyenne et la médiane pour une fonction f .
Pour cela, on considère l’interface :
interface Iter{
void reset();
double suivant();
}

Écrire une classe abstraite Fonction contenant une méthode abstraite nommée f ayant comme
argument un entier et retournant un double, cette classe implémente Iter, de façon à ce qu’après
un appel de reset, les k premiers appels de suivant retournent successivement f (0), ..., f (k − 1).
(d) (3 points) Écrire une classe VersTabIter extension de StatTab qui permet de construire un
StatTab à partir de n’importe quel objet implémentant un Iter. Plus précisément, cette classe
contiendra un champ entier taille qui contiendra le nombre d’éléments sur lequel on veut calculer
la somme, la moyenne et la médiane, et un constructeur qui initialisera le tableau data de StatTab
à partir d’un objet implémentant Iter.
(e) (2 points) Comment calculer la moyenne des 10 premières valeurs de la fonction f (x) = 2x avec
VersTabIter. Donner si possible une expression le permettant qui ne crée pas explicitement de
nouvelle classe.

Vous aimerez peut-être aussi