[C] Problème de boucle???

Fermé
Maaag - 18 janv. 2008 à 11:19
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 - 18 janv. 2008 à 15:31
Bonjour,

J'ai un petit soucis avec mon programme.
Voila j'ai un menu de choix dans mon programme avec une fonction différente pour chaque choix. Et le programme ré-affiche le menu de choix après l'avoir éxécuté.
Pour cela j'ai donc fait un do...while sur la réponse entrer (tant que l'utilisateur n'a pas choisit de quitter il réaffiche le menu)

Et le problème est le suivant, après avoir exécuté la fonction il me réaffiche bien mon menu mais en prenant déjà en compte une réponse, celle du défaut du switch (le mauvais choix) et me remet le menu après ou il me laisse le choix d'entrer quelque chose..
Je sais pas si j'ai été très clair...
Mais si vous avez des idées d'ou ca peut venir? De la boucle du menu? de la fonction?

Merci :(

15 réponses

SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
18 janv. 2008 à 11:24
tu peux nous montrer ton switch et les retours de tes fonctions (types et valeurs)?
0
pas de problème,
Voila le switch, dans le Do..While :

char reponse;

do {
printf("***************************************************\n");
printf("* Bienvenue dans le menu de gestion d'individus : *\n");
printf("***************************************************\n\n ");
printf(" N - Naissance\n D - Deces\n M - Mariage\n S - Separation\n A - Affichage\n Q - Quitter\n\n");
printf("Veuillez entrer votre choix : ");
reponse=getchar();
printf("\n\n");


switch (reponse) {
case 'A' :
affichage();
break;
default :
printf("Mauvais choix !!\n\n\n");
break;
}
}
while (reponse != 'Q');

Pour l'instant il n'y a que la fonction afficher, parce que j'avais déjà fait les autres mais comme je voyais pas d'ou venait le bug j'ai tout repris petit a petit, et ca bug déjà à la première fonction :(
Affichage et donc du type :

void affichage();
0
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
18 janv. 2008 à 11:30
ton switch prend des entiers en paramètres, pas des caractères...
si tu veux traiter des caractères, il faut que tu travailles avec des "if"
0
Euh tu es sur de cela? parce que mon switch il fonctionne c'est juste qu'à la fin de lafonction il remet le menu "deux fois"..
De plus c'est notre prof qui nous a dit d'utiliser un case, et chez d'autres etudiants pas de problème.. donc je comprend pas trop :s
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je confirme, après vérification dans mon cours, le switch fonctionne sur des caractères, c'est sur les CHAINES de caractères que cela ne fonctionne pas....
0
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
18 janv. 2008 à 11:46
après ton getchar, fais un printf("%c",reponse);, pour voir ce qu'il y a dans ta réponse...
0
Il y a bien le caractère que j'ai entrer...
0
J'ai testé le case avec un printf tout simple a la place de la fonction, ca fait la meme chose...
Le problème vient donc forcément du do/while ou du switch mais je vois VRAIMENT pas ou ... :(

Si quelqu'un trouve merci :(
0
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
18 janv. 2008 à 12:49
tu entre bien des majuscules?
sinon, il faudrait que tu fasse
case 'A':
case 'a':
affichage();
break;
etc...
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
18 janv. 2008 à 13:15
le probleme c'est que apres avoir fait ton choix tu appuies sur entree donc le caractere '\n' est rentré dans la variable reponse donc ton switch prends le choix par default...

la solution tu rajoutes:
getchar();


apres
reponse=getchar();
0
Oui j'entre bien des majuscules..
Et j'ai trouvé une solution : mettre fgetc(stdin) juste après mon getchar().. c'est pas optimal mais ca marche.
Merci pour ton aide en tout cas
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
18 janv. 2008 à 13:18
j'arrive trop tard ;)
0
SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
18 janv. 2008 à 13:27
sinon, tu peux faire un scanf("%c",&reponse); à la place de ton getchar();
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
18 janv. 2008 à 13:32
ça va rien changer...il va toujours lui manquer un getchar() pour recuperer '\n'
0
Bon en fait ma solution n'est qu'à moitié juste...
Parce que si je rentre un mauvaix choix il me le dit et me réaffiche un menu avec un mauvais choix déjà entrer et après un menu "vierge"

Par contre si je combine ta soluce mype avec la mienne ca marche a un détail près obligé d'appuyer sur entrer après avoir entrer le choix ...
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
18 janv. 2008 à 13:44
j'ai pas trop compris...
comme ça ça marche pas ?
char reponse;

do {
printf("***************************************************\n");
printf("* Bienvenue dans le menu de gestion d'individus : *\n");
printf("***************************************************\n\n ");
printf(" N - Naissance\n D - Deces\n M - Mariage\n S - Separation\n A - Affichage\n Q - Quitter\n\n");
printf("Veuillez entrer votre choix : ");
reponse=getchar();
getchar();
printf("\n\n");


switch (reponse) {
case 'A' :
affichage();
break;
default :
printf("Mauvais choix !!\n\n\n");
break;
}
}
while (reponse != 'Q');    return 0;}
0
Non comme ca:

char reponse;

do {
printf("***************************************************\n");
printf("* Bienvenue dans le menu de gestion d'individus : *\n");
printf("***************************************************\n\n ");
printf(" N - Naissance\n D - Deces\n M - Mariage\n S - Separation\n A - Affichage\n Q - Quitter\n\n");
printf("Veuillez entrer votre choix : ");
reponse=getchar();
getchar();
fgetc(stdin);
printf("\n\n");


switch (reponse) {
case 'A' :
affichage();
break;
default :
printf("Mauvais choix !!\n\n\n");
break;
}
}
while (reponse != 'Q'); return 0;}


Avec le fgetc(stdin) en plus après getchar();... seul hic devoir appuyer sur entré après
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
18 janv. 2008 à 15:31
ben oui c'est normal il faut qu'un seul...
donc tu mets soit le fgetc(stdin) ou le getchar()
a toi de choisir ;)
0