Sortir d'une boucle infinie pour revenir dans celle du dessus (sous-menu => menu
fab936
-
16 mars 2013 à 14:05
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
17 mars 2013 à 15:05
bonjour à tous,
je débute en programmation et je passe donc par le C.
Je souhaite realiser un petit programme (un jeu) mais j'ai un probleme au niveau des boucles de mes menus.
Dans mon 1ere boucle, j'ai mon menu, accompagné d'un switch pour que l'utilisateur choisissent son option.
Dans ma seconde boucle (je suis obligé de créer une boucle pour mon jeu puisse "tourner", il y a un sous menu dans lequel j'aimerais que l'utilisateur puisse pouvoir revenir au menu principal (avec un getchar et un switch également)
J'ai essayé pas mal de chose mais je n'y suis pas arrivé.
un return me fait sortir du programme, j'ai tenté ici en essayant de remettre la valeur de la boucle à 0 en esperant que ca ne boucle plus, mais ca ne marche pas non plus.
Je précise que je parle du case 'g' .
Comme je vous ai dis, je débute, donc toutes les remarques sont bonnes à prendre concernant mon code.
Merci d'avance
int main(void)
{
char reponse, choix;
char a, c;
menu();
do{
reponse = getch();
switch (reponse)
{
case 'x':
afficher(valeurs);
int boucle=1;
while(boucle)
{
calculer(valeurs);
ch = getchar();
switch(ch)
{
case 't': verification();break;
case 'p':demandeEncore();break;
case 'g': boucle=0;break;
}
}
break;
case '2': break;
case '3': SortieProgramme();break;
default : retour_menu();break;
}
}while(saisie!='3');
return 0;
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 17 mars 2013 à 15:05
Bonjour.
La première solution de yann_lo_san est la bonne.
La deuxième solution, utilisant un goto est déconseillée. Le goto est outil très spécifique, qui sert dans des conditions particulières. Il est à éviter car il mène vers du code "spaghetti" (très difficile à maintenir). On peut toujours se passer d'un goto, et son utilisation par des débutants est souvent signe d'une mauvaise conception.
Pour tout ce qui est menu, on sépare généralement la logique de demande d'une valeur, des actions à faire. Je te propose une solution:
#include <stdio.h>
/* En C89, on n'a pas de type booleen. Voici une adaptation */
#define bool char
#define true 1
#define false 0
/* Fonctions pratiques */
void flushBuffer(void)
{
while (getchar() != '\n')
;
}
bool isInTab(char c, char tab[], int size)
{
int i = 0;
for (i = 0; i < size; ++i)
if (c == tab[i])
return true;
return false;
}
char askChar(char tab[], int size)
{
char c = 0;
bool isValid = false;
while (!isValid)
{
printf("Enter choice: ");
c = getchar();
flushBuffer();
if (isInTab(c, tab, size))
isValid = true;
else
printf("%c: Invalid choice !\n", c);
}
return c;
}
char askMainChoice(void)
{
char tab[] = {'x', '2', '3'};
int size = sizeof(tab) / sizeof(*tab);
return askChar(tab, size);
}
char askComputeChoice(void)
{
char tab[] = {'t', 'p', 'g'};
int size = sizeof(tab) / sizeof(*tab);
return askChar(tab, size);
}
void menu(void)
{
printf("MENU\n");
}
void computeValues(void)
{
char response = 0;
bool stop = false;
while (!stop)
{
response = askComputeChoice();
switch (response)
{
case 't':
printf("verification\n");
/* verification(); */
break;
case 'p':
printf("demandeEncore\n");
/* demandeEncore(); */
break;
case 'g':
printf("stop compute\n");
stop = true;
break;
}
}
}
int main(void)
{
char response = 0;
bool stop = false;
while (!stop)
{
menu();
response = askMainChoice();
switch (response)
{
case 'x':
printf("afficher(valeurs)\n");
/*afficher(valeurs);*/
computeValues();
break;
case '2':
printf("choice 2\n");
break;
case '3':
stop = true;
}
}
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question