Problème fonction

Résolu/Fermé
anthony - 31 juil. 2009 à 02:07
 anthony - 1 août 2009 à 00:09
Bonjour,
Dans ce code C censer faire un menu et afficher un message d'erreur quand la commande est mauvaise se répète 1 fois ce qu'i n'est pas normale
voila le code:
#include <stdlib.h>
#include <math.h>
#include <time.h>
int menu()
{
    int choix = 0;

        printf("===MENU===\n");
        printf("1. big-mac\n");
        printf("2. poisson\n");
        scanf("%d", &choix);

    return choix;
}

int main()
{
    if(menu() == 1)
    {
        printf("Vous avez choisi big-mac\n");
    }
    else if(menu() == 2)
    {
        printf("Vous avez choisi poisson\n");
    }
    else
    {
        printf("Désolez vous avez tapez une mauvaise commande\n");
    }

    return 0;
}


Je tape une commande incorrecte pour tester le code s'il renvoie un message d'erreur et voici le résultat :
[user@guillemot test]$ ./main 
===MENU===
1. big-mac
2. poisson
3
===MENU===
1. big-mac
2. poisson
3
Désolez vous avez tapez une mauvaise commande
[user@guillemot test]$ 

vous voyez le menue se repete une 2 eme fois ce qui n'est pas normale il n'y a pas de boucle et normalement il devrait avoir un message d'erreur directement le menu devrait pas se repeter
A voir également:

14 réponses

Annhydrium Messages postés 1768 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 3 mars 2011 257
31 juil. 2009 à 02:49
a quel moment fai tu une fonction ... il me semble qu'un fontion s'écrit
funtion tonnom{

ta fonction


}
0
DrNitro Messages postés 681 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 5 janvier 2015 99
31 juil. 2009 à 03:40
en fait tu apple 2 fois la meme foncion
if(menu() == 1) //affiche le 1er menu
(...) //et le prog s'arret ici
//si non
else if(menu() == 2) //affiche 2eme menu et attend une reponse
tu devrait utiliser un ' case switch ' ou d'introduire une variable
x=menu();//affiche un seul menu pour tout le prog
if(x== 1)
(...)
else if(x== 2)
(...)
0
désoler j'ai pas trop compris ton explication voici comment je vois les chose
#include <stdlib.h>
#include <math.h>
#include <time.h>
int menu()
{
    int choix = 0;

        printf("===MENU===\n");
        printf("1. big-mac\n");
        printf("2. poisson\n");
        scanf("%d", &choix);

    return choix;
}

int main()
{
    if(menu() == 1)
    {
        printf("Vous avez choisi big-mac\n");
    }
    else if(menu() == 2)
    {
        printf("Vous avez choisi poisson\n");
    }
    else
    {
        printf("Désolez vous avez tapez une mauvaise commande\n");
    }

    return 0;
}

tout d'abord il y a la fonction menu() de type int elle prend aucun paramettre en entrer puis après dans la fonction on lui demande d'afficher le menu et on demande de faire un choix d'ou ce choix va être stocké dans la variable choix ce choix va etre retrouné en sortie puis après il y a la fonction main avec des confition la condition dit que si menu() == 1 alors affiche Vous avez choisi big-mac sinon si menu() est égale a 2 affiche Vous avez choisi poisson sinon si aucun des 2 choix est choisi affiche le message d'erreure Désolez vous avez tapez une mauvaise commande puis le programme s'arrete donc je ne vois pas ou est le problème dans ce code


Je croit que c'est a partir d'ici dans ton explication que je n'ai pas compris:
//si non
else if(menu() == 2) //affiche 2eme menu et attend une reponse
tu devrait utiliser un ' case switch ' ou d'introduire une variable
x=menu();//affiche un seul menu pour tout le prog

pourquoi affiche un 2eme menu et attend un reponse ??
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
31 juil. 2009 à 18:27
Bonsoir, voici ton code corrigé :

int main()
{
Choix=menu()
if( Choix== 1)
{
printf("Vous avez choisi big-mac\n");
}
else{
if(Choix == 2)
{
printf("Vous avez choisi poisson\n");
}
else
{
printf("Désolez vous avez tapez une mauvaise commande\n");
}
}

return 0;
}

Mais le mieux est de passer par un select case :

int main()
{
Choix=menu()
select case Choix:
Case 1:
{
printf("Vous avez choisi big-mac\n");
break;
}
Case 2:
{
printf("Vous avez choisi poisson\n");
break;
}
Case else:
{
printf("Désolez vous avez tapez une mauvaise commande\n");
}

return 0;
}


:)
0

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

Posez votre question
ah ben oui ton code marche parfaitement mais pourrait tu m'expliquer pourquoi avoir stocker menu() dans la varibale choix. pourquoi ne pas directement mettre menu() dans la condition comme j'ai fait ??
voici un code que j'ai pris dan sle site du zero :
 switch (menu())
    {
        case 1:
            printf("Vous avez pris le poulet\n");
            break;
        case 2:
            printf("Vous avez pris les concombres\n");
            break;
        case 3:
            printf("Vous avez pris l'escalope\n");
            break;
        case 4:
            printf("Vous avez pris la surprise du Chef. Vous etes un sacre aventurier dites donc !\n");
            break;    
    }

tu vois dans switch il a directement ajouter menu() a la place de le mettre dans une variable choix
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
31 juil. 2009 à 18:59
:)

Ah oui, c'est pas select case mais switch.. desolé, mais a force de pratiquer plusieurs langages, j en pert mon latin ;)

Bon, pourque passer par une variable Choix.. ben pour éviter de raffaichir le menu d une part (ca c'etait ta requete, sinon, pour chaque if il te l affiche ;) ).. et en regle générale, si tu veux utiliser plusieurs fois le meme résultat d une fonction, il vaut mieux stocker ce résultat que de rappeler la fonction.. c'est plus rapide ;).. bon ok, c'est quelques nanoseconde pour ton ptit code.. mais ca peut etre tres long suivant ce que la dite fonction doit traitée ;)
0
ah ok ben merci de ton aide
0
eu non en faite il me resste encore une question pourquoi a chaque if il aurait afficher le menu ??
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
31 juil. 2009 à 20:58
int main()
{
if(menu() == 1) => là il te l'affiche.. si l utilisateur choisi 2 ou autre.. il passe
{
printf("Vous avez choisi big-mac\n");
}
else if(menu() == 2) =>là il te l'affiche.. si l utilisateur choisi autre.. il passe
{
printf("Vous avez choisi poisson\n");
}
else
{
printf("Désolez vous avez tapez une mauvaise commande\n");
}

return 0;
}
0
int main()
{
if(menu() == 1) => là il te l'affiche.. si l utilisateur choisi 2 ou autre.. il passe
{
printf("Vous avez choisi big-mac\n");
}
else if(menu() == 2) =>là il te l'affiche.. si l utilisateur choisi autre.. il passe
{
printf("Vous avez choisi poisson\n");
}
else
{
printf("Désolez vous avez tapez une mauvaise commande\n");
}

return 0;
} 

j'ai pas trop compris l'ordinateur quand il lit le programme il va lire les condition qui sont dans la fonction main et dans les condition je fait apelle a la fonction menu() il va lire la fonction menu() puis il va afficher les printf donc en gros il commence a afficher le menu puis si la valeur de la variable choix est 1 il affiche Vous avez choisi big-mac mais si la valeur de choix n'est pas 1 mais 2 il va afficher le printf qui dans la condition else if ou sinon si la valeur n'est pas 1 ni 2 il va afficher le printf ou il affiche le message d'erreure donc pourquoi il affiche le menu 2 fois

est comme tu dit si je choisi 1 il me l'affiche et le programme s'arrete mais si je choisi 2 il me l'affiche 1 fois le menu et la commande et le programme s'arrete
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
31 juil. 2009 à 22:52
Car tu reteste menu() si c'est pas 1.. et donc il te raffiche le menu.. c'est logique pourtant !!
0
ah ok je vient de comprendre lol il reteste le menu() car si c'est pas 1 l'ordinateur va lire la suite de la condition c'est a dire le else if et comme dans le else if je fait appelle a la fonction menu() il va la retester ?? est ce exacte ??
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
31 juil. 2009 à 23:35
Et oui ;)

D'où l interet de l apelé au début et de mettre le résultat dans une variable.. pour apres n avoir a tester que la variable ;)

Probleme résolu donc ?
0
oui sayer il est résolue et merci encore de ton aide
0