Codage par substitution monoalphabetique

Résolu/Fermé
frank21 - 4 janv. 2013 à 15:53
 frank21 - 4 janv. 2013 à 17:20
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 !

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

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.
0
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)") ?
0
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
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 :

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)
0
A vrai dire le "readNextCode()" fait prendre a une variable la valeur des lettres d'un texte une par une et sort un "-1" lorsque le texte est finis. Je suis quasiment sur pour avoir déjà utilisé dans d'autres exercices qu'il se met en dehors de la boucle car c'est lui qui la conditionne.
0
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
Si tu fais comme ceci :

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);
        }
    }
}
0
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.
0
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
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...
0
Je vois ce que tu veux dire, tu as raison, un grand merci pour toutes ces petites aides :)
0