Problème de programmation

grongnet -  
 cgrongnet -
Bonjour,
Voilà le petit bout de programme suivant affiche toujours un fois de trop le menu, je l'ai débarrassé du superflu. Quelqu'un aurait-il une idée ? Merci beaucoup:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <unistd.h>

int GESTION();
int DIALOGUE(int);
int ACQUISITION(int);
int CONSULTATION(int);
int HEURISTIQUE(int);
int INTERACTION(int);

int AfficheMenu();

/* Variable globale teste les menus disponibles */
int gTabMenu[5];
int gAppelMenu;

int main(int argc, char** argv)
{
AfficheMenu();
if(GESTION() != 0)
{puts("PROGRAMME INDISPONIBLE"); return 0;}



return EXIT_SUCCESS;
}

int GESTION()
{
/* Cette procédure va permettre de profiler ce qui sera proposé au menu */
/* et ensuite dans les sous menus */

gAppelMenu = 0;

//ACQUISITION(gAppelMenu);
return 0;
}

int AfficheMenu()
{
/*On vérifie d'abord ce que peut proposer le programme afin*/
/*d'afficher un Menu réaliste. Par exemple lire le source
DIALOGUE(gAppelMenu);
ACQUISITION(gAppelMenu);
CONSULTATION(gAppelMenu);
HEURISTIQUE(gAppelMenu);
INTERACTION(gAppelMenu);*/

/****************************************************
* MenuGénéral
****************************************************/
char c;
do
{
puts(" ==========================================================================");
puts("\t\n GrpMLPCG-2009");
puts("\t\t\t\t ROBOTLING\n\n\n");
puts("\t\t\t(Activités possibles)\n\n");
if(gTabMenu[2]==0)
puts("\t\t\t-1)- DIALOGUE ");
if(gTabMenu[0]==0)
puts("\t\t\t-2)- ACQUISITION");
if(gTabMenu[3]==0)
puts("\t\t\t-3)- HEURISTIQUE");
if(gTabMenu[1]==0)
puts("\t\t\t-4)- CONSULTATION");
if(gTabMenu[4]==0)
puts("\t\t\t-5)- INTERACTION");
puts("\t\t\t-Q)- QUITTER");

switch (c)
{
case '1':
DIALOGUE(gAppelMenu);break;
case '2':
ACQUISITION(gAppelMenu);break;
case '3':
HEURISTIQUE(gAppelMenu);break;
case '4':
CONSULTATION(gAppelMenu);break;
case '5':
INTERACTION(gAppelMenu);break;
case 'Q':break;
default:
sleep(2);break;
}
}while((c=toupper(getchar()))!='Q' );
return 0;
}


int ACQUISITION(gAppelMenu)
{
/****************************************************
* MenuAcquisition
****************************************************/
if(gAppelMenu != 0)
gTabMenu[0]=0;

puts("DANS ACQUISITION");
return 0;
}

int CONSULTATION(gAppelMenu)
{
/****************************************************
* MenuConsultation
****************************************************/
gTabMenu[1]=0;

return 0;
}

int DIALOGUE(gAppelMenu)
{
/****************************************************
* MenuDialogue
****************************************************/
gTabMenu[2]=0;

return 0;
}

int HEURISTIQUE(gAppelMenu)
{
/****************************************************
* MenuHeuristique
****************************************************/
gTabMenu[3]=0;

return 0;
}


int INTERACTION(gAppelMenu)
{
/****************************************************
* MenuInteraction
****************************************************/
gTabMenu[4]=0;

return 0;
}

2 réponses

calibos
 
Bonjour,

C'est la fonction getchar() qui est en cause.
Quand tu appelles getchar(), le prog attends que tu entres un caractère suivi de 'Enter'.
Ce qui fait 2 caractères par exemple '1' et '\n', le menu est affiché une fois pour '1' et une autre fois pour '\n'.

solution: tester si le caractère est '\n' alors ne pas afficher le menu.

char c;
c='\0';
do
{
if (c!='\n') {
puts(" ==========================================================================");
puts("\t\n GrpMLPCG-2009");
puts("\t\t\t\t ROBOTLING\n\n\n");
puts("\t\t\t(Activités possibles)\n\n");
if(gTabMenu[2]==0)
puts("\t\t\t-1)- DIALOGUE ");
if(gTabMenu[0]==0)
puts("\t\t\t-2)- ACQUISITION");
if(gTabMenu[3]==0)
puts("\t\t\t-3)- HEURISTIQUE");
if(gTabMenu[1]==0)
puts("\t\t\t-4)- CONSULTATION");
if(gTabMenu[4]==0)
puts("\t\t\t-5)- INTERACTION");
puts("\t\t\t-Q)- QUITTER");
}

Salut.
0
cgrongnet
 
Bonsoir,
Merci de ta réponse, j'ai effectivement adopté une solution du même type, sympa de ta part !
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
bonjour, prière d'utiliser si possible les balises code pour les gros morceaux... (le bouton à droite de gras italique souligné)


je dois dire sinon que j'ai beaucoup de mal à comprendre votre code, ce que vous voulez faire / pensez faire. Cette histoire de tableau mis à zéro me trouble pas mal. Et sinon le tableau est utilisé avant sans être initialisé, ce qui est plutôt dangereux comme pratique...
0