bowen_tk
Messages postés8Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention28 janvier 2006
-
27 janv. 2006 à 18:42
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
28 janv. 2006 à 14:56
Bonjour
Je suis entrain de programmer un scrabble en C++ mais je rencontre actuellement un probleme :
Mon programme possede une classe Cmot et une classe Cjeu
Lorsque je saisis un mot pour pouvoir le mettre sur le plateau, je souhaite verifier s'il fait parti du dictionnaire que j'ai charger dans un tableau de Cmot ou chaque case comporte un mot
Ce tableau est dans cjeu
Mais voila je vois pas comment faire pour comparer le mot taper avec tout les mot du dictionnaire et voir s'il est dedans
pouvez vous m'aider
Je pense qu'il faut faire deux boucles while imbriquer
sachant que j'ai une fonction qui compte le nombre de lettre du mot entrer, que je connais le nombre de mot du dictionnaire et que par exemple dictionnaire[j].mot[i] correspond a la ieme lettre du jeme mot
Je suis sous visual C++ et je n'ai le droit qu'au fonction de base à savoir celle accessible sans chargement de bibliotheque sauf iostream.h
bowen_tk
Messages postés8Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention28 janvier 2006 27 janv. 2006 à 19:38
Voici ce que j'ai comme debut :
int Cjeu::Comparer()
{
int p=0;
int i=0;
int j=0;
while ((motaplacer.motinter[i]!=dictionnaire[j].mot[i])&&(j<22498)) //motaplacer.motinter[i] : i eme lettre du mot saisi, dictionnaire[j].mot[i] : i eme lettre du j eme mot du dictionnaire, 22498 nbre de mot du dico
{
j++;
i=0;
while ((motaplacer.motinter[i]==dictionnaire[j].mot[i])&&(i<motaplacer.Lettres())) //motaplacer.Lettres() : procedure pour compter le nombre de lettre du mot saisi
{
i++;
}
}
cout<<j;
return j;
}
Cette procedure marche quand le mot commence avec une lettre diferente de a mais pour un mot commencant par a ca foire
platon179
Messages postés237Date d'inscriptionlundi 20 mai 2002StatutMembreDernière intervention22 juillet 20112 27 janv. 2006 à 20:16
Salut,
Tu n'as pas besoin tester toutes les lettres une à une, des fonctions de comparaison de chaînes de caractères existent déjà ;)
Ton mot est stocké sous quelle forme dans Cmot ??? Un string ou un char * ?
Si c'est un string, tu peux faire quelque chose comme :
bool Cjeu::dansDico(string motaplacer)
{
for(int i=0; i<22498; i++)
{
if(dictionnaire[i].mot == motaplacer)
return true;
}
return false;
}
Si c'est un char *, c'est quasiment identique :
bool Cjeu::dansDico(char *motaplacer)
{
for(int i=0; i<22498; i++)
{
if(strcmp(dictionnaire[i].mot, motaplacer) == 0)
return true;
}
return false;
}
bowen_tk
Messages postés8Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention28 janvier 2006 27 janv. 2006 à 20:28
merci pour ton aide mais ce que la prof attend de nous c quelquechose plus proche de ce que je propose car on a vu que des void et int pour les procedure et mon mot est dans un char
Qu'est ce que bool? qu'est ce qui en sort?
et c'est quoi cette fonction : strcmp()?
Autre question donc en sorti j'aurais un nombre et j'aimerais aussi comparer les lettres de ce mots avec les lettres qui sont sur le chevalet comment faire car ce que j'ai fait ca ne marche pas et j'aimerais qu'en sorti ca soit aussi 1 ou 0
je dois aussi utiliser une structure tres simple avec des for ou if ou while dans le style que je propose donc avez vous des idées?
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 28 janv. 2006 à 00:34
Salut !
Je suis vraiment etonné...
Votre prof vous demande de vous attaquer a des projets aussi complexes alors que vous n'avez rien vu du c++...
"bool" vien d'un mathématicien qui a inventer un "algebre" apliquer au binaire. Un boolean c une variable qui ne peut avoir que 2 valeurs : vrai ou faux. Ici, si la fonction renvoit "true" c'est que le mot est dans le dictionnaire, sinon, il n'y est pas. Pas plus compliqué que ca.
Si tu est capable de faire des fonctions qui recoivent en parametre ou renvoyent des void ou des int, qu'est-ce qui t'empeche de renvoyer autre chose ? Tu as besin d'attendre que ta prof te prenne par la main ?
strcmp est une des nombreuses fonction du fichier "string.h". Une librairie standard provenant du language C. Cette librairie est incontournable. Cette fonction te permet de comparer deux chaines. Elle renvoit le nombre de difference entre les deux chaine (le chiffre peut etre negatif). Par consequent si les deux chaines sont totalement identique, elle renvoit 0.
Pour te simpplifier la vie, si tu doit absolument faire un code proche de celui que tu as fournit, demmerde-toi pour ranger les mots de ton dico dans l'ordre alphabetque.
int searching = 1;
while(searching)
{
//Si on est pas au bout du mot
if(motaplacer[i])
{
if(motaplacer[i] != dico[j][i])
{
j++; //Mot suivant dans le dictionnaire
if(j == 22498)
searching = 0: //Si on a tester tous les mots du dico
}
else
i++; //Lettre suivante
}
//Sinon on sort
else
{
searching = 0;
}
}
Voila, ce n'est qu'un squelette, il manque certainement une ou deux condition, mais c'est globalement ce que tu doit faire. Mais le dictionnaire doit etre trier car je ne teste pas tous les mots du dico, je passe au suivant a la premier difference trouvee (mais dans mon programme il subsiste un probleme de taille : imaginons que le dictionnaire contienne ces deux mots : abcdef et bacdef, si le mot a placer est aacdef, le mot bacdef sera valider). Bref c'est le bordel, c'est pour ca qu'utiliser strcmp est tout indiquer, surtout qu'il s'agit d'une fonctione standard. Si ta prof veut vraiment pas que tu l'utilise tu peux la reecrire :
int strcmp(char *str1, char *str2)
{
//On verifie d'abord les tailles
//Pas la peine de chercher plus loins si les tailles sont differentes
int taille1, taille2;
taille1 0; taille2 0;
while(str1[taille1])
taille1++;
while(str2[taille2])
taille2++;
if(taille1 != taille2)
return taille1-taille2;
//Si les tailles sont identique, on compte le nombre de difference
//Entre les deux chaines
taille1 0; taille2 0;
while(str1[taille1])
{
if(str1[taille1] != str2[taille1])
taille2++;
taille1++;
}
return taille2;
}
Voila, je croi que tu as toutes les clefs en mains pour satisfaire ta prof sans trop te casser le c** ^^.
Vous n’avez pas trouvé la réponse que vous recherchez ?
bowen_tk
Messages postés8Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention28 janvier 2006 28 janv. 2006 à 11:15
Merci beaucoup ctx_man
Sinon vous avez des idées pour cette question
"Autre question donc en sorti j'aurais un nombre et j'aimerais aussi comparer les lettres de ce mots avec les lettres qui sont sur le chevalet comment faire car ce que j'ai fait ca ne marche pas et j'aimerais qu'en sorti ca soit aussi 1 ou 0
je dois aussi utiliser une structure tres simple avec des for ou if ou while dans le style que je propose donc avez vous des idées?"
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 janv. 2006 à 12:16
La recherche séquentielle est très mauvaise, ici tu peux faire une recherche dichotomique. Comme tu es en C++, tu peux en profiter et utiliser un set<string>. Ainsi pour 22498, tu pourra savoir si ton mot est présent en moins de 15 comparaisons
set<string> mots;
-tu remplis mots: pour chaque mot: mots.insert(...);
-pour savoir si un mot est présent ensuite:
if(mots.find("lemot") != mots.end())
{
// le mot est présent
}
bowen_tk
Messages postés8Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention28 janvier 2006 28 janv. 2006 à 12:45
ui tout a fait mais je comprend pas le bout de code que tu donne
Pour le dico il est ranger dans l'ordre alphabetique je comprend qu'une recherche dichotomique est plus interessante mais je ne vois pas ce que tu veux dire avec le code
bowen_tk
Messages postés8Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention28 janvier 2006 28 janv. 2006 à 14:40
et quand je lance la procedure je met koi? present(??) et avant il faut que je fasse ajouter(??)
desole de poser des questions mais mot et mots correspondent a quoi? et je dois charger une bibliotheque???
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 janv. 2006 à 14:56
Tu fais pas trop d'efforts j'ai l'impression, ya rien de compliqué. Les fonctions ajouter et présent, c'est a toi de les appeler quand tu en as besoin, ca me semble logique.
Mais j'ai vu plus haut que tu ne savais pas ce qu'était un booléen, donc je pense que ca va pas être forcément facile pour toi de débuter avec ca