Table de Hachage de patronyme en C
guitoontruant
Messages postés
315
Date d'inscription
Statut
Membre
Dernière intervention
-
Stupeflip Messages postés 391 Date d'inscription Statut Membre Dernière intervention -
Stupeflip Messages postés 391 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voilà je dois créer une table de hashage de patronymes par le biais de N entrées, par exemple 20, de pointeurs vers des chaines de caracteres. L'utilisateur est invité de manière répétitive à choisir une commande parmi insérer, rechercher, supprimer et fin. Les noms sont des suites de caractères minuscules exclusivement.
La fonction de hashage calculera un indice dans le tableau en formant la "somme" des caractères du noms sachant que "a" vaut 1. Cette somme modulo N sera l'entrée utiliséee dans la table à moins que celle-ci ne soit déjà occupé. Dans ce cas, on rehashe en ajoutant 13 fois la valeur du premier caractère jusqu'à trouver une entrée libre ou à abandonner au bout de 5 échecs.
Toutes les opérations du programme sont imprimées au fur et à mesure de sorte que l'on puisse par exemple apprendre que la 5e entrée est déjà occupée, que le rehashage choisit ensuite la 3e qui est libre.
Souvenez-vous que la suppression de noms du tableau a une incidence sur les conflits, et donc les recherches des noms dans la tables entre autres.
J'ai déjà écrit ceci mais mon compilation fon,ctionne mais dés que j'éxecute aprész avoir insérer un nom j'ai comme message: "An unhandled win32 occured. Je travaille avec devcpp.
Que puis-je faire?
#include <stdlib.h>
#include <string.h>
#define N 20
char *T[N];
int i;
int inserer(char *s)
{
int compteur=0;
int n=0;
char temp;
char s1;
for(i=0;i<(strlen(s)-1);i++)
{
temp=s[i];
compteur=compteur +(temp-96);
}
while(n<5)
{
if(T[compteur%N]!=0)
{
temp=s[0];
compteur=compteur + 13*temp;
n++;
}
else
{
s1=s[0];
*T[compteur%N]=s1;
return 1;
}
}
return 0;
}
int rechercher(char *s)
{
for(i=0;i<N;i++)
{
if (*T[i]!=s[i])
return 0;
else
return 1;
}
}
int supprimer(char *s)
{
for(i=0;i<N;i++)
{
if(strcmp(T[i],s)!=0)
return 0;
else
{
T[i]=NULL;
return 1;
}
}
}
int main()
{
char *s,patro;
int i;
int choix;
for(i=0; i<N; i++) /*initialisiation de T a 0*/
T[i]=0;
for(i=0; i<N; i++)
{
printf("%s", T[i]);
printf("\n");
}
int bool=1; //booleen
while(bool)
{
printf("Entrez votre choix \n");
printf("1-Inserer \n");
printf("2-Rechercher \n");
printf("3-Supprimer \n");
printf("4-Fin du programme \n");
if(scanf("%d",&choix)==0)
return EXIT_FAILURE;
switch(choix)
{
case 1:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
printf("Vous avez choisi la commande inserer \n");
*s=patro;
if(inserer(s)==0)
printf("Le patronyme n'a pu etre inserer \n");
else
printf("Le patronyme a été inserer \n");
break;
case 2:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
*s=patro;
printf("Vous avez choisi la commande rechercher \n");
if(rechercher(s)==0)
printf("Le patronyme n'est pas présent dans le tableau \n");
else
printf("Le patronyme est présent dans le tableau \n");
break;
case 3:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
*s=patro;
printf("Vous avez choisi la commande supprimer \n");
if(supprimer(s)==0)
printf("Le patronyme ne fait pas partit du tableau et n'a donc pas pu etre supprimer \n");
else
printf("Le patronyme a bien été supprimer avec succes \n");
break;
case 4:
printf("Vous avez choisi la commande fin \n");
bool=0;
return EXIT_SUCCESS;
break;
default:
printf("Vous n'avez pas choisi une commande valide \n");
printf("Veuillez refaire un choix \n");
printf("\n");
break;
}
}
return EXIT_SUCCESS;
}
Merci
Voilà je dois créer une table de hashage de patronymes par le biais de N entrées, par exemple 20, de pointeurs vers des chaines de caracteres. L'utilisateur est invité de manière répétitive à choisir une commande parmi insérer, rechercher, supprimer et fin. Les noms sont des suites de caractères minuscules exclusivement.
La fonction de hashage calculera un indice dans le tableau en formant la "somme" des caractères du noms sachant que "a" vaut 1. Cette somme modulo N sera l'entrée utiliséee dans la table à moins que celle-ci ne soit déjà occupé. Dans ce cas, on rehashe en ajoutant 13 fois la valeur du premier caractère jusqu'à trouver une entrée libre ou à abandonner au bout de 5 échecs.
Toutes les opérations du programme sont imprimées au fur et à mesure de sorte que l'on puisse par exemple apprendre que la 5e entrée est déjà occupée, que le rehashage choisit ensuite la 3e qui est libre.
Souvenez-vous que la suppression de noms du tableau a une incidence sur les conflits, et donc les recherches des noms dans la tables entre autres.
J'ai déjà écrit ceci mais mon compilation fon,ctionne mais dés que j'éxecute aprész avoir insérer un nom j'ai comme message: "An unhandled win32 occured. Je travaille avec devcpp.
Que puis-je faire?
#include <stdlib.h>
#include <string.h>
#define N 20
char *T[N];
int i;
int inserer(char *s)
{
int compteur=0;
int n=0;
char temp;
char s1;
for(i=0;i<(strlen(s)-1);i++)
{
temp=s[i];
compteur=compteur +(temp-96);
}
while(n<5)
{
if(T[compteur%N]!=0)
{
temp=s[0];
compteur=compteur + 13*temp;
n++;
}
else
{
s1=s[0];
*T[compteur%N]=s1;
return 1;
}
}
return 0;
}
int rechercher(char *s)
{
for(i=0;i<N;i++)
{
if (*T[i]!=s[i])
return 0;
else
return 1;
}
}
int supprimer(char *s)
{
for(i=0;i<N;i++)
{
if(strcmp(T[i],s)!=0)
return 0;
else
{
T[i]=NULL;
return 1;
}
}
}
int main()
{
char *s,patro;
int i;
int choix;
for(i=0; i<N; i++) /*initialisiation de T a 0*/
T[i]=0;
for(i=0; i<N; i++)
{
printf("%s", T[i]);
printf("\n");
}
int bool=1; //booleen
while(bool)
{
printf("Entrez votre choix \n");
printf("1-Inserer \n");
printf("2-Rechercher \n");
printf("3-Supprimer \n");
printf("4-Fin du programme \n");
if(scanf("%d",&choix)==0)
return EXIT_FAILURE;
switch(choix)
{
case 1:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
printf("Vous avez choisi la commande inserer \n");
*s=patro;
if(inserer(s)==0)
printf("Le patronyme n'a pu etre inserer \n");
else
printf("Le patronyme a été inserer \n");
break;
case 2:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
*s=patro;
printf("Vous avez choisi la commande rechercher \n");
if(rechercher(s)==0)
printf("Le patronyme n'est pas présent dans le tableau \n");
else
printf("Le patronyme est présent dans le tableau \n");
break;
case 3:
printf("Entrez un patronyme en minuscule\n");
if (scanf("%s",patro)==0)
return EXIT_FAILURE;
*s=patro;
printf("Vous avez choisi la commande supprimer \n");
if(supprimer(s)==0)
printf("Le patronyme ne fait pas partit du tableau et n'a donc pas pu etre supprimer \n");
else
printf("Le patronyme a bien été supprimer avec succes \n");
break;
case 4:
printf("Vous avez choisi la commande fin \n");
bool=0;
return EXIT_SUCCESS;
break;
default:
printf("Vous n'avez pas choisi une commande valide \n");
printf("Veuillez refaire un choix \n");
printf("\n");
break;
}
}
return EXIT_SUCCESS;
}
Merci
A voir également:
- Table de Hachage de patronyme en C
- Table ascii - Guide
- Table des matières word - Guide
- Tableau croisé dynamique ou table de pilote - Guide
- Table des caractères - Guide
- No bootable partition in table ✓ - Forum Windows
5 réponses
Salut,
Tout d'abord, tu n'attribues pas d'espace mémoire pour tes chaines de caractères. Ensuite tu fais des affectations avec l'opérateur = qui ne fonctionne pas aussi simplement avec des char *
Et il faut relire ton code, il y a beaucoup de choses de ce genre qui font que ton code n'est pas propre.
Bon courage
Tout d'abord, tu n'attribues pas d'espace mémoire pour tes chaines de caractères. Ensuite tu fais des affectations avec l'opérateur = qui ne fonctionne pas aussi simplement avec des char *
Et il faut relire ton code, il y a beaucoup de choses de ce genre qui font que ton code n'est pas propre.
Bon courage
guitoontruant
Messages postés
315
Date d'inscription
Statut
Membre
Dernière intervention
53
Justement, peux-tu essayer de m'expliquer brièvement les affectations avec des chars * car jje galère avec ça.
Et bien d'abord il te faut allouer de l'espace mémoire à tes char *, avec la fonction new par exemple. Ca te ferait un truc du genre :
patro = new char [20];
A toi de mettre l'espace que tu veux allouer. Attention, il faut également libérer l'espace mémoire une fois que tu as terminée ce que tu avais à faire. Cela se fait avec la fonction delete :
delete [] patro;
Pour copier patro dans s, il te faut donc allouer la mémoire pour les deux, puis utiliser par exemple la fonction strcpy :
strcpy(s,patro);
Voilà bon courage pour la suite
patro = new char [20];
A toi de mettre l'espace que tu veux allouer. Attention, il faut également libérer l'espace mémoire une fois que tu as terminée ce que tu avais à faire. Cela se fait avec la fonction delete :
delete [] patro;
Pour copier patro dans s, il te faut donc allouer la mémoire pour les deux, puis utiliser par exemple la fonction strcpy :
strcpy(s,patro);
Voilà bon courage pour la suite
Bon voilà j'ai fait quelques changement dans le main qui fontionne bien maintenant.
Seulement j'ai un problème avec ma fonction insérer, j'y ai mis:
int inserer(char *s)
{
int compteur=0;
int n=0;
char temp;
char s1[20];
for(i=0;i<(strlen(s)-1);i++) //boucle de calcul de l'indice
{
temp=s[i]; //on met dans temp le caractere du i-ème patronyme
compteur=compteur +(temp-96); //emploi du code ascii pour calculer le hachage
}
while(n<5)
{
if(T[compteur%N]!=0) //recherche si on peut mettre le patronyme
{
temp=s[0];
compteur=compteur + 13*temp;//ajout de 13 fois la première valeur (re-hachage)
n++;
}
else
{
strcpy(s1,s);
*T[compteur%N]=*s1; L'ERREUR EST ICI
return 1;
}
}
return 0;
}
Mais j'ai toujours une erreur. Peux-tu encore m'aider, stp?
Seulement j'ai un problème avec ma fonction insérer, j'y ai mis:
int inserer(char *s)
{
int compteur=0;
int n=0;
char temp;
char s1[20];
for(i=0;i<(strlen(s)-1);i++) //boucle de calcul de l'indice
{
temp=s[i]; //on met dans temp le caractere du i-ème patronyme
compteur=compteur +(temp-96); //emploi du code ascii pour calculer le hachage
}
while(n<5)
{
if(T[compteur%N]!=0) //recherche si on peut mettre le patronyme
{
temp=s[0];
compteur=compteur + 13*temp;//ajout de 13 fois la première valeur (re-hachage)
n++;
}
else
{
strcpy(s1,s);
*T[compteur%N]=*s1; L'ERREUR EST ICI
return 1;
}
}
return 0;
}
Mais j'ai toujours une erreur. Peux-tu encore m'aider, stp?
J'ai trouvé l'erreur pour la fonction inserer.
Maintent sur rechercher je crois avoir un problème aussi:
int rechercher(char *s)
{
for(i=0;i<N;i++)
{
if (*T[i]!=s[i]) //il ne fait bien ce test
return 0;
else
return 1;
}
}
Maintent sur rechercher je crois avoir un problème aussi:
int rechercher(char *s)
{
for(i=0;i<N;i++)
{
if (*T[i]!=s[i]) //il ne fait bien ce test
return 0;
else
return 1;
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question