1 pièce(s) jointe(s)
Votre avis sur un petit programme C++ (chiffrement de César)
Bonjour à tous,
Alors voilà je suis grand débutant en C++ et je viens de créer un petit programme refaisant le chiffrement de César.
Ce chiffrement, qui est tout ce qu'il y a de plus basique, consiste à décaler les lettres de toute une phrase selon leur emplacement dans l'alphabet...
Ainsi je voudrais savoir de la part de programmeurs plus expérimentés que moi, si ma "façon de coder" est bonne et si je ne prends pas de mauvaises habitudes... (j'ai essayé de faire des efforts en ce qui concerne l'indentation et les remarques...;) )
Et puis une petite question, ça ne fait pas trop barbare mon if (à la ligne 79) avec tous les caractères spéciaux??
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#define CHAINE_MAXI 1000
using namespace std;
// définition de l'alphabet :
const string Alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string chaineEntree=""; // définition de la phrase d'entrée (celle que l'utilisateur entre...)
char chaineSortie[CHAINE_MAXI]=""; // définition de la phrase de sortie (celle que l'algo resort...)
int decalage=0; // définition de la variable de décalage
int varAnnuleDecalage=0; // création d'une variable en cas de dépassement de l'alphabet et qui permet un retour au début de l'alphabet
void toutMajuscule(); // fonction pour mettre la chaine de l'utilisateur en majuscule
void cryptage(); // fonction de décalage de toutes les lettres de la chaine
int main(int nNumberOfArgs, char* pszArgs[])
{
int continuer=0;
do
{
system("clear"); // on efface l'écran (ATTENTION : "clear" sous Linux et "cls" sous DOS/Windows)
cout << "\t/====================================\\" << endl;
cout << "\t| Le chiffrement de César (par nK0) |" << endl;
cout << "\t\\====================================/" << endl << endl; // une 'tite présentation :)
chaineEntree=""; // on efface...
for(int i=0;i<CHAINE_MAXI;i++) chaineSortie[i]=0; // idem pour chaineSortie...
cout << "Entrez la phrase à coder : ";
getline(std::cin, chaineEntree); // l'utilisateur entre sa phrase (il peut mettre des espaces...)
cout << "Entrez le décalage (compris entre 0 et 26) : ";
cin >> decalage; // il entre le décalage voulu
cout << endl;
toutMajuscule(); // et on met sa chaine en majuscules...
if(decalage>=0 && decalage<=26)
{
cout << "Avec un décalage de " << decalage << " lettres, " << chaineEntree << " donne :" << endl;
cryptage(); // et on crypte...
cout << "\n\t"<< chaineSortie << endl << endl;
}
else cout << "Erreur : Entrez un décalage compris entre 0 et 26" << endl << endl;
cout << "Voulez-vous recommencer ? (1=oui, 0=non) "; // on demande à l'utilisateur s'il veut recommencer un nouveau codage
cin >> continuer;
while(getchar() != '\n');
cout << endl;
} while (continuer==1); // boucle pour recommencer l'opération
return 0;
}
// fonction pour mettre la chaine de l'utilisateur en majuscule :
void toutMajuscule()
{
for(int i=0;i<CHAINE_MAXI;i++)
{
if(chaineEntree[i])
{
chaineEntree[i]=toupper(chaineEntree[i]); // on met tous les caractère de la chaine en MAJUSCULES
}
// et maintenant on s'occupe des caractère spéciaux du français
if (chaineEntree[i] && chaineEntree[i]=='é') chaineEntree[i]='E';
if (chaineEntree[i] && chaineEntree[i]=='ç') chaineEntree[i]='C';
if (chaineEntree[i] && chaineEntree[i]=='à') chaineEntree[i]='A';
if (chaineEntree[i] && chaineEntree[i]=='ù') chaineEntree[i]='U';
if (chaineEntree[i] && chaineEntree[i]=='ë') chaineEntree[i]='E';
if (chaineEntree[i] && chaineEntree[i]=='ô') chaineEntree[i]='O';
if (!chaineEntree[i]) break;
}
}
// fonction de décalage de toutes les lettres de la chaine :
void cryptage()
{
for (int i=0;i<CHAINE_MAXI;i++)
{
if (chaineEntree[i]=='\0') break;
for (int j=0;j<26;j++)
{
if (chaineEntree[i]==',' || chaineEntree[i]=='\'' || chaineEntree[i]=='_' || chaineEntree[i]=='/' || chaineEntree[i]=='\\' || chaineEntree[i]=='0' || chaineEntree[i]=='1' || chaineEntree[i]=='2' || chaineEntree[i]=='3' || chaineEntree[i]=='4' || chaineEntree[i]=='5' || chaineEntree[i]=='6' || chaineEntree[i]=='7' || chaineEntree[i]=='8' || chaineEntree[i]=='9' || chaineEntree[i]=='-' || chaineEntree[i]=='*' || chaineEntree[i]==' ' || chaineEntree[i]=='+' || chaineEntree[i]=='(' || chaineEntree[i]==')' || chaineEntree[i]=='"' || chaineEntree[i]=='&' || chaineEntree[i]=='@' || chaineEntree[i]=='$' || chaineEntree[i]=='.' || chaineEntree[i]=='!' || chaineEntree[i]==':' || chaineEntree[i]==';' || chaineEntree[i]=='?' || chaineEntree[i]=='%' || chaineEntree[i]=='^' || chaineEntree[i]=='"' || chaineEntree[i]=='£' || chaineEntree[i]=='¤') // liste de tous les caractère à ne pas coder
{
chaineSortie[i]=chaineEntree[i];
break;
}
else if (chaineEntree[i]==Alphabet[j] && j+decalage<26)
{
chaineSortie[i]=chaineEntree[i]+decalage; // on décale normalement si j+decalage<=25
}
else if (chaineEntree[i]==Alphabet[j] && j+decalage>=26)
{
varAnnuleDecalage=25-j; // un peu plus spécial si le décalage sort de l'alphabet
chaineSortie[i]=Alphabet[decalage-varAnnuleDecalage-1]; // on retourne donc au début de l'alphabet en enlevant les lettres passées à la fin de l'alphabet
}
}
}
} |
Sinon le code est aussi dispo ici.
Voilà, merci d'avance pour vos observations...
ALgo cesar en c++ simple à comprendre
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
#include<iostream>
#include<cctype> //pour la conversion tolower
using namespace std;
// la fonction :
char AlgoCesar(char *chaine)
{
int j=0;
char stock;
while(chaine[j])
{
stock=tolower(chaine[j]); //convertit stock en miniscule
char l=stock;
switch (l) {
case 'a' : cout <<"c";break;
case 'b' : cout <<"D";break;
case 'c' : cout <<"E";break;
case 'd' : cout <<"F";break;
case 'e' : cout <<"G";break;
case 'f' : cout <<"H";break;
case 'g' : cout <<"I";break;
case 'h' : cout <<"J";break;
case 'i' : cout <<"K";break;
case 'j' : cout <<"L";break;
case 'k' : cout <<"M";break;
case 'l' : cout <<"N";break;
case 'm' : cout <<"O";break;
case 'n' : cout <<"P";break;
case 'o' : cout <<"Q";break;
case 'p' : cout <<"R";break;
case 'q' : cout <<"S";break;
case 'r' : cout <<"T";break;
case 's' : cout <<"U";break;
case 't' : cout <<"V";break;
case 'u' : cout <<"W";break;
case 'v' : cout <<"X";break;
case 'w' : cout <<"Z";break;
case 'y' : cout <<"A";break;
case 'z' : cout <<"B";break;
default:
break;
}
j++;
}
}
// l'appel dans le main :
char Entier[40];
cout <<"ALGORITHME DE CESAR"<<endl<<endl;
cout << "Entrer votre chaine de caractere"<<endl;
cin.getline(Entier,40); //lis le tableau y compris les espaces
cout <<"La traduction de "<< Entier <<" en CESAR est :"<<endl;
char * s;
s=Entier;
AlgoCesar(s);
return 0; |