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 de retour de valeur dans ma fonction de recherche dichotomique


Sujet :

C

  1. #1
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut Problème de retour de valeur dans ma fonction de recherche dichotomique
    Voici mon 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include<stdio.h>
    #include<string.h>
     
     
    //INITIALISATION
    //initialisation de la fonction dichotomie
    short dichotomie(char **dico,char *mot,short nb_mots){
     
    int i,j,k;
     
    i=0;
    j= nb_mots;
     
    for(i=0; i<=nb_mots -1; i++) {		//execution de la boucle tant que (i,j) supérieur à 1
    									//puisque j=nb_mots, alors (i,j) sera supérieur à 1 pour
    									//i< nb_mots -1
     
    int moy;		//moyenne de(i,j)
    moy=(i+j)/2;
    k=moy;
    }
     
    if(dico[k] > mot) {
    j=k;
    }
    else {
    i = k;
    }
     
     
    //comparaison de mot avec le i ème et le j ème élément du dico
    if (mot==dico[i]){return 0;}
    if(mot==dico[j]){return 0;}
    else{return 1;}
     
    }
     
     
    //EXECUTION
    //PROGRAMME PRINCIPAL
     
    int main(void){
     
    char *mot;
    short nb_mots;
    //exemple d'initialisation de dico pour notre exemple
    char *dico[5]={"arbre","voiture","cheval","malade","besoin"};
    nb_mots=5;	//initialisation par exemple
     
     
    //saisie par l'utilisateur du mot à rechercher
    printf("Veuillez saisir un mot pour la recherche dichotomique: \n ");
    scanf_s("%c",&mot);
     
    //recherche dichotomique
    dichotomie(dico, mot, nb_mots);
     
    if(dichotomie(dico, mot, nb_mots)==0 ){
    	printf("Le mot saisie est bien dans le dictionnaire!\n");
    }
    else {
    	printf("Le mot saisie n'est pas dans le dictionnaire!\n");
    }
     
    return 0;
    }

    Mon probleme, c'est que quand, à l'exectution, je note par exemple "arbre",
    il me dit que le mot n'appartient pas au dictionnaire...alors que si !!
    Je pense qu'il y a un probleme au niveau de mes retours dr valeurs mais je ne vois pas ou ..

    Quelqu'un peut m'aider??

  2. #2
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Au lieu de faire de cette manière pourquoi ne créée-tu pas un fichier .txt qui te sert de dictionnaire c'est beaucoup plus facile à faire

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 978
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 978
    Par défaut
    Fai,

    Tu n'aurais pas oublié une condition pour l'algorithme de recherche par dichotomie ?

    Je te laisse chercher, c'est tellement élémentaire.

  4. #4
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    bien vu droggo !

  5. #5
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par snake264 Voir le message
    Au lieu de faire de cette manière pourquoi ne créée-tu pas un fichier .txt qui te sert de dictionnaire c'est beaucoup plus facile à faire
    Parce que l'énoncé de mon exercice me dit de faire comme ça


  6. #6
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par droggo Voir le message
    Fai,

    Tu n'aurais pas oublié une condition pour l'algorithme de recherche par dichotomie ?

    Je te laisse chercher, c'est tellement élémentaire.
    Euuuuuuuh .... oui !

    Je vais me creuser la tete, mais je ne vois pas ce que ça peut etre puisque j'ai suivit a la lettre (du moins je pense) l'énoncé de l'exercice !

    Le voici, au cas ou:

    La fonction aura la déclaration suivante:
    short dichotomie (dico, mot, nb_mots)
    char**dico;
    char *mot;
    short nb_mots;

    Elle devra retourner la valeur 1 si mot est trouvé dans dico et 0 si non.
    L'algorithme est le suivant :

    -on utilise 3 variables i, j et k entières
    -i initialisé a 0
    -j initialis a nb_mots

    Executer une boucle tant que l'intervalle (i,j) est supèrieur à 1:
    -mettre dans k la moyenne de (i,j)
    -si le k eme élément de dico est supèrieur à mot, mettre k dans j sinon mettre k dans i
    -fin de la boucle
    -comparer mot avec le ième et j ème élément de dico


    Por tester la fonction, on pourra écrire un petit programme permettant ... blablabla

    Effectivement je vois qu'il y a deux ou trois trucs que je n'ai pas respecté..
    je m'en vais les changer mais je ne pense pas que ce soit ça qui ne fonctionne pas?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    en plus, une grossière erreur :

    les chaînes de caractères ne se compare pas avec == mais avec strcmp ...


  8. #8
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    en plus, une grossière erreur :

    les chaînes de caractères ne se compare pas avec == mais avec strcmp ...

    OH MY GOD !
    OooooPS !!!!

    Correction =>

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include<stdio.h>
    #include<string.h>
     
     
    //INITIALISATION
    //initialisation de la fonction dichotomie
    short dichotomie(char **dico,char *mot,short nb_mots){
     
    int i,j,k;
    int strcmp (const char *s1, const char *s2);
     
    i=0;
    j= nb_mots;
     
    for(i=0; i<=nb_mots -1; i++) {		//execution de la boucle tant que (i,j) supérieur à 1
    									//puisque j=nb_mots, alors (i,j) sera supérieur à 1 pour
    									//i< nb_mots -1
     
    int moy;		//moyenne de(i,j)
    moy=(i+j)/2;
    k=moy;
     
     
    if(strcmp(dico[k],mot)>0) {
    j=k;
    }
    else {
    i = k;
    }
    }
     
     
    //comparaison de 'mot' avec le i ème et le j ème élément du dico
     
    if(strcmp(mot,dico[i])==0){return 1;}
    if(strcmp(mot,dico[j])==0){return 1;}
    else{return 0;}
     
     
    }
     
    //EXECUTION
    //PROGRAMME PRINCIPAL
     
    int main(void){
     
    char *mot;
    short nb_mots;
     
    //exemple d'initialisation de dico pour notre exemple
    char *dico[5]={"arbre","voiture","cheval","malade","besoin"};
    nb_mots=5;	//initialisation par exemple
     
     
    //saisie par l'utilisateur du mot à rechercher
    printf("Veuillez saisir un mot pour la recherche dichotomique: \n ");
    scanf_s("%c",&mot);
     
    //recherche dichotomique
    dichotomie(dico, mot, nb_mots);
     
    if(dichotomie(dico, mot, nb_mots)== 1 ){
    	printf("Le mot saisie est bien dans le dictionnaire!\n");
    }
    if (dichotomie(dico,mot,nb_mots)== 0) {
    	printf("Le mot saisie n'est pas dans le dictionnaire!\n");
    }
     
    return 0;
    }
    Mais toujours le meme probleme...
    Si je saisie "arbre" par exemple, il me dit qu'il n'est pas dans le dico..

  9. #9
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    extrait du man
    SYNOPSIS
    #include <string.h>

    int strcmp (const char *s1, const char *s2);

    DESCRIPTION
    La fonction strcmp() compare les deux chaînes s1 et s2. Elle renvoie
    un entier négatif, nul, ou positif, si s1 est respectivement
    inférieure, égale ou supérieure à s2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *dico[5]={"arbre","voiture","cheval","malade","besoin"};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(strcmp(dico[k],mot)>0)
    voiture < cheval ?
    malade > voiture ?

  10. #10
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,
    Citation Envoyé par mouchT8
    Si je saisie "arbre" par exemple, il me dit qu'il n'est pas dans le dico..
    Tu ne risques pas de lire un mot avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *mot;
    <...>
    scanf_s("%c",&mot);
    tu n'alloues pas de l'espace à 'mot'
    %c lit un et un seul caractère

    ...Avant d'aller plus loin je te conseil fortement la lecture de ce TUTO !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mouchT8 Voir le message
    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include<stdio.h>
    #include<string.h>
     
     
    //INITIALISATION
    //initialisation de la fonction dichotomie
    short dichotomie(char **dico,char *mot,short nb_mots){
    <...>
    Il faut cesser de réinventer la roue...

    1 - mettre les données dans un tableau
    2 - trier le tableau avec qsort())
    3 - rechercher avec bsearch().

  12. #12
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    C'est vrai mais en même temps il n'avait pas vraiment le choix car cela lui étais imposé

  13. #13
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    en même temps faire une recherche dichotomique sur un tableau non trié, ...
    y'en a qu'on essayé ...
    J'suis pas certain qu'ils aient réussi

  14. #14
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    On sait jamais avec une chance énorme ça peut éventuellement marché

  15. #15
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Sur ce coup là je préfère misé sur le trie que sur la chance

  16. #16
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    hum...
    tres interessantes ces petites plaisanteries mais ça ne maide pas du tout !!


  17. #17
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Désolé

    Le principe d'une recherche dichotomique est de choisir un "centre" appartenant au tableau et de comparer grace à une relation d'ordre ici "strcmp()" l'element recherché
    si ton tableau est trié en ordre croissant et que l' element est strictement plus petit que le centre alors l'élément se trouve entre le début du tableau et le "centre" ...
    si il est strictement plus grand alors il se trouve entre le "centre" et la fin.
    Si il est egal c'est gagné !

    Si ton tableau est rangé par ordre décroissant et que l'élément recherché et plus petit que le centre alors il se trouve entre le "centre" et la fin du tableau.
    Sinon il se trouve entre le debut et le "centre".
    si il est égal c'est gagné !

    si on a bien choisi le centre on peut effectuer un appel recursif de notre fonction de recherche en ajustant les indices de debut ou de fin selon le cas,
    fin = centre ou debut =centre

    Si le tableau n'est pas trié impossible de savoir dans quelle partie effectuer la prochaine recherche !

  18. #18
    Membre confirmé Avatar de mouchT8
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    ah oui merci!!

    C'était expliqué sur mon devoir mais pas aussi bien on va dire

    Il faut donc que je tri mon tableau dabord... ca n'a pas l'air bien compliqué!!
    je vais essayer cela !!!


    Sinon j'ai aussi un nouveau probleme !!
    eh oui..
    j'ai changer mon %c en %s pour lire mon "mot" mais ça bug !!!


    Moi pas comprendre

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    si ton code est le meme qu'au dessus, et que tu n'as pas pris en compte la remarque d'Emmanuel, c'est normal..

    %s demande une chaine, pas un pointeur non alloue...

  20. #20
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Si tu veux etre tranquille comme tu t'attends à ne pas lire des mots de plus de 255 characteres, declare toi un buffer statique de 256 char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char buffer[256];
    printf("entrez un mot :\n>");
    scanf("%s", buffer);
    cette méthode est critiquable! mais pour le moment ça ira

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

Discussions similaires

  1. [MySQL] Problème: Mauvais retour de valeur dans mysql
    Par Krabbos dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/05/2011, 16h09
  2. problème de passage de valeur dans une fonction
    Par jeremie74 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 21/09/2007, 19h30
  3. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 18h49
  4. Réponses: 9
    Dernier message: 13/05/2005, 04h13
  5. fonction récupérant des valeurs dans une fonction popup...
    Par petitsims dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2005, 15h51

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