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

fab936 - 16 mars 2013 à 14:05
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 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;
}

2 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
16 mars 2013 à 17:46
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...
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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
0
Rejoignez-nous