Partage
  • Partager sur Facebook
  • Partager sur Twitter

Correction exercice sur chaines de carracteres

fonction strcmp

Sujet résolu
    13 décembre 2006 à 22:34:12

    Bonjour!
    Comme proposé par M@téo, j' ai reprogrammé la fonction "strcmp" de la librairie <strin.h>.
    Pourriez vous me corriger et donnez votre opinion professionnelle.
    Merci
    Blackspine


    • Partager sur Facebook
    • Partager sur Twitter
      13 décembre 2006 à 22:54:13

      Salut ,

      Je sais pas mais tu n'as pas posté ton code , edite ton poste si tu veux de l'aide ^^
      En plus c'est la librairie <string.h>

      Merci .
      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2006 à 22:56:09

        je pense qu'il la poster mais le site a des petits problemes !!
        • Partager sur Facebook
        • Partager sur Twitter
          13 décembre 2006 à 22:57:58

          Salut,

          Ah bon c'est un nouveau Bug o_O je savais pas .... :-° .

          Merci .
          • Partager sur Facebook
          • Partager sur Twitter
            13 décembre 2006 à 23:00:43

            oui, sa fait 3 jours que je suis pas venus et j'ai remarquer sa ya 5 min !!
            • Partager sur Facebook
            • Partager sur Twitter
              13 décembre 2006 à 23:09:26

              Salut,

              Je pense que c'est vrai , j'ai été deconnecté du site 2 fois , a la troisième tentative ,
              j'ai pu me connecter mais le site était comme un zombie ! pas de CSS :lol: !!
              Ouups , je sort completement du sujet , restont C / C++ :D !!

              Merci.
              • Partager sur Facebook
              • Partager sur Twitter
                14 décembre 2006 à 17:43:30


                Désolé, je ne sais pas que faire. Pas moyen de copier mon code dans les balises "code c".
                • Partager sur Facebook
                • Partager sur Twitter
                  16 décembre 2006 à 4:42:49

                  Maintenant ça marche, alors tu peux poster ton code.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 décembre 2006 à 9:25:07



                    #include <stdio.h>
                    #include <stdlib.h>

                    long strcmp (const char* chaine1, const char* chaine2); // fonction qui compare les deux chaines de carracteres
                    long lngChaine (const char* chaine); // fonction qui calcule la longueur d' une chaine de carractere


                    int main(int argc, char *argv[])
                    {
                       
                        char chaine1 [] = "La stabilisation dynamique type Dynesys";
                        char chaine2 [] = "La stabilisation dynamique type Dynesys";
                        long t = 0; // variable qui prends en compte la valeur retournée par la fonction qui compare les chaines
                       
                        t = strcmp (chaine1, chaine2);
                       
                        if ( t == 1)
                        {
                             printf ("Et les chaines sont identiques!");
                        }
                        else
                        {
                            printf ("Mais les chaines sont differentes!!");
                        }
                        getchar()
                        return 0;
                    }
                    Merci à topus ceux qui travaillment et sacrifient leur temps pour que ce site tourne bien!!!
                    Voici le code...

                    long lngChaine (const char* chaine)
                    {
                         long i = 0;
                         char c = 0;
                         long lenghtChaine = 0;
                         
                         
                         do
                          {
                               c = chaine [i];
                               i++;
                          }
                          while (c != '\0');
                          lenghtChaine = (i-1);
                          return lenghtChaine;
                    }

                    long strcmp (const char* chaine1, const char* chaine2)
                    {
                       
                        long i = 0;
                        long t = 1;
                        char carractere1 = 0;
                        char carractere2 = 0;
                        long lenghtChaine1 = 0;
                        long lenghtChaine2 = 0
                         
                         lenghtChaine1 = lngChaine (chaine1);
                         printf ("La longueur de la chaine1 est %ld.\n\n", lenghtChaine1);
                         
                         lenghtChaine2 = lngChaine (chaine2);
                         printf ("La longueur de la chaine2 est %ld.\n\n", lenghtChaine2);
                         
                         
                            if (lenghtChaine1 == lenghtChaine2) //si les deux chaines ont la même longueur, on compare chaque carractère
                            {
                                for (i=0; i<lenghtChaine1; i++)
                                    {
                                          carractere1 = chaine1 [i];
                                          carractere2 = chaine2 [i];
                                         
                                          if (carractere1 != carractere2)
                                          {
                                   
                                              t=0;
                                             
                                          }
                                    }
                                           
                            }
                            else
                            {
                                t = 0;
                            }
                        return t;
                    }

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 décembre 2006 à 21:35:59

                      Salut :) ,

                      En fait, la fonction strcmp() effectue une comparaison l'ordre lexicographique ce qui revient au code ASCII ,
                      elle est sensible aussi a la casse "A" c'est différent de "a" , c'est pas le même code ASCII :p !!
                      donc il suffit de tester les caractères des deux chaînes un par un .
                      Pour ton code :
                      > C'est pas la peine de calculez la longueur des deux chaînes car c'est pas une obligation ,
                      il suffit de tester sur le '\0' qui est le code ASCII de 0 ! et ceci lors de la comparaison :lol: !
                      > Tester sur l'égalité des 2 caractères simplifie beaucoup la tâche !

                      Donc ce qu'il faut faire (du moins ce que je propose ^^ ):

                      * On commence a comparer caractère par caractère la chaîne S1 et S2 ,
                      et a chaque fois on teste si S1 est terminé ;) !
                      et on retourne le dernier index sur lequel pointe S1 moins le dernier index sur lequel pointe S2 :
                      Ce qui correspond a :
                      1) <0 : S1 < S2
                      2) =0 : S1 == S2
                      3) >0 : S1 > S2

                      Voici donc le code de la fonction :

                      * Version qui utilise les indices :

                      int strcmp(char *s1,char *s2)
                      {
                            int i;
                            for(i = 0; s1[i] == s2[i];i++)
                                if(s1[i] == '\0')
                                     return 0;
                            return s1[i] - s2[i];
                      }


                      * Version qui utilise les pointeurs :

                      int strcmp(char *s1,char *s2)
                      {
                           for( ; *s1 == *s2; s++,t++)
                                if(*s1 == '\0')
                                   return 0;
                           return *s1 - *s2;
                      }


                      Si tu ne comprends pas , n'hésite surtout pas pose des questions :D !

                      Merci.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 décembre 2006 à 21:46:17

                        En effet, il est inutile de comparer la longueur des deux chaînes avant. Autant comparer directement caractères-par caractères. Ensuite, dans ton code, plutôt que de mettre "t = 0", pourquoi ne pas mettre directement "return 0" ? ça évite une variable.

                        Pour les codes de medkarim, je te conseille d'étudier d'abord celui avec les indices. Parceque si tu as un peu de mal avec les pointeurs, le deuxième code va vite t'embrouiller. Il faut bien que tu te représentes le tableau dans la mémoire de l'ordinateur pour suivre le déroulement.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                          17 décembre 2006 à 23:32:27

                          Hum! j' avoue être un peu égaré dans les méandres de l' incompréhension....

                          1)

                          int strcmp(char *s1,char *s2)

                          Il s' agit donc d' une fonction qui renvoie un "integer", qui se nomme "strcmp" et dont les arguments sont deux chaines de carractères s1 et s2 (des tableaux en fait).

                          2)

                          int i;

                          On déclare une variable i de type "integer" qui permet de parcourir le tableau (lachaine de carractères).

                          3)

                          for(i = 0; s1[i] == s2[i];i++)


                          C' est ici que cela se complique. Nous avons une boucle qui parcourt de 0 à s1[i] == s2[i] et incrémente à chaque boucle de 1.
                          s1[i] == s2[i]: je ne comprends pas cette égalité et comment elle fonctionne? On compare le carractère situé à la position "i" dans chaque chaine de caractère je présume et si ce n' est pas égal, cela voudrait dire que la fonction s' arrête et renvoie une valeur booléenne qui indique que les deux chaines sont différentes?

                          4)

                          if(s1[i] == '\0')


                          Une condition: si le carractère est le carractère de fin de chaine, return0 et arrêt de la fonction

                          5)

                          return s1[i] - s2[i];


                          Donc à cette étape, on est sorti de la boucle et on compare les index des deux chaines et en fonction du résultat, nous pouvons déterminer leur égalité de longeur ou laquelle est plus grande ou plus petite que l' autre...Donc si la valeur de retour est 0, les chaines sont identiques et si la valeurs de retour est différente de 0 les chaines sont différentes?


                          Mon gros problème est (je pense)
                          for(i = 0; s1[i] == s2[i];i++)


                          Merci de votre aide

                          Blackspine
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 décembre 2006 à 23:36:17

                            en ce qui concerne compter le nombre de caractère sa peut être utile, dans le sens ou dans le cas ou il y'aura deux grande phrase à comparé si le nombre de caractère n'est pas identique la phrase ne peut pas être la même...Disons que même si elle n'est pas obligatoire s'est pas grave de la mettre ^^
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 décembre 2006 à 10:43:17

                              Citation : Blackspine

                              5)


                              return s1[i] - s2[i];



                              Donc à cette étape, on est sorti de la boucle et on compare les index des deux chaines et en fonction du résultat, nous pouvons déterminer leur égalité de longeur ou laquelle est plus grande ou plus petite que l' autre...Donc si la valeur de retour est 0, les chaines sont identiques et si la valeurs de retour est différente de 0 les chaines sont différentes?



                              Perso je trouve ça un peu louche :-° On soustrait un caractère à un autre...

                              Je pense qu'un return strlen(s1) - strlen(s2); serait plus logique m'enfin ce n'est que mon avis et je me trompe peut-être. ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 décembre 2006 à 22:23:32

                                Salut :) ,

                                Le plus simple pour comprendre c'est de le tester le programme a la main :
                                Se mettre a la place de ton ordi pour comprendre :p !

                                Pour tes questions :
                                for(i = 0; s1[i] == s2[i];i++)

                                Voici comment fonctionne la boucle for :
                                1) L'initialisation n'est pas importante ( mais dans notre cas c'est : i = 0).
                                2) La boucle for effectue le test qui est obligatoire (ce qui est normal)!
                                3) L'incrémentation (dans notre cas i++) .
                                4) Effectue le test...
                                etc....
                                Donc ça revient a une boucle while en quelque sorte ;) !
                                Bref c'est le fonctionnement de la boucle for qui nous intéresse !
                                Comme j'ai déjà dit , le principe repose sur le Code ASCII :

                                Image utilisateur

                                On suppose que S1 = BONJOUR , S2 = SALUT .
                                Dans cet exemple le programme retourne : -17 donc < 0 : S1 < S2.
                                Comment j'ai fait o_O ? :
                                Le programme commence par initialiser i=0, et teste : S1[i]== S2[i] ? :
                                Ce qui veut dire 'B' == 'S' ? (le premier chiffre de chaque mot) :
                                Plus clairement le code ASCII de 'B' et 'S' : '66' == '83' ? La réponse est non :lol: !!
                                Donc le programme retourne S1[i] - s2[i] : '66' - '83' = -17 :) !
                                La condition que j'ai mis :
                                if(s1[i] == '\0')

                                C'est pour tester si S1 est terminé , donc plus courte que S2 . Le traitement reste le même !

                                J'espère que c'est plus clair maintenant .
                                Voic un lien pour les codes ASCII : http://sebsauvage.net/comprendre/ascii/

                                Merci.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 décembre 2006 à 7:24:48

                                  Merci bcp!
                                  En ce qui me concerne j' ai résolu mes "angoisses" :p.
                                  J' espère que ce "post" aidera d' autres Zéros néophytes....
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 décembre 2006 à 15:39:37

                                    Citation : medkarim

                                    Donc le programme retourne S1[i] - s2[i] : '66' - '83' = -17 :) !



                                    Hum c'est bien ce que je pensais, c'est louche ;)

                                    Qui te dit que c'est la table ASCII qui est utilisée par la machine de l'utilisateur ? Il est assuré, certes, que les caractères nombres ('1', '2', '3'...) se suivent, mais pour ce qui est des lettres...

                                    M'enfin ce n'est qu'un problème d'algorithme, pas très conséquent.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 décembre 2006 à 20:12:57

                                      Je suis apostrophé! En effet, je pensais que lorsque l' on parlait de carractères pour un pc, on parlait inéluctablement de code Ascii.
                                      Visiblmement il existe d' autres tables de références?
                                      Ceci dit, je ne voie pas ce que cela change au code. En effet, que 'A' valle 4, 87, 63 ou 654, quelle que soit la table, une lettre restera un chiffre pour le pc et donc quelle que soit la table, il y aura toujours une comparaison sur les mêmes références.

                                      Blackspine.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 décembre 2006 à 22:36:35

                                        Citation : Blackspine

                                        Je suis apostrophé! En effet, je pensais que lorsque l' on parlait de carractères pour un pc, on parlait inéluctablement de code Ascii.
                                        Visiblmement il existe d' autres tables de références?
                                        Ceci dit, je ne voie pas ce que cela change au code. En effet, que 'A' valle 4, 87, 63 ou 654, quelle que soit la table, une lettre restera un chiffre pour le pc et donc quelle que soit la table, il y aura toujours une comparaison sur les mêmes références.

                                        Blackspine.



                                        Il en existe d'autres tels que UTF-8 il me semble.

                                        Cela pose en fait un problème dans le cas où les lettres ne se suivent pas dans l'ordre.

                                        En effet, soit x un nombre quelconque, si 'a' < 'b', 'a' - 'b' = -x, or, si 'a' > 'b', 'a' - 'b' = x, ce qui fausse tout.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 décembre 2006 à 22:47:23

                                          En théorie, oui. Mais en pratique, dans ce code, la seule chose qui est importante, c' est l'égalité! Dès que deux lettres sont différentes, que leur addition ou soustraction soit différente m' importe peu puisque la réponse est que les chaines sont différentes???
                                          Enfin, je pense o_O
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            20 décembre 2006 à 23:04:46

                                            Citation : Blackspine

                                            En théorie, oui. Mais en pratique, dans ce code, la seule chose qui est importante, c' est l'égalité! Dès que deux lettres sont différentes, que leur addition ou soustraction soit différente m' importe peu puisque la réponse est que les chaines sont différentes???
                                            Enfin, je pense o_O



                                            Ben en fait ça change tout quant au return.

                                            Je propose, pour les raisons énoncées plus haut, d'écrire :

                                            return strlen(s1) – strlen(s2);


                                            au lieu de

                                            return s1[i] – s2[i];


                                            En effet, la deuxième méthode est buggée. Le but est il me semble de retourner une valeur positive si s1 est > s2 et négative si s2 est < s1. Dans le cas contraire, j'aimerais bien une explication du terme 'lexicographie' (déjà rencontré dans le K&R mais rien pigé) qui reste pour ma part très obscur. :-°
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Correction exercice sur chaines de carracteres

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown