Besoin d'aide sur code - Java - Programmation
Marsh Posté le 29-09-2011 à 12:48:22
| Citation :          for (int j=4; j>=0; i--) {   | 
 
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+,
Marsh Posté le 29-09-2011 à 12:52:01
| gilou a écrit : 
   | 
 
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] [:sisicaivrai]](https://forum-images.hardware.fr/images/perso/sisicaivrai.gif) 
 
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++) {  | 
 
Marsh Posté le 29-09-2011 à 13:13:04
Pour te mettre sur la voie, ton j tu le fais varier où ? 
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ù ?  | 
 
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] [:dams86]](https://forum-images.hardware.fr/images/perso/dams86.gif) 
 
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.
Marsh Posté le 29-09-2011 à 13:23:48
| LePhasme a écrit : T'es sur que c'est exactement la même erreur ?  | 
 
Le dernier code testé : 
| Citation :       for (int i=0; i<=4; i++) {  | 
 
 
Plus d'erreur, mais tourne en boucle. 
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...
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+,
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+, 
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] [:eerilie]](https://forum-images.hardware.fr/images/perso/eerilie.gif) 
 
 
| Citation :       for (int i=0; i<=4; i++) {  | 
 
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 ?
Marsh Posté le 29-09-2011 à 13:42:51
| Code : 
 | 
 
 
Han, magiques les balises [code] ![[:gum] [:gum]](https://forum-images.hardware.fr/images/perso/gum.gif) 
 
/Sedna découvre HFR 
 
Le but ? C'était d'inverser mon tableau initial, tout simplement  
  
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] [:aelenia]](https://forum-images.hardware.fr/images/perso/aelenia.gif) 
  
Marsh Posté le 29-09-2011 à 14:11:24
| Code : 
 | 
 
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+,
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 ??? 
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 : 
 | 
Marsh Posté le 29-09-2011 à 14:22:21
Il y a des fonctions en Français maintenant dans java ?
Marsh Posté le 29-09-2011 à 14:23:22
| gfive a écrit : 
 | 
 
C'est ce que j'avais écrit plus haut. 
Et puis il y a la solution encore plus simple tab.reverse();  
 
 
A+,
Marsh Posté le 29-09-2011 à 14:29:45
| gilou a écrit : 
 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 
[edit]
Cela dit, en l'occurence avec des char, il peut faire :
| Code : 
 | 
Mais c'est un peu moche 
[edit²] J'avais pas vu ton post quand j'ai envoyé le mien 
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  
 
 
A+,
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é ? 
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é 
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 :   | 
 
Ah mais oui, bien sûr, je n'y avais pas pensé ![[:sanglier bossu:1] [:sanglier bossu:1]](https://forum-images.hardware.fr/images/perso/1/sanglier bossu.gif) 
  
Cela dit, même en refaisant la trace complète sur papier, je n'arrive toujours pas à la chaîne obtenue  ![[:cerveau autobot] [:cerveau autobot]](https://forum-images.hardware.fr/images/perso/cerveau autobot.gif) 
  
 
 
En tout cas, merci à tous pour vos réponses  
  
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 
Marsh Posté le 30-09-2011 à 10:27:00
| gfive a écrit :   | 
 
Merci beaucoup pour ces explications ! 
Marsh Posté le 30-09-2011 à 10:41:05
 
 
Tu penses payer par chèque ou t'as un paypal? 
Marsh Posté le 30-09-2011 à 11:16:13
| gfive a écrit : Tu penses payer par chèque ou t'as un paypal?  | 
 
  
  
 
Je poursuis mon apprentissage du Java, j'aurai peut-être d'autres questions  
  
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 : 
 | 
 
 
\o/ 
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 : 
 | 
 
L'intérêt étant de réduire la portée de i et j a la boucle. 
 
A+,
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.  
   | 
 
  
  
 
J'ai découvert une nouvelle écriture (++i / --j) que je ne connaissais pas encore  
  
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 :
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