Bonjour à tous,

Ma fonction de recherche dichotomique ne fonctionne pas et je ne trouve pas l'origine du mal. Le dico est trié correctement avec qsort() au préalable (merci E.D.). Pourriez-vous m'éclairer ? Merci d'avance.

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
#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
/*  
    Fonction de recherche dichotomique.
*/
 
int dichotomie(char dico[][LONG_MOT], char mot[], int nbMots)
{
    int i = 0;   /* Indice de debut.  */
    int j = nbMots;   /* Indice de fin.  */
    int k = 0;   /*  Indice de milieu.  */
    int trouve = 0;   /*  Boleenne (faux si pas trouve.)  */  
 
    while (!trouve && ((j - i) > 1) )
    {				
         k = (i + j) / 2;
         if (strcmp (dico[k], mot) == 0) 
             trouve = 1;
 
         if (strcmp (dico[k], mot) > 0)
	         j = k ;
         else
	         i = k ;
    }
 
    if (dico[i] == mot)
        return (i);  
    else
        return (-1);  
}
 
int main (int argc, char *argv[])
{
    FILE *fiDico = fopen ("dico.dat", "r");
    ret = EXIT_SUCCESS ;
    int nbMots = 0;   /*  Valeur pour le nombre de mots.  */ 
    int resultat;   /*  Retour de la fonction.  */
    char ligne[LONG_MOT] = " ";   /*  Stockage des lignes des fichiers.  */
    char dico[MAX_MOTS][LONG_MOT] = { " " }; /* Dico.  */
    char mot[26] = " " ;   /*  Mot a rechercher.  */
 
    if (fiDico != NULL)
    {
        /*  Lecture du fichier et stokage dans le tableau "dico".  */
        while (nbMots < MAX_MOTS && fgets (ligne, LONG_MOT, fiDico) != NULL)
            {
                strcpy (dico[nbMots], ligne);
                nbMots++;
            }
        fclose (fiDico);
        fiDico = NULL;
 
        fputs ("\nTapez  le mot a rechercher dans le dictionnaire : ", stdout);
        fflush (stdout);
        fgets (mot, sizeof mot, stdin);    
        if (mot[strlen(mot) - 1]  == '\n')
            mot[strlen(mot) - 1] = '\0';  
 
        /* Recherche  dans dico.  */   
        resultat = dichotomie (dico, mot, nbMots); 
        if (resultat != -1)
        {
	    fprintf (stdout, "Ce mot se trouve déjà en position %d du dico.\n", resultat);
        }
        else
        {
            fprintf (stdout, "Ce mot n'est pas dans le dictionnaire!\n");    
        }
    }
    else
    {
        printf ("Clash de \"dico.dat\".");
        ret = EXIT_FAILURE;
    }
 
    fprintf (stdout, "Appuyez sur une touche...");
    getch ();
    return ret;
}