Probléme de test de carractére

Signaler
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Bonjour,
Je dois réaliser un programme réalisant les contraintes suivantes :

Algorithme:
<hr size="2" width="100%" />

L'algorithme proposé utilise une matrice 6x6, identique au codage et au

décodage. Elle contient 36 caractères : les lettres de A à Z, les chiffres

de 1 à 9 et l'espace. Le chiffre zéro est représenté par la lettre O.


ABCDEF

GHIJKL

MNOPQR

STUVWX

YZ 123

456789


La clef de chiffrement associée à cette matrice est la concaténation de ses

lignes :


"ABCDEFGHIJKLMNOPQRSTUVWXYZ 123456789"


Le message est chiffré par bigrammes, i.e. par groupe de 2 caractères

successifs. Le chiffrement obéit aux règles suivantes :


- Si les deux caractères du bigramme représentent deux coins d'un rectangle

dans la matrice (c'est à dire sont sur 2 lignes et colonnes différentes),

on les code par les deux coins restants, dans le sens direct.

Ainsi, avec la matrice ci-dessus:


VI --> JU

IV --> UJ

W3 --> 2X


- Si les deux caractères sont sur la même ligne, on prend leurs deux voisins de

droite, modulo la largeur de la ligne:


EF --> FA

GJ --> HK


-Si les deux caractères sont sur la même colonne, on prend les deux voisins du

dessous, modulo la hauteur de la colonne:


Y4 --> 4A

KW --> Q2


- Si les deux caractères sont identiques ou si le bigramme ne contient plus

qu'un seul caratère (message de longueur impaire), on ne code tout simplement

pas le bigramme.


Interface:


Le programme doit pouvoir s'appeller en ligne de commande, avec comme

arguments l'options -C pour coder ou -D pour décoder, la matrice de codage

mise sous la forme d'une chaîne de 36 caractères, et enfin la chaîne à coder

entre guillemets. Le résultat est afficher sur la sortie standard.


Exemple:


$ MC []TP7.EXE -C "ABCDEFGHIJKLMNOPQRSTUVWXYZ 123456789" "Bonjour"

NCPHU R


$ MC []TP7.EXE -D "ABCDEFGHIJKLMNOPQRSTUVWXYZ 123456789" "NCPHU R"

BONJOUR"

alors j'ai réussi a récupere ma matrice de codage que je stocke dans mon  tableau MATRICE mais je en vois absolument pas comment testé els carractére pour respecter l'algorythme ci dessu.
<hr size="2" width="100%" />voici ma fonction codage pour le moment: mais je ne sait pas comment faire opur tester les lettres une par une dans la chaine de carractére, ni comment les tester pour obtenir la fonction de codage souhaitée:

int codage(char matrice[TAILLE_MATRICE][TAILLE_MATRICE],char *argv[])
{   int nb;

    nb=strlen(argv[3]);
    while(nb>=0)
    {
                nb=nb-2;// test si nombre multiple de 2 ou pas
    }
    switch(nb)
    {case -2: printf("chaine pair");
          break;
    case -1:
         printf("chaine impair");
         break;
    }
    return 0;
}

Toute aide sera la bienvenue parceque la je galére trop ...Merci d'avance
A voir également:

13 réponses

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Pas besoin d'une boucle pour savoir si un nombre est pair suffit de tester la valeur du deuxieme bit:
BOOL bPair = FALSE;
if(nb & 2) bPair = TRUE;

Neo_Fr
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonsoir,

1) C'est le premier bit (poids faible) qui correspond aux unités donc à la parité et si il est positionné alors c'est impair !
BOOL bPair = TRUE;
if (nb & 1) bPair = FALSE;

2) Ici ce n'est pas la parité de la longueur qui est cherchée mais si la longueur est multiple de 2. Il suffit de faire un modulo 2 de cette longueur (modulo = reste de la division entière). Si le résultat est 0 alors c'est un multiple de 2 :

nb = strlen(argv[3]);
if (nb % 2 == 0)
   printf("Chaîne de longeur paire\n");
else
   printf("Chaîne de longueur impaire\n");

ou en plus condensé :

nb = strlen(argv[3]);
printf("Chaîne de longueur %s\n",nb % 2 ? "impaire" : "paire");
Jean-François
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008

merci pour ces réponses mais mon probléme reste dans le codage de mon message et non pas dans le test de la parité de ma chaine qui meme si il n'est pas optimisé fonctionne.
Merci beaucoup pour votre aide
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
if(nb & 1) fait idem à if(nb % 2)

ciao...
BruNews, MVP VC++
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008

J'ai modifié ma fonction avec le %2 pour testé si ma chaine est pair , mais je ne comprend pas comment faire pour tester les carractére saisie 1 a 1
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

if(nb & 1) fait idem à if(nb % 2)

bien sûr ! mais pas le  if(nb & 2) qui a été proposé.

Jean-François
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
ça c'est clair et net.

ciao...
BruNews, MVP VC++
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Le codage de "Bonjour" donne "NCPHU R" ou "NCHPU R" ?

Jean-François
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008

NCHPU R ecusez moi pour cette erreur dans l'énoncé
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Je préfère ! Je viens d'écrire ce codage/décodage amusant et je ne trouvais pas la même chose !
Il a un nom cet algorithme ?

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Trouvé ! C'est le "Chiffre de Playfair" mais avec une utilisation un peu différente de l'originale.

Si on respecte la méthode originale, VI donne UJ et non JU (on prend dans l'ordre des lignes et non des colonnes) et, du coup, le codage de "Bonjour" est bien "NCPHU R".

Par contre c'est tout à fait différent en cs de lettres doubles !

Jean-François
Messages postés
18
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
19 mai 2008

voila mon code!
La je bug ca plante je ne comprend vraiment pas pourquoi!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAILLE_MATRICE 6

int codage(int matrice[TAILLE_MATRICE][TAILLE_MATRICE],char *argv[],int message[strlen(argv[3])+1])
{   int i,j,k,nb;
    int c1[strlen(argv[3])],l1[strlen(argv[3])];
    int c1_c[strlen(argv[3])],l1_c[strlen(argv[3])];
    
    for(k=0;k<(strlen(argv[3]));k++)
    {
    for(i=0;i<TAILLE_MATRICE;i++)
          {
          for(j=0;j<TAILLE_MATRICE;j++)
               {
                   if(message[k]== matrice[i][j])
                   {l1[k]=i;
                   c1[k]=j;
                   }

               }
          }
  }

            for(i=0;i<TAILLE_MATRICE;i++)
          {
          for(j=0;j<TAILLE_MATRICE;j++)
               {  printf("%c", matrice[i][j]);
               }
               printf("\n");
               }
    if(strlen(argv[3])%2 == 0)//si multiple de 2 alors
    {printf("chaine pair");
    nb=0;
     for (i=0;i<strlen(argv[3]);i=i+2)
         {
          if(l1[i]!=l1[i+1] &amp;&amp; c1[i]!=c1[i+1])
          {
          l1_c[i]=l1[i+1];
          l1_c[i+1]=l1[i];
          c1_c[i]=c1_c[1+1];
          c1_c[i+1]=c1[i];
          nb++;
          }
          if(l1[i]==l1[i+1])
          {
          l1_c[i]=l1[i];
          l1_c[i+1]=l1[i+1];
          c1_c[i]=(c1[i]+2)% TAILLE_MATRICE;
          c1_c[i+1]=(c1[i+1]+2) %TAILLE_MATRICE;
          nb++;
          }                   
          if(c1[i]==c1[i+1] &amp;&amp; l1[i]==l1[i+1])
          {c1_c[i]=c1[i];
          c1_c[i+1]=c1_c[i+1];
          l1_c[i]=l1[i];
          l1_c[i+1]=l1[i];
          nb++;
          }  
          else if(c1[i]=c1[i+1])
          {
          c1_c[i]=c1[i];
          c1_c[i+1]=c1_c[i+1];
          l1_c[i]=(l1[i]+2)% TAILLE_MATRICE;
          l1_c[i+1]=(l1[i+1]+2) %TAILLE_MATRICE;
          //nb++;
          } 
         } 
         
     
     }
    else
    {
        
        
        
        
         printf("chaine impair");    
    }

    for(i=0;i<nb;i++)
     {printf("%c",matrice[(l1_c[i])][(c1_c[i])]);
     }

    return 0;
}

int main(int argc, char *argv[])
{
    int i,j;
    
    int matrice[TAILLE_MATRICE][TAILLE_MATRICE];
    int message[strlen(argv[3])+1];
    
    FILE *fic_matrice = fopen("matrice.dat","w+");
    FILE *fic_message = fopen("message.dat","w+");
    if(fic_matrice != NULL)//macros défini dans stdlib
    {
                   fputs(argv[2],fic_matrice);
    
    }
    if(fic_message != NULL)
    {
                   fputs(argv[3],fic_message);
    }
    i=0;
    rewind(fic_message);
    while (i<strlen(argv[3])){
          message[i]=fgetc(fic_message);
          i++;
          }
   
   for (i=0; i < TAILLE_MATRICE; i++)
       {
            for(j=0;j< TAILLE_MATRICE;j++)
                   { if(fgetc(fic_matrice) != EOF)
                          {
                                  if(i==0 &amp;&amp; j==0)
                                  {rewind(fic_matrice);
                                  }//replace le curseur au début du fichier
                                  else
                                  {
                                  fseek(fic_matrice, -1, SEEK_CUR);//corige la position du curseur
                                  }
                                  matrice[i][j]=fgetc(fic_matrice);
                                  
                           }
                    }
        }
   fclose(fic_matrice);//fermeture du fichier fic_matrice
   fclose(fic_message);
   remove("matrice.dat"); //suprime le fichier temporaire
   remove("message.dat"); //suprime le fichier temporaire
    if(strcmp(argv[1],"-C")==0 || strcmp(argv[1],"-c")==0)
    {
    if(argc==4)//si un mot a bien été choisi pour etre coder
                 {
                       codage(matrice,&amp;argv[0],message);}//lance la fonction coder
    }
    else if(strcmp(argv[1],"-D")==0 || strcmp(argv[1],"-d")==0)//test si les 2 chaines sont =
    {
         if(argc==4)//si un mot a bien été choisi pour etre decoder
         {/*decoder();*/}//lance la fonction décoder
    }
    else
    {
          printf("erreur de saisie veuillez vous referencer au readme \a\n");
    }
    return 0;
}

Pouvez vous m'aider merci
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Aïe aïe aïe ! Il n'y a vraiment pas grand chose de correct là-dedans ! int c1[strlen(argv[3])] : ça ne marche pas comme ça. La dimension doit être connue d'avance ou alors c'est de l'allocation dynamique avec un pointeur, un new, ... . Et passer par des fichiers pour recopier des caractères !!!

Voici la version que j'ai écrite hier soir en pure console, après avoir découvert cette méthode de chiffrage (sous Microsoft Visual C++ 6.0, ainsi que sous Code::Blocks 8.02 avec quelques aménagements au niveau des déclarations de variables dans les boucles for). J'y ai ajouté un mode trace et la non-obligation de saisir la clé à chaque utilisation (la clé décrite dans l'énoncé est la clé standard du programme) :

// ====================================================
// Coder/Decoder un texte avec le "Chiffre de Playfair"
// (http://fr.wikipedia.org/wiki/Chiffre_de_Playfair)
// ====================================================

#include <stdio.h>
#include <string.h>
#include <ctype.h>




// --- Taille de la matrice (en lignes et en colonnes)
#define TAILLE_MATRICE  6




// --- Taille de la clé de chiffrement pour remplir la matrice
#define TAILLE_CLE  (TAILLE_MATRICE * TAILLE_MATRICE)




// --- Clé standard (pour éviter la saisie)
#define CLE_STANDARD  "ABCDEFGHIJKLMNOPQRSTUVWXYZ 123456789"




// --- Taille des textes
#define TAILLE_TEXTE  255




// --- Nom du programme
#define NOM_PROGRAMME "playfair"




 



// ========================
// Utilisation du programme
// ========================



void Usage(void)
{
   printf("Utilisation : %s -{C|D}[T] {cle|*} texte\n",NOM_PROGRAMME);
   printf("   {C|D}[T] : C   = Coder le texte\n");
   printf("              D   = Decoder le texte\n");
   printf("              T   = Activer le mode trace\n");
   printf("   {cle|*}  : cle = Cle de %d caracteres\n",TAILLE_CLE);
   printf("              *   = Utiliser la cle "%s"\n",CLE_STANDARD);
   printf("   texte    : Texte a coder/decoder (2 car. mini, %d car. maxi)\n",TAILLE_TEXTE);
   printf("\n");   printf("Syntaxe : {a|b} choix entre a et b, [a] a est facultatif\n");
   printf("La cle et le texte sont a placer entre "" s'il contiennent des espaces.\n");
   printf("La casse des saisies n'est pas significative, le texte est traite en majuscules.\n");
   printf("\n");
   printf("Exemples :\n");
   printf("   %s -C * bonjour\n",NOM_PROGRAMME);
   printf("   %s -CT * "bonjour tout le monde"\n",NOM_PROGRAMME);
   printf("   %s -C "123456789AEIOUY BCDFGHJKLMNPQRSTVWXZ" bonjour\n",NOM_PROGRAMME);
   printf("   %s -C "123456789AEIOUY BCDFGHJKLMNPQRSTVWXZ" "bonjour tout le monde"\n",NOM_PROGRAMME);
   printf("   %s -D * "ncphu r"\n",NOM_PROGRAMME);
   printf("   %s -DT * "cnphu o3unvu3ic2nppbe"\n",NOM_PROGRAMME);
   printf("\n");
}




 



// ===================
// Fonction principale
// ===================



int main(int argc,char** argv)
{
   // --- Présenter le programme
   printf("\nCoder/Decoder un texte avec le "Chiffre de Playfair"\n");
   printf("(Version %s, %s)\n\n",__DATE__,__TIME__);






   // --- Tester la ligne de commande
   if (argc != 4)
   {
      // --- Erreur
      Usage();
      return 0;
   }






   // --- Tester l'argument coder/décoder avec/sans trace
   bool bCoder,bTrace;
   if (stricmp(argv[1],"-C") == 0)
   {
      // --- Coder sans trace
      bCoder = true;
      bTrace = false;
   }
   else if (stricmp(argv[1],"-CT") == 0)
   {
      // --- Coder avec trace
      bCoder = true;
      bTrace = true;
   }
   else if (stricmp(argv[1],"-D") == 0)
   {
      // --- Décoder sans trace
      bCoder = false;
      bTrace = false;
   }
   else if (stricmp(argv[1],"-DT") == 0)
   {
      // --- Décoder avec trace
      bCoder = false;
      bTrace = true;
   }
   else
   {
      // --- Erreur
      printf("*** ERREUR DE SYNTAXE SUR -{C|D}[T] ***\n\n");
      Usage();
      return 0;
   }






   // --- Tester l'argument de la clé
   char szCle[TAILLE_CLE + 1];
   if (strcmp(argv[2],"*") == 0)
   {
      // --- Copier la clé standard
      strcpy(szCle,CLE_STANDARD);
   }
   else if (strlen(argv[2]) == TAILLE_CLE)
   {
      // --- Copier la clé en argument
      strcpy(szCle,strupr(argv[2]));
   }
   else
   {
      // --- Erreur
      printf("*** ERREUR DE SYNTAXE SUR {cle|*} ***\n\n");
      Usage();
      return 0;
   }






   // --- Tester le texte à coder/décoder
   int iLongTexteEntree = strlen(argv[3]);
   if (iLongTexteEntree > TAILLE_TEXTE)
   {
      // --- Erreur
      printf("*** ERREUR DE TEXTE TROP LONG (%d CARACTERES MAXI) ***\n\n",TAILLE_TEXTE);
      Usage();
      return 0;
   }




   // --- Copier le texte en majuscules
   char szTexteEntree[TAILLE_TEXTE + 1];
   strcpy(szTexteEntree,strupr(argv[3]));
  
   // --- Tester le contenu du texte
   for (int i=0 ; i lettre 'O'
         case 'à' : szTexteEntree[i] = 'A'; break;
         case 'â' : szTexteEntree[i] = 'A'; break;
         case 'ä' : szTexteEntree[i] = 'A'; break;
         case 'é' : szTexteEntree[i] = 'E'; break;
         case 'è' : szTexteEntree[i] = 'E'; break;
         case 'ê' : szTexteEntree[i] = 'E'; break;
         case 'ë' : szTexteEntree[i] = 'E'; break;
         case 'î' : szTexteEntree[i] = 'I'; break;
         case 'ï' : szTexteEntree[i] = 'I'; break;
         case 'ô' : szTexteEntree[i] = 'O'; break;
         case 'ö' : szTexteEntree[i] = 'O'; break;
         case 'ù' : szTexteEntree[i] = 'U'; break;
         case 'û' : szTexteEntree[i] = 'U'; break;
         case 'ü' : szTexteEntree[i] = 'U'; break;
         case 'ç' : szTexteEntree[i] = 'C'; break;
         case 'ñ' : szTexteEntree[i] = 'N'; break;
      }




      // --- Vérifier la légalité du caractère
      // --- (il doit exister dans la clé)
      bool bOk = false;
      for (int iCle=0 ; iCle<TAILLE_CLE ; ++iCle)
      {
         if (szTexteEntree[i] == szCle[iCle])
         {
            bOk = true;
            break; // trouvé !
         }
      }
      if (! bOk)
      {
         // --- Erreur
         printf("*** CARACTERE ILLEGAL DANS LE TEXTE EN ENTREE ***\n");
         return 0;
      }
   }
   if (iLongTexteEntree < 2)
   {
      printf("*** TEXTE TROP COURT POUR ETRE TRAITE ***\n");
      Usage();
      return 0;
   }






   // ------------------------
   // Codage/décodage du texte
   // ------------------------
  
   // --- Remplir la matrice avec la clé
   char acMatrice[TAILLE_MATRICE][TAILLE_MATRICE];
   int iCle = 0;
   for (int iLigne=0 ; iLigne<TAILLE_MATRICE ; ++iLigne)
      for (int iColonne=0 ; iColonne<TAILLE_MATRICE ; ++iColonne)
         acMatrice[iLigne][iColonne] = szCle[iCle++];






   // --- Visualiser la matrice (en mode trace)
   if (bTrace)
   {
      // --- Titre
      printf("Matrice %d x %d utilisee :\n\n",TAILLE_MATRICE,TAILLE_MATRICE);




      // --- Numéros des colonnes, à partir de 1
      printf("\t   ");
      for (int iColonne=0 ; iColonne<TAILLE_MATRICE ; ++iColonne) printf(" %d ",iColonne + 1);
      printf("\n");




      // --- Ligne de séparation
      printf("\t  +");
      for (iColonne=0 ; iColonne<TAILLE_MATRICE ; ++iColonne) printf("---");
      printf("+\n");




      // --- Matrice (avec numéros des lignes, à partir de 1)
      for (iLigne=0 ; iLigne<TAILLE_MATRICE ; ++iLigne)
      {
         printf("\t%d |",iLigne + 1);
         for (iColonne=0 ; iColonne<TAILLE_MATRICE ; ++iColonne)
            printf(" %c ",acMatrice[iLigne][iColonne]);
         printf("|\n");
      }




      // --- Ligne de séparation
      printf("\t  +");
      for (iColonne=0 ; iColonne<TAILLE_MATRICE ; ++iColonne) printf("---");
      printf("+\n\n");

      // --- Rappel du texte en entrée
      printf("Texte en entree : %s\n\n",szTexteEntree);
   }






   // --- On ne traitera que des bigrammes complets
   // --- (si le nombre de caractères est impair, le dernier
   // --- caractère sera concaténer au texte en sortie)
   int iLongTexteEntree2 = iLongTexteEntree;
   if (iLongTexteEntree2 % 2) --iLongTexteEntree2;



  
   // --- Parcours des caractères par bigramme
   char szTexteSortie[TAILLE_TEXTE + 1] = {0};
   int iSortie = 0;
   for (int iBigramme=0 ; iBigramme",c1,c2);




      // --- Cas particulier de 2 caractères identiques
      if (c1 == c2)
      {
         // --- Pas de traitement : on les conserve en sortie
         // --- (traitement valable au codage et au décodage)
         szTexteSortie[iSortie++] = c1;
         szTexteSortie[iSortie++] = c2;
         if (bTrace) printf(" --> bigramme conserve\n");
         continue; // bigramme suivant
      }




      // --- Repérer dans la matrice les lignes et les colonnes
      // --- des 2 caractères du bigramme
      int iLigne1,iLigne2,iColonne1,iColonne2;
      for (iLigne=0 ; iLigne<TAILLE_MATRICE ; ++iLigne)
      {
         for (int iColonne=0 ; iColonne<TAILLE_MATRICE ; ++iColonne)
         {
            if (acMatrice[iLigne][iColonne] == c1)
            {
               iLigne1   = iLigne;
               iColonne1 = iColonne;
            }
            if (acMatrice[iLigne][iColonne] == c2)
            {
               iLigne2   = iLigne;
               iColonne2 = iColonne;
            }
         }
      }
      if (bTrace) printf(" en (%d,%d) et (%d,%d)",iLigne1+1,iColonne1+1,iLigne2+1,iColonne2+1);




      // --- Recherche des 2 caractères codés
      // --- à placer dans la chaîne en sortie
      char c1c,c2c;
      if (iLigne1 == iLigne2)
      {
         // --- Les 2 caractères en entrée sont sur la même ligne
         // --- (traitements différents au codage et au décodage)
         if (bCoder)
         {
            // --- Coder : on prend les 2 caractères à droite
            // --- (modulo la largeur de la matrice)
            c1c = acMatrice[iLigne1][(iColonne1 + 1) % TAILLE_MATRICE];
            c2c = acMatrice[iLigne2][(iColonne2 + 1) % TAILLE_MATRICE];
         }
         else
         {
            // --- Décoder : on prend les 2 caractères à gauche
            // --- (modulo la largeur de la matrice)
            c1c = acMatrice[iLigne1][(iColonne1 ? iColonne1 : TAILLE_MATRICE) - 1];
            c2c = acMatrice[iLigne2][(iColonne2 ? iColonne2 : TAILLE_MATRICE) - 1];
         }
         if (bTrace) printf(" [lignes =]  ");
      }
      else if (iColonne1 == iColonne2)
      {
         // --- Les 2 caractères en entrée sont sur la même colonne
         // --- (traitements différents au codage et au décodage)
         if (bCoder)
         {
            // --- Coder : on prend au-dessous
            // --- (modulo la hauteur de la matrice)
            c1c = acMatrice[(iLigne1 + 1) % TAILLE_MATRICE][iColonne1];
            c2c = acMatrice[(iLigne2 + 1) % TAILLE_MATRICE][iColonne2];
         }
         else
         {
            // --- Décoder : on prend au-dessus
            // --- (modulo la hauteur de la matrice)
            c1c = acMatrice[(iLigne1 ? iLigne1 : TAILLE_MATRICE) - 1][iColonne1];
            c2c = acMatrice[(iLigne2 ? iLigne2 : TAILLE_MATRICE) - 1][iColonne2];
         }
         if (bTrace) printf(" [colonnes =]");
      }
      else
      {
         // --- Les 2 caractères en entrée occupent 2 coins d'un rectangle
         // --- (traitement valable au codage et au décodage)
         if (false) // true=méthode originale, false=respect de l'énoncé
         {
            // --- Dans l'ordre des lignes (VI --> UJ)
            // --- C'est la méthode originale du "Chiffre de Playfair"
            c1c = acMatrice[iLigne1][iColonne2];
            c2c = acMatrice[iLigne2][iColonne1];
         }
         else
         {
            // --- Dans l'ordre des colonnes (VI --> JU)
            // --- C'est la méthode décrite dans l'énoncé
            c1c = acMatrice[iLigne2][iColonne1];
            c2c = acMatrice[iLigne1][iColonne2];
         }
         if (bTrace) printf(" [2 coins]   ");
      }




      // --- Placer les 2 caractères codés dans la chaîne en sortie
      szTexteSortie[iSortie++] = c1c;
      szTexteSortie[iSortie++] = c2c;
      if (bTrace) printf(" --> <%c%c>\n",c1c,c2c);
   }



  
   // --- Concaténer l'éventuel dernier caractère de rang impair
   if (iLongTexteEntree > iLongTexteEntree2)
   {
      szTexteSortie[iSortie++] = szTexteEntree[iLongTexteEntree - 1];
      if (bTrace) printf("Ajouter le dernier caractere de rang impair  --> <%c>\n",szTexteEntree[iLongTexteEntree - 1]);
   }
   if (bTrace) printf("\n");
  
  
   // --- Placer le terminateur de la chaîne en sortie
   szTexteSortie[iSortie] = 0;



  
   // --- Visualiser les textes en entrée et en sortie
   if (bCoder)
   {
      printf("Texte en entree a coder : %s\n",szTexteEntree);
      printf("Texte code en sortie    : %s\n",szTexteSortie);
   }
   else
   {
      printf("Texte en entree a decoder : %s\n",szTexteEntree);
      printf("Texte decode en sortie    : %s\n",szTexteSortie);
   }






   // --- Proposer la syntaxe de la commande inverse pour décoder/coder
   char szCommande[TAILLE_TEXTE * 2];
   sprintf(szCommande,"%s -%c%s ",NOM_PROGRAMME,bCoder ? 'D' : 'C',bTrace ? "T" : "");
   if (argv[2][0] == '*')
      strcat(szCommande,"*");
   else
      strcat(strcat(strcat(szCommande,"""),szCle),""");
   strcat(strcat(strcat(szCommande," ""),szTexteSortie),""");
   printf("\n(Commande inverse pour %s : %s)\n",bCoder ? "decoder" : "coder",szCommande);
   return 0;
}


Ce qui donne, sans les traces et avec la clé standard :

playfair -c * bonjour



Coder/Decoder un texte avec le "Chiffre de Playfair"
(Version May 19 2008, 20:48:30)



Texte en entree a coder : BONJOUR
Texte code en sortie    : NCHPU R



(Commande inverse pour decoder : playfair -D * "NCHPU R")



playfair -d * "nchpu r"



Coder/Decoder un texte avec le "Chiffre de Playfair"
(Version May 19 2008, 20:48:30)



Texte en entree a decoder : NCHPU R
Texte decode en sortie    : BONJOUR



(Commande inverse pour coder : playfair -C * "BONJOUR")




Avec les traces activées :

playfair -ct * "ceci est un exemple"




Coder/Decoder un texte avec le "Chiffre de Playfair"
(Version May 19 2008, 20:48:30)



Matrice 6 x 6 utilisee :



            1  2  3  4  5  6
          +------------------+
        1 | A  B  C  D  E  F |
        2 | G  H  I  J  K  L |
        3 | M  N  O  P  Q  R |
        4 | S  T  U  V  W  X |
        5 | Y  Z     1  2  3 |
        6 | 4  5  6  7  8  9 |
          +------------------+



Texte en entree : CECI EST UN EXEMPLE



Bigramme <CE> en (1,3) et (1,5) [lignes =]   --> <DF>
Bigramme <CI> en (1,3) et (2,3) [colonnes =] -->
Bigramme < E> en (5,3) et (1,5) [2 coins]    --> <C2>
Bigramme <ST> en (4,1) et (4,2) [lignes =]   --> <TU>
Bigramme < U> en (5,3) et (4,3) [colonnes =] --> <6 >
Bigramme <N > en (3,2) et (5,3) [2 coins]    --> <ZO>
Bigramme <EX> en (1,5) et (4,6) [2 coins]    --> <WF>
Bigramme en (1,5) et (3,1) [2 coins]    --> <QA>
Bigramme en (3,4) et (2,6) [2 coins]    --> <JR>
Ajouter le dernier caractere de rang impair  --> <E>



Texte en entree a coder : CECI EST UN EXEMPLE
Texte code en sortie    : DFIOC2TU6 ZOWFQAJRE



(Commande inverse pour decoder : playfair -DT * "DFIOC2TU6 ZOWFQAJRE")



playfair -dt * "dfioc2tu6 zowfqajre"



Coder/Decoder un texte avec le "Chiffre de Playfair"
(Version May 19 2008, 20:48:30)



Matrice 6 x 6 utilisee :



            1  2  3  4  5  6
          +------------------+
        1 | A  B  C  D  E  F |
        2 | G  H  I  J  K  L |
        3 | M  N  O  P  Q  R |
        4 | S  T  U  V  W  X |
        5 | Y  Z     1  2  3 |
        6 | 4  5  6  7  8  9 |
          +------------------+



Texte en entree : DFIOC2TU6 ZOWFQAJRE



Bigramme <DF> en (1,4) et (1,6) [lignes =]   --> <CE>
Bigramme en (2,3) et (3,3) [colonnes =] --> <CI>
Bigramme <C2> en (1,3) et (5,5) [2 coins]    --> < E>
Bigramme <TU> en (4,2) et (4,3) [lignes =]   --> <ST>
Bigramme <6 > en (6,3) et (5,3) [colonnes =] --> < U>
Bigramme <ZO> en (5,2) et (3,3) [2 coins]    --> <N >
Bigramme <WF> en (4,5) et (1,6) [2 coins]    --> <EX>
Bigramme <QA> en (3,5) et (1,1) [2 coins]    -->
Bigramme <JR> en (2,4) et (3,6) [2 coins]    -->
Ajouter le dernier caractere de rang impair  --> <E>



Texte en entree a decoder : DFIOC2TU6 ZOWFQAJRE
Texte decode en sortie    : CECI EST UN EXEMPLE



(Commande inverse pour coder : playfair -CT * "CECI EST UN EXEMPLE")





Jean-François