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 :

Jeu du devin: printf affiche mes phrases en double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Par défaut Jeu du devin: printf affiche mes phrases en double
    Hello,

    j'ai programmé le jeu du devin mais je me heurte à deux problèmes:

    mon programme saute l'instruction getchar et exécute donc 2 fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("L'ordinateur propose %d.\n", nbOrdi);
    printf("Ce nombre est-il trop petit, trop grand ou le même que le vôtre?\n");
    printf("(p ou P pour \"trop petit\", g ou G pour \"trop grand\", t ou T pour le même)\n");
    Mais la seconde fois, pas de problème, réponse est lue (et ce, à chaque fois)

    J'ai aussi un problème avec compteur qui affiche une valeur complètement farfelue (du style 21 alors qu'il n'y a eu que 5 essais, par exemple)

    Je vous mets ici mon code (par contre, le programme se déroule jusqu'au bout)

    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
    #include <stdio.h>
    #include <stdlib.h>
    #define N 1000
    #define MIN 0
    #define MAX 1000
    int tab [N];
    int nb_pense;
     
    void creationTableau();
    int nbPense();
    void jeu();
     
     
    int main(void)
    {
        creationTableau();
        jeu();
        return 0;
    }
     
    void creationTableau(){
        int i;
        for (i = 1; i <= 1000; i++){
            tab[i] = i;
        }
    }
     
    int nbPense(){
        printf("A quel nombre pensez-vous?\n");
        scanf ("%d", &nb_pense);
        return nb_pense;
    }
     
    void jeu()
    {
        nb_pense = nbPense();
        int m;
        int debut = MIN;
        int fin = MAX;
        int nbOrdi;
        char reponse = '!';
        int compteur = 1;
        do
        {
            m = (debut + fin) / 2;
            nbOrdi = tab[m];
            printf("L'ordinateur propose %d.\n", nbOrdi);
            printf("Ce nombre est-il trop petit, trop grand ou le même que le vôtre?\n");
            printf("(p ou P pour \"trop petit\", g ou G pour \"trop grand\", t ou T pour le même)\n");
            reponse = getchar();
            if (reponse != 't' || reponse != 'T') compteur ++;
            if (reponse == 'p' || reponse == 'P')
            {
                debut = m + 1;
            } else if (reponse == 'g' || reponse == 'G')
            {
                fin = m - 1;
            } else if (reponse == 't' || reponse == 'T')
            {
                printf("C'était le bon nombre!\n");
                printf("Le nombre a été trouvé en %d essais.\n", compteur);
                break;
            }
        } while (debut <= fin && (reponse != 't' || reponse != 'T'));
    }
    Voyez-vous d'où viennent ces erreurs?

    En vous remerciant par avance,
    Johnny

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    getchar va read caractere par caractere. Comme a chaque fois tu auras ton caractere + \n ...
    sinon tu peux faire un read, et regarder uniquement le premier caractere


    pour les valeurs du compteur, c'est normal vu que tu fais a chaque fois deux tour de boucles, il sera incremente deux fois

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Par défaut merci
    Ca a fonctionné pour la première proposition, mais pour les autres, ça me remet tout en double.

    J'ai tapé read (0, &reponse, 1)

    Johnny

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    en mettant read (0, &reponse, 1), le probleme est exactement le meme parce que faire un read de 1 revient exactement a un getchar

    si tu pars du principe que ton utilisateur ne va pas marquer n'importe quoi, tu peux faire qqch comme ca:
    - declarer un buffer de lecture d'une taille suffisante pour lire le caractere + le \n
    - faire une lecture de 2 caracteres en 2 caracteres

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Par défaut
    pourrais-tu me donner un exemple, s'il te plait? Je ne pratique le C que depuis 2-3 mois et je ne vois pas comment faire.

    Merci!

    Johnny

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est effectivement un problème courant parce qu'il peut rester en attente un caractère '\n' non lu dû à une lecture précédente. Si on fait alors un scanf %c ou %s ou un getchar, on récupère ce '\n' et il constitue la lecture.
    Dans de tels cas, il faut prendre soin de vider la ligne en attente.

    Plusieurs fonctions pouvant faire cette opération ont été publiées sur ce forum (cherche fclean() mais ne pas utiliser fflush()).

    On peut aussi, à chaque lecture, vider la fin de la ligne qui ne nous interesse pas dans un scanf. C'est un peu ésotérique mais simple : il suffit de compléter le format utile par %*[^'\n']%*c.
    Ansi, ta lecture dans la fonction nbPense devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        scanf ("%d%*[^'\n']%*c", &nb_pense);
    et le getchar est remplacé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        scanf("%c%*[^'\n']%*c",&reponse);
    Avec ce code, tu peut taper tazerty , il prendra le t et ignorera la suite de la ligne y compris le caractère de fin de ligne et tout sera propre pour l'entrée suivante.

    L'interprétation est la suivante :
    %*[^'\n'] lit une chaîne de caractères (format %[]) tant que les caractères sont différents (à cause du ^) de '\n' et ignorer (à cause de *) la chaine obtenue
    %*c lit un caractère (c'est le '\n' sur lequel on est arrivé après le format précédent) et l'ignorer (à cause de *)

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

Discussions similaires

  1. Afficher mes Div horizontalement ?
    Par Alexino2 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/02/2007, 16h11
  2. Afficher mes infos systeme via une page Web ?
    Par byloute dans le forum Linux
    Réponses: 4
    Dernier message: 17/08/2006, 10h36
  3. [MySQL] Afficher mes données dans un tableau HTML
    Par lassmust dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 02/03/2006, 11h43
  4. Comment interdir ps -a d'afficher mes propres processus ?
    Par elmessoussi dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 08/12/2005, 14h14
  5. afficher une phrase dans le HTML a partir du javascript
    Par amelhog dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/08/2005, 17h02

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