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);
} |
Partager