IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Crée un précédent et un Raz de la console


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Crée un précédent et un Raz de la console
    Bonjour je suis tout nouveau sur le forum mais aussi en tant que programmeur de C!

    J'ai 2 questions

    Je débute vraiment ... donc j'ai un peu de mal ...

    J'ai fais un script pour m'amuser qui ressemble à quelque chose comme (simplifier ici):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    long menucase1()
    {
     long choixcase1;
      printf("Menu\n\n");
      printf("1. x\n");
      scanf("%ld", &choixcase1);
      printf("\n");
    return choixcase1;
    }
     
    long menucase11()
    {
     long choixcase11;
      printf("Menu 1.1 \n\n");
      printf("1. y\n");
      scanf("%ld", &choixcase11);
      printf("\n");
    return choixcase11;
    }
     
    int main(int argc, char *argv[])
    {
     
    switch (menuhcase1()) // Le premier menu, avec 1. x
      {
        case 1:
            switch (menucase11()) // Si le premier choix est choisis, un nouveau menu aparait
             {
               case 1:
                 printf("hello"); // Et si le premier choix est encore choisis, cela affiche "hello"
                 break;
             }
       break;
       }
    }
    Je voudrais savoir comment par exemple du 2ème menu (menucase11) on peu faire pour revenir au menu précendent (par exemple rajouter un printf(2. Précendent) qui permetrais d'arrivé sur le menu d'avant.

    Je voudrais aussi savoir si il y a une commande pour qu'a chaque nouveau menu la console s'efface ne laissant que le nouveau menu!

    Merci de vos réponces.

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Il y a beaucoup de répétition de code entre menucase1() et menucase11(), mais dans l'ensemble c'est pas mal. Voici quelques remarques et modifications:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <stdio.h>
     
    /* -tc- Permet de faire le menage dans le tampon du flux d'entree standard */
    void purge(void)
    {
        int c;
     
        while ((c = getchar()) != '\n' && c != EOF)
        {
        }
    }
     
    /* -tc- Pour etre declaree sous forme de prototype (conseille), une fonction
       doit specifier qu'elle ne prend aucuns arguments a l'aide de void */
    long menucase1(void)
    {
        long choixcase1;
        int const MENU_NELEMS = 1;
        int rv; /* -tc- valeur retournee par scanf(). A tester absolument! */
     
        printf("Menu 1\n");
        printf("1. x\n");
        /* -tc- tant que l'utilisateur entre autre chose qu'un entier (ou quelque
           chose pouvant etre interprete comme tel), on lui repose la question */
        do
        {
            printf("--> ");
            fflush(stdout);
            rv = scanf("%ld", &choixcase1);
            purge();
        }
        while (rv != 1 || choixcase1 < 1 || choixcase1 > MENU_NELEMS);
     
        return choixcase1;
    }
     
    long menucase11(void)
    {
        long choixcase11;
        int const MENU_NELEMS = 1;
        int rv; /* -tc- valeur retournee par scanf(). A tester absolument! */
     
        printf("Menu 1.1\n");
        printf("1. y\n");
        /* -tc- tant que l'utilisateur entre autre chose qu'un entier (ou quelque
           chose pouvant etre interprete comme tel), on lui repose la question */
        do
        {
            printf("--> ");
            fflush(stdout);
            rv = scanf("%ld", &choixcase11);
            purge();
        }
        while (rv != 1 || choixcase11 < 1 || choixcase11 > MENU_NELEMS);
     
        return choixcase11;
    }
     
    /* -tc- argc et argv ne sont pas utilises dans le programme. On peut definir
       main() sans arguments */
    int main(void)
    {
        switch (menucase1())
        {
        /* Le premier menu, avec 1. x */
        case 1:
            /* Si le premier choix est choisis, un nouveau menu aparait */
            switch (menucase11())
            {
            case 1:
                /* Et si le premier choix est encore choisis, cela affiche "hello" */
                printf("hello!\n");
                break;
            }
            break;
        }
     
        /* -tc- main() doit retourner 0, EXIT_SUCCESS ou EXIT_FAILURE */
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci Thierry Chappuis pour ta réponce

    Efféctivement il marche très bien, cela dis je m'amuse a faire ce script pour apprendre, et je comprend pas grand chose du tien ...

    J'aimerais que tu m'expliques si possibles ces lignes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c = getchar()) != '\n' && c != EOF)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const MENU_NELEMS = 1; /* j'ai pas compris ce qu'étais MENU_NELEMS :s */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            fflush(stdout);
            rv = scanf("%ld", &choixcase1); /* On le renvois à la variable rv? c'est ça? */
            purge();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        while (rv != 1 || choixcase1 < 1 || choixcase1 > MENU_NELEMS); /* Si j'ai un packet de menu (oui parce que la c'était juste une forme simplifié), est ce que rv !=1 suffit? (Dailleur, c'est pas la même chose que choixcase1<1?, et pour MENU_NELEMS, toujours pas compris ici :lol:
    Merci beaucoup de ton aide!

    PS: Mais enfaite, tu n'as pas une idées pour faire un "précedent" et pour que la fenaitre ce vide à chaque apparition de menus?

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par kakulupia Voir le message
    Merci Thierry Chappuis pour ta réponce

    Efféctivement il marche très bien, cela dis je m'amuse a faire ce script pour apprendre, et je comprend pas grand chose du tien ...

    J'aimerais que tu m'expliques si possibles ces lignes :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c = getchar()) != '\n' && c != EOF)
    Tant qu'il y a, dans le tampon du flux d'entrée standard, des caractères différents du caractère de fin de ligne et de EOF, ignorer le caractère.
    Citation Envoyé par kakulupia Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const MENU_NELEMS = 1; /* j'ai pas compris ce qu'étais MENU_NELEMS :s */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            fflush(stdout);
            rv = scanf("%ld", &choixcase1); /* On le renvois à la variable rv? c'est ça? */
            purge();
    fflush(stdout) force l'affichage de l'invite (affichée à l'aide de printf), car elle ne se termine pas par un caractère de fin de ligne. Ensuite, scanf() renvoie le nombre de conversions effectuées avec succès. Ce nombre est récupéré dans la variable rv et on teste ensuite que ce nombre est bien égal à 1 (i.e. l'entier saisit à l'aide de scanf() a bien été converti). Une fois l'entier saisi, il reste au minimum dans le tampon du flux d'entrée standard, un caractère de fin de ligne issu de la validation de la saisie à l'aide de la touche ENTER de ton clavier. La fonction purge(), comme son nom l'indique, a pour but de vide ce tampon en vue des futures saisies.

    Citation Envoyé par kakulupia Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        while (rv != 1 || choixcase1 < 1 || choixcase1 > MENU_NELEMS); /* Si j'ai un packet de menu (oui parce que la c'était juste une forme simplifié), est ce que rv !=1 suffit? (Dailleur, c'est pas la même chose que choixcase1<1?, et pour MENU_NELEMS, toujours pas compris ici :lol:
    Ici, j'utilise une variable MENU_NELEMS qui correspond au nombre d'éléments que compte ton menu. Je m'en sert pour tester dès la saisie que l'entier entré par l'utilisateur correspond bien à un élément du menu. Dans ton code, comme les menus ne proposent qu'un seul choix, l'entier entré par l'utilisateur ne peut être que 1.

    Citation Envoyé par kakulupia Voir le message
    Merci beaucoup de ton aide!

    PS: Mais enfaite, tu n'as pas une idées pour faire un "précedent" et pour que la fenaitre ce vide à chaque apparition de menus?
    Je ne veux pas te donner de solution toute prête pour implanter une hiérarchie de menus avec navigation d'un menu à l'autre. Je te laisse un peu réfléchir au problème. En ce qui concerne le problème consistant à effacer le contenu de la fenêtre entre chaque appel, je ne pense pas que ce soit une priorité dans un 1er temps. "Simple is better than complex!" Bien qu'il ne soit pas bien difficile d'effacer l'écran entre deux appels de menucase*(), je ne pense pas que cela apporte une quelconque valeur ajoutée au programme.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Test table créée
    Par Fabsou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2004, 15h08
  2. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  3. RAZ GENERATOR dans un trigger
    Par kase74 dans le forum SQL
    Réponses: 2
    Dernier message: 08/09/2003, 18h43
  4. RAZ intempestif de cookie
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 27/05/2003, 15h55
  5. Réponses: 2
    Dernier message: 06/03/2003, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo