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 dans un tableau trié]


Sujet :

C

  1. #1
    zui
    zui est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut [recherche dichotomique dans un tableau trié]
    J'ai ici un algo de recherche dichotomique que je voulais implementer en C++.

    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
     
     PROCEDURE dicho (IN t:table, IN cle_cherchee : cles,
                                  OUT reussi : logique, OUT milieu indices) Est
          VAR gauche, droite : indices;
          DEBUT
                  gauche := Bas(t);
                  droite := haut(t);
                  reussi := Faux;
                  TANTQUE NON reussi ET gauche < droite  BOUCLE
                       milieu := indices#Val((Ord(gauche)+Ord(droite)) Div 2);
                       SI cle_cherchee > cle(t[milieu])
                            ALORS gauche := Succ(milieu);
                       OUSI cle_cherchee <> cle(t[milieu])
                             ALORS droite := Pred(milieu)
                        SINON reussi := vrai
                        FIN SI
                   FIN BOUCLE
    FIN dicho;
    J'ai une solution à proposer

    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
     
    void main(){
    int t[8] = {1,4,8,12,15,22,25,30}; // tableau de 8 entiers
    int gauche = 0; // une variable que j'initialise au bas du tableau
    int droite = 7;  // une variable que j'initialise au haut du tableau
    int milieu;
    int cle_cherchee = 22 // l'element cherche est 22
    ( reussi := Faux) // je vois pas comment implementer cette instruction en C++
         While ((NON reussi) && (gauche < droite))  // Comment implementer aussi (NON reussi)????
           milieu = (gauche + droite) DIV 2;
           if (cle_cherchee > t[milieu])
               {
                  gauche = milieu+1;
                   else
                        if (cle_cherchee != t[milieu])
                            droite = milieu - 1;
                            else reussi = (t[milieu]==cle_cherchee)
                } // FIN SI
    }  // FIN DU PROG
    Vos corrections sont les biens venues. Merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu devrais plutôt consulter un cours de C++.

    Les booléens c'est le type bool, pouvant prendre true ou false comme valeur.

    Pour tester un booléen à faux c'est (b == false) ou (!b)

    La division c'est /

  3. #3
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Je ne sais pas si l'algo est juste mais ça donnerai un truc comme ça :

    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
    void main() { 
     
      int t[8] = {1,4,8,12,15,22,25,30}; // tableau de 8 entiers 
      int gauche = 0; // une variable que j'initialise au bas du tableau 
      int droite = 7; // une variable que j'initialise au haut du tableau 
      int milieu; 
      int cle_cherchee = 22; // l'element cherche est 22 
     
      bool reussi = false;
     
      while( (! reussi) && (gauche < droite) ) {
        milieu = (gauche + droite) / 2; 
        if( cle_cherchee > t[milieu] ) { 
          gauche = milieu + 1; 
        } else if( cle_cherchee != t[milieu] ) {
          droite = milieu - 1; 
        } else {
          reussi = ( t[milieu] == cle_cherchee );
        } // FIN IF/ELSE 
      } // FIN WHILE
    }  // FIN DU PROG
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  4. #4
    zui
    zui est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut
    bool reussi = false;
    Quand je compile le programme avec cette instruction, j'ai un message d'erreur : Undefined symbol 'bool'.

  5. #5
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Oula... tu es en C et pas en C++ Il faudrait deplacer ton post vers le bon forum

    int reussi = 0; // pour Faux

    et

    while( (reussi == 0) && ...
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  6. #6
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Effectivement, comme on te la dit, le type booléan n'existe pas en C, contrairement au Pascal.
    Pour cela, en C, on définit la valeur 0 à l'état FAUX et la valeur 1 (ou différente de 0) à l'état VRAI.
    Dans ton cas, tu peu définir un nouveau type (bool) avec 2 états TRUE ou FALSE.
    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
    typedef char bool ;  /* Le nouveau type booléan */
     
    #define TRUE    1  /* TRUE sera remplacé par 1 */
    #define FALSE   0  /* FALSE sera remplacé par 0 */
     
    int main(void)
      {
      bool reussi = FALSE ;  /* Est équivalent à char reussi = 0 ; */
      .
      .
      reussi = TRUE ;  /* Est équivalent à reussi = 1 ; */
      .
      .
      /* Si reussi est égal à TRUE (donc 1) executer la condition */
      if(reussi==TRUE)
        {
        .
        .
        }
      .
      /* Si reussi est égal à FALSE (donc 0) executer la condition */
      if(reussi==FALSE)
        {
        .
        .
        }
      return 1 ;  /* Fin du programme */
      }
    Maintenant, à toi de jouer .
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  7. #7
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Les booléens sont disponibles en incluant la librairie stdbool.h

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [recherche dichotomique dans un tableau trié]
    Citation Envoyé par zui
    J'ai ici un algo de recherche dichotomique que je voulais implementer en C++.
    Et tu te dis comme ça :

    "Tiens, ben je vais poster ça sur le forum C histoire de me faire bien voir..."
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Les booléens sont disponibles en incluant la librairie stdbool.h
    En C99, uniquement...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par PRomu@ld
    Les booléens sont disponibles en incluant la librairie stdbool.h
    En C99, uniquement...
    Je ne comprenais pas, pourquoi je ne le trouvais pas dans mon répertoire include.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  11. #11
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Il faut vivre avec son temps messieurs ...


  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pas toujours facile d'avoir un compilo conforme au C99...
    Les GCC de mon école datent (ils ne connaissent ni -std=c99 ni -Wextra) et même le dernier Visual n'y est pas conforme... (Surtout le dernier visual, en fait, grâce à sa géniale "bibliothèque run-time sécurisée" )

    En fait, y'a surtout les GCC récents qui sont plus ou moins conformes, comme celui fourni avec Dev-C++...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Toujours sur les booléans : Existe-t'il un type booléen en C ?

    Suffisait d'aller voir la faq
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  14. #14
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pas toujours facile d'avoir un compilo conforme au C99...
    C'était une boutade !

    Mais il est vrai que de temps en temps il est difficile d'avoir les dernières versions (pas forcément les toutes dernières mais quelque chose d'assez récent), surtout dans les domaines publics ...

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Mais il est vrai que de temps en temps il est difficile d'avoir les dernières versions (pas forcément les toutes dernières mais quelque chose d'assez récent), surtout dans les domaines publics ...
    Je ne sais pas ce que tu appelles 'domaine public', mais à ma connaissance, GNU et FSF ne sont pas du domaine public...

    On est gravement hors-sujet...
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ah non, tu te méprend, je ne parlais pas de public dans ce sens, mais dans les établissement publics (genre éducation nationnale ...).

    Désolé de ne pas avoir été plus clair ...

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Ah non, tu te méprend, je ne parlais pas de public dans ce sens, mais dans les établissement publics (genre éducation nationnale ...).

    Désolé de ne pas avoir été plus clair ...
    Etablissements et services publics. Ok.

    Euh, connais pas. Je suis un mauvais français, et je ne connais que le privé!
    Pas de Wi-Fi à la maison : CPL

  18. #18
    zui
    zui est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2005
    Messages : 43
    Points : 37
    Points
    37
    Par défaut
    Salut à tous,
    J'ai fait un programme de recherche dichotomique en m'appuyant toutes les suggestions que vous avez données. Ca compile mais malheuresement je n'obtiens pas les résultats escomptés à l'execution du programme. Cad que quand je cherche un element qui ne se trouve pas dans la table exemple cle_cherchee = 99, j'obtiens "0" après l'execution du programme ce qui est tout à fait normal car ne se trouvant pas dans la table. Par contre que je cherche un element qui se trouve dans la table par exemple cle_cherchee = 4, j'obtiens toujours un "0" apres l'exécution du programme alors que je devrais obtenir un "1" pour dire que l'élément se trouve dans la table. Vos corrections sont les bien venues. Merci
    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
     
    #include <stdio.h>
     
    void main(){
     
        int t[8] = {1,4,8,12,15,22,25,30};
        int gauche = 0;
        int droite = 7;
        int milieu;
        int reussi;
        int cle_cherchee = 4;
     
        while ((!reussi) && (gauche < droite)){
             milieu = (gauche + droite) / 2;
             if (che_cherchee > t[milieu])
                gauche = milieu + 1;
                else
                if (cle_cherchee != t[milieu])
                   droite = milieu - 1;
                   else
                   reussi = (t[milieu]==cle_cherchee);
         }
    }

  19. #19
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pourquoi utilises-tu une variable reussi ? (de plus elle n'est pas initialiséee). Quand tu as trouvé ton élément, tu quittes.

    De plus indente ton code correctement ça facilite la relecture (ton else n'est pas bien placé).

    Si ça peut t'aider :

    http://cermics.enpc.fr/polys/oap/node56.html

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par zui
    J'ai fait un programme de recherche dichotomique en m'appuyant toutes les suggestions que vous avez données. Ca compile
    Hum, non !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Compiling: main.c
    main.c:3: warning: function declaration isn't a prototype
    main.c:3: warning: return type of 'main' is not `int'
    main.c: In function `main':
    main.c:14: error: `che_cherchee' undeclared (first use in this function)
    main.c:14: error: (Each undeclared identifier is reported only once
    main.c:14: error: for each function it appears in.)
    Process terminated with status 1 (0 minutes, 7 seconds)
    Merci de copier coller et non de retaper avec des fautes...

    D'autre part :

    http://emmanuel-delahaye.developpez....s.htm#typemain
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/08/2014, 11h10
  2. Recherche aléatoire dans un tableau
    Par Ykroxor dans le forum Excel
    Réponses: 1
    Dernier message: 11/04/2007, 09h58
  3. recherche dichotomique dans un tableu de String
    Par new_wave dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 23/02/2007, 11h53
  4. Réponses: 6
    Dernier message: 05/01/2006, 14h23
  5. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21

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