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. #61
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 80
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par olivier1209
    Je n'ai pas bien compris ce que tu voulais dire, à par une vérité évidente : il faut penser son algo avant d'écrire un prog.
    Et bien tu ne t'es pas montré capable de respecter la vérité évidente. Il y a au moins trois phases à respecter : les specifications (poser le problème et ses limites), la conception (du verbe "concevoir") où on construit les algorithmes, les méthodes, les structures de données, etc et l'implémentation (du verbe "pondre") où on produit le code-source à compiler. Chaque étape s'appuie sur la précédente.

    Candide

  2. #62
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int compression (char *sz1, char *sz2) // compresse une chaine de caractere
    {
       int i, j, n = 0; j = 0;
     
       for (i=0;*sz1[i]!=0;i++)
            n++;
     
        /*...*/
    }
    On ne peut pas passer en C un tableau en argument d'une fonction. Par contre, on peut passer un pointeur sur le premier élément d'un tableau. C'est ce qu'on fait ici.

    Ce qu'il faut comprendre, c'est que les tableaux et les pointeurs, en C, sont intimement liés. Cette équivalence a lieu au niveau de l'arithmétique des pointeurs. On a donc:

    qui est équivalent à et
    qui est équivalent à Ainsi, ton code ci-dessus doit s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int compression (char *sz1, char *sz2) // compresse une chaine de caractere
    {
       int i, j, n = 0; j = 0;
     
       for (i=0; sz1[i] !=0; i++)  /* -TC- *sz1[i] n'est pas correct */
            n++;
     
        /*...*/
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int compression (char *sz1, char *sz2) // compresse une chaine de caractere
    {
       int i, j, n = 0; j = 0;
     
       for (i=0;*(sz1 + i) != 0; i++)
            n++;
     
        /*...*/
    }
    Thierry

  3. #63
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par c-candide
    je poste mon code que je soumets à la critique :
    Correct, mais améliorable...
    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
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       for (;;)
       {
          char chaine[50];
     
    /* -ed-
       printf ("Entrer une chaine (au plus %d caracteres) : \n", 49);
       fgets (chaine, 50, stdin);
     
       et sizeof ?
       Les espaces avant un \n ne servent à rien...
     
    */
     
          printf
             ("Entrer une chaine (au plus %d caracteres) ou [enter] pour quitter :\n",
              (int) (sizeof chaine - 1));
          fgets (chaine, sizeof chaine, stdin);
     
          if (chaine[0] == '\n')
          {
             break;
          }
    /* -ed-
      chaine[strlen(chaine)-1]='\0';
      int longueur=strlen(chaine);
     
     2 fois strlen() ? pourquoi ? */
     
          int longueur = strlen (chaine);
          if (chaine[longueur - 1] == '\n')
          {
             chaine[longueur - 1] = 0;
             longueur--;
          }
    /* -ed- tout le monde n'a pas C99 */
          {
             int gauche = 0, droite = longueur - 1;
             int pal = 1;
             while (pal && gauche < droite)
             {
                while (chaine[gauche] == ' ')
                   gauche++;
                while (chaine[droite] == ' ')
                   droite--;
                /* -ed-
                if (chaine[gauche] != chaine[droite])
                   return 0;
     
                   A eviter. La regle en programmation structuree (C != Assemleur...),
                   c'est un return par fonction. Ca rompt brutalement le logique du
                   code. Si on voulait boucler le tout, pour exécuter plusieurs fois
                   (jusqu'a entrer [enter], tout seul par exemple), on aurait une sortie
                   sauvage. (Pour la peine, je l'ajoute...)
     
                   Et quid des eventuelles ressources non liberees...
                 */
                pal = chaine[gauche] == chaine[droite];
                gauche++;
                droite--;
             }
             printf ("Palindrone ? %s. \n", pal ? "OUI" : "NON");
          }
       }
       return 0;
    }

  4. #64
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par c-candide
    "Reporte-toi au 1er post."
    4 fautes en 5 mots, apprends déjà l'orthographe avant de venir me donner des conseils infondés.
    Yo ! Je me suis fait taper sur les doigts pour moins que ça !

  5. #65
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 80
    Points : 75
    Points
    75
    Par défaut
    Bonjour Emmanuel,

    J'espère qu'on ne va pas se disputer

    Citation Envoyé par Emmanuel Delahaye
    printf ("Entrer une chaine (au plus %d caracteres) : \n", 49);
    fgets (chaine, 50, stdin);

    et sizeof ?
    Exact mais je me suis basé sur le code du PO et je n'ai pas souhaité soigner ce genre de détail.
    Les espaces avant un \n ne servent à rien...
    Exact, étourderie de ma part.
    /* -ed-
    chaine[strlen(chaine)-1]='\0';
    int longueur=strlen(chaine);

    2 fois strlen() ? pourquoi ? */

    int longueur = strlen (chaine);
    if (chaine[longueur - 1] == '\n')
    {
    chaine[longueur - 1] = 0;
    longueur--;
    }
    OK.

    /* -ed- tout le monde n'a pas C99 */
    Oui, exact.
    A eviter. [...] un return par fonction
    Oui, je me doutais que quelqu'un allait tiquer. C'est en effet sauvage. Je crois que j'éviterai à l'avenir, je suis soucieux de produire du code conforme aux pratiques reconnues et éprouvées.
    Et quid des eventuelles ressources non liberees...
    Ah oui, très bon argument auquel je n'avais pas pensé.

    Merci de tes conseils.

    Candide

  6. #66
    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 c-candide
    4 fautes en 5 mots, apprends déjà l'orthographe avant de venir me donner des conseils infondés.
    Candide


    reprends moi sur un algorithme, ou sur une erreur de synthaxe, mais s'attaquer à l'orthographe c'est vraiment limite, surtout dans un forum informatique, et que je pense avoir un français très correct ...

    Citation Envoyé par c-candide
    Tu crois ?
    arf j'ai horreur de ce genre d'ironie qui ne nous avance pas du tout. Au lieu de prendre tes grands airs, tu n'as qu'à me réexpliquer ce que tu as compris, et je te répondrai si c'est correct ou non.

    Je reprends donc calmement :
    définition du palindrome:

    une expression 1 : elu par cette crapule.
    1. Compression : eluparcettecrapule (on a ici une expression 2)
    2. Inversion : eluparcettecrapule
    3. Comparaison : si 1 et 2 sont identiques, alors 1 est un palindrome

  7. #67
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier1209
    définition du palindrome:

    une expression 1 : elu par cette crapule.
    OK, ca, c'est la définition, "par l'exemple". (en principe, on ne se sert pas d'un exemple pour faire une définition... passons...)

    Avec mon code (dérivé de celui de c-candide) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Entrer une chaine (au plus 49 caracteres) ou [enter] pour quitter :
    elu par cette crapule
    Palindrone ? OUI.
    Entrer une chaine (au plus 49 caracteres) ou [enter] pour quitter :
     
     
    Press ENTER to continue.
    1. Compression : eluparcettecrapule (on a ici une expression 2)
    2. Inversion : eluparcettecrapule
    3. Comparaison : si 1 et 2 sont identiques, alors 1 est un palindrome
    Ceci n'a rien à voir avec la définition (quoi ?) mais ressort plutôt de la conception (comment ?). Il faut absolument différencier les deux. Ce qu'on t'a fait remarquer (pas immédiatement, tu as remarqué, c'est à dire après s'être intéressé au codage), c'est que cette conception était compliquée. C'est tout. On t'a proposé des alternatives qui répondent au problème initial qui est "cette expression est-elle un palindrome ?".

    Il est absolument primordial, pour mener quelque projet que ce soit, de bien différencier les phases principales qui sont :
    1. Définition (répondre à la question quoi ?)
    2. Conception (répondre à la question comment ?)
    3. Réalisation (mettre en oeuvre)

    Le codage (phase 3), c'est rien. La reflexion apparait dans la phase 2. Coder une ânerie, c'est perdre son temps...

  8. #68
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 80
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par olivier1209
    que je pense avoir un français très correct ...
    T'as surtout une très haute opinion de toi.

    Au lieu de prendre tes grands airs, tu n'as qu'à me réexpliquer ce que tu as compris, et je te répondrai si c'est correct ou non.
    Monsieur est trop bon.

    Je reprends donc calmement :
    définition du palindrome:
    une expression 1 : elu par cette crapule.
    1. Compression : eluparcettecrapule (on a ici une expression 2)
    2. Inversion : eluparcettecrapule
    3. Comparaison : si 1 et 2 sont identiques, alors 1 est un palindrome
    Non, ce n'est pas une DEFINITION, c'est ta CONCEPTION de la notion de palindrome. Détecter un palindrome ne nécessite nullement de recopier la chaîne (une copie de données est un opération coûteuse), c'est un simple exercice de lecture et de comparaison, pas d'écriture.
    Mais tu es sans doute un adepte du "pourquoi-faire-simple-quand-on-peut-faire-compliqué", c'est ton droit.

    Tu débarques sur ce forum en nous expliquant ce qu'est un palindrome alors que tous les gens ici le savent depuis longtemps, c'est un exercice de programmation (tous langages confondus) d'une banalité totale.

    Au lieu de perdre ton temps à polémiquer, reprends les conseils qui t'ont été donnés et donne-nous une version complète et robuste. Quant à moi, je cesse cette discussion stérile avec toi.

  9. #69
    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
    Merci mujigka pour ton message

    j'ai donc remplacé dans mon 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
     // chaine de caractere sur lesquelles on travaille => variable globale
     
    int compression (char *sz1, char *sz2) // 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+i)=*(sz1+i);
                     j++;
                   }
         strcpy(sz1,sz2);
      printf("apres compression : %s\n",*sz2);
      return 0;
      }
     
     
     int inversion (char *sz1,char *sz2) // 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\n",*sz2);
     return 0;
      }
     
     
    int main(int argc, char *argv[])
       {  
      char sz1[50], sz2[50]; 
     
      fgets(sz1,sizeof(sz1),stdin);
     
      compression(&sz1,&sz2);
      inversion(&sz1,&sz2);
     
     
     if (!(strcmp(sz1,sz2)))
              puts("c'est un palindrome");
        else  puts("ce n'est pas un palindrome");  
     
      system("PAUSE");	
      return 0;
       }
    J'ai quand même un problème... Je ne sais plus trop ...

  10. #70
    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 Emmanuel Delahaye
    OK, ca, c'est la définition, "par l'exemple".
    certes ce n'est pas la définition du dico mais bon pour expliquer je trouvais ça mieux... enfin cela n'engage que moi.

  11. #71
    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,

    J'ai rejeté un coup d'oeil à ton code, et je me demande pourquoi tu persistes à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      for (i=0;*(sz1+i)!=0;i++)
           n++;
    pour obtenir la longueur d'une chaine.

    Il y a une fonction standard pour cela, qui s'appelle strlen. Pourquoi ne pas l'utiliser ?
    (Si tu ne la connais pas, il est plus que temps d'ouvrir un bouquin ou un cours de C)

    D'autre part, pourquoi persister à faire une indentation si mauvaise qu'elle perturbe la lecture du code au lieu de la rendre limpide ?

  12. #72
    Membre régulier Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par olivier1209
    (...)

    Je reprends donc calmement :
    définition du palindrome:

    une expression 1 : elu par cette crapule.
    1. Compression : eluparcettecrapule (on a ici une expression 2)
    2. Inversion : eluparcettecrapule
    3. Comparaison : si 1 et 2 sont identiques, alors 1 est un palindrome
    Donc je te réexplique ce que je pense et qui a été repris par "c-candide".
    La phase n°2 est inutile car une fois que tu as ta chaine sans les caractères superflu (espace, ponctuation, ect...) tu peux directement comparer la chaine elle même: le premier caractère avec le dernier, le second avec l'avant dernier, etc jusqu'au milieu de ta chaine au maximun.

  13. #73
    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 Lucky-94
    Donc je te réexplique ce que je pense et qui a été repris par "c-candide".
    La phase n°2 est inutile car une fois que tu as ta chaine sans les caractères superflu (espace, ponctuation, ect...) tu peux directement comparer la chaine elle même: le premier caractère avec le dernier, le second avec l'avant dernier, etc jusqu'au milieu de ta chaine au maximun.
    Il te faut toutefois, lors de ta saisie caractère par caractère, prendre le soin de transformer les caractères accentués en leur équivalent non accentué.

    Thierry

  14. #74
    Membre régulier Avatar de Lucky-94
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Oui, comme je l'avais déjà dit dans un précédent message.
    Il faut aussi modifier la case si besoin est pour certains caractères pour n'avoir que des minuscules ou majuscules.
    Je parle donc bien d'une chaîne conforme pour le traitemant (la comparaison), cette tel chaîne se suffit à elle même.
    Même en utilisant deux chaînes comme le fait "olivier1209" il faut bien sûr que les caractères accentués aient été traités.

  15. #75
    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,

    J'ai rejeté un coup d'oeil à ton code, et je me demande pourquoi tu persistes à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      for (i=0;*(sz1+i)!=0;i++)
           n++;
    pour obtenir la longueur d'une chaine.

    Il y a une fonction standard pour cela, qui s'appelle strlen. Pourquoi ne pas l'utiliser ?
    (Si tu ne la connais pas, il est plus que temps d'ouvrir un bouquin ou un cours de C)

    D'autre part, pourquoi persister à faire une indentation si mauvaise qu'elle perturbe la lecture du code au lieu de la rendre limpide ?

    je connais cette fonction mais je préférais m'attarder sur cette histoire de pointeurs, sachant que le reste fonctionnait correctement .

  16. #76
    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 Lucky-94
    Donc je te réexplique ce que je pense et qui a été repris par "c-candide".
    La phase n°2 est inutile car une fois que tu as ta chaine sans les caractères superflu (espace, ponctuation, ect...) tu peux directement comparer la chaine elle même: le premier caractère avec le dernier, le second avec l'avant dernier, etc jusqu'au milieu de ta chaine au maximun.
    Autant pour moi je n'avais pas bien compris ce que m'avais expliqué c-candide
    En effet c'est plus simple : dès que deux caractères diffèrent, on sort de la boucle directement pour dire que ce n'est pas un palindrome ...

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