C/C++: probleme de programmation, retourn val

Résolu/Fermé
MouchT8 Messages postés 22 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 11 août 2008 - 24 mai 2008 à 21:53
MouchT8 Messages postés 22 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 11 août 2008 - 26 mai 2008 à 16:15
Bonjour,
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

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
25 mai 2008 à 00:48
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.
#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
0
tuantu Messages postés 41 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 29 mai 2008 13
25 mai 2008 à 01:09
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 ...
0
MouchT8 Messages postés 22 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 11 août 2008 1
26 mai 2008 à 16:09
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!
0
MouchT8 Messages postés 22 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 11 août 2008 1
26 mai 2008 à 16:15
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
0