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 :

egalité de deux chaînes de caractères à n éléments près


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Par défaut egalité de deux chaînes de caractères à n éléments près
    Salut tous,

    L'idée est simple : mettre au point une fonction qui teste si les n premiers caractères de deux chaînes sont égales, renvoie 1 le cas échéant, 0 sinon.

    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
     
    int egal_n_ch(int n, char ch1[], char ch2[])
    {
        int rtn;//la valeur retournée
        int i=1;// compteur
        if(n>strlen(ch1) || n>strlen(ch2)) rtn=0; // cas où l'on dépasse les tailles des chaînes
        else
        {
            if(ch1[0]==ch2[0])
            {
                while(ch1[i]==ch2[i] && i<=n)
                {
                  i++;
                }
     
                if(i==n) rtn=1; // on a égalité des n premiers caractères !
            }
            else rtn=0;
        }
     
        return rtn;
    }
     
    int main()
    {
     
        char  ch1[]="achille";
        char  ch2[]="achillus";
        printf("%d",egal_n_ch(4,ch1,ch2));
     
        return 0;
    }
    A ma surprise, le résultat est invariablement 16384, et donc ? Voilà, si vous comprenez quelque chose, moi je sèche...Merci tous.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 866
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bounadalvidal Voir le message
    Salut tous,

    L'idée est simple : mettre au point une fonction qui teste si les n premiers caractères de deux chaînes sont égales, renvoie 1 le cas échéant, 0 sinon.

    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
     
    int egal_n_ch(int n, char ch1[], char ch2[])
    {
        int rtn;//la valeur retournée
        int i=1;// compteur
        if(n>strlen(ch1) || n>strlen(ch2)) rtn=0; // cas où l'on dépasse les tailles des chaînes
        else
        {
            if(ch1[0]==ch2[0])
            {
                while(ch1[i]==ch2[i] && i<=n)
                {
                  i++;
                }
     
                if(i==n) rtn=1; // on a égalité des n premiers caractères !
            }
            else rtn=0;
        }
     
        return rtn;
    }
     
    int main()
    {
     
        char  ch1[]="achille";
        char  ch2[]="achillus";
        printf("%d",egal_n_ch(4,ch1,ch2));
     
        return 0;
    }
    A ma surprise, le résultat est invariablement 16384, et donc ? Voilà, si vous comprenez quelque chose, moi je sèche...Merci tous.
    C'est pas parce que tu débutes qu'il t'est interdit de réfléchir. Le printf() est un outil vachement utile. Il n'y a pas que les forum quoi...

    Tu testes i<=n donc quand i arrive à 4 ben il passe à 5. Ensuite, comme i différent de n, ben rtn n'est pas rempli à 1. Et comme il n'a pas été initialisé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 173
    Billets dans le blog
    155
    Par défaut
    Bonjour,

    Pour ce code là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int i=1;// compteur
    if(ch1[0]==ch2[0])
            {
                while(ch1[i]==ch2[i] && i<=n)
                {
                  i++;
                }
     
                if(i==n) rtn=1; // on a égalité des n premiers caractères !
            }
    Pourquoi ne pas faire simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int i=0;// compteur
     
                while(ch1[i]==ch2[i] && i<=n)
                {
                  i++;
                }
     
                if(i==n) rtn=1; // on a égalité des n premiers caractères !
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    strncmp() ne te convient pas ?

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 866
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    strncmp() ne te convient pas ?
    Arf, à mon avis il s'agit d'un TP...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Moi, je renforcerai ce qu'a dit Sev@r
    Ensuite, comme i différent de n,
    ne jamais tester avec '==' dans ce genre de test de compteur, mais utiliser '<=' ou '>='.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 866
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    Moi, je renforcerai ce qu'a dit Sev@r
    ne jamais tester avec '==' dans ce genre de test de compteur, mais utiliser '<=' ou '>='.
    Arf, j'aime pas quand on dit "jamais" ou "toujours" car ça induit une certaine notion d'éternité qui s'adapte mal à la notion d'évolutivité.

    Déjà, faut savoir que les tests plus-petit/plus-grand sont plus longs en temps machine que des tests d'égalité/inégalité pure. Et si on rajoute à ces tests un "ou égal" alors ça devient super-long.

    Donc je ne suis pas contre de mettre un <= quand il faut... mais je préfère éviter de systématiser la chose et ne le mettre que quand c'est vraiment nécessaire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour Sve@r,
    Tout à fait d'accord sur le principe, ni jamais, ni toujours.
    Dans le cas présent, il n'a apparu que l'OP avait besoin de méthodes de base, qu'il sera bien temps de moduler quand il aura bien compris ce qui se passe.
    Concernant l'optimisation du code et des tests en particulier, vous savez que vous prêchez un converti.

    PS Je viens de voir que l'OP a eu une note négative. Je ne vois vraiment pas ce qu'il a fait de mal. Il a bien compris que ce forum répond aux questions, donc il en profite. Son code n'est pas très bon, d'accord, mais est-ce une raison pour lui mettre une note négative à lui? Son professeur le notera sur 20 et assumera sa notation. A première vue, il n'y a même pas de faute d'orthographe.

    [Suite]
    J'ai fait des tests de vitesse comparatifs == ; != ; > ; >= .
    Les différences sont de l'ordre de 1 pour 100, donc pas très significatifs.
    Dernière modification par Invité ; 12/11/2010 à 13h09.

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Arf, à mon avis il s'agit d'un TP...
    Non monsieur, ça l'est pas ! Je me fais de l'exercice, question d'accélérer l'apprentissage. Vous ne trouvez pas utile de répondre, ne le faîtes pas ! si je rejoins ce forum c'est bien pour son atmosphère accueillante...

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 866
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bounadalvidal Voir le message
    Non monsieur, ça l'est pas ! Je me fais de l'exercice, question d'accélérer l'apprentissage.
    Ok, encore un boulet qui ne sait pas lire une phrase. TP signifie "Travail Personnel" (ou "Travail Pratique"). Que ce travail soit imposé par un prof ou imposé par toi-même ne change pas sa nature de TP.
    Matafan te demandait si strncmp() ne te convenait pas et je lui ai répondu que strncmp() ne te conviendrait probablement pas parce qu'à mon avis il s'agissait d'un travail personnel. Venir dire "non ce n'est pas un travail personnel c'est un travail personnel" c'est un peu neuneu tu ne trouves pas ???

    Citation Envoyé par bounadalvidal Voir le message
    Vous ne trouvez pas utile de répondre, ne le faîtes pas !
    Et en plus t'as même pas vu que j'avais répondu en donnant la cause exacte de ton bug ?

    Citation Envoyé par Pierre Dolez Voir le message
    PS Je viens de voir que l'OP a eu une note négative. Je ne vois vraiment pas ce qu'il a fait de mal
    Ben voilà. Maintenant tu vois. Non seulement il vient poser des questions très très con mais en plus il se vexe quand on le lui fait remarquer. Je sais bien qu'un forum est là pour que ceux qui savent répondent à ceux qui savent pas (ce que j'ai fait avec la plus grande précision possible) mais ça n'empêche pas aussi de faire remarquer quand une question est nulle...

    Citation Envoyé par Pierre Dolez Voir le message
    J'ai fait des tests de vitesse comparatifs == ; != ; > ; >= .
    Les différences sont de l'ordre de 1 pour 100, donc pas très significatifs.
    Arf, on a des ordis devenus trop puissants. Comme quoi, les certitudes...
    Mais c'est sympa de t'être intéressé assez pour faire des tests
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Invité
    Invité(e)
    Par défaut
    Arf, on a des ordis devenus trop puissants. Comme quoi, les certitudes...
    Ce n'est pas une question de puissance, puisqu'il ne s'agit pas de valeur absolue, mais de mesure relative.

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

Discussions similaires

  1. Concaténer deux chaînes de caractères
    Par fafabzh6 dans le forum R
    Réponses: 2
    Dernier message: 21/03/2008, 22h03
  2. Réponses: 4
    Dernier message: 07/06/2007, 23h35
  3. Comparer deux chaînes de caractère
    Par natie_49 dans le forum Langage
    Réponses: 2
    Dernier message: 28/03/2007, 12h53
  4. Réponses: 3
    Dernier message: 16/03/2007, 23h22
  5. Comparer deux chaînes de caractères
    Par camoa dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 10/12/2006, 15h30

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