begin process at 2012 05 30 04:54:03
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

Table de hachage avec patronyme


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

Table de hachage avec patronyme

mardi 4 décembre 2007 à 15:52:01 | Table de hachage avec patronyme

guitoontruant

Bonjour,

Désolé, j'avais d'abord poster dans les discussions libres.

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


Je vous remercie d'avance.


L'important, c'est les trois points...
mardi 4 décembre 2007 à 16:28:13 | Re : Table de hachage avec patronyme

Pistol_Pete

Salut
Il y a des erreurs de partout...
-scanf attend l'adresse de la variable parto
- char patro;  ==> tu ne pourra stoker qu'un caractère dans ton patronime
-*s=patro;  faut faire un strcpy, mais je ne vois pas l'utilité de cette variable intermédiaire
-Pour copier en générale deux chaines de caractère il faut que tu utilises strcpy. Sinon tu copies uniquement les pointeurs. Les deux chaine pointerons sur la meme zone et si tu fais une modif à l'une, les deux variables seront modifiées.

Voila pour commencer, corrige toutes les erreurs et tient nous au courant si tu as besoin d'aide

A+
Mon site internet : [ Lien ]

mardi 4 décembre 2007 à 16:51:04 | Re : Table de hachage avec patronyme

guitoontruant

J'ai corigé en mettant char patro[20] et le scanf ("%s",&patro)

*s=patro, c'est pour que s pointe sur patro pour pouvoir utiliser les fonctions inserer, supprimer... aprés.

Apparemment j'aurai encore des problèmes avec les fonctions inserer supprimer et rechercher.

Si tu pouvais encore m'aider, ce serait super.

PS:Pete était le meilleur.

L'important, c'est les trois points...
mardi 4 décembre 2007 à 17:17:45 | Re : Table de hachage avec patronyme

guitoontruant

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


L'important, c'est les trois points...
mercredi 5 décembre 2007 à 09:57:25 | Re : Table de hachage avec patronyme

Pistol_Pete

Réponse acceptée !
J'ai refait complètement la fonction inseré pour te montrer la manière de faire:
Compare à ce que tu avais fait et essaye bien de comprendre comment ca marche.
Une fois que tu auras compris le cheminement, tu n'auras aucun mal à faire les autres fonctions.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define N 20
char **T;
int i;

int inserer(char *szNom)
{
    char *P;
    int Hash=0,n=0;

    P=szNom;        //P pointe sur szNom
    while(*P != '\0')
    {
        Hash+= *P - 96;
        P++;
    }
    do
    {
        if(T[Hash%N]==0)        //vide
        {
            T[Hash%N]=szNom;
            return 1;
        }
        else
        {
            Hash+=13*szNom[0];
            n++;
        }
    }
    while(n<5);        //5 tentatives
    return 0;
}



int main()
{
    char *s,patro[N];
    int i;
    int choix;

    T=(char**)malloc(sizeof(char*)*N);

    for(i=0; i<N; i++) /*initialisiation de T a 0*/
        T[i]=0;
  
    int Bool=1; //booleen

   
   

    while(Bool)
    {
        for(i=0; i<N; i++)
            printf("%s\n", T[i]);
        printf("\n");
       

        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=(char*)malloc(sizeof(char*)*(strlen(patro)+1));
            strcpy(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 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;
}


Mon site internet : [ Lien ]

mercredi 5 décembre 2007 à 11:17:10 | Re : Table de hachage avec patronyme

guitoontruant

Merci beaucoup, ça m'a débloqué.

Et encore merci...

L'important, c'est les trois points...


Cette discussion est classée dans : int, printf, return, if, patronyme


Répondre à ce message

Sujets en rapport avec ce message

un tit coup de pouce pour une pile ??? [ par noisette87 ] voici le debut de mon programme :#include #include #include //---------------------------------------------------------------------------#pragma argsu je ne comprends pas mon code n'affiche pas ma grille...de morpion [ par nicoworld ] Voilà ben le .exe m'affiche pas ma grille cje ne comprends pas!!!!si quelqu'un peut me dire pourquoi????voilà le code://MORPION 10*10 :#include int ve RFID skyetek developer kit [ par chibi59 ] Salut à tous,J'ai un projet à mener pour mes études il sagit de déveloper une aplication en C++ capable de se connecter à un lecteur RFID de lire des maths et autres [ par jeanphilippe37 ] Slt, j'ai fais un prgm de maths pour savoir les nbrs premiers mais, quand je mets system("pause"), j'ai une erreur, pouvez vous me corriger ? rien ne s'affiche a l'execution(les tubes ordinaires) [ par brekiano ] bonsoir,  svp chui débutant dans la programmation systeme sous unix.j'ai fait ce programme qui affiche normalement le résultats de ce pipes :    ]$ ps Return tableau? [ par zut69 ] Bonjour,Je suis en train d'écrire un petit programme sur les matrices en C, mais vu que je veux faire quelque chose d'assez général, j'ai besoin que d Problème compréhension du programme le compte est bon [ par echec ] Bonjour,Je cherchai un programme c++ sur internet qui permettait de calculer la solution du jeu le compte est bon, j'en est finalement trouvé un, mais Gestion de plusieurs ports RS232 [ par dissezfr ] Bonjour à tous d'abordJ'ai récupéré un code sur le site permettant de géré un port série, j'aimerai piloter 8 (voir +) ports série avec un seul ordina ce code ne marche pas?????????? [ par banak3181 ] s'il vous plait les gars je veux que quelqu'un me disent pourquoi ce code ne marche sur dev C++:#include #include #include #include # include<myconio. Simple Hook (DLL) qui plante GetMessage ! Je suis nul ou quoi ? [ par dam1dam1 ] Bonjour. Je ne suis pas un pro du Hook et j’ai un peu oublié tout ca, mais vu toutes les bonnes sources et annotations qui trônent ici, je pensais po


Nos sponsors


Sondage...

Comparez les prix

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,499 sec (4)

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