Le codage de cesar ....mais ouuups il n'affiche pas le code????

Fermé
kazanani - Modifié par Whismeril le 19/10/2015 à 07:07
jackdada Messages postés 77 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 - 20 oct. 2015 à 19:48
Bonjour,
voila tout simplement je cherche l'affichage de caractere decale mais malheureusement ca ne marche pas .....j'attends vos remarques


# include <stdio.h>


char decale(char c,char debut,int decalage);
char code(char c ,int d);

char decale(char c,char debut,int decalage)
{

    while(decalage<0)
    {
        decalage=decalage+26;
    }

    return debut+(((c-debut)+decalage)%26);

}
   char code(char c ,int d)
   {
        if(c>='a'&&c<='z')
        {
           return decale(c,'a',d);
        }
        else if(c>='A'&&c<='Z')
        {
           return decale(c,'A',d);
        }
        else
         {
           return c;
         }
    }


int main()
{
    int d;
    char c;

    printf("entrez le decalage : ");
    scanf("%d",&d);
    printf("entez le caractere : ");
    scanf("%c",&c);
    getchar();

    printf("Le caractere code est %c",code(c,d));



  return 0;

}




A voir également:

2 réponses

jackdada Messages postés 77 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 19
19 oct. 2015 à 04:24
Bonjour,
Évite de faire des doublons de postes merci.

Pour ton problème, il est du au fait que le caractère stocker dans la variable c n'est pas celui que tu tape mais le '\n' enregistré dans le buffer suite à l'appuie de entrée après avoir écrit le décalage (rajoute un printf de la variable c juste avant l'appel de ta fonction afin de visualiser ceci). Ton scanf vas lire la premiere entrée du buffer se présentant donc le '\n' et non la lettre taper.
Ceci est du au fait que tes scanf ne son pas sécuriser (formaté), notamment le second.
corrige ton main en mettant ceci:
int main()
{
int d;
char c;

printf("entrez le decalage : ");
if(scanf("%d",&d)!=1){
	printf("Input error\n");
	exit (-1);
}
printf("entez le caractere : ");
do{
	if(scanf("%c",&c)!=1){
		printf("Input error\n");
		exit (-1);
	}
}while(c=='\n');
printf("Le caractere code est %c\n",code(c,d));
return 0;

}

Tu aurait aussi pu ajouter un simple getchar() juste après le premier scanf afin de virer le '\n' du buffer, mais personnellement je ne trouve pas ça propre de mélanger scanf et getchar(d'autre aussi je pense). Soit tu utilise scanf et apprend à le sécuriser (formaté) soit tu t'oriente sur les fonction fgets et getchar pour récupérer le flux stdin.

Sinon pour ce qui est du codage cesar une méthode bien plus simple et plus rapide existe, en référence avec la table ascii.
Quand tu le fait par toi même avec tes 26 lettre de l'alphabet, tu applique les formule suivante:
codage: Cesar(x) = (x + 3) modulo 26
décodage: Cesar(x) = (x - 3 + 26) modulo 26

Pour pouvoir réaliser notre codage césar en c, il faut regarder la table ascii, qui va associer un nombre unique entre 0 et 127, à un caractère. En modifiant cette valeur entre 0 et 127, tu modifie donc le caractère associer à la variable qui le stocke.
exécute ce code pour visualiser ceci:
int main(){
char caractere='a';
	printf("caractere=%c valeur ascii=%d\n", caractere, caractere);
	caractere+=5;
	printf("caractere=%c valeur ascii=%d\n", caractere, caractere);
	caractere-=5;
	printf("caractere=%c valeur ascii=%d\n", caractere, caractere);
}

Donc pour revenir au codage cesar, tu a besoins d'une unique fonction et en repartant des formule appliquer pour un alphabet de 26 lettre que je t'ai donné plus haut, tu devrais être capable de trouver la bonne formule. Si ce n'est pas le cas dit le moi.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
19 oct. 2015 à 23:30
exit (-1);
Pas terrible dans un main(). On préfèrera mettre plutôt : return EXIT_FAILURE;

Je ne vois pas en quoi ta solution vide le buffer clavier...

Tu aurait aussi pu ajouter un simple getchar() juste après le premier scanf afin de virer le '\n' du buffer, mais personnellement je ne trouve pas ça propre de mélanger
C'est pourtant la solution la plus propre : une boucle while sur un getchar() jusqu'à rencontrer un '\n' ou EOF.

Soit tu utilise scanf et apprend à le sécuriser (formaté) soit tu t'oriente sur les fonction fgets et getchar pour récupérer le flux stdin.
La sécurisation des entrées est une chose, mais il faut quand même vider le buffer clavier.
0
jackdada Messages postés 77 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 19
20 oct. 2015 à 19:48
Merci à toi pour la correction au niveau du exit (-1) c'est une mauvaise habitude que j'ai prit dont je me rend contre actuellement au travers de mes cours de système d'exploitation Unix/Linux.
ma solution ne vide pas le buffer mais juste le '\n' posant problème. Après c'est vrai que je n'avait pas pensé et prit en compte le fait qu'n saisie on aurais pu remplir le buffer dès le premier scanf avec un tas de donné erroné, ce qui bloquerait encore le second scanf.
Il me semblait qu'il y avait un autre moyen de vider son buffer plutot qu'une boucle sur un getchar().
En tout cas merci de cette précision.
0
Utilisateur anonyme
19 oct. 2015 à 07:08
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.

0