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
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é
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 ?
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]
/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
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é
Cela dit, même en refaisant la trace complète sur papier, je n'arrive toujours pas à la chaîne obtenue
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