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 :

recherche dichotomique mot fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut recherche dichotomique mot fichier
    Bonjour a tous,

    voila j'ai un soucis, j'ai un fichier rempli comme suit :

    avec
    de
    du
    la
    le
    les
    pour

    les mots sont tous sur 10 caractères
    ensuite je dois entrer un mot au clavier et vérifier par recherche dichotomique s'il se trouve dans le fichier, le problème est que il m'affiche tous le temps que le mot ne s'y trouve pas, je pense a un problème de taille entrer le buffer contenant les mots et le mot entrer au clavier ??

    enfin voici toujours mon code, s'il qq'un a une idée ? elle est la bien venue ^^
    merci

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <fcntl.h>
     
    typedef enum BOOLEAN{FALSE,TRUE} BOOL;  //"creation" du type booleen
    typedef char string[11]; //defini le type string ==> plus a utiliser ^^
     
     
    /* fonction de recherche dichotomique qui renvoie un indice où se trouve la chaine "m" 
    si elle est dans le tableau "tab[]" et -1 si elle n'y est pas */
    int rechercheDicho(string tab[7],int nbMot, string m)
    {
     
     	 /* déclaration des variables locales à la fonction */
      	BOOL trouve;  //vaut faux tant que la chaine "m" n'aura pas été trouvée
      	int deb;  //indice de début
      	int fin;  //indice de fin
      	int milieu;  //indice de "milieu"
     
     	 /* initialisation de ces variables avant la boucle de recherche */
     	 trouve = FALSE;  //la chainen'a pas encore été trouvée
      	deb = 0;  //intervalle de recherche compris entre 0...
      	fin = nbMot;  //...et nbMot
     
     	 /* boucle de recherche */
      	while(trouve == FALSE && ((fin - deb) > 1))
      	{
     
       		 milieu = (deb + fin)/2;  //on détermine l'indice de milieu
     
        		if (strncmp(tab[milieu],m,11) == 0) trouve = TRUE;
       		else trouve = FALSE;  //on regarde si la chaine recherchée est à cet indice
     
       		 if (strncmp(tab[milieu], m,11) > 0) fin = milieu;  //si la chaine qui est à la case "milieu" est supérieure à la chaine recherchée, l'indice de fin "fin" devient l'indice  de milieu, ainsi l'intervalle de recherche est restreint lors du prochain tour de boucle
        		else deb = milieu;  //sinon l'indice de début devient l'indice de milieu et l'intervalle est de la même façon restreint
      	}
     
      	/* test conditionnant la chaine que la fonction va renvoyer */
      	if (strncmp(tab[milieu],m,11) == 0) return(deb);  //si on a trouvé la bonne chaine, on retourne l'indice
     	 else return(-1);  //sinon on retourne -1
     
    	}
     
     
    int main (int argc, char * argv[])
    {
    	char fichier[] = "MotsVides.txt";
    	string buffer[7]; // 7 mots dans le fichier et chacun fais 11 caracteres (avec \0) 
    	string motTexte;
    	int FD;
    	printf ("\n\tRecherche d'un mot vide dans le fichier : \n\n");
    	FD = open (fichier,O_RDONLY);
    	if (FD == -1) 
    	{
    		fprintf(stderr, "Erreur d'ouverture: %s\n", strerror(errno));	
    	}
    	else
    	{
    		int a,i=0;
    		while (i < 7) 
    		{			
    			a=read (FD,motTexte,11);
    			printf ("%s",motTexte);
    			strcpy(buffer[i],motTexte);
    			printf ("buffer[i] = %s",buffer[i]);
    			i++;
    		}	
     
    		string mot;
    		printf ("Veuillez entrer un mot vide : ");
    		scanf("%11s",mot);
    		printf ("\nmot = %s",mot);
    		//printf ("\ntaille buffer[0] = %d",strlen(buffer[0]));
    		//printf("\ntaille mot = %d",strlen(mot));
    		int res = rechercheDicho(buffer,7,mot);
    		if (res == -1) printf("\nLe mot n'est pas dans le fichier...\n");
    		else printf ("\nLe mot est dans le fichier...\n");		
     
    	}
    	close(FD);
     
    }

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Il me semble, a premiere vue, que cette ligne ne fait pas ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef char string[11]; //defini le type string ==> plus a utiliser ^^
    Ici, tu semble vouloir definir un typedef de String comme etant un char[11].
    Or, tu defini String[11] comme etant un char.

    Essais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef char[11] string; //defini le type string ==> plus a utiliser ^^

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    SofEvans :
    Non, la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char string[11]; //defini le type string ==> plus a utiliser ^^
    est correcte pour définir le type string comme un tableau de 11 char.

    Le typedef, utilise la même syntaxe que la définition des variables, sauf qu'au lieu d'obtenir l'identificateur d'une variable, on a celui d'un type.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut


    Va falloir que je dise au prof de C qu'il faut qu'il modifie son poly ><

  5. #5
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Ton erreur vient que ton read lit aussi les caractères de fin de ligne (\n ou \r) et que ceux-ci comptent dans la comparaison à ton mot recherché, qui lui, n'en contient pas.

    Les solutions sont multiples :
    Par exemple tu peux enlèves les caractères de fin de ligne de tes mots contenus dans ton fichier après lecture, ton programme marchera. Ou alors tu peux rajouter le caractère fin de ligne à ton mot recherché...

    Si tu as un soucis n'hésites pas

Discussions similaires

  1. Recherche dichotomique d'une ligne dans un fichier
    Par yarf dans le forum Général Java
    Réponses: 5
    Dernier message: 31/03/2008, 15h37
  2. Rechercher un mot ou une phrase dans un fichier
    Par cellendhyll dans le forum Général Python
    Réponses: 3
    Dernier message: 12/06/2007, 11h52
  3. Recherche de mot dans un fichier
    Par Bennybear dans le forum C++
    Réponses: 6
    Dernier message: 23/03/2007, 20h12
  4. Module de recherche de mots dans plusieurs fichiers
    Par hat_et_m dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/09/2006, 20h09
  5. Réponses: 10
    Dernier message: 14/04/2006, 09h23

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