Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
850 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Besoin d'aide sur code

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'aide sur code

n°2103921
Profil sup​primé
Posté le 29-09-2011 à 12:36:26  answer
 

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:  

mood
Publicité
Posté le 29-09-2011 à 12:36:26  profilanswer
 

n°2103924
gilou
Modérateur
Modzilla
Posté le 29-09-2011 à 12:48:22  profilanswer
 

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é!  --
n°2103925
Profil sup​primé
Posté le 29-09-2011 à 12:52:01  answer
 

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]

n°2103928
Profil sup​primé
Posté le 29-09-2011 à 13:08:09  answer
 

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;
            }
         }
      }


n°2103930
LePhasme
Les Belges domineront le monde
Posté le 29-09-2011 à 13:13:04  profilanswer
 

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


---------------
Instagram - Mon PVT en Australie.
n°2103932
Profil sup​primé
Posté le 29-09-2011 à 13:17:49  answer
 

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]

n°2103934
LePhasme
Les Belges domineront le monde
Posté le 29-09-2011 à 13:21:03  profilanswer
 

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.
n°2103935
Profil sup​primé
Posté le 29-09-2011 à 13:23:48  answer
 

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.

n°2103936
LePhasme
Les Belges domineront le monde
Posté le 29-09-2011 à 13:26:42  profilanswer
 

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.
n°2103937
gilou
Modérateur
Modzilla
Posté le 29-09-2011 à 13:29:49  profilanswer
 

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é!  --
mood
Publicité
Posté le 29-09-2011 à 13:29:49  profilanswer
 

n°2103938
gilou
Modérateur
Modzilla
Posté le 29-09-2011 à 13:32:33  profilanswer
 

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é!  --
n°2103939
Profil sup​primé
Posté le 29-09-2011 à 13:33:09  answer
 

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;
            }
         }
      }


n°2103940
LePhasme
Les Belges domineront le monde
Posté le 29-09-2011 à 13:36:52  profilanswer
 

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.
n°2103942
Profil sup​primé
Posté le 29-09-2011 à 13:42:51  answer
 

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  

n°2103943
Profil sup​primé
Posté le 29-09-2011 à 13:51:51  answer
 

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

n°2103945
gilou
Modérateur
Modzilla
Posté le 29-09-2011 à 14:11:24  profilanswer
 

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é!  --
n°2103946
Profil sup​primé
Posté le 29-09-2011 à 14:14:07  answer
 

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 ???

n°2103947
gfive
Posté le 29-09-2011 à 14:17:21  profilanswer
 

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)
n°2103948
LePhasme
Les Belges domineront le monde
Posté le 29-09-2011 à 14:22:21  profilanswer
 

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


---------------
Instagram - Mon PVT en Australie.
n°2103949
gilou
Modérateur
Modzilla
Posté le 29-09-2011 à 14:23:22  profilanswer
 

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é!  --
n°2103950
gfive
Posté le 29-09-2011 à 14:29:45  profilanswer
 

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)
n°2103959
gilou
Modérateur
Modzilla
Posté le 29-09-2011 à 14:58:36  profilanswer
 

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é!  --
n°2103962
_darkalt3_
Proctopathe
Posté le 29-09-2011 à 15:16:32  profilanswer
 


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


---------------
Töp of the plöp
n°2103963
gfive
Posté le 29-09-2011 à 15:26:44  profilanswer
 


 
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)
n°2104006
Profil sup​primé
Posté le 29-09-2011 à 20:19:54  answer
 

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:  

n°2104019
gfive
Posté le 29-09-2011 à 21:27:28  profilanswer
 


 
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)
n°2104099
Profil sup​primé
Posté le 30-09-2011 à 10:27:00  answer
 

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 !

n°2104105
gfive
Posté le 30-09-2011 à 10:41:05  profilanswer
 


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


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2104115
Profil sup​primé
Posté le 30-09-2011 à 11:16:13  answer
 

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  

n°2104433
Profil sup​primé
Posté le 03-10-2011 à 13:23:29  answer
 

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/

n°2104444
gilou
Modérateur
Modzilla
Posté le 03-10-2011 à 14:29:46  profilanswer
 

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é!  --
n°2104447
Profil sup​primé
Posté le 03-10-2011 à 14:57:34  answer
 

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  

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Besoin d'aide sur code

 

Sujets relatifs
[PHP] Besoin d'aide pour du code PHPBesoin d'aide pour un code PHP
connexion ado avec acces et besoin d'aide pour code vb svpBesoin d'aide sur un code "copier - coller"
[ Besoin D'AIDE ! ] Quelques lignes de code Svp. ( noob )Besoin d'aide pour écrire un code VBA
besoin d'aide pour le code d'1 graphiqueBesoin d'aide sur un code.
Besoin d'aide pour mon bout de code PHPBesoin d'aide sur un code !!
Plus de sujets relatifs à : Besoin d'aide sur code


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR