Fonction Scrabble

Signaler
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
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

aider moi svp

merci d'avance

13 réponses

Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

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

aidez moi svp
Messages postés
237
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
22 juillet 2011
2
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;
}

Bonne soirée @+
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

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?

merci d'avance
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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** ^^.
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

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?"
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

d'ailleur comment on appelle la fonction
bool Cjeu::dansDico(char *motaplacer)
{
for(int i=0; i<22498; i++)
{
if(strcmp(dictionnaire[i].mot, motaplacer) == 0)
return true;
}
return false;
}

Comparer(?)

merci d'avance
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
}
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

vecchio56 pourrais tu un peu detailler car la j'ai pas tout compris et tu parle pour la question sur la recherche dans un dico ou pour l'autre??
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pour la recherche oui. Je crois que j'ai tout expliqué. Il s'agit bien de savoir si un mot est présent dans une liste?
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
la map c'est juste pour le simplifier la vie. Si tu préfères:

void ajouter(const char* mot)
{
mots.insert(mot);
}

bool present(const char* mot)
{
return mots.find(mot) != mots.end();
}
Messages postés
8
Date d'inscription
vendredi 27 janvier 2006
Statut
Membre
Dernière intervention
28 janvier 2006

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???
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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