begin process at 2012 05 29 07:37:41
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Hachage fermé problème de lecture


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Hachage fermé problème de lecture

mardi 25 novembre 2003 à 23:19:24 | Hachage fermé problème de lecture

mcflysupersonic


Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.
Voilà j'ai un projet à faire en C sur les tables de hachage. Je crois avoir bien compris le principe malheureusement je n'arrive pas à créer un dictionnaire à partir d'un fichier texte.
Il semble que j'ai un problème dans ma fonction Ajouter ou bien dans Lecture. Il semble que seul le dernier mot du fichier que je lis soit ajouter dans ma table. Pourtant à l'aide de printf je vois que l'ajout de tout les mots c'est bien effectuer. Si quelqu'un pouvait m'aider cela serait fort aimable. Je joint mon source:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>

#define B 256
#define N 10000
#define LIBRE 2 /* a été libre par suppression */
#define OQP 1
#define VIDE 0 /* n'a jamais été occupée */
#define MAX 10

typedef struct {
char etat; /* occupée ou libre ou vide */
char * mot;
int occurrence;
int position[MAX]; /* position du mot dans la phrase */
}Case;
typedef Case Dictionnaire[N];

/* Hachage linéaire */
/* Fonction non utilisée */
int h(char * mot)
{
int h = 0;
int i;

for (i = 0; mot[i] != '\0'; i++)
{
h = h*256 + (unsigned int) mot[i];
if (h >= B)
h %= B;
}
return h;
}

/* Fonction de hachage très simple sur la premiere lettre du mot */
int hbis(char * mot)
{
return (mot[0]-'a');
}

void ViderDictionnaire(Dictionnaire a)
{
int i;

for(i=0;i<=B-1;i++)
{
a[i].etat=VIDE;
a[i].mot='\0';
}
}

int Position(char * mot,Dictionnaire a)
{
int i=0;

while(i<B && a[h(mot)].mot!=mot && a[h(mot)].etat!=VIDE &&
a[h(mot)].etat==OQP)
i=i+1;
return i;
}

int Positionne(char * mot,Dictionnaire a)
{
int hi,dernier;

hi=hbis(mot);
dernier= (hi + B-1) % B ;

while(hi!=dernier && a[hi].mot!=mot && a[hi].etat!=VIDE &&
a[hi].etat!=LIBRE)
hi = (hi + 1) % B ;
return hi;
}

int Positiona(char * mot,Dictionnaire a)
{
int hi,dernier;

hi=hbis(mot);
dernier= (hi + B-1) % B ;
while(hi!=dernier && a[hi].etat==OQP /* (a[hi].etat!=VIDE ||
a[hi].etat!=LIBRE) */ )
hi = (hi + 1) % B ;
return hi;
}


/* Renvois 1 si le mot est deja dans le dico */
int Element(char * mot,Dictionnaire a)
{
if(a[Positionne(mot,a)].mot==mot)
return 1;
else return 0;
}

void Enlever(char * mot,Dictionnaire a)
{
int i;

i=Positionne(mot,a);
if(a[i].mot==mot)
{
a[i].etat=LIBRE;
a[i].mot='\0';
printf("on a mis libre pour a[%d]=%s\n",i,a[i].mot);
}
}

void Ajouter(char * mot,Dictionnaire a)
{
int i;
int position_du_mot;

if(Element(mot,a)==0)
{
i=Positiona(mot,a);
if(a[i].etat!=OQP /* a[i].etat==VIDE || a[i].etat==LIBRE) */ )
{
a[i].mot=mot; printf("'%s' ajouté a la position %d\t",mot,i);
a[i].etat=OQP;
a[i].occurrence=1;
}
else if(a[i].mot!=mot)
printf("erreur table pleine\n");
printf("a[%d]=%s\n",i,a[i].mot);
}
else /* Le mot est déjà dans la table on augmente juste le nbr
d'occurrences */
{
position_du_mot=Positionne(mot,a);
printf("'%s' est déjà présent %d fois à la position
%d\n",mot,a[position_du_mot].occurrence,position_du_mot);
a[position_du_mot].occurrence++;
}
}


int estAlpha (int x)
{
if ( isalpha(x) || x == 'é' || x == 'è' || x == 'ê' || x == 'ç' ||
x == 'à'
|| x == 'â' || x == 'ï' || x == 'ô' || x == 'ù' || x == 'û' )

return 1;
else return 0;
}

void AfficheDictionnaire(Dictionnaire a)
{
int i;
printf(" ---------------------\n");
printf("|Affichage de la table|\n
---------------------\nIndice\tMot\t\tOccurrences\n");
for(i=0;i<=B;i++)
{
if(a[i].etat==OQP)
printf("i=%d\tmot=%s\toccurrences=%d\n",i,a[i].mot,a[i].occurrence);
}
}

int Lecture (FILE * file,Dictionnaire a)
{
char buf[50];
int c;
int i, cour=0;
int tmp;

rewind(file);printf("->Début de la lecture\n");

while(feof(file) == 0)
{
i=0;

c=fgetc(file);
while(c=='\r' || c=='\n'|| c=='\t' || estAlpha(c) == 0)
{
c=fgetc(file);
cour++;
} ungetc(c, file); cour--;

c= fgetc(file); cour++;
while( estAlpha(c) == 1)
{
c = tolower(c);
buf[i] = (char)c;
i++;
c= fgetc(file);
cour++;
}
buf[i] = '\0';
tmp = cour - (strlen(buf)-1);

Ajouter(buf,a);

ungetc(c, file); cour--;
printf("%c", ungetc(c, file));

}
printf("->Fin de la fonction lecture\n\n");
AfficheDictionnaire(a);
fclose(file);
return 1;
}


void usage(const char *nom)
{
fprintf(stderr,"utilisation:\n");
fprintf(stderr,"%s,nomdufichiertexte\n",nom);
fprintf(stderr,"lit le texte contenu dans le fichier %s\n",nom);
}

int Prelecture(int argc, char * argv[],FILE * file,Dictionnaire a)
{
if(argc!=2)
{
usage(argv[0]);
printf("sort de usage\n");
return EXIT_FAILURE;
}
else
{
fprintf(stderr,"Ouverture du fichier '%s' en
cours...\n",argv[1]);
file=fopen(argv[1],"r");
printf("fichier ouvert\n\n--------------------------\n");

if(file==NULL)
{
fprintf(stderr,"Erreur d'ouverture du fichier %s\n",argv[1]);
perror(argv[1]);
return EXIT_FAILURE;
}
int c, nl, nm, nc, etat,dehors,dedans;
etat = dehors;
nl = nm = nc = 0;
while(!feof(file))
{
c = fgetc(file);
++nc;
if(c == '\n')
++nl;
if(c == ' ' || c == '\n' || c == '\t')
etat = dehors;
else if(etat == dehors)
{
etat = dedans;
++nm;
}
}
printf("\nNombre de ligne: %d\nNombre de mot: %d\nNombre de
caracteres: %d\n", nl, nm, nc);
printf("----------------------------------------\n");
Lecture(file,a);

}
return EXIT_SUCCESS;
}


int main (int argc, char * argv[])
{
FILE * file;
Dictionnaire a;
char * mot1="bonjour";
char * mot2="ceci";
char * mot3="babar";
char * mot4="bonjour";

ViderDictionnaire(a);

printf("\n\n");
/* printf("Quelques tests\n");
Ajouter(mot1,a);
Ajouter(mot2,a);
Ajouter(mot3,a);
Ajouter(mot4,a);
printf("Fin des tests\n\n");*/


Prelecture(argc,argv,file,a);


printf("\n");
return 0;

}




Cette discussion est classée dans : int, file, mot, printf, char


Répondre à ce message

Sujets en rapport avec ce message

Ouvrir et afficher un fichier texte en C [ par AsM0DeUz ] 'lut Je m'initie actuellement au C. Apres avoir fait les exos les plus basiques ... je passe au basique niveau 2 J'ai ecris qques lignes pour afficher printf de char en hexadécimal affiche un byte en 4 caractères ? [ par develdelphi ] Bonjour,Le printf  de mon compilateur génère des erreures d'affichages, en effet je dipose de variables unsigned char que je voudrais affichées en héx Sélection d'octet [ par dayvid75014 ] Bonjour à tous, Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y a oh non!! [ par bako25 ] Le prog suivant  calcule le nombre des 'e' dans un paragraphe: #include #include< Pendu en C [ par the_kaiser ] Voila je suis débutant en C (en programmation tous cours d'ailleurs puisque le C est le premier language que je teste) et je tente de faire un pendu. problem avec un char[] [ par kibab ] Bounour a vous tous, je suis nouveau de ce langage et je m'amuse à faire des épreuves diverses.Ici il y a un petit example mais jái un problem:#includ Lecture et ecriture sur fichier [ par developvbdebut ] Bonjour tout le mondeJe travaille sur la gestion des fichier en c.Mon livre n'explique pas clairement l'ectriture et la lecture dans les fichiers.Voic Probleme typedef struct [ par shenron ] #include #include #include /*Definition de la structure*/typedef struct{ char login[11]; char mdp[11];}strlogin;/*Declaration de fonctions*/void ajo conversion [ par coyotedef ] salut!!lors de la compilation de mon code une erreur apparait. impossible de trouver un remede. "cannot convert parameter 1 from 'char [10]' to 'char' concatenation [ par asmv ] //a partir d'elements de tableau 'int' transformes en 'char'//essai de concatenation qui ne fonctionne pas pourquoi ?//merci pour votre aide#include #


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales