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 :

boucle do while


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut boucle do while
    bonjour,

    Question bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char reponse = 0;
     
     
        do
        {
             printf("Voulez vous continuer ? (y/n)");
             scanf("%c", &reponse);
             printf("%c\n", reponse);
        }
        while((reponse != 'y') || (reponse != 'n'));
    Comment faire pour que ca fonctionne ? La je ne vois plus trop...

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    bonjour,

    En faisant une recherche sur le forum C, en tapant 'saise clavier' tu trouvera tout ton bonheur et meme plus.
    Cette question revient tres souvent et a ete traité d'ailleurs tres recement dans plusieurs post qui sont peut etre visible en fond de page.
    "vaste programme"

  3. #3
    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 arnaudperfect Voir le message
    bonjour,

    Question bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char reponse = 0;
     
     
        do
        {
             printf("Voulez vous continuer ? (y/n)");
             scanf("%c", &reponse);
             printf("%c\n", reponse);
        }
        while((reponse != 'y') || (reponse != 'n'));
    Comment faire pour que ca fonctionne ? La je ne vois plus trop...

    Merci d'avance
    Par exemple:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
        /* la fonction getchar() retourne un entier de type int */
        int reponse = 0;
     
        do
        {
            printf("Voulez-vous continuer ? (y/n) ");
            /* Ne pas oublier de purger le tampon du flux de sortie standard pour
                forcer l'affichage de l'invite */
            fflush(stdout);
            reponse = getchar();
            if (reponse != '\n' && reponse != EOF)
            {
                /* On purge le tampon du flux d'entrée standard */
                int c;
     
                while ((c = getchar()) != '\n' && c != EOF)
                {
                }
            }
        }
        while (reponse != 'y' && reponse != 'n');
     
        return 0;
    }
    Attention, la condition de sortie de ta boucle est fausse.

    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++

    +

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    un peu compliquer ton code :

    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
    /* la fonction getchar() retourne un entier de type int */
        int reponse = 0;
     
        do
        {
            printf("Voulez-vous continuer ? (y/n) ");
            /* Ne pas oublier de purger le tampon du flux de sortie standard pour
                forcer l'affichage de l'invite */
            fflush(stdout);
            reponse = getchar();
            if (reponse != '\n' && reponse != EOF)
            {
                /* On purge le tampon du flux d'entrée standard */
                int c;
     
                while ((c = getchar()) != '\n' && c != EOF)
                {
                }
            }
        }
        while (reponse != 'y' && reponse != 'n');
    J'avais deja fais quelque chose de similaire avant, mais je ne me souviens plus comment j'avais fais...

  5. #5
    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
    A part encapsuler la partie purge du tampon du flux entrant dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    fpurge(FILE *stream)
    {
        if (stream != NULL)
        {
            int c;
     
            while ((c = fgetc(stream)) != '\n' && c != EOF)
            {
            }
        }
    }
    Je ne vois pas comment faire plus court:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     int reponse = 0;
     
        do
        {
            printf("Voulez-vous continuer ? (y/n) ");
            fflush(stdout);
            reponse = getchar();
     
            if (reponse != '\n' && reponse != EOF)
            {
                fpurge(stdin);
            }
        }
        while (reponse != 'y' && reponse != 'n');
    Il s'agit là du code minimal:
    1. On affiche l'invite
    2. On saisit le caractère
    3. On nettoie les traces de notre passage
    4. On vérifie que le caractère saisi correspond à ce qui est attendu


    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++

    +

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    mais ca sert à quoi ca : purge du tampon du flux ?

    Moi je cherche juste à poser une question, l'utilisateur répond par y ou n, mais si il entre une autre lettre on lui repose la question. S'il répond bien, on sort de la boucle...

  7. #7
    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 arnaudperfect Voir le message
    mais ca sert à quoi ca : purge du tampon du flux ?

    Moi je cherche juste à poser une question, l'utilisateur répond par y ou n, mais si il entre une autre lettre on lui repose la question. S'il répond bien, on sort de la boucle...
    Lorsque l'utilisateur répond à ta question, il entre 'y' ou 'n' et termine la saisie avec la touche ENTER. Le caractère saisie est stocké dans la variable reponse, mais il reste le caractère de fin-de-ligne '\n' dans le tampon du flux d'entrée standard. Ainsi, si tu ne vide pas ce tampon avant le prochain appel à getchar(), le caractère '\n' sera placé dans la variable reponse au prochain tour de boucle sans attendre la réponse de l'utilisateur, ce qui te donne la chose suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Voulez-vous continuer ? (y/n) o
    Voulez-vous continuer ? (y/n) Voulez-vous continuer ? (y/n) y
    
    FIN du programme
    On voit ici que l'invite a été affichée deux fois à cause du caractère de fin de ligne qui était toujours présent dans le tampon du flux d'entrée suite à la mauvaise réponse de l'utilisateur. D'où la nécessité d'effectuer une purge après chaque opération de saisie.

    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++

    +

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par arnaudperfect Voir le message
    mais ca sert à quoi ca : purge du tampon du flux ?

    Moi je cherche juste à poser une question, l'utilisateur répond par y ou n, mais si il entre une autre lettre on lui repose la question. S'il répond bien, on sort de la boucle...
    Il faut étudier et comprendre le fonctionnement de fgetc().

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    772
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 772
    Points : 216
    Points
    216
    Par défaut
    j'ai pos& la question ya pas longtemps içi voir la discussion...A+

    http://www.developpez.net/forums/sho...d.php?t=404231

Discussions similaires

  1. Boucle Do ..while
    Par parp1 dans le forum Général Python
    Réponses: 2
    Dernier message: 11/06/2006, 13h32
  2. Réponses: 13
    Dernier message: 20/03/2006, 16h26
  3. [VBA] Boucle Do While
    Par jmde dans le forum Access
    Réponses: 4
    Dernier message: 16/10/2005, 20h23
  4. probleme de recordset dans une boucle do while
    Par Shoryu dans le forum ASP
    Réponses: 18
    Dernier message: 05/07/2004, 15h30
  5. Appel recurssif et boucle Do...While
    Par zsoh dans le forum Langage
    Réponses: 6
    Dernier message: 31/05/2004, 18h01

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