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 :

les palindromes et chaines de caractères


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut les palindromes et chaines de caractères
    Savez-vous ce qu'est un palindrome ? c'est un type de mot spécial : c'est en fait une expression qui, une fois les blancs enlevés et les lettres inversés donne la même expression :
    exemple : elu par cette crapule
    compression => eluparcettecrapule
    inversement => eluparcettecrapule
    c'est la meme expression, c'est donc un palindrome ...

    j'ai choisi de poster ici car j'ai fait le programme qui teste une expression (suppression des blancs,inversement,comparaison) et débutant en C, je trouve que c'est un bon exercice pour apprendre le maniemebt des chaines de caractères .

    Je me ferai un plaisir d'expliquer ce que j'ai fait dans mon programme

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Si tu désires nos remarques sur la qualité d'implantation de ton code en langage C, c'est volontier qu'on y jette un coup d'oeil, et qu'on le commente. N'hésite pas à le poster. Idem si tu as des questions précises.

    Meilleures salutations

    Thierry

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    ok merci je le mets en forme ...
    si c'est trop imcompréhensible, je le commenterai

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par olivier1209
    ok merci je le mets en forme ...
    si c'est trop imcompréhensible, je le commenterai
    De toute manière, un code doit être commenté... pas trop, mais suffisamment pour permettre au relecteur de comprendre les intentions de l'auteur original.

    Thierry

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    char sz1[50],sz2[50]; // chaine de caractere sur lesquelles on travaille => variable globale
     
    int compression (void) // compresse une chaine de caractere
      {
     
      int i,j,n=0;j=0;
     
      for (i=0;sz1[i]!=0;i++)
           n++;
     
          for (i=0;i<n;i++)
                if (sz1[i]!=' ') 
                   {
                     sz2[j]=sz1[i];
                     j++;
                   }
         strcpy(sz1,sz2);
      printf("apres compression : %s\n",sz2);
      return 0;
      }
     
     
     int inversion (void) // inverse les caractères d'une chaine : abc=>cba
      {
      char c;
      int i,j,n;
      n=0;
      j=1;
      for (i=0;sz2[i]!=0;i++)
           n++;
        for(i=0;i<n/2;i++)
            {
              c=sz2[i];
              sz2[i]=sz2[n-j];
              sz2[n-j]=c;
              j++;
            }   
       printf("apres inversion : %s\n",sz2);
     return 0;
      }
     
     
     
    int test_palindrome (void)
       {
    if (strcmp(sz1,sz2)) 
           return 0;
      else return 1;
       }
     
     
    int main(int argc, char *argv[])
       {  
     
      gets(sz1);
     
      compression();
      inversion();
     
     
     if (test_palindrome()) 
              puts("c'est un palindrome");
        else  puts("ce n'est pas un palindrome");  
     
      system("PAUSE");	
      return 0;
       }
    Oui oui je sais il y en a qui vont s'arracher les cheveux à force de dire qu'on ne met pas de gets mais plutot des fgets ...
    Le problème est qu'elle plus est compliquée à utiliser, et donc pour les programmes que je fais - en outre en DUT GEII -, gets est amplement suffisant .

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par mujigka
    De toute manière, un code doit être commenté... pas trop, mais suffisamment pour permettre au relecteur de comprendre les intentions de l'auteur original.

    Thierry
    dsl j'étais en train de poster ...
    dis le si c'est impossible à lire.
    mais bon vu la simplicité de la chose je me suis dis que pour beaucoup, ce serait très bien passé sans commentaires

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    je reviens dans 25 min

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par olivier1209
    [CODE]
    Oui oui je sais il y en a qui vont s'arracher les cheveux à force de dire qu'on ne met pas de gets mais plutot des fgets ...
    Le problème est qu'elle plus est compliquée à utiliser, et donc pour les programmes que je fais - en outre en DUT GEII -, gets est amplement suffisant .
    Je ne vois pas en quoi fgets est plus compliqué que gets, mais c'est dangereux de prendre ce genre d'habitude. gets, c'est un bug, et ça ne mange pas de pain d'utiliser fgets à la place.

    Thierry

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par mujigka
    Je ne vois pas en quoi fgets est plus compliqué que gets, mais c'est dangereux de prendre ce genre d'habitude. gets, c'est un bug, et ça ne mange pas de pain d'utiliser fgets à la place.

    Thierry
    d'accord je vais essayer avec fgets.
    est-ce le code est compréhensible ?

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    De manière générale, fait attention d'être cohérent avec l'indentation. Mes commentaires sont dans 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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    /* -TC- A quelques exceptions prêtes, utiliser des variables 
       globales, c'est mal!*/
    char sz1[50], sz2[50]; 
     
    int compression (void) 
    {
        int i, j, n=0, j=0; /* -TC- il y avait un point-virgule au mauvais endroit*/
     
        /* -TC- J'utilise plutôt '\0' que 0 pour faire référence au
            caractère nul */
        for (i = 0; sz1[i] != 0; i++)
        {
            n++; 
        }
     
        /* -TC- Pour plus de clareté dans le code, j'utilise toujours les
            accolades, même lorsqu'une boucle for/while ne compte 
            qu'une instruction. Ca n'engage que moi... */
        for (i = 0; i < n; i++)
        {
            if (sz1[i] != ' ') 
            {
                sz2[j] = sz1[i];
                j++;
            }
        }
     
        /* -TC- Ici, l'utilisation de strcpy est OK (sz1 et sz2 ont la même taille),
            mais cette fonction peut réserver des surprises. J'utilise en général
            strncat */
        strcpy(sz1, sz2);
        printf("apres compression : %s\n", sz2);
     
        /* -TC- A quoi cela sert-il de retourner un entier si c'est toujours 0?*/
        return 0;
    }
     
     
    int inversion (void) // inverse les caractères d'une chaine : abc=>cba
    {
        char c;
        int i, j, n;
        n=0;
        j=1;
     
        for (i = 0; sz2[i] != 0; i++)
        {
            n++;
        }
     
        /* -TC- l'indice j est inutile ici*/
        for(i = 0; i < n/2; i++)
        {
            c = sz2[i];
            sz2[i] = sz2[n-j];
            sz2[n-j] = c;
            j++;
        }   
        printf("apres inversion : %s\n", sz2);
        /* _TC- même remarque que pour compression() */
        return 0;
    }
     
     
     
    int test_palindrome (void)
    {
        /* -TC- ou simplement return !strcmp(sz1, sz2) */
        if (strcmp(sz1,sz2)) 
            return 0;
        else 
            return 1;
       }
     
     
    int main(int argc, char *argv[])
    {  
        /* -TC- Dire à l'utilisateur ce qu'il doit faire:
                    printf("Entrez une chaîne: ");
                    fflush(stdout); */
     
        /* -TC- fgets, c'est bcp plus compliqué: fgets(sz1, sizeof sz1, stdin);
            Si la chaîne entrée par l'utilisateur fait 50 caractères ou plus, il n'y a 
            pas de caractère nul à la fin de sz1 et les fonctions compression et
            inverser ne fonctionnent plus. */
        gets(sz1);
        /* N'oublie pas d'enlever le saut de ligne à la fin de la chaîne. Une
            chaîne telle que "SOS\n" ne sera pas considérée comme un
            palindrome par ton code */
     
     
        compression();
        inversion();
     
     
        if (test_palindrome()) 
              puts("c'est un palindrome");
        else  puts("ce n'est pas un palindrome");  
     
        system("PAUSE");	
        return 0;
    }
    Essaie de définir tes chaînes avec une classe d'allocation automatique dans le corps de main, et passer un pointeur sur ces chaînes à tes fonctions. Ton interface deviendrait alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* Elimine les espaces présents dans chaine en place. Sers-toi
        de la valeur de retour pour affiner ton contrôle d'erreur */
    int compresser(char *chaine); 
    /* Inverse la chaine de caractères contenue dans source, et 
        place le résultat de l'inversion dans destination */
    int inverser(char const *source, char *destination);
    Thierry

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    fgets(sz1, sizeof(sz1), stdin); pour remplacer le gets
    merci je vais voir un peu ce que tu m'as écrit

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par olivier1209
    d'accord je vais essayer avec fgets.
    est-ce le code est compréhensible ?
    Le code est compréhensible, mais fait attention d'être cohérent avec l'indentation. De plus, déclare une variable par ligne, et n'utilise jamais, à moins de pouvoir le justifier, de variables globales.

    Thierry

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par olivier1209
    fgets(sz1, sizeof(sz1), stdin); pour remplacer le gets
    merci je vais voir un peu ce que tu m'as écrit
    Tu vois que ce n'est pas beaucoup plus compliqué que gets

    Thierry

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par mujigka
    Tu vois que ce n'est pas beaucoup plus compliqué que gets

    Thierry
    c'est vrai mais c'est juste une question de reflex. c'est ce qu'on apprend en cours c'est relou. Le problème c'est vrai avec gets c'est que lorsque j'ai une chaine de caractère, j'ai un paquet de caractère à la con à la fin. C'est pour ça que j'ai du compter le nombre de caractères entrés (variable n dans le programme) .

    Je réponds à tes commentaires ...

  15. #15
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par olivier1209
    c'est vrai mais c'est juste une question de reflex. c'est ce qu'on apprend en cours c'est relou. Le problème c'est vrai avec gets c'est que lorsque j'ai une chaine de caractère, j'ai un paquet de caractère à la con à la fin. C'est pour ça que j'ai du compter le nombre de caractères entrés (variable n dans le programme) .

    Je réponds à tes commentaires ...
    Pour compter le nombre de caractères, tu peux utiliser:

    Thierry

  16. #16
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Ici, l'utilisation de strcpy est OK (sz1 et sz2 ont la même taille),
            mais cette fonction peut réserver des surprises. J'utilise en général
            strncat
    Ok je vais voir un peu ce que c'est.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A quoi cela sert-il de retourner un entier si c'est toujours 0?
    C'est pour le fun, pour aussi plus de clarté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l'indice j est inutile ici
    c'est vrai je dois le confesser : je n'avais pas vu . i et j dans la même boucle s'incrémentent de la même façon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    simplement return !strcmp(sz1, sz2)
    pas mal j'avoue

    Essaie de définir tes chaînes avec une classe d'allocation automatique dans le corps de main
    euh désolé maais kézako ?? on a pas ça à l'IUT.

    Pour les pointeurs je vais essayer tranquillou dans la soirée mais bon c'est chaud au début

  17. #17
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par mujigka
    Pour compter le nombre de caractères, tu peux utiliser:

    Thierry
    rohh lol c'est vrai !
    putain je fais vraiment de la progrmmation à l'ancienne, à l'arrache, tout ce que tu veux

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Pour savoir si une expression est un palindrome, il faudrait compléter ton traitement.

    Il faut

    - supprimer les espaces. Tu l'as fait, c'est bien

    - supprimer tous les signes de ponctuation et autres (point, virgule, parenthèses, slash, signes +- etc..., enfin bref, tout ce qui n'est pas une lettre)

    - transformer tous les caractères avec des signes diacritiques (accents, cédille...) en leur équivalent sans ces signes (par exemple Ééçï deviennent Eeci)

    - transformer toutes les majuscules en minuscules (ou inversement)

    et poursuivre le traitement comme tu l'as fait, inverser, comparer.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Pour plus de clarter, je conseille de tester explicitement si strcmp() est égal à zéro ou non.
    Ne pas oublier que strcmp() n'a pas deux cas possibles, mais trois (supérieur, égal, inférieur).

    Mais bon, c'est subjectif...

    Et oui, les variables globales, c'est mal.

    PS: mujigka: J'aime bien tes corrections proposées, mais je conseillerais de suivre les conventions C : La destination en premier (c'est illogique, mais constant).

  20. #20
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par thewho
    Bonjour,

    Pour savoir si une expression est un palindrome, il faudrait compléter ton traitement.

    Il faut

    - supprimer les espaces. Tu l'as fait, c'est bien

    - supprimer tous les signes de ponctuation et autres (point, virgule, parenthèses, slash, signes +- etc..., enfin bref, tout ce qui n'est pas une lettre)

    - transformer tous les caractères avec des signes diacritiques (accents, cédille...) en leur équivalent sans ces signes (par exemple Ééçï deviennent Eeci)

    - transformer toutes les majuscules en minuscules (ou inversement)

    et poursuivre le traitement comme tu l'as fait, inverser, comparer.
    faut pas trop pousser non plus !
    ce n'est juste qu'un exercice

Discussions similaires

  1. eliminer les espaces d'une chaine de caractères
    Par wassim_kh dans le forum Langage
    Réponses: 1
    Dernier message: 14/07/2006, 12h20
  2. question sur les chaines de caractères
    Par pierrOPSG dans le forum C
    Réponses: 5
    Dernier message: 13/04/2006, 19h55
  3. les chaines de caractères
    Par mrtatou dans le forum C
    Réponses: 4
    Dernier message: 25/01/2006, 15h18
  4. xsl : test sur les chaine de caractère
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 13/07/2005, 16h43
  5. Réponses: 3
    Dernier message: 10/06/2004, 23h34

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