Boucle do while en langage C

Résolu
thotoss -  
Emmanuel Delahaye Messages postés 107 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai une petite question :
j'ai nommé mot_valide une fonction qui, pour simplifier, verifie si un mot donné est present dans un fichier, et qui me renvoi 0 si le mot ce n'est pas la cas, et 1 si le mot c'est la cas. J'effectue donc un do while de la manière suivante, de façon a recommencer jusqu'a l'obtention d'un mot valide ! cependant quand je rentre un mot qui n'existe pas, il reboucle, me raffiche bien "Entrez votre mot :", mais la il passe directement a "Choisir votre direction..." sans que je puisse rentrer un autre mot. Cela n'est il pas possible ?? merci si vous pouvez m'aider !


do
{
printf("Entrez votre mot :\n");
gets(mot);
printf("Choisir votre direction pour placer le mot : 0=>droite 1=>bas \n");
scanf("%d",&direction);
printf("Choisir l'abscice de la premiere lettre de votre mot : \n");
scanf("%d",&coord_X);
printf("Choisir l'ordonnee de la premiere lettre de votre mot : \n");
scanf("%d",&coord_Y);
mot_valide(plateau_de_jeu,mot,direction,coord_X ,coord_Y);
}
while (mot_valide(plateau_de_jeu,mot,direction,coord_X ,coord_Y)!=1);

3 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

fait voir ta fonction mot_valide
0
thotoss
 
Salut !
merci de m'aider encore ! la fonction est celle que vous m'avez faites dans l'autre post ^^ et elle marche sans souci ... le probleme est qu'il me redemande bien un mot si le precedent n'était pas valide, mais il ne me laisse pas" le temps" pour l'ecrire et passe a la suite. Ma fonction marche , c(est une certitude ... voulez vous quand méme que je l'écrive ?
0
thotoss > thotoss
 
J'ecris quand meme ma fonction (le début apré sa se repete ) :

int mot_valide(int plateau[15][15], char mot[20], int direction, int coord_X, int coord_Y)
{
int longueur=strlen(mot)+1;
int existe=0; // indique si le mot existe dans le dico //
int i,j;
char mot_bis[longueur];
FILE * entree;
if (coord_X + longueur > 14 || coord_Y + longueur > 14)
{
printf("Le mot sort du plateau de jeu ! \n");
return 0;
}
else if (longueur==3)
{
entree=fopen("2_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==4)
.......
...
..
}
0
thotoss > thotoss
 
personne ne peut me sortir de la ? me trouver une explication ??
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Donne ton code complet, pour que je teste chez moi et je te dirai ce qui ne va pas.
0
thotoss
 
Alors voici le code, le probleme c'est que je vais chercher dans des fichiers si le mot rentré existe, et vous n'avez pas ces fichiers...

Voici ma fonction (elle se repete pour un mot allant de 2 a 15 lettres je n'ai pas trouvé un moyen de la rendre plus courte) :

int mot_valide(int plateau[15][15], char mot[20], int direction, int coord_X, int coord_Y)
{
int longueur=strlen(mot)+1;
int existe=0; // indique si le mot existe dans le dico //
int i,j;
char mot_bis[longueur];
FILE * entree;
if (coord_X + longueur > 14 || coord_Y + longueur > 14)
{
printf("Le mot sort du plateau de jeu ! \n");
return 0;
}
else if (longueur==3)
{
entree=fopen("2_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==4)
{
entree=fopen("3_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==5)
{
entree=fopen("4_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==6)
{
entree=fopen("5_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==7)
{
entree=fopen("6_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==8)
{
entree=fopen("7_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==9)
{
entree=fopen("8_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==10)
{
entree=fopen("9_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==11)
{
entree=fopen("10_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==12)
{
entree=fopen("11_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==13)
{
entree=fopen("12_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==14)
{
entree=fopen("13_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==15)
{
entree=fopen("14_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
else if (longueur==16)
{
entree=fopen("15_lettres.txt","r");
do
{
fscanf (entree,"%s",mot_bis);
if (strcmp(mot_bis,mot)==0)
{
existe=longueur-1;
return 1;
}
}
while (!feof(entree) && strcmp(mot_bis,mot)!=0);
if(!existe)
{
printf ("Le mot %s n'existe pas!\n",mot);
return 0;
}

}
}


Et voici le programme principal :


main()
{

int mot_valide(int [15][15], char [20], int , int , int );

int plateau_de_jeu[15][15];
int i,j,coord_X,coord_Y,direction,valeur_mot;
char mot[20];

printf("Bonjour !\n ");
do
{
printf("Entrez votre mot :\n");
gets(mot);
printf("Choisir votre direction pour placer le mot : 0=>droite 1=>bas \n");
scanf("%d",&direction);
printf("Choisir l'abscice de la premiere lettre de votre mot : \n");
scanf("%d",&coord_X);
printf("Choisir l'ordonnee de la premiere lettre de votre mot : \n");
scanf("%d",&coord_Y);
mot_valide(plateau_de_jeu,mot,direction,coord_X ,coord_Y);
}
while (mot_valide(plateau_de_jeu,mot,direction,coord_X ,coord_Y)!=1);
}
0
Emmanuel Delahaye Messages postés 107 Date d'inscription   Statut Membre Dernière intervention   7
 
Apprenez à utiliser les balises de code (icone [<>])
0
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
Salutations,

Sans vraiment regarder le code, le problème décrit ressemble à une entrée standard non vidée. Ce qui fait que la saisie du mot est satisfaite avec une ancienne entrée (probablement un retour chariot) et qu'elle devient non bloquante. C'est généralement gets et fgets qui pose ce type de soucis.

Je mets un petit lien, c'est peut-être bien ce genre de chose qu'il faut faire avant la saisie du mot. (Et des autres saisies aussi)

M.

PS:
Dans ce même lien il y a pourquoi préférer fgets à gets aussi ;-)
0
thotoss
 
Bonjour,
le probleme c'est que moi je dois rentrer le mot, alors que fgets le prend dans un fichier non ? comment faire alors ?
merci
0
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125 > thotoss
 
On peut lui donner l'entrée standard en paramètre.

fgets( str, strSize, stdin );

Ca marche en vidant le buffer clavier ?

M.
0
thotoss > Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention  
 
yess sa marche en vidant le buffer !! merci bocoup !
0