Boucle do while en langage C [Résolu/Fermé]

- - Dernière réponse : Emmanuel Delahaye
Messages postés
105
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
- 27 mai 2010 à 08:57
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);
Afficher la suite 

3 réponses

Messages postés
21510
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
8 octobre 2012
3375
0
Merci
Salut,

fait voir ta fonction mot_valide
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 ?
> 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)
.......
...
..
}
> thotoss -
personne ne peut me sortir de la ? me trouver une explication ??
Messages postés
21510
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
8 octobre 2012
3375
0
Merci
Donne ton code complet, pour que je teste chez moi et je te dirai ce qui ne va pas.
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);
}
Emmanuel Delahaye
Messages postés
105
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
7 -
Apprenez à utiliser les balises de code (icone [<>])
Messages postés
499
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
120
0
Merci
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 ;-)
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
Mahmah
Messages postés
499
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
120 > thotoss -
On peut lui donner l'entrée standard en paramètre.

fgets( str, strSize, stdin );

Ca marche en vidant le buffer clavier ?

M.
> Mahmah
Messages postés
499
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
-
yess sa marche en vidant le buffer !! merci bocoup !