IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Votre avis sur un petit programme C++ (chiffrement de César)


Sujet :

C++

  1. #1
    Candidat au Club
    Lycéen
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Quelques observations en vrac :
    • Inclure cstdio et cstdlib est inutile : tu ne te sert d'aucune des choses definies dedans
    • La directive using namespace std est une mauvaise idee en general. Les namespace sont la pour encapsuler les noms, mieux vaut soit prefixer tous tes noms (std::cout, ...), soit faire ton using le plus tard possible.
    • Les variables globales chaineEntree et decalage devraient etres des parametres a la fonction cryptage. La variable globale chaineSortie devrait etre la valeur de retour de la meme fonction.
    • Idem pour la fonction toutMajuscule. Un appel aux fonctions de la bibliotheque standard permet d'ailleurs de remplacer ta fonction. http://c.developpez.com/faq/cpp/?pag...TRINGS_toupper
    • varAnnuleDecalage devrait etre declaree dans la fonction cryptage, le plus tard possible.
    • chaineSortie devrait etre une std::string, comme chaineEntree
    • Au lieu d'enumerer les caracteres a ne pas coder, mieux vaut chercher si ton caractere est dans l'alphabet. Si c'est le cas, tu lui rajoute le decalage et tu lui fait un modulo 26 pour revenir dans l'alphabet :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
      if(std::find(chaineEntree[i], alphabet, alphabet+26)==alphabet+26)
      {
          chaineSortie[i] = chaineEntree[i];
      }
      else
      {
          chaineSortie[i] = (chaineEntree[i]+decalage)%26;
      }

  3. #3
    Candidat au Club
    Lycéen
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    OK, merci roulious, maintenant je vais voir tout ça...
    Et cette fois-ci je vais lire la FAQ C++ (jusqu'au bout )...

    Merci encore pour tes indications...

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ton code pour mettre en capitales fait peur. Tu pourrais au moins conserver les accents sur les capitales, même s'il y a encore certaines personnes qui croient qu'il ne faut pas mettre les accents dessus.
    Malheureusement il n'existe actuellement pas vraiment de bon système pour mettre en capitales ton texte en C++ (cela ne marche pas avec une locale multi-octets, ce qui est le cas de la plupart des systèmes linux actuels). Néanmoins si ton code fonctionne (ce qui sera le cas si ta locale est mono-octet), il te suffit d'utiliser ta locale pour mettre en capitale les accents.

    L'idéal étant bien sûr de travailler en Unicode et d'utiliser alors les outils appropriés.

    Autre chose : ça sera pas mal de virer ce system("clear") qui rend ton code non portable et qui n'apporte pas grand chose (personnellement, je trouve plutôt ça gênant).
    Boost ftw

  5. #5
    Candidat au Club
    Lycéen
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ok merci loufoque !!

  6. #6
    Candidat au Club
    Homme Profil pro
    developper
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : developper
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut ALgo cesar en c++ simple à comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 477
    Points
    11 477
    Billets dans le blog
    11
    Par défaut
    @biguet, ce code est plutôt moche, en fait. Je me serais abstenu...
    Pas d'utilisation de std::string (on est en C++, hein)
    Décalage fixe et tu repasses tes minuscules en majuscules, ou pas (case 'a')
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. votre avis sur mon programme
    Par warubi dans le forum C++
    Réponses: 6
    Dernier message: 19/02/2007, 09h47
  2. Votre avis sur mon petit site
    Par didou038 dans le forum Mon site
    Réponses: 2
    Dernier message: 24/12/2006, 14h33
  3. [HSQLDB] Votre avis sur un petit exemple complet...
    Par calogerogigante dans le forum Persistance des données
    Réponses: 8
    Dernier message: 16/05/2006, 08h21
  4. [Programmation distribuée] Votre avis sur une archi
    Par Acarp47 dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 7
    Dernier message: 29/06/2005, 14h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo