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 :

Le Palindrome (petit exo)


Sujet :

C

  1. #1
    Membre régulier Avatar de skulled
    Inscrit en
    Décembre 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 120
    Points : 120
    Points
    120
    Par défaut Le Palindrome (petit exo)
    Bonjour, je suis entrain d'écrire un petit prog qui permet de reconnaitre si le mot que je saisi est ou pas un palindrome.
    Je rappel qu'un palindrome est un mots lisibles dans les deux sens comme par exemple: laval ou bien radar

    Voilà 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
     
    #include <stdio.h>
    #include <string.h>
    char mot[20];
    int i,j,l,ok,res;
    void main (void) {
    	printf("Tapez un mot:\n");
    	scanf("%s",mot);
    	l=strlen(mot);
    	ok=0;
    	for(i=0,j=l-1;i<l,j>0;i++,j--)
    	{
    		res=strcmp(&mot[i],&mot[j]);
    		if(res!=0)
    		{
    			break;
    		}
    		else
    		{
    			ok++;
    		}
    	}
    	if(ok==l)
    		printf("PALINDROME\n");
    	else
    		printf("PAS PALINDROME\n");
     
    }
    Le probleme est au niveau de res=strcmp(&mot[i],&mot[j]);
    Lorsque je passe le programme sous debugger je vois que "&mot[i]" et "&mot[j]" prennent en compte plusieurs lettres à la fois, et non pas une seule lettre.
    Comment puis je faire pour comparer lettre par lettre? En utilisant strcmp si possible.
    Merci.

  2. #2
    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 skulled
    Bonjour, je suis entrain d'écrire un petit prog qui permet de reconnaitre si le mot que je saisi est ou pas un palindrome.
    Avant de régler les problèmes de C, tu devrais plus réfléchir sur l'algorithme. Une comparaison astucieuse caractères par caractères permet une grande simplification...

    En C, la comparaison de valeurs, c'est ==.

  3. #3
    Membre régulier Avatar de skulled
    Inscrit en
    Décembre 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 120
    Points : 120
    Points
    120
    Par défaut
    Je sais, en faite j'ai dejà fais le programme en utilisant caractere par caractere mais mon professeur souhaiterais que j'utilise les fonction de comparaison des string.
    Ma question est: Est-ce possible avec strcmp de comparer caractere par caractere?

    Merci d'avoir repondu aussi vite.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si ta contraintes est d'utiliser strcmp, il est douteux que comparer caractère par caractère soit la solution attendue.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    strrev puis strcmp ?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par hegros
    strrev puis strcmp ?
    Ca existe strrev? (J'ai pas mes refs habituelles sous la main).

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

    Voici quelques commentaires, mais je n'ai pas corrigé ton 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
     
    #include <stdio.h>
    #include <string.h>
     
    /*-TC- Les globales, c'est pas bien du tout et ça ne se justifie
       pas dans ton cas. Toute ces variables doivent être définies dans le
       corps de la fonction main. C'est un habitude à prendre, et c'est 
       important */
    char mot[20];
    int i, j , l, ok, res;
     
    /*-TC- main doit absolument retourner un entier de type int. C'est 
       la norme du langage C qui le dit. Par convention, on retourne la
       valeur 0 ou EXIT_SUCCESS définie dans stdlib.h en d'exécution sans
       problème. Ecrire: int main(void)*/
    void main (void) {
    	printf("Tapez un mot:\n");
            /*-TC- Cette utilisation de scanf engendre des problèmes si la chaîne
               entrée par l'utilisateur est plus grande que l'espace mémoire alloué
               à mot, et ainsi entraîner un débordement de tambon. DANGEREUX*/
    	scanf("%s",mot);
            /*-TC- pratiquement, strlen retourne une valeur de type size_t*/
    	l=strlen(mot);
    	ok=0;
     
            /* -TC- La forme de ton test est incorrecte, et est vrai seulement 
                lorsque j > 0. Le test correct ici (i < l) && (j >= 0). Par ailleurs,
                il n'est pas recommandé d'appeler une variable "l" qui peux facilement
                être confondue avec le chiffre 1. Note par ailleurs que la variable j
                est inutile, car elle vaut l-i-1. */
    	for(i=0,j=l-1;i<l,j>0;i++,j--)
    	{       
                    /*-TC- Ici, tu cherches à comparer des caractères et non des
                       chaînes de caractères. Il faut donc écrire 
                       res = (mot[i] == mot[j]) qui vaudra 1 lorsque les deux
                       caractères sont égaux */
    		res = strcmp(&mot[i],&mot[j]);
     
                    /*-TC- Avec la comparaison de caractères, la condition devient
                       if (res != 1). Pourquoi ne pas intégrer ce test à la condition 
                       de sortie de la boucle.*/
    		if(res!=0)
    		{
    			break;
    		}
    		else
    		{
    			ok++;
    		}
    	}
    	if(ok==l)
    		printf("PALINDROME\n");
    	else
    		printf("PAS PALINDROME\n");
     
            /* -TC- TRES IMPORTANT: main doit retourner 0 ou EXIT_SUCCESS
                i.e. return EXIT_SUCCESS*/
    }
    Tu devrais par ailleurs revoir la définition d'un palindrome, mais il me semble que ton programme est incomplet pour déterminer si une chaîne de caractères est un palindrome ou pas. La lecture de cette discussion peut t'être profitable: http://www.developpez.net/forums/sho...ght=palindrome

    Thierry

  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 hegros
    strrev puis strcmp ?
    Si ça existe, c'est pas standard! http://man.developpez.com ne trouve rien de ce nom là

    Thierry

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Ca existe strrev? (J'ai pas mes refs habituelles sous la main).

    Effectivement je pensais le retrouver dans string.h ou stdlib.h mais maintenant je le retrouve plus

  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
    Citation Envoyé par hegros
    Effectivement je pensais le retrouver dans string.h ou stdlib.h mais maintenant je le retrouve plus
    Mais c'est un bon exercice pour l'auteur du post d'implanter une telle fonction, et de s'en servir pour tester si la chaîne entrée par l'utilisateur est un palindrome.

    Thierry

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Le coup du palindrome, ça n'a pas déjà été demandé récemment ?

  12. #12
    Membre régulier Avatar de skulled
    Inscrit en
    Décembre 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 120
    Points : 120
    Points
    120
    Par défaut
    Merci d'avoir répondu, j'ai trouvé la réponse à ma question.
    Pour comparer 1 lettre d'une chaine de caractere, il suffit d'utiliser la fonction "strncmp" qui permet de comparer un nombre defini de caractere.
    ex: strncmp(&mot[i],&mot[j],1).
    Voici mon code Finale pour le palindrome:
    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>
    void main (void) {
            char mot[20];
            int i,j,l,ok,res;
     
    	printf("Tapez un mot:\n");
    	scanf("%s",mot);
    	l=strlen(mot);
    	ok=0;
    	for(i=0,j=l-1;i<l,j>=0;i++,j--)
    	{
    		res=strncmp(&mot[i],&mot[j],1);
    		if(res!=0)
    		{
    			break;
    		}
    		else
    		{
    			ok++;
    		}
    	}
    	if(ok==l)
    	{
    		printf("PALINDROME\n");
    	}
    	else
    	{
    		printf("PAS PALINDROME\n");
    	}
    }

  13. #13
    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 skulled
    Voici mon code Finale pour le palindrome:
    Inutilement complexe...

    Y'a pas besoin de strncmp()... La comparaison des caractères un à un en partant respectivement du début et de la fin suffit largement.

    On s'arrête dès qu'il y a une différence. Si on atteint la moité, c'est que c'est un palindrome.

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

Discussions similaires

  1. petit exo python
    Par Invité dans le forum Général Python
    Réponses: 1
    Dernier message: 05/05/2012, 18h10

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