Probleme urgent en C

Résolu
stroumpf Messages postés 292 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
jai un probleme , c'est que j'ai des mots stockésdans une table de hacahge, et des séquences stockés dans une liste chainées.
Le probleme c'est que trouve pas une idée pour faire la comparaioson de cahque mot et chaque séquence : c'est à dire un mots est inclus dans une séquence de mots : le dernier mot de la sequence egale au mot en question).

merci d'avance
je compte sur vous
Configuration: Windows XP
Internet Explorer 7.0

8 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Ce n'est pas très dur en utilisant conjointement strstr et strlen, ou strtok et strcmp. Une façon de faire :
    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    
    int chercher_mot(const char *phrase,const char *mot){
        int last;
        const size_t size = strlen(mot);
        char *find = strstr(phrase,mot);
        char *p;
        while(find){
            // le mot a été trouvé, mais est ce le dernier mot ?
            if(strlen(find) == size) return 1;
            else{ // le mot est peut être en dernière position mais suivi de caractères autre que des mots (ponctuation...)
                last = 1; // 1 si mot est bien le dernier dans la séquence, 0 sinon
                for(p = &(find[size]);*p != '\0';++p){
                    if (isalpha(*p)){ // on a trouvé un caractère alphanumérique derrière donc ça ne va pas
                        last = 0;
                        break;
                    }
                }
                // le mot n'est pas suivi de caractère alphanumérique donc c'est bon
                if (last) return 1;
            }
            find = strstr(&(find[1]),mot);
        }
        return 0;
    }
    
    int main(){
        const char *phrase = "bonjour les amis";
        const char *mot = "amis";
        if (chercher_mot(phrase,mot)){
            printf("le mot [%s] a été trouvé en dernière position de la phrase [%s]\n",mot,phrase);
        }else{
            printf("le mot [%s] n'a pas été trouvé en dernière position de [%s]\n",mot,phrase);
        }
        return 0;
    }

    Bonne chance
    1
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci mamiemando

      c tres gentil de ta part :)
      je vais essayé ta version et vais t'informaer le resultat.
      a+
      0
    2. stroumpf Messages postés 292 Statut Membre 2
       
      Bonsoir à tous , je trouve un probleme au niveau de l'appele de cette fonction:
      vus avez une idéée:
      ya un warning
      void elaguer2seq(Liste *L, Liste **TableHash)
      {
        Liste *p;
        Liste *q;
        char *mot;
        int i=0;
        int a;
        printf(" seq : %s\n",L->mot);
      //printf("TableHash : %s\n",TableHash[1]->mot);
      for ( i=0;i<TAILLEHASH;i++)
      {
          for(p=L;p!=NULL;p=p->suivant){
       // if(TableHash[i] != NULL)
         //printf("TableHash : %s\n",TableHash[i]->mot);
         if  (chercher_mot(TableHash[i]->mot,p->mot)==0)
         printf("%s","aaaaaa");
            
            
            
      }
      }
      0
    3. stroumpf Messages postés 292 Statut Membre 2
       
      merci Mamiemando, mais est ceque tu peux la simplifier un peux , car elle semble un peu complexe:
      juste le teste sile moty est le dernier des mots constituant les séquences des mots.
      merci
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Si c'est en C++

    Si tes mots sont stockés dans des std::string ce n'est pas très compliqué, il suffit de faire un find du mot à l'intérieur de la séquence de mot. Pour stocker tes mots tu as intérêt à utiliser des std::set, et pour ta liste de séquence une std::list. Toutes ces classes font parties de la STL et permettent de résoudre facilement ton problème.

    Pour plus de détails, un peu de lecture :
    http://www.commentcamarche.net/faq/sujet 11255 introduction a la stl en c standard template library

    Si c'est en C

    C'est plus compliqué mais tu peux utiliser des fonctions comme strstr.
    http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strstr.3.html
    Sans le code difficile d'en dire plus

    Bonne chance
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci mamiemando d'avoir regardé mon post :
      je code en C
      mais faut s'aasurer que le dernier mot de la sequenec est le meme que le mot en questio
      exple :
      mot : amis
      sequence : bonjour les amis.
      tu vois?
      merci
      0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Désolé mais là avec juste un code partiel c'est pas facile de rentrer dedans. La solution que je t'ai donné marche donc bon...
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      ok,
      donc là dans ce code, si le mot est inclus dans la séquence des mots et il bien le dernier, le fonction retourne la valeur 1, sinon elle retourne 0?
      c'ets juste?
      merci
      0
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Ben oui, tu as essayé au moins ?
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      ca retourne tjrs 1 quelque soit la position, mais moi je veux quil verifie les 2conditions à la fois : inclusion et dernier element.
      merci
      j'attends ta reponse.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Ben pas chez moi regarde...

    Je corrige l'initialisation de phrase :
    const char *phrase = "bonjour les amis ca va ?";

    Je recompile, et j'obtiens :
    le mot [amis] n'a pas été trouvé en dernière position de [bonjour les amis ca va ?]

    amis, qui est inclu dans la phrase n'est pas en dernière position, ce qui correspond bien à ce qu'on attendait (ou à ce que j'ai compris du sujet).

    Bonne chance
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      merci mamiemando :)
      ca bon ca marche
      0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Nickel, bonne continuation :-)
    0
    1. stroumpf Messages postés 292 Statut Membre 2
       
      Bonjour,
      jai developpé une fonction en C et qui bug: ua pas mal d'erreurs!!! 4 erreurs.
      cettefonction prend en entree un mot et une liste chainée et doit verifier que le mot en entréé verifie la condition d'inclusion pour tous les sequence des mots qui sont dans une liste chainée.
      la fonction de verification marche nikel pour 1 mot et 1 seq
      mais quand je la fait tourner pour tte une liste cacause un pb.
      merci
      je compte sur vous.

      int chercher_mot(const char *phrase,const char *mot){
          int last;
          const size_t size = strlen(mot);
          char *find = strstr(phrase,mot);
          char *p;
          
          while(find){
              // le mot a été trouvé, mais est ce le dernier mot ?
              if(strlen(find) == size) return 1;
              else{ // le mot est peut être en dernière position mais suivi de caractères autre que des mots (ponctuation...)
                  last = 1; // 1 si mot est bien le dernier dans la séquence, 0 sinon
                  for(p = &(find[size]);*p != '\0';++p){
                      if (isalpha(*p)){ // on a trouvé un caractère alphanumérique derrière donc ça ne va pas
                          last = 0;
                          break;
                      }
                  }
                  // le mot n'est pas suivi de caractère alphanumérique donc c'est bon
                  if (last) return 1;
              }
              find = strstr(&(find[1]),mot);
          }
          return 0;
      }
      
      
      
      
      int verifCondition2seq(char *mot, Liste *seq)
      {
          if(seq==NULL)
          return 0;
          Liste tmp = *seq;
          while(tmp != NULL)
          {
                    if(chercher_mot(tmp->mot, mot)
                    return 1;
                    printf ("ok");
                    tmp=tmp->suivant;
           }  
           return 0;
      } 
      0
  8. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Il me faut le code complet. Idéalement ouvre un nouveau sujet puisqu'on a résolu celui-là (sinon je serai la seule personne à lire ce fil de discussion).
    0
    1. stroumpf
       
      bonsoir MAmiemando,
      Donc jai fait coome tu ma dit, j'ai ouvert une autyre disscussion.*
      SVP jette un coup d'oeil la dessus.*
      merci
      j'attends ta reponse.
      A+
      0
  9. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Pas tout de suite mais bientôt, promis :-)
    0