Oltana.net 24 Mai 2012 à 01:14:40 *
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.


Connexion avec identifiant et mot de passe
Nouvelles:
Bascule sur SMF faite!
 
 
Accueil Aide Rechercher
Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: [C]Filtrer les saisies  (Lu 1825 fois)
Fireboot
Modérateur Global
*****
Hors ligne Hors ligne

Messages: 1831



Voir le profil
« le: 17 Septembre 2006 à 16:22:08 »

Salut all,

Je suis en train d'apprendre le C, et dans ce cadre, je veux créer un jeu du "plus ou moins" (c'est un tp du sdz).

Le programme génère un chiffre compris entre 0 et 100.

L'utilisateur doit ensuite entrer un chiffre, et le programme répond "c'est plus" ou "bravo t'as gagné" ou "c'est moins".

Probleme : Si l'user entre autre chose qu'un chiffre le programme part en boucle infini.

Voila le code de base, avant que je ne m'apercoive du probleme :

Code:

 #include <stdio.h>
#include <stdlib.h>
#include <time.h> /*Librairie permettant le random*/

int main()
{
    long nombreMystere, nombreEntre = 0, nombreTentatives = 0;
const long MAX = 100, MIN = 1;

/*Génération du nombre aléatoire*/
srand(time(NULL));
    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

    do
    {
        printf("Entrez un nombre  ");
        scanf("%ld", &nombreEntre);

        if (nombreEntre < nombreMystere)
            printf("C'est plus !\n\n");

        else if (nombreEntre > nombreMystere)
            printf("C'est moins !\n\n");

        else
            printf("Bravo !\nVous avez trouve en %ld tentatives!\n", nombreTentatives);


        nombreTentatives++;

    } while (nombreEntre != nombreMystere);

    return 0;
}

Ensuite, j'ai tenté tant bien que mal de vérifier ce que l'user entre, mais ça marche pas. Voila ce que j'ai tenté :

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> /*Librairie permettant le random*/

int main()
{
    long nombreMystere, nombreEntre = 0, nombreTentatives = 0;
const long MAX = 100, MIN = 1;

/*Génération du nombre aléatoire*/
srand(time(NULL));
    nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

        do
        {
            printf("Entrez un nombre  ");
            scanf("%ld", &nombreEntre);

            if  (nombreEntre <= 100 && nombreEntre >=0)
            {
                if (nombreEntre < nombreMystere)
                    printf("C'est plus !\n\n");

                else if (nombreEntre > nombreMystere)
                    printf("C'est moins !\n\n");

                else
                    printf("Bravo !\nVous avez trouve en %ld tentatives!\n", nombreTentatives);


                nombreTentatives++;
            }
            else
                printf("erreur de saisie");
        } while (nombreEntre != nombreMystere);


    return 0;
}


Toujours pareil, le programme part en boucle infini.

Si quelqu'un aurait la gentillesse de m'aider, ça serait simpa

Merci, ++
Journalisée




Tom
Posteur fou
*****
Hors ligne Hors ligne

Messages: 771



Voir le profil
« Répondre #1 le: 17 Septembre 2006 à 16:32:40 »

Tu peux créer une boucle qui tant que le caractère entré n'est pas un nombre, re-demandes à l'utilisateur d'entrer un nombre.
Au lieu de :
Code:
printf("Entrez un nombre ");
scanf("%ld", &nombreEntre);

Code:
do
{
printf("Entrez un nombre ");
scanf("%ld", &nombreEntre);
}
while(condition);


Pour la condition, vérifies le code Ascii : il faut que tu vérifis que ce que l'utilisateur entre soit compis entre 30 et 39 (0à9 > 30à39 en Ascii).

Ca fait un an que j'ai pas fait ca, alors j'espère que ca ira.
Journalisée

Fireboot
Modérateur Global
*****
Hors ligne Hors ligne

Messages: 1831



Voir le profil
« Répondre #2 le: 17 Septembre 2006 à 21:08:48 »

Tom, merci de l'attention que tu portes à mon soucis Sourire

Seulement, je sais pas du tout comment vérifier le code ascii :S
Journalisée




Tom
Posteur fou
*****
Hors ligne Hors ligne

Messages: 771



Voir le profil
« Répondre #3 le: 17 Septembre 2006 à 21:34:17 »

A priori je me suis déja planté : 0 à 9 ne valent pas 30 à 39 en Ascii. :s J'ai du lire ca sur un site pourri tout à l'heure.

Je ne sais plus comment faire ca non plus, mais il me semble qu'on avait ce genre de tests en cours, je vais voir si je retrouve ca.
Journalisée

Flavien
Posteur fou
*****
Hors ligne Hors ligne

Messages: 622



Voir le profil
« Répondre #4 le: 17 Septembre 2006 à 21:37:11 »

en c++ cin.fail() renvoie true si il y a eu un probleme dans l'entré
Journalisée




Fireboot
Modérateur Global
*****
Hors ligne Hors ligne

Messages: 1831



Voir le profil
« Répondre #5 le: 17 Septembre 2006 à 21:40:50 »

Peut-être, mais je code pas C++ flavien.

Je débute à peine en C, je vais pas m'amuser à mélanger les deux
Journalisée




Flavien
Posteur fou
*****
Hors ligne Hors ligne

Messages: 622



Voir le profil
« Répondre #6 le: 17 Septembre 2006 à 21:46:57 »

Zap le c passe au c++ direct  Sourire
Journalisée




superjun
Posteur assidu
****
Hors ligne Hors ligne

Messages: 137



Voir le profil
« Répondre #7 le: 18 Septembre 2006 à 00:23:45 »

Sinon il y a l'intermédiaire entre C et C++, appelée communément (et sobrement) C+ :
Utiliser la syntaxe (ou une partie) de C++ pour coder en C (donc ne pas utiliser les classes, et tout ce qui est lié à la POO).

Ceci permet de bénéficier de certains "plus" du C++ (par exemple, et pour n'en citer qu'un : Les chaines de caractères, qui remplaces les tableaux de caractères du C).
Le C++ étant rétrocompatible (sauf très très rares exceptions) avec le C, il n'y aura pas de problèmes Clin d'oeil
Journalisée


What isn't remembered never happened...
Marmotte
Modérateur Global
*****
Hors ligne Hors ligne

Sexe: Homme
Messages: 554



Voir le profil WWW
« Répondre #8 le: 22 Septembre 2006 à 20:31:55 »

Bon, j'y ai repensé ce soir, et je me suis rappelé de mes premiers programmes en C (il y a un an environ, donc j'y ai pas repensé sur le coup...)

Explication :
 - On tape une touche du clavier, la valeur est mise en buffer
 - On valide, la fonction scanf essaie de lire le buffer et de mettre ce qu'on a entré dans le type de donnée voulu

Le problème :
 - La fonction scanf n'arrive pas a faire correspondre les types, et se plante
 - Vu que la fonction s'est plantée, elle ne vide pas le buffer et donc cette erreur se retrouve à l'appel suivant (et donc boucle infinie puisque dans un Do While basé sur cette valeur tapée !)

La solution : Vider le buffer avant chaque appel de la fonction scanf ^^
=> Il me semble (de mémoire, je rentre juste chez moi, pas eu le temps de tester) que c'est l'objectif de la fonction fflush();
Il suffit de mettre cette fonction avant le scanf("%...",&...) et ca devrait fonctionner Clin d'oeil
Journalisée

Fireboot
Modérateur Global
*****
Hors ligne Hors ligne

Messages: 1831



Voir le profil
« Répondre #9 le: 22 Septembre 2006 à 21:29:03 »

Pas d'arguments à donner à fflush() ?

Parce que quand je rajoute juste fflush() au dessus du scanf(), ça me chie une erreur lors de la compilation :

Code:
Error : too few arguments to function "fflush()
Journalisée




Marmotte
Modérateur Global
*****
Hors ligne Hors ligne

Sexe: Homme
Messages: 554



Voir le profil WWW
« Répondre #10 le: 22 Septembre 2006 à 22:41:28 »

Bah si bien sur... il faut lui dire quel buffer vider mdr
Je vais rechercher dans mes programmes ^^ (me rappelle pas de tete depuis un an :s)

EDIT : voila pour le clavier : fflush(stdin);
Journalisée

GianT
Animateurs
****
Hors ligne Hors ligne

Messages: 403



Voir le profil WWW
« Répondre #11 le: 05 Novembre 2006 à 18:43:20 »

si je ne m'abuse il y'a une fonction isdigit() qui renvoie true si le caractere entré est un nombre et faux sinon ... ca devrait bien t'aider ^^
Journalisée
Pseudo555
Administrateur
*****
Hors ligne Hors ligne

Sexe: Homme
Messages: 2187



Voir le profil WWW
« Répondre #12 le: 06 Novembre 2006 à 10:07:35 »

Je crois que le scanf renvoie un integer pour verifier que la saisie est correcte.

+1 pour le fflush(stdin); sa t' evitera pas mal d'emmerde avec les chaines de caracteres.
Journalisée

Arphus
Posteur assidu
****
Hors ligne Hors ligne

Messages: 235



Voir le profil
« Répondre #13 le: 11 Novembre 2006 à 01:38:32 »

comme sur le site du zéro moi aussi j'ai fait le programme...

Il faudrait que je mis remmettre...
Journalisée




Fireboot
Modérateur Global
*****
Hors ligne Hors ligne

Messages: 1831



Voir le profil
« Répondre #14 le: 07 Juillet 2007 à 19:46:45 »

Hum, je me permets de détérrer ce vieux topic.

La solution proposée par Marmotte, à savoir fflush(stdin); n'est pas conforme aux normes.

En effet, la norme définit uniquement le fonctionnement de fflush() sur les flux sortant. Or, stdin est un flux entrant, et le comportement de fflush() dans ce cas là peut varier selon le compilateur.

La solution correcte à utiliser pour vider le buffer est :

Code:
while ((c = getchar()) != '\n' && c != EOF);


Bye
Journalisée




Pages: [1] 2   Haut de page
Imprimer
Oltana.net  |  Informatique Créatrice  |  Programmation  |  Fil de discussion: [C]Filtrer les saisies
 
Aller à:  

Powered by SMF 1.1.15 | SMF © 2006-2009, Simple Machines