Probléme de test de carractére language c
Bonjour,
Je dois réaliser un programme réalisant les contraintes suivantes :
Algorithme:
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.
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
Je dois réaliser un programme réalisant les contraintes suivantes :
Algorithme:
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.
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:
- Probléme de test de carractére language c
- Test performance pc - Guide
- Test disque dur - Télécharger - Informations & Diagnostic
- Test steam deck oled - Guide
- Test composant pc - Guide
- Test batterie pc - Guide
1 réponse
En fait ton exercice est simple dès que l'on sait que l'opérateur modulo s'écrit % en langage C (ou C++). Par exemple (3 % 4 = 3, 8 % 4 = 0).
Ensuite il suffit d'écrire les tests : notons (l1,c1) et (l2,c2) les positions (ligne,colonne) des deux caractères lus et
(l1_,c1_) (l2_,c2_) les caractères obtenus suite à la transformation
Notons L la largeur de la matrice, et H sa hauteur :
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.
- Si les deux caractères sont sur la même ligne, on prend leurs deux voisins de
droite, modulo la largeur de la ligne:
-Si les deux caractères sont sur la même colonne, on prend les deux voisins du
dessous, modulo la hauteur de la colonne:
- 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.
Je te laisse chercher pour le reste...
Pour le déchiffrage il suffit de faire les opérations inverse (permutation quand tu permutes pour le chiffrage, soustraction avec modulo quand tu additionnes avec modulo pour le chiffrage, identité quand tu ne changes rien pour le chiffrage).
Bonne chance
Ensuite il suffit d'écrire les tests : notons (l1,c1) et (l2,c2) les positions (ligne,colonne) des deux caractères lus et
(l1_,c1_) (l2_,c2_) les caractères obtenus suite à la transformation
Notons L la largeur de la matrice, et H sa hauteur :
#define L 6 #define H 6
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.
if(l1!=l2 && c1!=c2){ l1_ = l2; l2_ = l1; c1_ = c2; c2_ = c1; }
- Si les deux caractères sont sur la même ligne, on prend leurs deux voisins de
droite, modulo la largeur de la ligne:
if(l1 == l2){ l1_ = l1; l2_ = l2; c1_ = (c1 + 2) % L; c2_ = (c2 + 2) % L; }
-Si les deux caractères sont sur la même colonne, on prend les deux voisins du
dessous, modulo la hauteur de la colonne:
if(c1 == c2){ c1_ = c1; c2_ = c2; l1_ = (l1 + 2) % H; l2_ = (l2 + 2) % H; }
- 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.
if(unseulcaractere || (c1 == c2 && l1 == l2)){ c1_ = c1; c2_ = c2; l1_ = l1; l2_ = l2; }
Je te laisse chercher pour le reste...
Pour le déchiffrage il suffit de faire les opérations inverse (permutation quand tu permutes pour le chiffrage, soustraction avec modulo quand tu additionnes avec modulo pour le chiffrage, identité quand tu ne changes rien pour le chiffrage).
Bonne chance