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 :

enfin j'ai pu réaliser le programme


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut enfin j'ai pu réaliser le programme
    les amis enfin j'ai pu réaliser mon programme mais il ne marche pas pouvez vous me trouver le problème ou me correcte le programme svp.
    voila le programme
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include <stdio.h>
    #include <string.h>
     
    void crypter ( char* phrase , int cle );
    void decrypter ( char* phrase , int cle );
    int caractereValide ( char caractere );
     
    int main ()
    {
        int cle = 0 , menu = 1;
        char phrase [225];
        printf("\t<<<<<<<<<<<<<<<<<<<<<<BIENVENUE A NOTRE PROGRAMME >>>>>>>>>>>>>>>>>>>>>>>>\n");
        printf("\n\n --Bienvenue dans le programme de cryptage - decryptage\n de phrases selon la methode Cesar\n\n");
        printf("1. Cryptage \n");
        printf("2. Decryptage \n");
        printf("3. EXIT\n");
        printf("Votre choix :  ");
     
        do
        {
            scanf("%d" , &menu);
     
            if (menu == 1)
            {
                printf ("\n\nVous avez choisi de crypter.\nVeuillez entrer       la phrase a crypter : ");
                scanf("%s" , phrase);
                printf("\nVeuillez choisir votre cle de cryptage : ");
                scanf("%d" , &cle );
                crypter ( phrase , cle );
                printf("\nVotre phrase cryptee est : %s" , phrase );
            }
            if(menu==3){
            	return 0;
    		}
     
            else if (menu == 2)
            {
                printf ("\n\nVous avez choisi de decrypter.\nVeuillez entrer la phrase a decrypter : ");
                scanf("%s" , phrase);
                printf("\nVeuillez entrer votre cle de cryptage : ");
                scanf("%d" , &cle );
                decrypter ( phrase , cle );
                printf("\nVotre phrase decryptee est : %s" , phrase );
            }
     
            else
            {
                printf("\nVous n'avez pas entre un choix valide veuillez entrer un choix valide");
            }
        }while (menu != 1 && menu != 2);
     }
     
    void crypter (char* phrase , int cle)
    {
        int i ;
     
        for (i = 0; i<strlen(phrase);  i ++)
        {
            if (caractereValide(phrase [i]) == 1)
            {
                phrase [i] = (((phrase[i]-'a')+cle)%26)+'a';
            }
     
            else if (caractereValide (phrase[i]) == 2)
            {
                phrase [i] = (((phrase[i]-'A')+cle)%26)+'A';
            }
        }
    }
     
    void decrypter (char* phrase , int cle)
    {
        int i ;
     
        for (i = 0; i<strlen(phrase);  i ++)
        {
            if (caractereValide(phrase [i]) == 1)
            {
                phrase [i] = (((phrase[i]-'a')-cle)%26)+'a';
            }
     
            else if (caractereValide (phrase[i] == 2))
            {
                phrase [i] = (((phrase[i]-'A')-cle)%26)+'A';
            }
        }
    }
     
    int caractereValide (char caractere)
    {
        int etat = 0;
     
        if( caractere >= 'a' && caractere<= 'z')
        {
            etat == 1;// etat 1 = minuscule
        }
     
        else if ( caractere>= 'A' && caractere <= 'Z')
        {
            etat == 2;// etat 2 = Majuscule
        }
     
        return etat; //etat 0 = autres
    }



    et voici le projet
    Images attachées Images attachées   
    Dernière modification par Songbird ; 15/11/2017 à 20h22. Motif: Ajout des balises code

  2. #2
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir,
    Avant que l'on puisse vous aider pourriez vous faire un tout petit effort en indentant votre code source en vous servant des balises '#' (balise code) qui sont mise à votre disposition ?

    À bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2015
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 644
    Points : 1 509
    Points
    1 509
    Par défaut
    Hello,

    Petit rajout : peut-être nous dire ce qui fonctionne pas? n_n
    Un fait toujours plaisir et encourage à l'entraide. Un n'est pas à négliger, pensez aux autres !

    Que la force soit avec Developpez.net
    Je ne suis pas un crack en informatique, loin de là, mais il n'y a pas que les mécaniciens qui sachent conduire une voiture

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    Il faut oser le dire :

    "J'ai pu réaliser mon programme ..."

    en enchaînant avec "il ne marche pas".

    Chapeau bas
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par JujuPomme Voir le message
    Hello,

    Petit rajout : peut-être nous dire ce qui fonctionne pas? n_n
    merci mon ami
    le problème est que le programme me demande de donner la phrase a crypter ou décrypter mais après il cèsse de fonctionneret la console s'échappe.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour commencer, ne vois-tu pas un truc bizarre aux lignes 64 et 82?

    Je ne vois pas d'autre erreur flagrante, et surtout aucune qui soit censée pouvoir provoquer comportement indéfini, tant que la chaîne de caractères saisie ne dépasse pas 224 caractères.
    Par contre, ton programme se termine immédiatement après avoir affiché son résultat; sous Windows, si tu l'as lancé en double-cliquant dessus (ou si tu l'as lancé dans le debugger de Visual Studio, etc.), la console se fermera aussitôt. Tu devrais le tester dans un Invite de Commandes à la place.

    Edit: Je constate aussi que tu ne vides pas le buffer d'entrée après tes appels à scanf(). Les scanf("%d", ) laissent le \n dans le buffer d'entrée, perturbant la saisie de la phrase.
    Tu ne vérifies pas non-plus le retour de scanf(), au passage.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Invité Voir le message
    merci mon ami
    le problème est que le programme me demande de donner la phrase a crypter ou décrypter mais après il cèsse de fonctionneret la console s'échappe.
    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
     
    #include <stdio.h>
    #include <string.h>
     
    void crypter ( char* phrase , int cle );
     
    int main ()
    {
        int cle = 0 , menu = 1;
        char phrase [225];
        puts("<<<<<<<<<<<<<<<<<<<<<<BIENVENUE A NOTRE PROGRAMME >>>>>>>>>>>>>>>>>>>>>>>>");
        puts(" --Bienvenue dans le programme de cryptage - decryptage de phrases selon la methode de Cesar");
     
        while(menu!=3)
        {
            puts("*** MENU ***");
            puts("1. Cryptage ");
            puts("2. Decryptage");
            puts("3. EXIT");
            puts("Votre choix :");
            scanf("%d" , &menu);
     
    		switch(menu)
    		{
    			case 1:
    				printf ("\n\nVous avez choisi de crypter.\nVeuillez entrer       la phrase a crypter : ");
    				scanf("%s" , phrase);
    				printf("\nVeuillez choisir votre cle de cryptage : ");
    				scanf("%d" , &cle );
    				crypter ( phrase , cle );
    				printf("\nVotre phrase cryptee est : %s\n\n" , phrase );
    				break;
    			case 2:
    				printf ("\n\nVous avez choisi de decrypter.\nVeuillez entrer la phrase a decrypter : ");
    				scanf("%s" , phrase);
    				printf("\nVeuillez entrer votre cle de cryptage : ");
    				scanf("%d" , &cle );
    				crypter ( phrase , cle * -1 );
    				printf("\nVotre phrase decryptee est : %s\n\n" , phrase );
    				break;
    			default:
    				printf("\nVous n'avez pas entre un choix valide veuillez entrer un choix valide");
    				break;
            }
        }
     }
     
    void crypter (char* phrase , int cle)
    {
        int i ;
    	int c;
    	char caractere;
     
        for (i = 0; i<strlen(phrase);  i ++)
        {
            	caractere=phrase[i];
    	        c=0;
                if( (caractere >= 'a') && (caractere<= 'z') )
    		        c='a';
                else
    		        if ( (caractere>= 'A' && caractere <= 'Z') )
    			        c='A';
                phrase [i] = (((caractere-c)+cle)%26)+c;
        }
    }
    voici le code fonctionnel et simplifié! A noté que j'ai choisi d'utiliser la même fonction pour l'encryption et le décryptage! Pour transformer le + en -, je transforme la valeur de l'argument en nombre négatif avant l'appel.

    J'ai tranformé la boucle while qui n'était pas claire. Enlever une méthode inutile.

  8. #8
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir
    Êtes-vous sûr que le programme soit fonctionnel ?.
    Je suis bien curieux de savoir comment se comporte le programme si je saisissais un caractère au moment du choix proposer par le menu. Et en admettant que je me trompe non pas au menu, mais en deuxième partie, c'est-à-dire au moment où l'on doit fournir la clef de chiffrement (qui est censé être le nombre de décalages) et que je saisis un caractère à la place ; comment se comporterait le programme à ce moment-là ?
    Et surtout avez-vous pris en compte les remarques de @Médinoc dans le correctifs de l'applications simplifié ?
    À bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  9. #9
    Invité
    Invité(e)
    Par défaut
    Salutations!

    Citation Envoyé par sambia39 Voir le message
    Bonsoir
    Êtes-vous sûr que le programme soit fonctionnel ?.
    je l'ai testé, tu peux en faire autant:
    https://www.onlinegdb.com/


    Citation Envoyé par sambia39 Voir le message
    Bonsoir
    Et surtout avez-vous pris en compte les remarques de @Médinoc dans le correctifs de l'applications simplifié ?
    À bientôt
    pas besoin, le scanf insère un char \0 à la fin de la séquence lue, que tu vides ou non le buffer, la séquence tapée sera quand même null-terminated. Scanf ne vide pas le buffer, mais il insére quand même un NULL à la fin de la séquence lu.


    Pour être plus rigoureux, il faudrait limiter ce qui peut être lu en ligne de commande et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    phrase[224]=0; //AU DEBUT, pas obliger de le mettre dans la boucle
     
    scanf ("%224s",str);        //limite la taille lu et garde 1 octet supplémentaire pour le 0 de fin.

    Citation Envoyé par sambia39 Voir le message
    Bonsoir
    Je suis bien curieux de savoir comment se comporte le programme si je saisissais un caractère au moment du choix proposer par le menu. Et en admettant que je me trompe non pas au menu, mais en deuxième partie, c'est-à-dire au moment où l'on doit fournir la clef de chiffrement (qui est censé être le nombre de décalages) et que je saisis un caractère à la place ; comment se comporterait le programme à ce moment-là ?
    Pour ce qui est du reste, le programme original ne faisait pas de détection de ce qui était tapé, je n'ai rien ajouté en ce sens. Par contre, si tu tapes du texte dans un scanf avec %d, si tu entres du texte bidon au lieu d'un nombre, la chaine bidon sera convertie à 0.

    Si on voudrait être propre, ce code devrait quand même avoir des détections de null/non-null au niveau de la fonction appelée. Le code aurait pu être encore optimisé, mais cela peut nuire à la lisibilité.

    Tout marche mais en plus simple.

  10. #10
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    D'accord autant pour moi je me suis donc trompé ?
    je pensais qu'il était nécessaire de vider le buffer Éventuellement avec un while( '\n' != (ret = getchar()) && EOF != ret);. Et sur la variable phrase faire un memsetne serait pas de refus également.

    Variable phrase sans initialisation préalable ( même phrase[224]=0)
    Code GDB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <<<<<<<<<<<<<<<<<<<<<<BIENVENUE A NOTRE PROGRAMME >>>>>>>>>>>>>>>>>>>>>>>>
     --Bienvenue dans le programme de cryptage - decryptage de phrases selon la methode de Cesar
    *** MENU ***
    1. Cryptage 
    2. Decryptage
    3. EXIT
    Votre choix :
    1
    
    Vous avez choisi de crypter.
    Veuillez entrer       la phrase a crypter : AAAAA
    (gdb) p phrase
    $1 = "AAAAA", '\000' <repeats 59 times>, "\320\000\376QT\216\067{`\370\277\357\376\177\000\000\030\367\277\357\376\177\000\000\001\000\000\000\000\000\000\000@\367\277\357\376\177\000\000\060\367\277\357\376\177\000\000\000\367\277\357\376\177\000\000\324C\000\000\001\000\000\000\030\367\277\357\376\177\000\000\000\000\000\000\001\000\000\000\060\367\277\357\376\177\000\000\030\367\277\357\376\177\000\000 5\000\000\001\000\000\000\000\000\000\000\001\000\000\000H2\000\000\001", '\000' <repeats 43 times>...
    (gdb)

    Variable phrase initialiser (memset)
    Code GDB : 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
     
    <<<<<<<<<<<<<<<<<<<<<<BIENVENUE A NOTRE PROGRAMME >>>>>>>>>>>>>>>>>>>>>>>>
     --Bienvenue dans le programme de cryptage - decryptage de phrases selon la methode de Cesar
    *** MENU ***
    1. Cryptage 
    2. Decryptage
    3. EXIT
    Votre choix :
    1
     
    Vous avez choisi de crypter.
    Veuillez entrer       la phrase a crypter : AAAAA
     
    Veuillez choisir votre cle de cryptage : 1
    (gdb) p phrase
    $1 = "AAAAA", '\000' <repeats 219 times>
    (gdb)

    Mais bon tant que le programme fonctionne ......
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  11. #11
    Invité
    Invité(e)
    Par défaut
    Par convention, il n'est pas nécessaire de vider le buffer, car toutes les opérations de chaines (printf, strlen) voit une fin de ligne au premier NULL. Le danger serait de remplir le buffer au complet sans avoir de place pour y insérer un ZERO de terminaison. C'est pour ca que c'est toujours recommandé de faire des allocations de N+1 pour contenir le 0 de terminaison.
    En mettant un zero à la fin du buffer lors de l'initialisation, ca permet de s'assurer de ne pas dépasser. il faut juste ensuite contrôler le scanf pour ne pas écraser ce zéro final. Scanf mettra lui même un zero après l'entrée de la chaine. Donc pas de soucis.

    Par contre, ça dépend toujours du contexte. Idéalement même si cela n'affecte pas le déroulement du programme, c'est pas mauvais de mettre à zero (genre memset). Dans le cas, où tu sauverais le contenu des variables sur disque. Imagine un jeu qui te permet de charger/sauver des parties. Si tu ne met pas le buffer à zero, le programme pourrait sauvegarder des infos qui étaient stockés en mémoire par d'autres programme dans la partie de sauvegarde. Il y a possibilité de data leak!

    Idéalement il serait une bonne pratique de vider le buffer lors de l'initialisation et avant la destruction (free), de cette façon, le prochain programme qui utilise cette zone ram, sera vide. La raison pourquoi ce n'est pas fait par défaut, c'est pour la rapidité.

    a+

  12. #12
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 065
    Points
    43 065
    Par défaut
    Idéalement, j'utiliserais fgets au lieu de scanf.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  13. #13
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Idéalement, j'utiliserais fgets au lieu de scanf.
    Oui, je suis d'avis avec vous. scanf manque de souplesse il très difficile à utiliser.
    Là où j'attire l'attention, c'est au comportement du programme en lui-même la partie non-vidage du buffer.
    Certains appels de scanf échouent systématiquement, car ces appels attendent des séquences de chiffre pour être valide sauf si on ne joue pas le jeu et que l'on injecte des caractères ou des séquences de caractères, ils seront réinjectés dans la variable phrase donc ne pas vider le buffer me parais un peu délicat.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. Comment réaliser un programme de régression lineaire
    Par estellllle dans le forum Général VBA
    Réponses: 0
    Dernier message: 12/11/2009, 17h02
  2. Conception et réalisation de programmes hautes performances et/ou sûrs
    Par gorgonite dans le forum Débats sur le développement - Le Best Of
    Réponses: 171
    Dernier message: 05/08/2009, 23h02
  3. Réaliser un programme pour quelqu'un qui ne maitrise pas VBA
    Par Loki83 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/11/2008, 13h20
  4. réalise un programme avec Delphi tres compliqué
    Par ouldfella dans le forum Delphi
    Réponses: 11
    Dernier message: 04/09/2006, 23h49
  5. Réponses: 15
    Dernier message: 18/05/2006, 13h43

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