Boucle do while en langage C

Résolu/Fermé
thotoss - 6 avril 2008 à 13:21
Emmanuel Delahaye Messages postés 106 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);

3 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 avril 2008 à 13:32
Salut,

fait voir ta fonction mot_valide
0
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
6 avril 2008 à 13:49
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
6 avril 2008 à 14:53
personne ne peut me sortir de la ? me trouver une explication ??
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
6 avril 2008 à 15:08
Donne ton code complet, pour que je teste chez moi et je te dirai ce qui ne va pas.
0
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 106 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
27 mai 2010 à 08:57
Apprenez à utiliser les balises de code (icone [<>])
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
6 avril 2008 à 16:03
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
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 lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125 > thotoss
7 avril 2008 à 12:14
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 lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010
7 avril 2008 à 12:24
yess sa marche en vidant le buffer !! merci bocoup !
0