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.