Codage par substitution monoalphabetique
Résolu/Fermé
A voir également:
- Codage par substitution monoalphabetique
- Codage ascii - Guide
- Codage binaire - Guide
- Fichier word illisible codage - Guide
- Pour enregistrer ce texte au format txt sans perdre d’informations, quel codage utiliser ? - Forum Webmastering
- Application codage - Guide
3 réponses
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
4 janv. 2013 à 16:08
4 janv. 2013 à 16:08
Il y a des erreurs flagrantes sur tes boucles, il ne faut pas mettre de point-virgule après, et tu dois spécifier avec des accolades leurs portées, sinon seule la première instruction est prise en compte alors que toi tu en as deux. De plus il n'y a aucune raison de mettre des 'int' dans tes affectations. Enfin, le deuxième argument de la boucle for est un test booléen, si tu mets "i=2" ça ne veut rien dire.
C'est la même chose pour la boucle while (il faut donc remplacer tes parenthèses par des accolades), sans oublier que "i" n'existe plus quand tu arrives à ce niveau du code, il faut donc déclarer son type. De plus la condition du if est toujours entre parenthèse, et là encore, pas de point de virgule derrière. Enfin, il ne faut pas confondre = et == qui sont très différent.
Remarque : je ne dis pas que j'ai repéré toutes les erreurs, de plus je n'ai pas du tout regardé le fonctionnement du programme, j'ai juste corrigé les erreurs évidentes. Mais il faut absolument que tu apprennes la syntaxe de Java car tu ne peux pas te permettre d'être approximatif dans ce que tu écris, sinon le compilateur ne peux pas comprendre ce que tu lui demandes.
for (int i=0; i<2; i++) for (int j=0; j<26; j++) { tab[i]=alphabet.charAt(i); tab[j]=coder.charAt(j); }
C'est la même chose pour la boucle while (il faut donc remplacer tes parenthèses par des accolades), sans oublier que "i" n'existe plus quand tu arrives à ce niveau du code, il faut donc déclarer son type. De plus la condition du if est toujours entre parenthèse, et là encore, pas de point de virgule derrière. Enfin, il ne faut pas confondre = et == qui sont très différent.
int echange = -1; // il faut déclarer 'echange' avant la boucle si tu veux modifier sa valeur dans la boucle et t'en servir après ! while (c != -1) { for (int i=0; i<26; i++) { if (c == tab[i][1]) echange = tab[i][2]; } } println(echange);
Remarque : je ne dis pas que j'ai repéré toutes les erreurs, de plus je n'ai pas du tout regardé le fonctionnement du programme, j'ai juste corrigé les erreurs évidentes. Mais il faut absolument que tu apprennes la syntaxe de Java car tu ne peux pas te permettre d'être approximatif dans ce que tu écris, sinon le compilateur ne peux pas comprendre ce que tu lui demandes.
Oui en effet, maintenant je vois mes erreures, a vrai dire je débute juste en java donc j'ai du mal a appliquer mon raisonnement avec le vocabulaire de programmation adéquat. En tous cas merci déja pour ces corrections très utiles.
La compilation me trouve une faute ligne 8:
incompatible types
found : char
required: int[]
tab[i]=alphabet.charAt(i);
J'ai du mal a comprendre a quoi me servirait ce "int[]" à cet endroit (il me le positionne entre le "charAt" et le "(i)") ?
La compilation me trouve une faute ligne 8:
incompatible types
found : char
required: int[]
tab[i]=alphabet.charAt(i);
J'ai du mal a comprendre a quoi me servirait ce "int[]" à cet endroit (il me le positionne entre le "charAt" et le "(i)") ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
4 janv. 2013 à 16:49
4 janv. 2013 à 16:49
Effectivement ceci m'avait échappé. tab est un tableau à deux dimensions int [26][2], donc tab[i] est un tableau int[2], il faudrait donc plutôt avoir tab[j][i], dans ton contexte cela donne :
Cependant, ton tableau est totalement superflus car tu as déjà tes deux String qui contiennent ces données, tu pourrais faire directement ceci qui est d'ailleurs plus simple à comprendre :
Au passage, je ne sais pas trop à quoi sert ton readNextCode() mais tu l'utilises mal, car tu devrais le lire à chaque tour de boucle, pas juste une fois avant la boucle, sinon 'c' aura toujours la même valeur dans la boucle et tu tourneras indéfiniment ! La bonne façon de faire devrait être :
for (int i=0; i<26; i++) { tab[i][0]=alphabet.charAt(i); tab[i][1]=coder.charAt(i); }
Cependant, ton tableau est totalement superflus car tu as déjà tes deux String qui contiennent ces données, tu pourrais faire directement ceci qui est d'ailleurs plus simple à comprendre :
while (c != -1) { for (int i=0; i<26; i++) { if (c == alphabet.charAt(i)) echange = coder.charAt(i) } }
Au passage, je ne sais pas trop à quoi sert ton readNextCode() mais tu l'utilises mal, car tu devrais le lire à chaque tour de boucle, pas juste une fois avant la boucle, sinon 'c' aura toujours la même valeur dans la boucle et tu tourneras indéfiniment ! La bonne façon de faire devrait être :
while ((c=readNextCode()) != -1)
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
4 janv. 2013 à 17:09
4 janv. 2013 à 17:09
Si tu fais comme ceci :
La valeur de 'c' est créée avant la boucle, prenons par exemple c=2, dans ce cas tu as c!=-1 et tu rentres dans la boucle, mais comme la valeur de 'c' ne change jamais, tu as toujours c=2, donc tu ne sors jamais de la boucle, et tu ne lis jamais d'autres valeurs de c !
Alors que si tu fais comme ceci :
La valeur de 'c' est d'abord lue avec readNextCode, puis comparée avec la valeur -1, donc à chaque tour de boucle c'est un nouveau 'c' qui est lu, ce qui est à mon avis ce que tu veux faire, sauf que bien sûr cela veut dire que l'instruction println(echange); devrait aussi être dans la boucle.
int c = readNextCode(); while(c != -1) { ... }
La valeur de 'c' est créée avant la boucle, prenons par exemple c=2, dans ce cas tu as c!=-1 et tu rentres dans la boucle, mais comme la valeur de 'c' ne change jamais, tu as toujours c=2, donc tu ne sors jamais de la boucle, et tu ne lis jamais d'autres valeurs de c !
Alors que si tu fais comme ceci :
int c; while ((c=readNextCode()) != -1) { ... }
La valeur de 'c' est d'abord lue avec readNextCode, puis comparée avec la valeur -1, donc à chaque tour de boucle c'est un nouveau 'c' qui est lu, ce qui est à mon avis ce que tu veux faire, sauf que bien sûr cela veut dire que l'instruction println(echange); devrait aussi être dans la boucle.
int c; while ((c=readNextCode()) != -1) { for (int i=0; i<26; i++) { if (c == alphabet.charAt(i)) { int echange = coder.charAt(i); println(echange); } } }
Quand a l'interet de mon tableau, je pensais que c'etait une solution pour le programme de substituer la lettre d'un texte par une autre associée.
Il fallait que par exemple, ici, quand il lit A, il remplace par B. Et quand il lit B, il remplace par K etc
Le tableau simplifiait la position et la substitution de chaque lettre à mon sens.
Il fallait que par exemple, ici, quand il lit A, il remplace par B. Et quand il lit B, il remplace par K etc
Le tableau simplifiait la position et la substitution de chaque lettre à mon sens.
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
4 janv. 2013 à 17:11
4 janv. 2013 à 17:11
Ton tableau ne simplifie rien du tout puisque tu as déjà les String !
Faire tab[i][0] ou alphabet.charAt(i) c'est pareil, mais il y en a un qui est plus compréhensible que l'autre, surtout si tu te mélanges les pinceaux en manipulant tab...
Faire tab[i][0] ou alphabet.charAt(i) c'est pareil, mais il y en a un qui est plus compréhensible que l'autre, surtout si tu te mélanges les pinceaux en manipulant tab...