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 :

La Boucle while


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut La Boucle while
    Bonjour,

    J'ai un petit programme dans lequel ce trouve une boucle pour savoir si l'utilisateur veux le quitter ou pas. Quand je fais oui et bien ça quitte mais quand je fais non il passe toute mes lignes de code pour revenir directement à la question si oui ou non on souhaite quitter le programme !

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main (void)
    {
        float texp;
        float mexp;
        float mskill;
        int mob;
        int sp;
        char fin='n'; 
     
        while (fin !='o')
        {  
     
        printf("Experience necessaire pour le prochain niveau : ");
        scanf("%f",&texp);
        printf("Experience que le MOB vous fait gagner : ");
        scanf("%f",&mexp);
        printf("Skillpoint que le MOB vous fait gagner : ");
        scanf("%f",&mskill);
     
        mob=((texp)/(mexp)+1);
        sp=(mob*mskill);
     
        printf("\n\nNombre de MOB a tuer pour le niveau suivant : %d", mob);
        printf("\nNombre de SkillPoints obtenues : %d\n\n", sp); 
     
        printf("Voulez vous quitter ? (o/n) : ");
        scanf("%c\n", &fin);
        }
    }
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Ton scanf à la fin de la boucle lit le '\n' généré lors de l'appui sur ENTREE par l'utilisateur pour valider la saisie de mskill. Tu peux résoudre ce problème avec :
    Dans ce cas scanf va ignorer tous les caractères blancs avant d'effectivement commencer la lecture. scanf est une fonction complexe, il ne faut pas l'utiliser si on ne sait pas comment elle fonctionne. Utilise plutôt fgets pour faire une saisie.

  3. #3
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Merci je le saurais maintenant !
    Cependant, maintenant après avoir la modification que vous m'avez suggéré le programme ne s'arrête plus pour me demander si oui ou non je souhaite continuer il re exécute la boucle.

    Il ne lit plus les \n puisqu'ils n'appartiennent plus au scanf, c'est donc qu'il a déja une valeur qui est rentré et donc relance la boucle mais je ne vois pas où cela ce fait

    @+ et merci encore pour votre patience !

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par darkwall_37
    Merci je le saurais maintenant !
    Cependant, maintenant après avoir la modification que vous m'avez suggéré le programme ne s'arrête plus pour me demander si oui ou non je souhaite continuer il re exécute la boucle.
    Non, non. A moins que t'as aussi modifié autre chose et de toute façon, si tu utilises encore scanf après ce que je viens de te dire c'est que t'as complètement ignoré ma réponse. Montre ton code actuel pour voir et précise également les valeurs que t'as fourni au programme pendant la saisie.
    Citation Envoyé par darkwall_37
    Il ne lit plus les \n puisqu'ils n'appartiennent plus au scanf, c'est donc qu'il a déja une valeur qui est rentré et donc relance la boucle mais je ne vois pas où cela ce fait
    Pas besoin de \n. Le \n peut rester et sera tout simplement ignoré à la prochaine lecture d'un flottant (mais gare aux surprises si la prochaîne donnée à lire est un caractère ...). D'ailleurs, \n dans scanf ne signifie pas lire un '\n' mais passer tous les caractères blancs (même rôle que l'espace), ce qui n'empêche pas à l'utilisateur d'entrer n'importe quoi et de faire planter le programme.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Pour résoudre les problèmes de lecture clavier, il faut , comme le dit Melem, utiliser fgets(buf, sizeof buf, stdin).
    Ensuite on traite la saisie selon ses besoins.
    Seule fgets garantit que le buffer claveir soit vidé (et encore, il faut que buf soit assez grand). scanf est une fonction très difficile à utiliser, dans 99,999999% des cas on peut s'en passer.
    Il faut faire des recherches sur ce forum ou consulter la FAQ, il y a de nombreux exemples à ce sujet
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    C'est le même sans le \n dans le scanf !

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main (void)
    {
        float texp;
        float mexp;
        float mskill;
        int mob;
        int sp;
        char fin='n'; 
     
        while (fin !='o')
        {  
     
        printf("Experience necessaire pour le prochain niveau : ");
        scanf("%f",&texp);
        printf("Experience que le MOB vous fait gagner : ");
        scanf("%f",&mexp);
        printf("Skillpoint que le MOB vous fait gagner : ");
        scanf("%f",&mskill);
     
        mob=((texp)/(mexp)+1);
        sp=(mob*mskill);
     
        printf("\n\nNombre de MOB a tuer pour le niveau suivant : %d", mob);
        printf("\nNombre de SkillPoints obtenues : %d\n\n", sp); 
     
        printf("Voulez vous quitter ? (o/n) : ");
        scanf("%c", &fin);
        }
    }
    Et desormais le scanf ne s'arrête plus pour me demander une valeur de fin. C'est donc qu'une valeur est stocké dans fin après avoir remplie mes valeurs peu importe celles qu'elles sont ça fait la même chose. Mon souci c'est que je ne vois pas ou le scanf pourrait prendre une valeur sans que ce soit moi qui lui donne !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  2. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 15h38
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 17h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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