C/C++: probleme de programmation, retourn val
Résolu
MouchT8
Messages postés
22
Date d'inscription
Statut
Membre
Dernière intervention
-
MouchT8 Messages postés 22 Date d'inscription Statut Membre Dernière intervention -
MouchT8 Messages postés 22 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
VOila, j'ai un probleme avec mon programme.
Voici mon code:
Le but est donc la reherche dichotomique.
Le probleme qui se pose, c'est que meme quand j'écrit "arbre" par exemple, mon programme me dit que le mot n'est pas dans le dico alors que pourtant il y est!!
J'ai tout essayé, tout réfléchit, peut etre est ce la fatigue mais je ne sais pas d'ou ca vient.....
quelqu'un peu m'aider??????
VOila, j'ai un probleme avec mon programme.
Voici mon code:
#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); bool trouve=1; i=0; j= nb_mots; while(i<=nb_mots -1 && trouve==1 ) { //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 m; //moyenne de(i,j) m=(i+j)/2; k=m; 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("%s",&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; }
Le but est donc la reherche dichotomique.
Le probleme qui se pose, c'est que meme quand j'écrit "arbre" par exemple, mon programme me dit que le mot n'est pas dans le dico alors que pourtant il y est!!
J'ai tout essayé, tout réfléchit, peut etre est ce la fatigue mais je ne sais pas d'ou ca vient.....
quelqu'un peu m'aider??????
4 réponses
En fait si tu veux juste stocker des mots et vérifier s'ils sont stockés par recherche dichotomique, il serait plus logique d'utiliser les classes std::set et std::string de la STL.
Bien sûr si le but de l'exercice est d'implémenter une dichotomie c'est autre chose...
Bonne chance
#include <set> #include <string> #include <iostream> void trouve(const std::set<std::string> & mots,const std::string & mot){ if(mots.find(mot) != mots.end()) std::cout << mot << " a été trouvé !" << std::endl; else std::cout << mot << " n'a pas été trouvé" << std::endl; } int main(){ std::set<std::string> mots; trouve(mots,"tapir"); trouve(mots,"savane"); return 0; }
Bien sûr si le but de l'exercice est d'implémenter une dichotomie c'est autre chose...
Bonne chance
ton programme affiche vraiment qu'il trouve pas le mot ?
pcq chez moi déjà, ça compile pas pcq il connait pas la fonction scan_s
ensuite, si je vire la ligne ou tu demandes l'input de l'utilisateur et que j'initialise avec char* mot="arbre"
je reste bloqué dans le while sans jamais sortir ... bref ...
sinon j'pense que ton problème doit venir du fait que les mots ne sont pas ordonnés par ordre alphabétique dans ton dictionnaire ... ce qui est qd meme assez important pour une recherche dichotomique ...
pcq chez moi déjà, ça compile pas pcq il connait pas la fonction scan_s
ensuite, si je vire la ligne ou tu demandes l'input de l'utilisateur et que j'initialise avec char* mot="arbre"
je reste bloqué dans le while sans jamais sortir ... bref ...
sinon j'pense que ton problème doit venir du fait que les mots ne sont pas ordonnés par ordre alphabétique dans ton dictionnaire ... ce qui est qd meme assez important pour une recherche dichotomique ...
enfait voila j'ai déja trouver, je pense un probleme!!
Je vois que jai mit dans mon main(), pour l'entrée de "mot": %c donc déjà ca ne va pas jai donc remplacé par %s !
Et maintenant mon programme bug a cet endroit! a partir du moment ou j'entre mon mot, le programme sarret!!
Pourtant %s c'est bien pour une chaine de caractere nan?? et non pas %c pour un caractere uniquement!
Je vois que jai mit dans mon main(), pour l'entrée de "mot": %c donc déjà ca ne va pas jai donc remplacé par %s !
Et maintenant mon programme bug a cet endroit! a partir du moment ou j'entre mon mot, le programme sarret!!
Pourtant %s c'est bien pour une chaine de caractere nan?? et non pas %c pour un caractere uniquement!
sinon j'ai ordonné mes mots par ordre alphabetique dans mon tableau.
Je tiens a dire en réponse à TUANTU, que VS me dit qu'il ne connais pas scanf ! et qu'il faut que je le remplace par scanf_s , bizaroide?? mais ca marche en tout cas !!
Cet exercice est en fait un exercice préliminaire pour créer ma fonction dichotomique et la tester, avant de créer mon programme complet! seulement je dois suivre l'énoncé de l'exercie c'est pour cela que je galere surement....
voila l'énoncé 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
Pour tester la fonction, on pourra écrire un petit programme permettant ... blablabla
Je tiens a dire en réponse à TUANTU, que VS me dit qu'il ne connais pas scanf ! et qu'il faut que je le remplace par scanf_s , bizaroide?? mais ca marche en tout cas !!
Cet exercice est en fait un exercice préliminaire pour créer ma fonction dichotomique et la tester, avant de créer mon programme complet! seulement je dois suivre l'énoncé de l'exercie c'est pour cela que je galere surement....
voila l'énoncé 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
Pour tester la fonction, on pourra écrire un petit programme permettant ... blablabla