IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

recherche dichotomique fichier


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut recherche dichotomique fichier
    salut
    je essaye d'effectuer une recherche dichotomique sur le fichier(fichier d'étudiant),mais je trouve qlq difficultés ,si je taper un nom qui existe déjà ,il m'affiche que le nom n'existe !
    voici mon essai:
    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
     
        #include<stdio.h>
        #include<conio.h>
        #include<string.h>
        /*ce script permet de éffecter une recherche dichatomique */
        typedef struct 
        {
                int num;
                char nom[10];
        }etud;
     
        int main()
        {
            FILE *f;
            int sup,inf,trouve=0,milieu;
            char nom_chercher[20];
            etud e;
     
            printf("Taper l'element à chercher\n");
            gets(nom_chercher);
     
            f=fopen("etudiant.dat","r+");
            fseek(f,0,0);
            sup=ftell(f)/sizeof(etud);
     
            do
            {
                                      milieu=sup-inf/2;
                                      /*positioner le cursur au milieu*/
                                      fseek(f,(milieu-1)*sizeof(etud),0);
                                      fread(&e,sizeof(etud),1,f);
     
                                      /*tester cet element */
                                      if(strcmp(e.nom,nom_chercher)==0)
                                                                       trouve=1;
                                      else
                                          {
                                                                       if(strcmp(e.nom,nom_chercher)>0)
                                                                                 sup=milieu-1;
                                                                       else
                                                                                 inf=milieu+1;
                                          }
            }while(!trouve&&sup>inf);
            if(trouve==0)
                         printf("L'element n'existe pass ");
            else 
                         printf("L'element existe ");   
            getch();
            return 0;
        }
    n considere que la liste des étudiantes est trié en ordre croissante(les noms).

    merci de m'aider

    comment va indentation?

    bonne nuit

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    inf n'est jamais initialisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*ce script permet de éffecter une recherche dichatomique */
    Boum ?

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Dans ta discussion précédente, on avait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                f=fopen("etudiant.dat","r+");
                 fseek(f,0,2);                           
                l=ftell(f)/sizeof(etud);
    Et je t'avais suggéré d'utiliser les constantes prédéfinies SEEK_SET,SEEK_CUR et SEEK_END dans fseek().

    Ici, on trouve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            f=fopen("etudiant.dat","r+");
            fseek(f,0,0);
            sup=ftell(f)/sizeof(etud);
    Comme quoi, ne pas suivre les conseils ...
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    mabu=> vous avez tout a fait raison ,mais le programme ne marche pas ,si je lui donne un nom qui existe ,il m'affiche qu'il n'existe pas !!!
    diogene => ce sont les habitudes ,mais la prochaine fois ,je changerais

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Le problème semble venir de la détermination du milieu :

    Il faudrait remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    milieu = (sup + inf) / 2;
    Citation Envoyé par hindou90 Voir le message
    diogene => ce sont les habitudes ,mais la prochaine fois ,je changerais
    Pourquoi pas maintenant ?

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    oui j ai mal calculé la distance .
    mais je pense que l'erreur vient de l'ouverture ,je pense que je dois remplacer r+ par r .

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par hindou90 Voir le message
    oui j ai mal calculé la distance .
    mais je pense que l'erreur vient de l'ouverture ,je pense que je dois remplacer r+ par r .
    Tu as encore des problèmes ? Chez moi le code ainsi corrigé fonctionne. Poste ton code corrigé.

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    je fait appel à 3 programme un permet l'écriture sur le fichier, l'autre permet l'affichage et le dernier c'est la recherche ditch ,voici le trois programme :
    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
    #include<stdio.h>
    #include<conio.h>
    typedef struct 
    {
            int num;
            char nom[10];
    }etud;
    int main()  
    {
        FILE *f;
        etud e;
        f=fopen("etudiant.dat","r");
        printf("l'ensemble des etduiants\n");
     
        do
        {
     
                                   fread(&e,sizeof(etud),1,f);
                                   if(!feof(f))
                                   {
     
                                                printf("%d     %s        \n",e.num,e.nom);
                                   }
        }
        while(!feof(f));
        fclose(f);
     
        getch();
        return 0;
    }
    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
    #include<stdio.h>
    #include<conio.h>
    #include<process.h>
    #include<string.h>
        /*ecrir un programme permet d'afficher classe.txt*/
     
        typedef struct 
           {
                int num;
                char nom[10];
     
           }etud;
        int main()
        {   
    //        /*declaration des variables
            FILE *f1;
            etud e;
            char rep; 
               f1=fopen("etudiant.dat","w");
            do 
            {
                                       printf("entrer un numero:\n"); // lire les donnees 
                                       scanf("%d",&e.num);
     
                                       printf("taper le nom:\n");
                                       scanf("%s",e.nom);
     
                                       fwrite(&e,sizeof(etud),1,f1);//1:un seule Bloc
     
                                       printf("voulez vous traper autre etudiant");
                                       scanf(" %c",&rep);
            }
            while(rep=='o');
        //  Ouverture d'un fichier   
     
     
            fclose(f1);
            getch();
            return 0;
        }
    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
        #include<stdio.h>
        #include<conio.h>
        #include<string.h>
     
        typedef struct 
        {
                int num;
                char nom[10];
        }etud;
     
        int main()
        {
            FILE *f;
            int sup,inf=0,trouve=0,milieu;
            char nom_chercher[20];
            etud e;
     
            printf("Taper l'element à chercher\n");
            gets(nom_chercher);
     
            f=fopen("etudiant.dat","r+");
            fseek(f,0,0);
            sup=ftell(f)/sizeof(etud);
     
            do
            {
                                      milieu=(sup+inf)/2;
                                      /*positioner le cursur au milieu*/
                                      fseek(f,(milieu-1)*sizeof(etud),0);
                                      fread(&e,sizeof(etud),1,f);
     
                                      /*tester cet element */
                                      if(strcmp(e.nom,nom_chercher)==0)
                                                                       trouve=1;
                                      else
                                          {
                                                                       if(strcmp(e.nom,nom_chercher)>0)
                                                                                 sup=milieu-1;
                                                                       else
                                                                                 inf=milieu+1;
                                          }
            }while(!trouve&&sup>inf);
            if(trouve==0)
                         printf("L'element n'existe pass ");
            else 
                         printf("L'element existe ");   
            getch();
            return 0;
        }
    sachant que je pourrai le mettre dans un même programme ,mais bon...

    le probleme :si je donne un nom qui existe ,le programme m'affiche qu'il n'existe pas !!

    est ce le programme fonctionne chez vous ?

    merci pour vos réponses

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    C'est dommage que tu ne tiennes pas compte des conseils qu'on te donne. Hier, on t'avait parlé des problèmes de portabilité de ton code... chose que tu n'as pas corrigé depuis.

    C'est toi qui vois...

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Mon post précédent n'était pas une manifestation de dépit parce que tu n'avais pas suivi nos conseils, mais mettait en évidence une erreur d'inattention que tu n'aurais certainement pas faite si tu les avais suivis.

    D'où l'utilité d'utiliser des constantes symboliques.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    bonsoir
    C'est dommage que tu ne tiennes pas compte des conseils qu'on te donne. Hier, on t'avait parlé des problèmes de portabilité de ton code... chose que tu n'as pas corrigé depuis.
    vous m'avez parlé hier de ce problème ,vous m'avez donné comme solution d'ajouter b à fopen je l'ai fait mais cela n'a pas réglé le probléme (je l'ai dit hier)!
    Mon post précédent n'était pas une manifestation de dépit parce que tu n'avais pas suivi nos conseils, mais mettait en évidence une erreur d'inattention que tu n'aurais certainement pas faite si tu les avais suivis.

    D'où l'utilité d'utiliser des constantes symboliques.
    mais expliquez moi pourquoi je dois forcément utiliser des constants symboliques !
    est ce que le faite de utiler de chiffres aura des effets sur le programme ?

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    vous m'avez parlé hier de ce problème ,vous m'avez donné comme solution d'ajouter b à fopen je l'ai fait mais cela n'a pas réglé le probléme (je l'ai dit hier)!
    Je n'avais personnellement pas parlé de fopen mais du problème d'alignement des données membres en mémoire et du boutisme, ce qui pose un sérieux problème de portabilité. Cela veut dire que le jour où le programme semblera fonctionner, il pourra ne plus récupérer les bonnes valeurs depuis le fichier (si tu le fais tourner sur une autre machine par exemple), et là tu ne comprendras pas pourquoi. Si un programme doit fonctionner, autant qu'il fonctionne "partout".
    Après, je n'ai pas dit que ça allait régler le problème qui était en cours. Simplement, apparemment il n'y a pas qu'un problème dans le programme... Autant prendre les bonnes habitudes.

    mais expliquez moi pourquoi je dois forcément utiliser des constants symboliques !
    est ce que le faite de utiler de chiffres aura des effets sur le programme ?
    Sve@r avait pourtant répondu à ta question :
    Envoyé par hindou90
    ca revient à utiliser des enumérations 0,1 et 2.
    Aujourd'hui oui. Mais si demain la librairie change...

  13. #13
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par hindou90 Voir le message
    est ce le programme fonctionne chez vous ?
    Chez moi, cela fonctionne, mais j'ai lu ce qu'a écrit diogène est j'ai remplacé par
    mais expliquez moi pourquoi je dois forcément utiliser des constants symboliques !
    est ce que le faite de utiler de chiffres aura des effets sur le programme ?
    Rien ne t'y oblige. Mais c'est plus facile pour la relecture :
    Pour aller à la fin du fichier tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*on va à la fin du fichier */
    fseek(f, 0, 0);
    alors que tu aurais du écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*on va à la fin du fichier */
    fseek(f, 0, 2);
    Pas évident de faire la différence entre les deux codes en un seul coup d'œil.

    L'erreur est plus facile à voir avec des mots :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*on va à la fin du fichier */
    fseek(f, 0, SEEK_SET); /* <-- pas logique d'écrire SEEK_SET si on va à la fin */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*on va à la fin du fichier */
    fseek(f, 0, SEEK_END);

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    ok j'ai compris l'utilité des constantes symboliques ,merci
    pensez vous pourquoi le code ne marche pas chez moi ?

  15. #15
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par hindou90 Voir le message
    ok j'ai compris l'utilité des constantes symboliques ,merci
    pensez vous pourquoi le code ne marche pas chez moi ?
    La première valeur de sup est elle bonne ? Ajoute un printf pour en être sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sup=ftell(f)/sizeof(etud);
    printf("sup = %d\n", sup);

  16. #16
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    oui j'ai fait une erreur au niveau de fseek ,comme a bien dit "diogene" ,c'était une mauvaise habitude qui amené à des bêtes erreurs !
    correction:
    mais il y a un problème , lorsque je cherche le dernière élément ,il m'affiche qu'il n'existe pas !
    (c'est juste pour le dernier élément )

    Un très grand MERCI pour vos conseils

  17. #17
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!trouve&&sup>inf);

    correction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!trouve&&sup>=inf);


    ok merci ,le code marche très bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche dichotomique mot fichier
    Par flow_13 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2009, 15h24
  2. Recherche dichotomique d'une ligne dans un fichier
    Par yarf dans le forum Général Java
    Réponses: 5
    Dernier message: 31/03/2008, 15h37
  3. Réponses: 14
    Dernier message: 25/10/2004, 21h33
  4. batch de recherche de fichier ...
    Par Félia dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 29/07/2004, 15h54
  5. Recherche support fichier
    Par sydiop dans le forum Informix
    Réponses: 5
    Dernier message: 18/03/2004, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo