Vérification

Fermé
mac - 23 janv. 2010 à 15:50
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 24 janv. 2010 à 23:00
Bonjour,
je voudrais faire un programme en C qui vérifie si les lettres d'un mot donné appartiennent à la grille de lettres proposée, un peu genre lettres du jeu chiffres et lettres. Par ex:

Lettres proposées: A U F L I O Y T C

Mot : FLAC!!!

J'ai bien besoin d'aide!!

3 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
23 janv. 2010 à 16:20
Bonjour,

tu prends la première lettre de ton mot. Est-elle dans la liste ? si non alors c'est fini.
Si oui, tu regardes à quel endroit (tu stockes l'indice où la lettre est dans la grille dans un tableau),

ensuite tu prends la deuxième lettre. Est-elle dans la liste ? si non alors c'est fini.
Si oui, tu regardes à quel endroit (tu stockes l'indice où la lettre est dans la grille ), et tu vérifies que tu ne l'a pas déjà utilisée (en comparant avec les indices déjà stockés). Si elle est déjà utilisée, alors il faut continuer à chercher dans la grille la même lettre.
Si tu ne la trouves pas c'est fini. Si tu la trouves, encore une fois il faut vérifier que tu ne l'as pas déjà utilisée (en comparant dans le tableau des indices utilisés)
Etc...
0
Oui exactement c'est cet algo que j'ai utilisé mais mon programme me fait défault. Je le met ci aprés:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main () {

FILE *file;

char dico[16]="dico.txt"; /* On charge le fichier dictionnaire.txt dans la chaine de caractère dico */

char mot_proposer[9]="rbarbitre";

char lettres[9];

char trouve[9];

char mot_rechercher[20]; /* On déclare la variable devant contenir les mots du dico */

int res=0,i,j=0,k,compt=0;

file = fopen(dico, "r"); /* On ouvre le dico en mode lecture */

if(file==NULL) { /* Si le fichier n'existe pas, il renvoie un message d'erreur */

fprintf(stderr,"Error: can't open file.\n");

}

else { /* Si le fichier existe */

/*fgets (mot_rechercher, sizeof mot_rechercher, file);

i=strcmp(mot_rechercher,mot_proposer);*/

while(!feof(file)) { /* Tant qu'on a pas atteint la fin du fichier */

fgets (mot_rechercher, sizeof mot_rechercher, file); /* On récupère le mot de la première ligne à la dernière */

while(mot_rechercher[j]!='\0'){

trouve=strchr(lettres,mot_rechercher[j]);

compt=compt+1;printf("compt %d ",compt);

j++;

}

if(compt==strlen(mot_rechercher))

strcpy(trouve,mot_rechercher);

}




}

fclose(file); /* Fermeture du fichier dictionnaire */

printf("%s\n",trouve);

return 0; /* On retourne la valeur de res, soit 1 ou 0 */

}
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
24 janv. 2010 à 16:10
Bonjour,

1) j'arrive mal à lire ton code et je n'ai pas trop envie de faire copier-coller vu qu'il n'y a pas d'indentation.
Utiliese les balises code pour conserver l'indentation

2) Tu devrais a) d'abord charger ton dico dans un tableau de chaine de caractères puis b) travailler avec ce tableau. Tu y gagneras énormément en lisibilité et en efficacité/rapidité.

3) je crois que tu n'as pas compris le point concernant le fait d'éviter de prendre plusieurs fois la même lettre pour comparer le mot...


4) l'algorithme en lui même est un mauvais choix dans ton cas. Là tu vas devoir, pour chaque mot du dictionnaire, faire l'algo de vérifier si on peut faire le mot. ça va être TRES TRES long si ton dico contient plusieurs milliers de mots.

Il faudrait, si tu veux pouvoir utiliser ton programme et que ce n'est pas juste un entrainement à la programmation, revoir ta stratégie avec par exemple une récursion sur les premières lettres.
0
Au fait, je suis d'accord avec toi sur le 4) et le 1). Mais concernant le 2) si j'utilise un tableau de caractère, je n'aurais pas beaucoup de mot dans mon dico car c'est limité à 512 caractères, a moins que j'ai mal compris ton idée. Concernant le 4), si je serais reconnaissant de me proposer une autre astuce parce que je suis a court d'idée.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
24 janv. 2010 à 23:00
à vrai dire pour le codage de l'algo ça va pas être très facile... je préfère le C++ ou le Java que le C pour ce genre de choses, avec le C je sens que ça va m'énerver ^^ .

d'autre part et concernant la manière de gérer le dico, je parlais d'un tableau de chaines de caractères, pas un tableau de caractères.
Un tableau où chaque élément seraient une chaine.
voir https://c.developpez.com/faq/?page=Les-chaines-de-caracteres#STRINGS_array_of_strings

ensuite tu travailleras avec cette matrice plutot que ton fichier, ce sera plus simple je pense.


Pour l'algorithme:

Tout d'abord il faut que ton dictionnaire soit trié.


Il faudrait :

ListeCarac <=> la liste de caractères avec laquelle tu peux faire tes mots
Dictionnaire <=> le tableau de chaines (Dictionnaire[0] est le premier mot, Dictionnaire[1] le deuxième, etc...


je vais essayer de te montrer l'algo auquel je pense, c'est peut-etre compliqué à comprendre...(avec du C++ ou java ça aurait assez simple à faire ^^ )

Fonction : RechercheRecursive(ListeCaractere, départ, fin, etape)
Si ListeCaractere n'est pas vide :
Pour i = 0 jusqu'à taille de ListeCaractere-1
   Pour j = depart jusqu'à fin
      Si Dictionnaire[j][etape] == '\0' c'est fini, on a trouvé un mot, on renvoie depart
      Trouver le premier et le dernier mot tel que Dictionnaire[j][etape]==ListeCaractere[i] (le premier j et le dernier j de sorte que c'est vrai).
      Si on en trouve aucun, on renvoie -1
      Sinon, si on en trouve au moins un:
         Recréer une liste de caractère avec ListeCaractere[i] en moins ->ListeCaractèreAmputee
         resultat =  RechercheRecursive(ListeCaractereAmputee, premier j, dernier j, etape+1)
         si resultat==-1 on continue,
         sinon c'est qu'on a trouvé un mot, donc on renvoie la valeur de resultat.

Si ListeCaractere est Vide lorsqu'on appelle la fonction, on vérifie que dictionnaire[depart][etape] vaut '\0' et si oui c'est qu'on a trouvé un mot, on renvoie "depart" . Sinon c'est qu'on a pas de quoi faire le mot en entier et on renvoie -1


Le programme consiste à appeler RechercheRecursive(ListeCarac, 0, taille de Dictionnaire-1, 0) et de regarder le résultat : si c'est -1 c'est que le mot n'y est pas, si c'est autre chose alors le premier mot qui correspond est Dictionnaire[valeur retournée]


Je ne sais pas si tu as saisis le principe...

Il y a donc pas mal de petit morceaux de code à programmer pour traduire tout ça.
0