Sortir d'une boucle infinie pour revenir dans celle du dessus (sous-menu => menu

Signaler
-
Messages postés
3820
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
1 décembre 2020
-
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;
}
A voir également:

2 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Salut,

tu pourrais mettre ta fonction Menu() dans la 1ere boucle do while

do{
    menu(); // <----------- ici
    reponse = getch();
    switch (reponse)
    {
    }
}while(saisie!='3');


tu aurais pu aussi faire un "goto etiquette"

RET_MENU:// <----------- ici
menu(); 
do{
    reponse = getch();
    switch (reponse)
    {
        case 'x':
        while(boucle) 
        {
           switch(ch)
           {
               case 'g': goto RET_MENU; // <------- ici
           }
       }
    }
}while(saisie!='3');


bye...
Messages postés
3820
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
1 décembre 2020
113
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