Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C]empercher d'entrez un décimal

    15 janvier 2006 à 15:23:47

    Bonjours,
    comme dit dans le titre j'aimerais empecher d'entrez un décimal.
    En fait empecher n'est pas le bon mot, faire une boucle (while) que si le nombre entrez est un décimal il entre dans la boucle.
    Voici le code du style que je voudrais(mais qui n'est pas bon :( ):
    while (nombre1 == %lf)
    {
    printf("Entrez un nombre sans decimal:  ");
    scanf("%ld", &nombre1);
    }

    Quelqu'un serai comment faire ceci??
    Merci beaucoup de vos réponses ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 janvier 2006 à 15:37:02

      Si on entre pas un bon nombre, scanf ne le lit pas et le nombre ne change aps de valeur. Tu peux donc faire un truc du genre :

      int a = 0;
      do
      {
      printf("Nombre : ");
      scanf("%d", &a);
      }
      while(a != 0);
      Après tu peux aussi remplacer int par long et donc %d par %ld

      En tout cas, retiens qu'en C, à cause tu typage de variables, tu n'auras jamais de nombre à virgules dans un int, donc tu n'as pas vraiment besoin de vérifier si c'est bien un nombre entier, tout se passe au niveau du scanf.
      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2006 à 21:18:14

        Je ne comprend pas trop ton code ^^ Enfin si je comprend mais je ne vois pas en quoi il c'est ce que je demende. Et je ne comprend pas ta boucle aussi o_O
        Voici la partie de mon code:
        long nombre1=0, nombre2=0, resultat=0;
        printf("1er nombre:  ");
        scanf("%ld", &nombre1);
        printf("2eme nombre:  ");
        scanf("%ld", &nombre2);
        resultat = nombre1 % nombre2;
        printf("resultat= %ld", resultat);

        Comme tu(vous) l'a(vez) remarqué c'est un modulo. Le problème c'est quand on entre un nombre décimal ma console se ferme. J'aimez mettre que quand on entre un nombre décimal un gentille phrase de ce type apparaisse
        Le modulo n'accepte pas les nombres decimaux, veuillez entrez s'il vous plaits un nombre non décimal. Merci.
        Votre nombre:

        Merci ;)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 janvier 2006 à 18:12:18

          Ok alors je t'explique un peu :

          Quand tu fais un scanf("%ld", long) tu es assuré que le nombre rentré sera un long, sinon il n'aura pas de valeur. On ne fait pas rentrer un float dans un long. Et dans ce cas, la variable ne change pas de valeur.

          La solution est donc de faire, comme dans mon code, une boucle. On initialise une variable à 0, elle ne change de valeur que si on entre un int valide (ce qui est géré par le scanf), donc tant que la variable est égale à 0 (en fait j'aurais dû mettre a == 0 dans ma condition), elle n'a pas changé, il faut redemander un nombre. Sinon on sort de la boucle : on sait que le nombre est un bon long.

          Si tu ne boucles pas de toute façon tu ne pourras rien faire en cas de mauvais nombre, des calculs seront quand même faits dessus. Je te remets le code (avec une belle indentation :D et un long) :
          long a = 0;
          do
            {
              printf ("Nombre : ");
              scanf ("%ld", &a);
            }
          while (a == 0);
          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2006 à 18:17:14

            Mais il me semble que si l'on assigne un float à une variable destinée à recevoir un entier, le scanf() ne lira que la partie entière. Dans ce cas-là ça donnerait une bonne alternative.
            • Partager sur Facebook
            • Partager sur Twitter
              16 janvier 2006 à 18:20:26

              Sauf qu'il me semble qu'on ne peut faire de modulo avec un float ... enfin je crois :euh:
              EDIT : =X Je sais pas ou j'ai entendu parlé de modulo :p Je confond de topic je crois ! ^^
              • Partager sur Facebook
              • Partager sur Twitter
                16 janvier 2006 à 18:22:41

                C'est bien ce que je dis: si on donne un float via le scanf(), il n'en sortira que la partie entière, c'est-à-dire si je rentre 142.1248645, il en sortira 142.

                (mais je sais pas si c'est vrai tout ça)
                • Partager sur Facebook
                • Partager sur Twitter
                  16 janvier 2006 à 19:06:45

                  Louisclem: dans ton code, quand j'entre, un nombre décimal, il ne rentre pas dans ta boucle. Donc le code se termine. En fait quand on entre un nombre décimal dans un long, il prend les nombres avant la virgule(il me semble). Donc un nombre décimal dans un long n'affecte pas la valeur 0, il fautdrais dire: "Tant que a est un nombre décimal tu dis (fais) ça!"
                  Mais je crois que je vais laissé mon modulo comme ça. Si je trouve, je signale. Et si vous trouvé merci de le signalé ;)


                  ps: willy c'est bien ici que tu as vu modulo ;)
                  Et je ne sais pas comment vous vous en etes venu au float alors que je parle de long
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 janvier 2006 à 19:17:00

                    Ben tu viens de demander à ton proc:

                    si c'est un float, fais pas ça;
                    si c'est un entier, fais ça;
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 janvier 2006 à 19:22:36

                      Citation : V1944

                      Ben tu viens de demander à ton proc:

                      si c'est un float, fais pas ça;
                      si c'est un entier, fais ça;


                      Et comment lui dire si c'est un float fait ça, si c'est un entier, ok c'est bon, tu peux passé à l'instructuion suivant.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 janvier 2006 à 19:59:01

                        ctype.h pour ces tests (cf. post-it sur les fonctions et/ou doc à partir de Google).
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 janvier 2006 à 22:52:34

                          Merci Elentar. C'est surement ça.
                          Mais le problème ça que je n'arrive pas à m'en servir ^^
                          Je retourne dans toute les sauces mais pas moyen.
                          Merci de m'aidé ^^

                          ps: c'est isdigit que j'utilise. C'est le bon au moins :p


                          Edit: la fonction fait si j'ai bien trouvé: si on entre 1, elle retourne 1; si on entre 1.25 elle retourne 1
                          Si c'est ça, c'est pas vraiment ce que je recherche encore, même si celà s'ameillore. :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 janvier 2006 à 2:19:59

                            //HS

                            Juste une question comme ca, c'est quoi la difference reele entre un %d et un %ld ??? j'ai vu les deux, j'ai tester les deux, et je n'ai pas vu de difference dans l'application :/

                            HS//
                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 janvier 2006 à 6:58:50

                              %d c'est pour un argument de type int, %ld pour un argument de type long.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 janvier 2006 à 17:47:24

                                J'aime pas faire ce genre de chose mais bon. UP
                                Je n'arrive vraiment pas à bien comprendre comment fonctionne <ctype.h> ==> isdigit.
                                Si quelqu'un pourrais m'aidé ;)
                                Merci d'avance ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 janvier 2006 à 18:16:04

                                  #include <ctype.h>

                                  int c;
                                  c = getchar();
                                  if (isdigit(c))
                                  printf("c is a digit.\n");

                                  char c;
                                  scanf("%c", &c);
                                  if (isdigit((unsigned char)c))
                                  printf("c is a digit.\n");
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 janvier 2006 à 19:03:21

                                    Oullaaaa, de 1 je pige rien du tout au code ^^
                                    Quand je compile il me dit qu'il y a une erreur a la ligne c=getchar(); et en dessous j'ai plein d'erreur o_O
                                    Bizard o_O
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      18 janvier 2006 à 23:08:55

                                      Euh, c'est pas parce qu'il a mis qu'un seul include dans son exemple que faut faire pareil...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 janvier 2006 à 7:16:55

                                        Je pense pas que isdigit t'aide vraiment, dans ce cas là.
                                        Ce que tu pourrais faire : (mais cay pas testé)

                                        float f;
                                        long n;
                                        // buffer temporaire pour tester le type de la saisie
                                        char buf[64];
                                        // on prend les 64 premiers caractères saisis (ca devrait suffire)
                                        fgets(buf,64,stdin);

                                        // si le buffer commence par flottant (si sscanf renvoie 1 )
                                        if(sscanf(buf,"%f",&f))
                                        {
                                            printf("Vous avez tapé un flottant.\n");
                                        }
                                        else if ( sscanf(buf,"%d",&n))
                                            printf("C'est bon vous avez tapé : %d\n",n);
                                        else
                                            printf("Euh.... vous avez tapé qqchose qui ne correspond pas à ce que je voulais \n");



                                        sscanf fait exactement la meme chose mais sur une chaine de caractère plutot que sur l'entrée standard (la console)
                                        Ce code est assez long, donc risque peut-eter de ralentir ton prog ( mais si tu les enchaines pas ca devrait aller )
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 janvier 2006 à 7:57:36

                                          scanf("%d", &nombre); ça marche pas ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 janvier 2006 à 12:38:58

                                            Si tu rentres un float dans un scanf() qui est destiné à recevoir un int, ben... regarde donc.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 janvier 2006 à 12:46:48

                                              Bah ça marche au sens strict mais ça laisse du garbage dans le buffer donc c'est bof, stout.
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              [C]empercher d'entrez un décimal

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown