ESC/JAVA prend comme premier exemple le
programme :
class Bag {
int[] a;
int n;
Bag(int[] input) {
n = input.length;
a = new int[n];
System.arraycopy(input, 0, a, 0, n);
}
int extractMin() {
int m = Integer.MAX_VALUE;
int mindex = 0;
for (int i = 1; i <= n; i++) {
if (a[i] < m) {
mindex = i;
m = a[i];
}
}
n--;
a[mindex] = a[n];
return m;
}
}
|
QUESTION 1 : Spécifiez en français la méthode
extractMin.
Vous semble-t-il sans erreur ? sinon corrigez.
i.e. écrivez en français, en 4 lignes maximum,
le plus précisemment possible "ce que fait" (l'EFFET de) la méthode
extractMin.
QUESTION 2 : Quelle est la signification de
l'instruction , System.arraycopy(input,
0, a, 0, n); ? Où trouve -t-on
(dans quelle classe de quel package) la méthode
arraycopy
?
QUESTION 3 : Transformez la classe Bag.java en une
application (ajout d'une méthode main notamment) qui permet de tester la
méthode extractMin.
QUESTION 4 : Montrez la trace d'un "bon test" de
la méthode extractMin.
remarque : lors du test les données seront prises sur
la ligne de commande.
Question
1 |
Effet de la méthode extractMin:
Cette méthode parcours un tableau d'entier afin d'enregistrer la valeur
et l'indice de l' élément de valeur minimale. La longueur du tableau
est ensuite diminuée de un élément, le dernier élément du tableau étant
copiée à la place de l'élément de valeur min.
Les appels successifs de cette méthode retourne donc la valeur des
éléments du plus petit au plus grand.
Pour un tableau de longueur n, l'indice du premier élément est égal à
0 et l'indice du dernier élément est n-1.
Méthode initiale: |
Méthode corrigée: |
int extractMin() {
int m = Integer.MAX_VALUE;
int mindex = 0;
for (int i = 1; i <= n; i++) {
if (a[i] < m) {
mindex = i;
m = a[i];
}
}
n--;
a[mindex] = a[n];
return m;
} |
int extractMin() {
int m = Integer.MAX_VALUE;
int mindex = 0;
for (int i = 0; i
< n; i++) {
if (a[i] < m) {
mindex = i;
m = a[i];
}
}
n--;
a[mindex] = a[n];
return m;
} |
|
Question
2 |
signification de l'instruction , System.arraycopy(input,
0, a, 0, n):
La méthode arraycopy provient de la classe System du package java.lang.
Cette méthode copie un tableau source à partir d'un certain indice dans un
tableau destination à partir d'un indice sur une longueur spécifiée.
System.arraycopy(src, int srcPos, dest, int destPos, int length)
|
Question
3 |
/**
* La classe Bag permet de travailler sur la copie d'un tableau d'entier et d'extraire
* successivement les valeurs minimales sans detruire le tableau original passé en paramètre.
* @author OUDARD Claude I013351
* @version 03/04/2004
*/
class Bag {
int[] a;
int n;
/**
* Constructeur d'objet de la classe Bag
* Initialise n à la longueur du tableau passé en paramètre et a une copie du
* tableau passé en paramètre.
*
* @param Tableau d'entier
*/
public Bag(int[] input) {
n = input.length;
a = new int[n];
System.arraycopy(input, 0, a, 0, n);
}
/**
* Recherche l'indice de l'élément de valeur minimum de la copie du tableau
* d'initialisation de l'objet, réduit n la longueur de la copie du tableau,
* puis copie la valeur du dernier élément du tableau à la place de l'élément
* le plus petit trouvé.
*
* @param aucun
* @return valeur du plus petit élément du tableau
*/
int extractMin() {
int m = Integer.MAX_VALUE;
int mindex = 0;
for (int i = 0; i < n; i++) {
if (a[i] < m) {
mindex = i;
m = a[i];
}
}
n--;
a[mindex] = a[n];
return m;
}
/**
* Méthode main de test de la classe
*
* @param liste d'entier
*/
public static void main (String[] args){
int lg = args.length;
int[] tab = new int[lg];
try{
// Recupération des parametres dans le tableau d'entier tab
for (int i=0; i < lg; i++ ){
tab[i] = Integer.parseInt(args[i]);
}
// Initialisation et utilisation de la classe Bag
Bag myBag = new Bag(tab);
for (int i=0; i < lg; i++ ){
tab[i] = Integer.parseInt(args[i]);
System.out.println("Le min du tableau est:" + myBag.extractMin());
}
}catch(Exception e){
System.out.println("Il faut passer une liste d entiers en ligne de commande.");
}
}
}
|
Question
4 |
Trace du test du programme de la question 3: |
|