Java's cool, n'arrive pas a afficher le mot !

Fermé
kasio Messages postés 2 Date d'inscription dimanche 23 février 2014 Statut Membre Dernière intervention 23 février 2014 - Modifié par pijaku le 24/02/2014 à 10:48
kasio Messages postés 2 Date d'inscription dimanche 23 février 2014 Statut Membre Dernière intervention 23 février 2014 - 23 févr. 2014 à 16:21
Bonjour,

je suis en Terminale S et je travail sur une version simplifié de Java appelé java's cool, nous avons un exercice de cryptage/décryptage de code a faire, et je m'occupe du code dit de Vernam. J'ai réussi la partie codage mais lorsque je décode je n'arrive pas a afficher le mot décoder a la fin, j'aurais besoin d'aide...
voici les programmes:

Codage:

void main()
 {
 int n, p ,a ,b, c; /* on définit les valeurs numériques que l'on utilisera */
 String motclair, clé, motcodé; /* on définit les mots que l'on utilisera */
  motclair = readString("entrez votre mot à coder: "); /* on demande le mot à coder à l'utilisateur */
  n = motclair.length() ; /* on cherche la taille du mot à coder choisit précèdemment */
  println ("taille du mot à coder:"); println (n); /* on indique la taille du mot à coder à l'utilisateur */
  do
  {
   clé = readString("entrez votre clé d'au moins autant de caractères que le mot à coder SVP: "); /* on demande à l'utilisateur la clé d'au moins la taille du mot à coder */
   p = clé.length(); /* on cherche la taille de la clé */
   if(p<n) /* on teste cette taille jusqu'à pour voir si elle est inférieure à celle du mot à coder */
    println("clé trop petite, recommencez SVP: "); /* si elle est inférieure on demande de recommencer */
  }
  while(p<n); /* on répète jusqu'à ce que la clé soit de la taille recquise */
 int []valeurcodée = new int[n];
 /* int []valeurclé = new int[p]; */
  for(int i=0; i<n; i++)
  {
   a=motclair.charAt(i); /* on transforme la lettre en sa valeur ASCII */
    /* println(a); */
   b=clé.charAt(i); /* on transforme la lettre de la clé en sa valeur ASCII */
    /* println(b); */
   c=a+b; /* on calcule la valeure ASCII de la lettre codée */
    if(c<123) /*on vérifie que la valeur ASCII ne dépasse pas la valeur ASCII de "z" */
    {
     c=c ; /* auquel cas on laisse la valeur ASCII trouvée */
    }
    else
    {
     if(c<219) /*on coupe notre alphabet en 2 */
     {
      c=c-96; /*les 4 premières lettres de l'alphabet auxquelles on enlève 96 */
     }
     else
     {
      c=c-122; /*les autres lettres de l'alphabet auxquelles on enlève 122 */
     }
    }
   /* println(c); */
   valeurcodée[i]=c; /*on rentre chaques valeurs ASCII de la lettre codée dans un tableau */
  }
 /* println(valeurcodée); */
 motcodé = new String(valeurcodée,0,n); /* on définit le mot codé comme la succession des lettre correspondantes aux valeurs ASCII du tableau ci dessus */
 println(motcodé); /* donner le mot codé */
}


Décodage:


void main(){
 
 
 println("entrez le mot a décoder");
 String mot_a_decoder=readString("Entrez le mot");
 int longueur_mot=mot_a_decoder.length();
 int []valeur_decodee=new int[longueur_mot];
 String mot_decode;
 println("entrez le mot clé");
 String mot_cle=readString("Entrez le mot clé");
 int longueur_cle =mot_cle.length();
 
 if (longueur_cle!=longueur_mot){
     println("La clé n'est pas valide");
     }else { 
    for (int i=0; i<longueur_mot; i++)
           {
         int variable_mot=mot_a_decoder.charAt(i);
      int variable_cle=mot_cle.charAt(i);
      int b=variable_mot-variable_cle;
      if (b<0){b=b+26;}
         valeur_decodee[i]=b;  
     mot_decode=new String(valeur_decodee,0,longueur_mot); 
     println(mot_decode);
}
      } 
         }

le décodage est plus "sale" car non fonctionnel... je tiens juste a préciser que je peux compiler et que lorsque qu'au lieu de rentrer "mot_decode" dans le dernier println je rentre "b" j'obtiens les chiffres correspondant aux lettres ... merci d'avance pour votre aide qui je l'espere me sera précieuse :)

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 févr. 2014 à 13:52
"le décodage est plus "sale" car non fonctionnel..."
Tu considères donc que ton codage lui est fonctionnel ?
Comment savoir quand c'est le codage ou le décodage qui est mauvais ?

Personnellement, je ne trouve le codage plus "propre".
Tout est dans une seule méthode, avec des déclarations de variables tout au début, alors qu'elles devraient se faire au fur et à mesure, en plus de ça elles n'ont aucun nom significatifs (n, p ,a ,b, c...), impossible de savoir à quoi elles servent.

Les interactions utilisateurs avec des readString c'est joli, mais ce n'est pas le plus important. Pour l'instant ton couple codage/decodage ne permet pas de récupérer le mot d'origine... et ça c'est plus embêtant !

Commences déjà par regrouper tes deux codes en un seul, avec des méthodes distinctes et un seul main qui te servira de test.

Exemple :

String codage(String mot, String cle)
{
	return mot; // TODO
}

String decodage(String mot, String cle)
{
	return mot; // TODO
}

void main()
{ 
	String cle = "1234";
	println("clé = "+cle);
	
	String mot = "toto";
	println("mot à coder = "+mot);
	
	String code = codage(mot,cle);
	println("mot codé = "+code);
	
	String decode = decodage(code,cle);
	println("mot décodé = "+decode);
	
	println("ok = "+mot.equals(decode));
}

Pour l'instant modifies juste les méthode codage et decodage de manière à ce qu'elles fonctionnent ensemble (c'est à dire que dans le main tu dois toujours avoir "ok = true")

Une fois que ce sera fait tu pourras t'occuper de l'utilisateur, à faire des boucles parce que la saisie est mauvaise ou tout ce que tu veux dans le main. Mais il faut faire les choses dans l'ordre.
0
kasio Messages postés 2 Date d'inscription dimanche 23 février 2014 Statut Membre Dernière intervention 23 février 2014
23 févr. 2014 à 16:21
Merci de ta réponse mais je crois que tu n'as pas bien compris le but de ma question, peut-etre me suis-je mal exprimé. En fait dans notre projet une partie du groupe fait le cryptage et l'autre le décryptage, le fait étant que le décryptage est fini et es fonctionnel, c'est certain. Malheureusement mon probleme est que je ne peux pas afficher le mot de base, qui a été crypté, or lorsque j'affiche le "b" qui représente en fait les valeurs des lettres, celles-ci sont les bonnes... Je demandais donc si quelqu'un savait comment faire cela, ou, ou avais-je raté... De plus par propre je parlais de la présentation et de la description qui est fait sur le cryptage et non sur le décryptage, et non de la clarté de ce programme... Je tiens juste à rappeler que c'est le premier programme que j'effectue en autonomie et que je débute, merci tout de même pour ta réponse rapide et explicite, que j'ai cependant eu du mal a comprendre...
0