Codage par substitution monoalphabetique
Résolu
frank21
-
frank21 -
frank21 -
Bonjour,
Je travail en fait avec javascool (version simplifiée de java).
J'ai comme projet le suivant: avoir un fichier texte dans lequel est écrit une phrase, lorsque le programme démarre, il crypte les lettres une par une et ecrit le resultat dans un autre fichier texte.
Pour simplifier la chose j'ai décidé de prendre toujours le meme alphabet de substitution.
Jai commencé en créant un tableau a 2 lignes: une avec l'alphabet normal et la deuxieme avec mon alphabet de substitution.
Ensuite je lui dis d'aller chercher les lettres une par une dans le fichier texte et de les comparer a la premiere ligne du tableau. Quand il y a correspondance, il substitue la lettre d'origine par celle située sur la deuxieme ligne a la meme position. Malheureusement je commence a programmer et je n'ai pas une excellente connaissance du langage. Mon programme ne fonctionne donc pas mais je ne comprends pas pourquoi, est-ce que quelqu'un pourrait m'aider ?
Mon programme actuel:
void main(){
resetConsole();
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String coder = "BKZMURXQWNOTCHSVIDGQFLAPJE";
int[][]tab = new int [26][2];
for(int i=0;i=2;i++);
for(int j=0;j=26;j++);
tab[i]=int alphabet.charAt(i);
tab[j]=int coder.charAt(j);
openFileReader("essai.txt");
int c = readNextCode();
while(c != -1)(
for(i=0;i=26;i++);
if c = tab [i][1];
int echange = tab[i][2];
)
println(echange);
closeFileReader();
Merci d'avance !
Je travail en fait avec javascool (version simplifiée de java).
J'ai comme projet le suivant: avoir un fichier texte dans lequel est écrit une phrase, lorsque le programme démarre, il crypte les lettres une par une et ecrit le resultat dans un autre fichier texte.
Pour simplifier la chose j'ai décidé de prendre toujours le meme alphabet de substitution.
Jai commencé en créant un tableau a 2 lignes: une avec l'alphabet normal et la deuxieme avec mon alphabet de substitution.
Ensuite je lui dis d'aller chercher les lettres une par une dans le fichier texte et de les comparer a la premiere ligne du tableau. Quand il y a correspondance, il substitue la lettre d'origine par celle située sur la deuxieme ligne a la meme position. Malheureusement je commence a programmer et je n'ai pas une excellente connaissance du langage. Mon programme ne fonctionne donc pas mais je ne comprends pas pourquoi, est-ce que quelqu'un pourrait m'aider ?
Mon programme actuel:
void main(){
resetConsole();
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String coder = "BKZMURXQWNOTCHSVIDGQFLAPJE";
int[][]tab = new int [26][2];
for(int i=0;i=2;i++);
for(int j=0;j=26;j++);
tab[i]=int alphabet.charAt(i);
tab[j]=int coder.charAt(j);
openFileReader("essai.txt");
int c = readNextCode();
while(c != -1)(
for(i=0;i=26;i++);
if c = tab [i][1];
int echange = tab[i][2];
)
println(echange);
closeFileReader();
Merci d'avance !
A voir également:
- Codage par substitution monoalphabetique
- Codage ascii - Guide
- Codage binaire - Guide
- Application codage - Guide
- Fichier word illisible codage - Guide
- Controleur de codage/decodage pci ✓ - Forum Pilotes (drivers)
3 réponses
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)") ?
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)
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.