Besoin d'aide sur code

Besoin d'aide sur code - Java - Programmation

Marsh Posté le 29-09-2011 à 12:36:26    

Bonjour,  
 
Quelqu'un pourrait m'expliquer ce qui cloche dans mon programme ? Il compile, mais quand je l'exécute, j'ai droit à l'erreur suivante :  
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at Permutation.main(Permutation.java:8)".
 
Le code :

Citation :

public class Permutation {
   public static void main (String [] args) {
      char [] tab = {'a', 'b', 'c', 'd', 'e'};
      char temp;
      for (int i=0; i<=4; i++) {
         for (int j=4; j>=0; i--) {
            do {
               temp = tab[i];
               tab[i] = tab[j];
               tab[j] = temp;
            }
            while (i==j);
         }
      }
      for (int k=0; k<=4; k++) {
         Terminal.ecrireChar(tab[k]);
      }
   }
}


 
Merci d'avance :jap:  

Reply

Marsh Posté le 29-09-2011 à 12:36:26   

Reply

Marsh Posté le 29-09-2011 à 12:48:22    

Citation :

        for (int j=4; j>=0; i--) {  
            do {  
               temp = tab[i];  
               tab[i] = tab[j];  
               tab[j] = temp;  
            }  
            while (i==j);  
         }


Ben tu relis ça tranquillement, car ça saute aux yeux, l'erreur, surtout sachant que i = 0 au départ.
Quand tu auras corrigé la première erreur, tu pourras corriger la seconde qui surviendra alors (une boucle infinie...)
A+,

Message cité 1 fois
Message édité par gilou le 29-09-2011 à 12:51:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2011 à 12:52:01    

gilou a écrit :

Citation :

        for (int j=4; j>=0; i--) {  
            do {  
               temp = tab[i];  
               tab[i] = tab[j];  
               tab[j] = temp;  
            }  
            while (i==j);  
         }


Ben tu relis ça tranquillement, car ça saute aux yeux, l'erreur.
A+,


J'ai déjà relu mon code whatmille fois. Je suis sûre que c'est tout con, mais je ne la vois pas, mon erreur [:sisicaivrai]

Reply

Marsh Posté le 29-09-2011 à 13:08:09    

Bon, j'ai essayé ça : je n'ai plus d'erreur, mais ça boucle à l'infini :/
 

Citation :

     for (int i=0; i<=4; i++) {
         for (int j=4; j>=0; i--) {
            while (i!=j) {
               temp = tab[i];
               tab[i] = tab[j];
               tab[j] = temp;
            }
         }
      }


Reply

Marsh Posté le 29-09-2011 à 13:13:04    

Pour te mettre sur la voie, ton j tu le fais varier où ? :o


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 29-09-2011 à 13:17:49    

LePhasme a écrit :

Pour te mettre sur la voie, ton j tu le fais varier où ? :o


Je viens de voir que j'avais écrit "i" au lieu de "j" dans mon 2d for. J'ai corrigé, mais ça n'a rien changé [:dams86]

Reply

Marsh Posté le 29-09-2011 à 13:21:03    

T'es sur que c'est exactement la même erreur ?
Parce que là théoriquement tu ne peux plus avoir d'index à -1.


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 29-09-2011 à 13:23:48    

LePhasme a écrit :

T'es sur que c'est exactement la même erreur ?
Parce que là théoriquement tu ne peux plus avoir d'index à -1.


Le dernier code testé :

Citation :

     for (int i=0; i<=4; i++) {
         for (int j=4; j>=0; j--) {
            while (i<j) {
               temp = tab[i];
               tab[i] = tab[j];
               tab[j] = temp;
            }
         }
      }


 
Plus d'erreur, mais tourne en boucle.

Reply

Marsh Posté le 29-09-2011 à 13:26:42    

T'as un while i < j, ton i vaut 0, j 4 et rien ne modifie leur valeur dans le while...


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 29-09-2011 à 13:29:49    

Déja, s'il indiquait comment il veut permuter les indices, ça aiderait à savoir ce qu'il veut faire.
il veut remplacer {'a', 'b', 'c', 'd', 'e'} par quoi? {'e', 'd', 'c', 'b', 'a'}?
A+,


Message édité par gilou le 29-09-2011 à 13:30:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2011 à 13:29:49   

Reply

Marsh Posté le 29-09-2011 à 13:32:33    

Tu te poses pas les bonnes question:
1) j'ai une boucle for. est-ce que ma variable de boucle change à chaque tour?
2) j'ai une boucle while. est-ce que le contenu de mon test change à chaque tour?
C'est à vérifier systématiquement, jusqu'à ce que cela devienne un réflexe.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2011 à 13:33:09    

LePhasme a écrit :

T'as un while i < j, ton i vaut 0, j 4 et rien ne modifie leur valeur dans le while...


Effectivement, si j'incrémente i et décrémente j, ça fonctionne. Mais je croyais que c'était fait automatiquement dans mes boucles for :??:  
 
Et c'est pas un peu bordélique comme code ? Y'a pas une meilleure manière de procéder ? [:eerilie]
 

Citation :

     for (int i=0; i<=4; i++) {
         for (int j=4; j>=0; j--) {
            while (i<j) {
               temp = tab[i];
               tab[i] = tab[j];
               tab[j] = temp;
               i = i + 1;
               j = j - 1;
            }
         }
      }


Reply

Marsh Posté le 29-09-2011 à 13:36:52    

Dans les boucles for oui, mais t'as une boucle while à l'intérieur du 2ème for.
Donc tant qu'il ne termine pas le while il ne termine pas le 1er tour du for et il n'incrémente pas.

 

Et au passage il y a des balises [code] ;)

 

Edit : Comme le dit gilou, c'est quoi le but de ton code ?


Message édité par LePhasme le 29-09-2011 à 13:37:23

---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 29-09-2011 à 13:42:51    

Code :
  1. for (int i=0; i<=4; i++) {
  2.          for (int j=4; j>=0; j--) {
  3.             while (i<j) {
  4.                temp = tab[i];
  5.                tab[i] = tab[j];
  6.                tab[j] = temp;
  7.                i = i + 1;
  8.                j = j - 1;
  9.             }
  10.          }
  11.       }


 
Han, magiques les balises [code] [:gum]
/Sedna découvre HFR
 
Le but ? C'était d'inverser mon tableau initial, tout simplement :D  

Reply

Marsh Posté le 29-09-2011 à 13:51:51    

Ah mais non, ça marche pas ! Je récupère "edcab". Les caractères "a" et "b" n'ont pas été permutés [:aelenia]  

Reply

Marsh Posté le 29-09-2011 à 14:11:24    

Code :
  1. int j = tab.length;
  2. for (int i = 0; i < j/2; i++) {
  3.           temp = tab[i];
  4.           tab[i] = tab[j - (i + 1)];
  5.           tab[j - (i + 1)] = temp;
  6. }


Tu échanges ce qui se trouve dans ton tableau ce qui se trouve la position i avec ce qui se trouve à la position tab.length - (i + 1) et tu ne le fais que pour la première moitié des éléments sinon tu fais deux fois l'échange.
A+,


Message édité par gilou le 29-09-2011 à 14:18:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2011 à 14:14:07    

Si je fais la trace du programme :
 
1er tour de boucle : i vaut 0, j vaut 4
temp <- a
tab[i] <- e
tab[j] <- a
 
2ème tour de boucle : i vaut 1, j vaut 3
temp <- b
tab[i] <- d
tab[j] <- b
 
3ème tour de boucle : i vaut 2, j vaut 2
Condition de sortie, donc arrêt du programme.
 
Alors pourquoi mon inversion finale n'est-elle pas correcte ???

Reply

Marsh Posté le 29-09-2011 à 14:17:21    

C'est sans doute parce que tes index changent dans le while ET dans le for.
 
Pour ton truc, tu te fais beaucoup chier avec tes 2 index, là.
 

Code :
  1. char[] tab = { 'a', 'b', 'c', 'd', 'e' };
  2.        char temp;
  3.  
  4.        int len = tab.length;
  5.        for (int i = 0; i <= len / 2; i++) {
  6.            int j = len - i - 1;
  7.            temp = tab[i];
  8.            tab[i] = tab[j];
  9.            tab[j] = temp;
  10.        }
  11.        for (char k : tab) {
  12.            Terminal.ecrireChar(k);
  13.        }


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
Reply

Marsh Posté le 29-09-2011 à 14:22:21    

Il y a des fonctions en Français maintenant dans java ?


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 29-09-2011 à 14:23:22    

gfive a écrit :

Code :
  1. ............
  2.        int len = tab.length;
  3.        for (int i = 0; i <= len / 2; i++) {
  4.            int j = len - i - 1;
  5.            temp = tab[i];
  6.            tab[i] = tab[j];
  7.            tab[j] = temp;
  8.        }
  9. ............



C'est ce que j'avais écrit plus haut.
Et puis il y a la solution encore plus simple tab.reverse(); :D
 
A+,

Message cité 1 fois
Message édité par gilou le 29-09-2011 à 14:24:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2011 à 14:29:45    

gilou a écrit :


C'est ce que j'avais écrit plus haut.
Et puis il y a la solution encore plus simple tab.reverse(); :D

 

A+,

 

tab.reverse, ça marche avec une liste.

 

Ca lui fait instancier une liste.. Donc Arrays.asList(), qui va pas marcher avec un tableau de type primitif. Et ça lui retournera un Character[], au mieux.

 

Bref, il a sans doute plus vite fait de faire comme ça.. S'il a vraiment besoin de faire ça :o

 

[edit]

 

Cela dit, en l'occurence avec des char, il peut faire :

 
Code :
  1. StringBuilder sb = new StringBuilder(new String(tab));
  2. sb.reverse();
  3. tab = sb.toString().toCharArray()
 

Mais c'est un peu moche :o

 

[edit²] J'avais pas vu ton post quand j'ai envoyé le mien :o

Message cité 1 fois
Message édité par gfive le 29-09-2011 à 14:33:59

---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
Reply

Marsh Posté le 29-09-2011 à 14:58:36    

gfive a écrit :

tab.reverse, ça marche avec une liste.

Il avait qu'a faire un vrai tableau:
tab = new Array('a', 'b', 'c', 'd', 'e');  
EDIT: en fait j'ai pas fait gaffe, depuis le début, je pensais que c'était en javascript :o
 
A+,


Message édité par gilou le 29-09-2011 à 15:00:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 29-09-2011 à 15:16:32    


 
Pourquoi n'utilises tu pas un debugger pour observer le comportement que tu as implémenté ?


---------------
Töp of the plöp
Reply

Marsh Posté le 29-09-2011 à 15:26:44    


 
Nan.
 
Dans le while, ça te fait ça, puis la boucle For reprend son cours...
 
j-- => j vaut 1, le while ne fait rien.
j-- => j vaut 0, le while ne fait rien.
 
Ensuite, 2° tour du 1° for :
i = 2, j = 4
 
Il va se apsser plein de trucs que t'as oublié :)


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
Reply

Marsh Posté le 29-09-2011 à 20:19:54    

LePhasme a écrit :

Il y a des fonctions en Français maintenant dans java ?


Si tu parles de Terminal.ecrireChar(), c'est une classe déjà existante ;)  
 

_darkalt3_ a écrit :

Pourquoi n'utilises tu pas un debugger pour observer le comportement que tu as implémenté ?


J'ai récupéré NetBeans. Je vais voir si je peux y mettre des espions parce que moi, Eclipse, je m'y perds !
 

gfive a écrit :


 
Nan.
 
Dans le while, ça te fait ça, puis la boucle For reprend son cours...
 
j-- => j vaut 1, le while ne fait rien.
j-- => j vaut 0, le while ne fait rien.
 
Ensuite, 2° tour du 1° for :
i = 2, j = 4
 
Il va se apsser plein de trucs que t'as oublié :)


Ah mais oui, bien sûr, je n'y avais pas pensé [:sanglier bossu:1]  
Cela dit, même en refaisant la trace complète sur papier, je n'arrive toujours pas à la chaîne obtenue  [:cerveau autobot]  
 
 
En tout cas, merci à tous pour vos réponses :jap:  

Reply

Marsh Posté le 29-09-2011 à 21:27:28    


 
ben après le premier passage dans le while, ta chaîne est bien inversée.
 
Et je me suis gourré : i=3, j=4
 
Donc, on fait un tour de plus
tab = edcba, on entre dans le while :
temp=b
tab = edcaa
tab = edcab
i = 4
j = 3
 => on sort du while
 => on fait 3 tour du 2° for sans entrer dans le while parce que i >= j
 => on refait un tour du 1° for avec i = 4 => on fait 4 tours du 2° for sans entrer dans le while parce que i >= j
 => on sort. Chaine finale = edcab


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
Reply

Marsh Posté le 30-09-2011 à 10:27:00    

gfive a écrit :


 
ben après le premier passage dans le while, ta chaîne est bien inversée.
 
Et je me suis gourré : i=3, j=4
 
Donc, on fait un tour de plus
tab = edcba, on entre dans le while :
temp=b
tab = edcaa
tab = edcab
i = 4
j = 3
 => on sort du while
 => on fait 3 tour du 2° for sans entrer dans le while parce que i >= j
 => on refait un tour du 1° for avec i = 4 => on fait 4 tours du 2° for sans entrer dans le while parce que i >= j
 => on sort. Chaine finale = edcab


Merci beaucoup pour ces explications !

Reply

Marsh Posté le 30-09-2011 à 10:41:05    


 
Tu penses payer par chèque ou t'as un paypal? :o


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
Reply

Marsh Posté le 30-09-2011 à 11:16:13    

gfive a écrit :

Tu penses payer par chèque ou t'as un paypal? :o


 :D  
 
Je poursuis mon apprentissage du Java, j'aurai peut-être d'autres questions :o  

Reply

Marsh Posté le 03-10-2011 à 13:23:29    

Je reviens, non pas pour vous poser une autre question mais pour vous proposer une solution toute simple qui fonctionne (et qui permet d'éviter les boucles imbriquées !) :
 

Code :
  1. char temp;
  2.       int i=0; int j=4;
  3.             while (i<j) {
  4.                temp = tab[i];
  5.                tab[i] = tab[j];
  6.                tab[j] = temp;
  7.                i = i + 1;
  8.                j = j - 1;
  9.             }


 
\o/

Reply

Marsh Posté le 03-10-2011 à 14:29:46    

Dans le code que je t'ai proposé, comme dans celui de gfive, il n'y a pas de boucle imbriquée.
Mais c'est vrai que l'écriture de celui la est particulièrement élégante.
 
On peut aussi le faire avec un for:

Code :
  1. for (int i = 0, j = tab.length - 1; i < j; ++i, --j) {
  2.    char temp = tab[i];
  3.    tab[i] = tab[j];
  4.    tab[j] = temp;
  5. }


L'intérêt étant de réduire la portée de i et j a la boucle.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-10-2011 à 14:57:34    

gilou a écrit :

Dans le code que je t'ai proposé, comme dans celui de gfive, il n'y a pas de boucle imbriquée.
Mais c'est vrai que l'écriture de celui la est particulièrement élégante.
 
On peut aussi le faire avec un for:

Code :
  1. for (int i = 0, j = tab.length - 1; i < j; ++i, --j) {
  2.    char temp = tab[i];
  3.    tab[i] = tab[j];
  4.    tab[j] = temp;
  5. }


L'intérêt étant de réduire la portée de i et j a la boucle.
 
A+,


 :jap:  
 
J'ai découvert une nouvelle écriture (++i / --j) que je ne connaissais pas encore :D  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed