Solution l'exercice 4
Le programme TriJuste.java
est la solution.
Il suffit de compiler et d'exécuter le programme pour révéler la
première erreur :
maranget@manche ~/TD/TD-0 > javac TriPresqueJuste.java
maranget@manche ~/TD/TD-0 > java Tri
tableau de :
190 46 193 35 81 146 153 228 192 18
java.lang.ArrayIndexOutOfBoundsException: 10
at Tri.trier(TriPresqueJuste.java:27)
at Tri.main(TriPresqueJuste.java:54)
Java controle que les accès dans les tableaux sont bien compris entre
les bornes des tableaux.
Or, les indices commencent à zéro et vont jusqu'à la longueur du
tableau moins un (a.length-1
).
La boucle la plus exterieure de la méthode trier, qui suppose
que les indices vont de un à la longueur du tableau, se termine
donc par un accès illégal :
for (int i = 1 ; i <= a.length ; i++) {
...
}
Elle se corrige bien évidemment par :
for (int i = 0 ; i < a.length ; i++) {
...
}
Mais ce n'est pas fini. Certes le programme s'exécute sans planter,
mais il produit un résultat incorrect :
maranget@manche ~/TD/TD-0 > java Tri
tableau d'entiers :
201 190 180 131 166 209 209 15 179 125
tableau trié :
15 15 15 15 15 15 15 15 125 125
La faute en revient à l'échange de m
et de a[j]
:
// échanger m et a[j]
m = a[j] ;
a[j] = m;
En effet, ces deux instructions identifient les contenus de
m
et de a[j]
au lieu de les échanger.
Pour ce faire, on utlisera une variable auxiliaire :
// échanger m et a[j]
int t = m ;
m = a[j] ;
a[j] = t;
On notera aussi qu'un commentaire prétendait qu'il y avait échange.
D'où une règle d'or de la mise au point :
débugger le programme, pas les commentaires.
Au passage, cet exercice et le précédent montrent quatre états
successifs du développement d'un programme : d'abord il ne compile
pas,
ensuite il ne tourne pas, puis il produit un résultat incorrect. et
enfin il est juste.
On ne passe pas obligatoirement par toutes ces étapes à chaque fois,
mais on les rencontre forcément un jour ou l'autre.
Ce document a été traduit de LATEX par
HEVEA.