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. #41
    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 thewho
    Bonjour,

    L'idée est bonne, et relève d'une bonne conception.

    MAIS regarde bien comment tu as défini tes paramètres, c'est un joli bug.
    Un prototype correct pour la fonction inversion est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int inversion (char *sz1,char *sz2);
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int inversion (char sz1[],char sz2[]);
    Les deux notations sont strictement équivalentes.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  2. #42
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(char *chaine[]);
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(char **chaine);
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par mujigka
    Un prototype correct pour la fonction inversion est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int inversion (char *sz1,char *sz2);
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int inversion (char sz1[],char sz2[]);
    Les deux notations sont strictement équivalentes.

    Thierry
    Ok merci j'ai modifié, mais j'ai encore un paquet d'erreur - cette fois lors de la compilation -

    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 <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[j]=*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 test_palindrome (char *sz1,char *sz2)
       {
    return (strcmp(*sz1,*sz2)); 
       }
     
     
    int main(int argc, char *argv[])
       {  
      char sz1[50], sz2[50]; 
     
      fgets(sz1,sizeof(sz1),stdin);
     
      compression(&sz1,&sz2);
      inversion(&sz1,&sz2);
     
     
     if (!(test_palindrome(&sz1,&sz2)))
              puts("c'est un palindrome");
        else  puts("ce n'est pas un palindrome");  
     
      system("PAUSE");	
      return 0;
       }

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par mujigka
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(char *chaine[]);
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(char **chaine);
    Thierry
    c'est pas les adresses que l'on rentre en paramètre ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    c'est pas les adresses que l'on rentre en paramètre ?
    roh nan nul complétement a coté de la plaque
    dsl

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    Je fais à peu près le même exercice.
    Pourquoi utilisé deux chaînes de caractères?
    On peu pour vérifier si une chaîne est un palindrome comparer le premier caractère avec le dernier, le second avec l'avant dernier, ainsi de suite jusqu'au milieu de la chaîne!
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

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

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

    Je fais à peu près le même exercice.
    Pourquoi utilisé deux chaînes de caractères?
    On peu pour vérifier si une chaîne est un palindrome comparer le premier caractère avec le dernier, le second avec l'avant dernier, ainsi de suite jusqu'au milieu de la chaîne!
    pour la compression, je l'ai fait avec 2 chaines :
    dans une boucle for, on lit la 1ere caractère par caractère, et si on a un espace, on passe au suivant, sinon on copie sur la 2eme.

    toi tu parlais directement de comparer, mais il faut d'abord enlever les blancs

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Quel est l'entrée de ta chaîne à étudier?
    Les espaces peuvent être ignorés dès la saisie (ou lecture) des carctères de la chaîne de caractère.
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Lucky-94
    Les espaces peuvent être ignorés dès la saisie (ou lecture) des carctères de la chaîne de caractère.
    Je ne vois pas vraiment comment ... on récupère une entrée clavier avec fgets, et ensuite on travaille dessus. Dans mon prog, l'entrée c'est sz1.

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 81
    Points : 76
    Points
    76
    Par défaut
    Tu fais une entrée caractère par caractère.
    Ainsi tu conserves que les caractères alphabétiques et supprimes tout le reste, caractères numériques, espaces, caractères de ponctuation, comme le sugérait déjà "thewho". De plus tu peux en profiter pour modifier tout les caractères dans la même case.
    Par contre, cela ne résoud pas le problème des accents. Il faut donc convenir que l'entrée se fera sans.
    Lucky.
    Je ne dors pas longtemps, mais je dors vite.
    [Albert Einstein]

  11. #51
    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 : 67
    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
    j'ai essayé de le refaire en enlevant les variables globales, donc en entrant en parametre de chaque fonction les adresses des chaines de caractères.

    J'ai quand même un problème à l'exécution ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int compression (char *sz1[50],char *sz2[50]) // compresse une chaine de caractere
    A lire d'urgence :

    http://emmanuel-delahaye.developpez.....htm#param_tab
    Pas de Wi-Fi à la maison : CPL

  12. #52
    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 Lucky-94
    Bonjour,

    Je fais à peu près le même exercice.
    Pourquoi utilisé deux chaînes de caractères?
    On peu pour vérifier si une chaîne est un palindrome comparer le premier caractère avec le dernier, le second avec l'avant dernier, ainsi de suite jusqu'au milieu de la chaîne!
    Ah, enfin ! je me demandais si cette remarque allait venir. La solution du posteur original est affreusement compliquée, avant de pondre du code, il faut le concevoir !!


    Candide

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je comprends rien au pointeurs !!!

    j'ai pourtant écrit ce que l'on m'a indiqué ...

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par c-candide
    Ah, enfin ! je me demandais si cette remarque allait venir. La solution du posteur original est affreusement compliquée, avant de pondre du code, il faut le concevoir !!


    Candide
    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.

  15. #55
    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
    Malgré la simplicité de l'énoncé et le classicisme de la question (je crois que la question des palindromes est de celles les plus traitées en C), cet exercice met en jeu de nombreuses notions plus ou moins élémentaires : utilisation de fonctions, utilisation ou pas de variables globales, branchement, itérations, entrées/sorties, manipulation de chaînes.

    Quand on est débutant je trouve que c'est beaucoup trop de choses à maîtriser en même temps, je ne te jette pas la pierre, tu es comme beaucoup, t'as envie de jouer en faisant du C et en plus la plupart des livres font comme ça ce qui est selon moi une profonde erreur. Il vaut mieux se concentrer sur des programmes SOBRES et DEPOUILLES qui font des taches atomiques. Apprentissage et surchage ne font pas bon ménage, enfin c'est mon opinion.

    Tout le monde te reprend sur la forme et à juste titre mais personne ne te reprend sur le fond. Après tout si tu es débutant en C, ton programme n'est pas si mal même s'il est largement perfectible. Par contre ta méthode pour tester si c'est un palondrome ou pas est très maladroite. Je m'explique : d'abord, tu parcours la chaîne pour trouver sa longueur et puis tu la parcours à nouveau pour la COPIER sans les blancs dans un autre tableau, pour la recopier ensuite dans la chaine initiale, toutes ces copies sont couteuses et totalement inutiles. Ensuite, tu recopies une moitié de ta chaîne sz2 dans l'autre, totalement inutile aussi.

    Une question simple comme cella-là doit être résolue de manière simple, ton travail de codage doit commencer par ça. Sans compter que ton code ne marche pas s'il y a un espace (blanc) au début ou s'il y a plusieurs espaces consécutifs.

    Je me considère moi aussi comme débutant (un an et demi de C, c'est peu) et je poste mon code que je soumets à la critique :

    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
      char chaine[50];
     
      printf("Entrer une chaine (au plus %d caracteres) : \n",49);
      fgets(chaine,50,stdin);
     
      chaine[strlen(chaine)-1]='\0';
      int longueur=strlen(chaine);
     
      int gauche=0, droite = longueur-1;
     
      while (gauche < droite)
        {
          while (chaine[gauche] == ' ')
            gauche++;
          while (chaine[droite] == ' ')
            droite--;
          if (chaine[gauche] != chaine[droite])
            {
              printf("Palindrone ? NON. \n");
              return 0;
            }
          gauche++;
          droite--;
        }
      printf("Palindrone ? OUI. \n");
      return 0;
    }
    Naturellement, on est loin d'un programme complet et robuste.

    Candide

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par c-candide
    Malgré la simplicité de l'énoncé et le classicisme de la question (je crois que la question des palindromes est de celles les plus traitées en C), cet exercice met en jeu de nombreuses notions plus ou moins élémentaires : utilisation de fonctions, utilisation ou pas de variables globales, branchement, itérations, entrées/sorties, manipulation de chaînes.

    Quand on est débutant je trouve que c'est beaucoup trop de choses à maitrîser en même temps, je ne te jette pas la pierre, tu es comme beaucoup, t'as envie de jouer en faisant du C et en plus la plupart des livres font comme ça ce qui est selon moi une profonde erreur. Il vaut mieux se concentrer sur des programmes SOBRES et DEPOUILLES qui font des taches atomiques. Apprentissage et surchage ne font pas bon ménage, enfin c'est mon opinion.

    Tout le monde te reprend sur la forme et à juste titre mais personne ne te reprend sur le fond. Après tout si tu es débutant en C, ton programme n'est pas si mal même s'il est largement perfectible. Par contre ta méthode pour tester si c'est un palondrome ou pas est très maladroite. Je m'explique : d'abord, tu parcours la chaîne pour trouver sa longueur et puis tu la parcours à nouveau pour la COPIER sans les blancs dans un autre tableau, pour la recopier ensuite dans la chaine initiale, toutes ces copies sont couteuses et totalement inutiles. Ensuite, tu recopies une moitié de ta chaîne sz2 dans l'autre, totalement inutile aussi.

    Une question simple comme cella-là doit être résolue de manière simple, ton travail de codage doit commencer par ça. Sans compter que ton code ne marche pas s'il y a un espace (blanc) au début ou s'il y a plusieurs espaces consécutifs.

    Je suis d'accord avec toi sur beaucoup de chose. Chacun son programme, sa manière de penser. Moi j'avoue, de temps en temps, ça fait un peu bricolage mais mon prog il marche !!

    Moi aussi je suis débutant (4 mois de C), et j'ai commencé par des programmes plus petits. Et c'est pour cela que j'ai proposer cet exercice dans ce forum. Le palindrome permet comme tu l'as dit à juste titre d'appliquer pas mal de connaissances, encore faut-il avoir les bases.

    Je vais regarder pourquoi ton programme compile, se lance, mais la fenetre se ferme dès que l'on rentre quelque chose .

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Je n'ai pas l'impression que tu ais compris ce qu'est un palindrome ...

    compression puis inversion ...
    ensuite comparaison ...

    reportes toi au 1er poste ...

  18. #58
    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 suis d'accord avec toi sur beaucoup de chose. Chacun son programme, sa manière de penser.
    Non, non, il y a certains standards à respecter pour coder, ça demande assez peu d'imagination. Si tu veux "penser", étudie ton algorithme (enfin algorithme pour tester un palindrome, c'est beaucoup dire)

    Citation Envoyé par olivier1209
    Moi j'avoue, de temps en temps, ça fait un peu bricolage mais mon prog il marche !!
    A mon avis programmation -- surtout en C -- et bricolage font assez mauvais ménage. Vaut mieux prendre les bonnes habitudes au départ, après c'est difficile de changer.

    Citation Envoyé par olivier1209
    Je vais regarder pourquoi ton programme compile, se lance, mais la fenetre se ferme dès que l'on rentre quelque chose .
    Il faut sans doute insérer cette ligne
    Probablement ton IDE est Dev-cpp. Utilise Code-Blocks par exemple et tu n'auras plus à ajouter cette ligne.


    Candide

  19. #59
    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
    Je comprends rien au pointeurs !!!

    j'ai pourtant écrit ce que l'on m'a indiqué ...
    La bonne stratégie, c'est de prendre les liens que t'a passé Emmanuel et de les lire attentivement. Pose des questions s'il y a des concepts que tu ne comprends pas. Construis-toi des petits programmes de tests pour étudier:
    • les pointeurs
    • les chaînes de caractères
    • le passage de pointeurs en arguments de fonctions
    • le passage de tableaux en arguments de fonctions
    • le passage de chaînes de caractères en arguments de fonctions


    Il est important de comprendre en profondeur tous ces concepts avec des programmes modestes. Le site d'Emmanuel explique tous les concepts clés du langage C de manière très pédagogique. De ce point de vue, c'est une référence qu'il faut lire absolument. La programmation ne s'apprend pas en jonglant à l'aveugle avec des éléments de syntaxe. Il y a des fondamentaux à comprendre. Et une fois que ces fondamentaux sont acquis, il est possible de construire dessus et de s'attaquer à des problèmes plus compliqués.

    Bonne chance, et n'hésite pas à poser des questions s'il y a des choses que tu ne comprends pas.

    Thierry Chappuis
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  20. #60
    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 l'impression que tu ais compris ce qu'est un palindrome ...
    Tu crois ?
    reportes toi au 1er poste ...
    "Reporte-toi au 1er post."
    4 fautes en 5 mots, apprends déjà l'orthographe avant de venir me donner des conseils infondés.

    Candide

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, 11h20
  2. question sur les chaines de caractères
    Par pierrOPSG dans le forum C
    Réponses: 5
    Dernier message: 13/04/2006, 18h55
  3. les chaines de caractères
    Par mrtatou dans le forum C
    Réponses: 4
    Dernier message: 25/01/2006, 14h18
  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, 15h43
  5. Réponses: 3
    Dernier message: 10/06/2004, 22h34

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