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 :

Problème fonction recherche


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2014
    Messages : 85
    Points : 143
    Points
    143
    Par défaut Problème fonction recherche
    Bonjour,

    j'ai un petit problème avec un exercice sur les fonctions:

    ce que je cherche à faire:

    écrire la fonction (rechdicho) qui détermine si une valeur donnée appartient à un tableau donné à une dimension d’entiers. Le tableau est supposé trié. Si la valeur se trouve dans le tableau, la fonction renvoie sa position

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAILLE_TAB 10
     
    /*
     * 
     */
    void rechdicho(int val, int *tab, int taille){
        int compteur, pos;
     
        if (val == tab[taille/2]) {
            pos = taille/2;       
        }
        else if (val < tab[taille/2]) {
            for (compteur=0; compteur <= taille/2; compteur++){
                if (val == tab[compteur]){
                    pos = compteur;
                }                     
            }           
        }
        else {
            for (compteur=taille/2; compteur <= taille-1; compteur++){
                if (val == tab[compteur]){
                    pos = compteur;
                }                     
            }           
        }         
        return (pos);
    } 
     
    int main(int argc, char** argv) {
        int position;
        int tableau[TAILLE_TAB] = {1,3,5,6,7,8,9,11,44,55};
        int val;
        char MSG_USERS1[255] = "Encodez une valeur: ";
        char MSG_USERS2[255] = "La position de votre valeur dans le tableau est: ";
     
        printf ("%s",MSG_USERS1);
        scanf ("%d", &val);
     
        position = rechdicho(val, tableau, TAILLE_TAB);
        printf ("%s",MSG_USERS1);
        printf ("%d", position);
     
    }

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Ton algo n'est pas une recherche dichotomique vu qu'il ne coupe le tableau en deux qu'une fois, il faut que tu coupes le tableau en deux jusqu'à ce que tu trouves la valeur. Pour ce faire, je te conseille d'utiliser 3 variables supplémentaires : int debut, fin, milieu; et de réfléchir avec ces variables :-)

    Sinon qql remarques générales sur ton code :

    1. char MSG_USERS1[255] pourquoi 255 ? Utilise char* MSG_ASK_VALUE = ...
    2. Comme tu vois j'ai également changé le nom, il faut être explicite et éviter de numéroter les noms.
    3. return (pos);, tu peux te passer des parenthèses.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2014
    Messages : 85
    Points : 143
    Points
    143
    Par défaut
    Hello et merci pour ton aide, je vais regarder pour modifier mon algorithme avec tes conseils, cependant j'ai encore un problème car quand j'appelle ma fonction netbeans me donne une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c:49:14: error: void value not ignored as it ought to be
         position = rechdicho(val, tableau, TAILLE_TAB);

  4. #4
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par Ersch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c:49:14: error: void value not ignored as it ought to be
         position = rechdicho(val, tableau, TAILLE_TAB);
    Ta fonction rechdicho() est declaree comme ne retournant rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void rechdicho(int val, int *tab, int taille);
    Tu ne peux donc pas affecter une valeur de retour. Si tu veux recuperer une valeur de retour, tu dois modifier le prototype en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int rechdicho(int val, int *tab, int taille);
    unsigned parce qu'une postion n'est pas censee etre negative

    Les parametres de ta fonction ne sont pas modifies pas la fonction elle meme. Tu peux donc les declares const.

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    La fonction rechdicho(int val, int *tab, int taille); pourrait aussi renvoyer un entier signé. Ainsi si le retour est négatif le nombre n'a pas était trouvé dans le tableau. Ce n'est qu'une remarque de style bien sûr.

  6. #6
    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
    C'est même ce que font certaines bibliothèques, retournant le complément à 2* de l'index où l'on devrait insérer la valeur si elle n'est pas là.

    *C'est-à-dire, -index-1 ou -(index+1); c'est nécessaire pour traiter le cas d'une insertion à l'index zéro.
    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.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2014
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2014
    Messages : 85
    Points : 143
    Points
    143
    Par défaut
    Merci à tous pour vos remarques, voila mon nouveau code:

    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
    51
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAILLE_TAB 10
     
    /*
     * 
     */
    unsigned int rechdicho(int val, int *tab, int taille){
     
    int imin = 0;
    int imax = taille;
    int imilieu;
    int irecherche;
     
     
    while ((imin <= imax) && (tab[imilieu] != val)){
    imilieu = (imin+imax)/2;
     
        if (tab[imilieu] == val) {
            irecherche = imilieu;
        }
            else {
     
            }if (tab[imilieu] > val){
                    imax = imilieu-1;
            }else
            {
                imin = imilieu+1;
            }  
    }
     
    return irecherche;
     
    } 
     
    int main(int argc, char** argv) {
        int position;
        int tableau[TAILLE_TAB] = {1,3,5,6,7,8,9,11,44,55};
        int val;
        char MSG_USERS1[255] = "Encodez une valeur: ";
        char MSG_USERS2[255] = "La position de votre valeur dans le tableau est: ";
     
        printf ("%s",MSG_USERS1);
        scanf ("%d", &val);
     
        position = rechdicho(val, tableau, TAILLE_TAB);
        printf ("%s",MSG_USERS2);
        printf ("%d", position);
     
    }

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dahtah Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int rechdicho(int val, int *tab, int taille);
    unsigned parce qu'une postion n'est pas censee etre negative
    Le type size_t est fait pour cela

Discussions similaires

  1. Problème fonction recherche et valeur min
    Par mulder78 dans le forum Excel
    Réponses: 2
    Dernier message: 05/06/2013, 12h08
  2. Problème fonction recherche
    Par switchmo dans le forum Excel
    Réponses: 4
    Dernier message: 21/12/2011, 12h06
  3. [XL-2003] Problème fonction recherche / remplacer sous VBA
    Par DVano dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/04/2010, 12h13
  4. Problème fonction recherche
    Par derech dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/10/2007, 11h35
  5. Problème fonction recherche..
    Par Lutine dans le forum VB.NET
    Réponses: 13
    Dernier message: 23/07/2007, 14h30

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