Probleme urgent en C

Résolu/Fermé
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 - 4 juil. 2008 à 19:46
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 - 9 juil. 2008 à 00:41
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

8 réponses

mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
4 juil. 2008 à 20:50
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
4 juil. 2008 à 20:52
merci mamiemando

c tres gentil de ta part :)
je vais essayé ta version et vais t'informaer le resultat.
a+
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
5 juil. 2008 à 23:13
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 00:07
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
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
4 juil. 2008 à 20:22
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
4 juil. 2008 à 20:26
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
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
6 juil. 2008 à 01:58
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 08:22
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
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
6 juil. 2008 à 13:30
Ben oui, tu as essayé au moins ?
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
6 juil. 2008 à 13:42
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
6 juil. 2008 à 23:40
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
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
7 juil. 2008 à 08:34
merci mamiemando :)
ca bon ca marche
0
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
7 juil. 2008 à 10:03
Nickel, bonne continuation :-)
0
stroumpf Messages postés 289 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 1 mars 2009 2
7 juil. 2008 à 18:03
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
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
7 juil. 2008 à 21:02
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
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
mamiemando Messages postés 33545 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 février 2025 7 829
9 juil. 2008 à 00:41
Pas tout de suite mais bientôt, promis :-)
0