Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de boucle

je veux dire au pc tant ceci n'est pas fait refait sa

    27 novembre 2005 à 21:22:58

    bonsoir!
    j'ai un nouveau probleme avec une boucle.
    je demande l'age du visiteur et je veux que tant qu'il na pas donnée un nombre la question lui soit de nouveau posé
    en claire sa donne sa

    Citation : moi

    Entrez votre age :
    aksjs
    Entrez votre age :
    ajajsu
    Entrez votre age : 16
    Vous avez 16 ans



    voila a quoi j'ai pensé mais sa ne marche pas
    #include <stdio.h>

    int main (void)
    {
       int age;
       int cpt = 0;

    do{
          printf("Entrez votre age :\n");   
          if(scanf("%d", &age))cpt = 2;
          else
          printf("Entrez votre age :\n");
          }
          while(cpt < 1)
       printf("Vous avez %d ans ", age);


       /* Fin d'exécution */
       system("pause");
       return 0;
    }

    selement voila la premiére fois il m'affiche Entrez votre age et le code s'arrete jusqua ceque j'entre une valeur puis il me met a l'inifinit Entrez votre age :
    Entrez votre age :
    Entrez votre age :
    Or je voudrai qu'a chaque foit le code s'arrete jusqu'a ceque j'entre une valeur.
    merci d'avance.

    ps j'ai essayé de mettre system("pause") sous else
    printf("Entrez votre age :\n"); mais sa ne marche toujours pas :/

    €dit
    je vien d'essayer ceci
    #include <stdio.h>
    #include <stdlib.h>

    int main (void)
    {
       unsigned short int age;
       int i;

       for (i = 0; i<1; ++i)
       {
          printf("Entrez votre age :\n");   
          if(!scanf("%d", &age))i=-1;
       }
         
       printf("Vous avez %d ans ", age);


       /* Fin d'exécution */
       system("pause");
       return 0;
    }
    mais sa me fait le meme probleme :/.
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2005 à 21:35:55

      Bon, s'il vous plait, arrêtez avec vos do while.... je sais pas d'o vous avez appris ça, mais utilisez le while, dle do while, c'est si tu veux que la boucle soit exeutée au moins une fois.... et ici, un while suffit.

      Essaye avec un whyle du genre:

      Tant que rien n'est tapé, le damander ^^

      (je met pas le code expres...)
      • Partager sur Facebook
      • Partager sur Twitter
        27 novembre 2005 à 21:52:46

        do while et le while c'est la meme chose j'ai utilisé do while parsque je n'avais jamais essayé avant.

        Citation : Pas de titre

        Tant que rien n'est tapé, le damander


        un truc du genre si la variable est vide (egale a 0) je redemande, ceci donera la meme chose je pense la premiére fois il m'affichera la question puis il l'affichera a l'infinit sans me laissé le temp de répondre .
        En plus je ne veux pas lui reposé la question si il n'a rien tapé je veux la lui reposé si il tape autre chose qu'un int
        merci de ta réponce
        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2005 à 22:03:10

          Non, while et do while, c'est pas pareil, avec un while, normalement si tu code bien , ca marche...
          Sinon, t'as qu'à utiliser break, c'est pas interdit ;)
          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2005 à 22:03:40

            int age = 0;
            while(age == 0)
            {
            scanf(tout le blabla);
            }


            Ca marche ca ?
            • Partager sur Facebook
            • Partager sur Twitter
              27 novembre 2005 à 22:09:18

              Citation : Pas de titre

              Non, while et do while, c'est pas pareil, avec un while, normalement si tu code bien , ca marche...
              Sinon, t'as qu'à utiliser break, c'est pas interdit ;)


              non break me fait sortire de la boucle
              or moi je ne veux pas sortire je veux juste que le code fasse comme une pause comme pour la premiére fois,
              si le do while te géne voila l'équivalent avec for
              #include <stdio.h>
              #include <stdlib.h>

              int main (void)
              {
                 unsigned short int age;
                 int i;

                 for (i = 0; i<1; ++i)
                 {
                    printf("Entrez votre age :\n");   
                    if(!scanf("%d", &age))i=-1;
                 }
                   
                 printf("Vous avez %d ans ", age);


                 /* Fin d'exécution */
                 system("pause");
                 return 0;
              }

              ce que je veux c'est qu'au moment ou le code arrive a cette ligne printf("Entrez votre age :\n"); il s'arrete en attandant que j'entre une répence puis continue a c'executé normalement or avec mon bout de code d'en haut il s'arrete juste la premiére fois,
              avec un break; je sors de la boucle donc la question ne se repose plus ^^
              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2005 à 22:20:51

                Donc t'es décidé à pas utiliser de while...... T'en as peur???

                Utilise ce que Rotoclap te dis, mais là ton for, c'est nimporte quoi, Dsl ^^

                Enfin bon, c'est comme tu veux, mais moi je ferais while (l'utilisateur tape rien) j'affiche la question
                S'il tape quelque chose, je récupère le quelque chose, je sort de la boucle et je fais ce qu'il faut avec ce quil a tapé.. Enfin, t'as l'air décidé à pas utiliser les astuces qu'on te donne, alors, fait comme tu veux....
                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2005 à 22:23:20

                  Citation : Seeme

                  Donc t'es décidé à pas utiliser de while...... T'en as peur???

                  Utilise ce que Rotoclap te dis, mais là ton for, c'est nimporte quoi, Dsl ^^

                  Enfin bon, c'est comme tu veux, mais moi je ferais while (l'utilisateur tape rien) j'affiche la question
                  S'il tape quelque chose, je récupère le quelque chose, je sort de la boucle et je fais ce qu'il faut avec ce quil a tapé.. Enfin, t'as l'air décidé à pas utiliser les astuces qu'on te donne, alors, fait comme tu veux....


                  ce n'est pas que je ne veux pas c'est que je ne vois pas comment utilisé while ici ni quel serait la difference car le problemme n'est pas en la boucle elle meme vue que sa donne le meme résultat avec toutes les boucles que j'ai utilisé, le problemme c'est de dire au pc: stop attand que je te repond pour continué!!!!!!!

                  €dit :
                  j'ai fait sa mais j'ai toujours le meme probleme
                  #include <stdio.h>
                  #include <stdlib.h>

                  int main (void)
                  {
                     unsigned short int age = 0;
                     
                     while(age == 0)
                     {
                        printf("Entrez votre age :\n"); //je veux que le code s'arrete ici a chaque fois, et qu'il continue a s'executé apres que j'ai entré une valeur
                        if(scanf("%d", &age))break;// si age est un int on sort de la boucle
                     }
                       
                     printf("Vous avez %d ans ", age);


                     /* Fin d'exécution */
                     system("pause");
                     return 0;
                  }


                  donc je répete ce que je veux : je veux qu'a la 2 eme lecture de cette ligne printf("Entrez votre age :\n"); l e code s'arrete jusqua ce que j'entre une valeur puis continue a executé le reste sans que pour autant je ne sorte de la boucle.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 novembre 2005 à 3:18:32

                    Essais cela :


                    #include <stdio.h>

                    #define BUFF_SIZE       3

                    void    exit(int status);
                    int     strlen(char *str);

                    int     my_str_is_num(char *str)
                    {
                      while (*str)
                        if (*str < '0' || *str++ > '9')
                          return (0);
                      return (1);
                    }

                    int     main()
                    {
                      int   i;
                      char  buffer[BUFF_SIZE];

                      for (i = 0; i < BUFF_SIZE; i++)
                        buffer[i] = 42;
                      while (my_str_is_num(buffer) != 1)
                        {
                          printf("Entrez votre age : \n");
                          if ((gets(buffer)) == NULL)
                            exit(1);
                          if (strlen(buffer) >= BUFF_SIZE)
                            for (i = 0; i < BUFF_SIZE; i++)
                              buffer[i] = 42;
                        }
                      printf("Vous avez : %s ans\n", buffer);
                    #ifdef WIN
                      system("pause");
                    #endif
                      return (0);
                    }


                    On declare donc un tableau de BUFF_SIZE caracteres;
                    On initialise ensuite ces caracteres a 42 [...];
                    On test si le buffer est une suite de caracteres representant un nombre; [de '0' a '9' ou 48 a 57 [man ascii]]
                    • Si oui, alors my_str_is_num() renvoie 1 et donc la condition de boucle devient fausse;
                    • Si non, alors my_str_is_num() renvoie 0 et donc comme 0 != 1 alors on continue la boucle;

                    On stocke les caracteres entres au clavier dans buffer grace a gets();
                    • Si gets() echoue -> elle renvoie '0' == NULL -> on quitte
                    • Si la taille de buffer > BUFF_SIZE - 1, alors on le re-initialise et on recommence la boucle;
                    • Sinon on affiche son age;

                    Si compilation sous Windows -> alors on execute la commande shell "pause"

                    Pas teste sous Windows.
                    Compile avec
                    gcc -o age age.c -W -Wall -pedantic -ansi
                    sans erreur :p
                    Ah si a l'execution -> gets is unsafe ! Et il a pas tord :p

                    Test it with : "738297138213782173923171732718973" and "42" -> SegFault

                    Desole pour le code, c'est moche et ca SegFault mais j'essaie de finir un proj en meme temps :p

                    Bon code :)

                    Edit : Desole, la re-lecture fut perieuse :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 novembre 2005 à 6:59:41

                      Oh ! Un revenant ! Ca fait plaisir de te revoir bydoo !

                      Y'a un truc que je pige dans ce que veut Nemesis. Tu veux que ça te pose deux fois la question ?? Mais à la 2ème fois, tu veux que ça exécute le reste du programme qui n'est pas dans la boucle, sans pour autant que tu y sortes ?!
                      Y'a un espèce d'illogisme.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 novembre 2005 à 7:08:32

                        Avec le dernier code (celui ave cwhile) ca doit marcher, je comprends pas pourquoi tu trouves que ca marche pas ? :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 novembre 2005 à 8:22:35

                          #include <stdio.h>
                          #include <stdlib.h>

                          int main (void)
                          {
                             
                             
                             if (!scanf("%d",&n))
                          {     
                             printf("Quel est votre âge?\n);
                          }
                          else
                          {
                          printf("
                          Vous avez %d ans \a", age);
                          }

                             /* Fin d'exécution */
                             system("
                          pause");
                             return 0;


                          Un truc dans le genre devrait marcher aussi ( je sais pas si if (!scanf("%d",&n)) marchera, j'ai pas son proto sous la main, en général j'utilise cin.

                          A voir, donc ;)


                          edit: normalement c'est bon ;)



                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 novembre 2005 à 10:02:14

                            Citation : Pas de titre


                            Oh ! Un revenant ! Ca fait plaisir de te revoir bydoo !

                            Y'a un truc que je pige dans ce que veut Nemesis. Tu veux que ça te pose deux fois la question ?? Mais à la 2ème fois, tu veux que ça exécute le reste du programme qui n'est pas dans la boucle, sans pour autant que tu y sortes ?!
                            Y'a un espèce d'illogisme.


                            Bon je vais essayer d'etre plus claire sur ce que je veux en éspérant que sa t'aidera a m'aider ^^
                            je veux un truc dans ce genre:
                            /1 la fenaitre s'ouvre puis la question "Quel est votre âge?" s'affiche .(le programe attand ma réponce pour continué)
                            2/ soit je met mon age et il m'affiche "Vous avez "un nombre" ans" soit je met n'importe quoi et la il me réaffiche la question "Quel est votre âge?" et en fonction de ma 2 eme réponce soit c'est bon "Vous avez "un nombre" ans" soit j'ai pas tapé de nombre et il me remet la question "Quel est votre âge?" et ansi de suite
                            le probleme qu'il s'arrete a la premiére lecture de la boucle jusqu'a ce que je tape un mot puis en fonction de ce mot soit c'est un nombredonc c'est bon soit c'est des lettres donc il me réaffiche la question selement voila au 2 eme affichage de la question il ne me laisse plus le temp de répondre il la pose a l'infinit
                            bydooweedoo ton code marche ou du moin il s'arrete a chaque fois que la question m'ai posé puis il reprend apres que j'ai répondu selement quand la réponce est bonne il n'affiche pas votre age est il quit directement :/.
                            merci quand meme de votre aide a tous.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 novembre 2005 à 11:25:06

                              Citation : nemesisTHEone


                              le probleme qu'il s'arrete a la premiére lecture de la boucle jusqu'a ce que je tape un mot puis en fonction de ce mot soit c'est un nombredonc c'est bon soit c'est des lettres donc il me réaffiche la question selement voila au 2 eme affichage de la question il ne me laisse plus le temp de répondre il la pose a l'infinit



                              Ca je crois savoir ce que c'est. En fait quand tu tapes entrée, ça te valide le scanf, mais en fait le caractère entrée reste dans le buffer du clavier, donc quand scanf revient ben il se fait valider direct. Normalement, t'as une fonction fflush() qui permet de vider le buffer à appeler avant le scanf.
                              Pour débugger, fais un printf juste apres le scanf, histoire de voir ce vaut ta variable, si c'est pas ça qui fait bugger aussi.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 novembre 2005 à 21:38:03

                                merci beaucoup rotoclap mainteannt sa marche a merveille :D
                                #include <stdio.h>
                                #include <stdlib.h>

                                int main(int argc, char *argv[])
                                {
                                    int age = 0;

                                 while(age == 0)
                                   {
                                      printf("Entrez votre age :\n");
                                      fflush(stdin);
                                      if (scanf("%i", &age))break;       
                                   }
                                     
                                   printf("Vous avez %i ans \n", age);
                                   system("pause");
                                   return 0;
                                }

                                merci aussi au autre zero qui m'en aidé :D.

                                €dit : j'ai aussi trouvé ceci int c;
                                while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */
                                sa a le meme effet fflush(stdin); lequel me conseillez vous ?
                                #include <stdio.h>
                                #include <stdlib.h>

                                int main(int argc, char *argv[])
                                {
                                    int age = 0;

                                 while(age == 0)
                                   {
                                      printf("Entrez votre age :\n");
                                      if (scanf("%i", &age))break;
                                      int c;
                                      while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon */       
                                   }
                                     
                                   printf("Vous avez %i ans \n", age);
                                   system("pause");
                                   return 0;
                                }
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 novembre 2005 à 22:30:47

                                  Ben fflush() est plus simple à comprendre :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 novembre 2005 à 17:45:25

                                    Salut nemesis, t'as déjà eu pleins de réponse a ta question. Mais bon je te file quand même ma solution. En gros tu déclares ta variable age en char et après tu fait une conversion char to int avec la fonction atoi qui est dans la bibliothèque stdlib.h. Et tu test une condition sur atoi.
                                    Finalement ca donne un truc dans le genre:


                                    #include<stdio.h>
                                    #include<stdlib.h>

                                    void main(void)
                                    {
                                            char age[] = "\0";
                                            int presence_age = 1;

                                            while(presence_age)
                                            {       
                                                    printf("Entrer votre age:");
                                                    scanf("%s",age);
                                                    if(atoi(age))
                                                            presence_age = 0;
                                                    else
                                                            presence_age = 1;
                                            }
                                            printf("Vous avez:%s ans",age);
                                    }


                                    Voilà j'espère que ca t'aide un peu.
                                    </span>
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      30 novembre 2005 à 18:05:25

                                      On se calme sur les horreurs.
                                      fflush(stdin) n'existe pas en iso C
                                      void main non plus n'existe pas
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        30 novembre 2005 à 18:25:16

                                        Citation : rz0


                                        fflush(stdin) n'existe pas en iso C



                                        C'est bon en ansi C et ce n'est pas horrible du tout :-°
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          30 novembre 2005 à 18:46:35

                                          The Dooft, pour quelqu'un qui programme sous Unix tu devrais savoir que cette croyance vient d'une connerie de la libc de MS.

                                          Ceci dit vu que tu n'as jamais l'air de me faire confiance je vais citer quelques docs :

                                          Citation : iso-c9899-1999 'c99'

                                          Ifstream points to an output stream or an update stream in which the most recent
                                          operation was not input
                                          (...); otherwise, the behavior is
                                          undefined.



                                          Citation : iso-9989-1999 section informative sur les UBs


                                          The behavior is undefined in the following circumstances:
                                          (...)
                                          The stream for the fflush function points to an input stream
                                          in which the most recent operation was input (7.19.5.2).



                                          Citation : FAQ clc


                                          fflush is defined only for output streams. Since its definition of ``flush'' is to complete the writing of buffered characters (not to discard them), discarding unread input would not be an analogous meaning for fflush on input streams.


                                          Source : http://www.eskimo.com/~scs/C-faq/q12.26.html

                                          Si vous pensez que j'ai toujours tort, je laisse tomber...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            30 novembre 2005 à 21:14:48

                                            fflush(stdin) => poubelle.


                                            Et pour ceux qui sont contre le do {} while(...) ;, je ne comprends pas pourquoi. C'est la boucle la plus adaptée pour faire ce qu'il voulait faire.

                                            do
                                            {
                                              prinft("Age ?\n") ;
                                            }
                                            while ( scanf("%d", &age) == 1 ) ;


                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              30 novembre 2005 à 21:57:03

                                              Question alors, qu'est-ce qu'il faut utiliser alors pour remplacer fflush() ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                30 novembre 2005 à 21:57:52

                                                Arrêter d'utiliser des fonctions moisies qui laisse trainer des caractères dans le buffer.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  30 novembre 2005 à 22:05:18

                                                  + 1

                                                  (getchar + boucle for)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    30 novembre 2005 à 22:12:32

                                                    getchar c'est un peu bourrin, fgets ça existe aussi...
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      30 novembre 2005 à 23:02:49

                                                      Enfin ce sujet me conforte dans l'idée :
                                                      Faites du C++, c'est moins chiant :p !
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        30 novembre 2005 à 23:57:26



                                                        Mackila ton code c pas mal mais en réalité je pense que ce que tu voulais dire c'est:

                                                        #include<stdio.h>

                                                        void main(void)
                                                        {
                                                           int age;

                                                           do
                                                           {
                                                              printf("Age ?\n") ;
                                                           }
                                                           while (!scanf("%d", &age)) ;
                                                        }


                                                        Là il fait la boucle tant que scanf n'as pas "enregistré" un chiffre. Cependant J'ai testé, ca marche qu'a moitié, il fait bien le test, le programme termine lorsque un chiffre est entré, mais il fait une boucle infini si une lettre est entrée.
                                                        Ne devrait il pas refaire un scanf après le printf?

                                                        Je veux dire par là que si on entre une première fois un caractère la boucle recommence et redemande age? et là on devrait pouvoir avoir la main pour entré notre age. Mais là, non ca boucle à infini, Age?Age?Age?....
                                                        Bizarre ca semble correcte pourtant...

                                                        </span>
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          1 décembre 2005 à 0:24:01

                                                          naaoooonnnn
                                                          pfeuh, j'étais sûr que tu allais sortir une phrase du genre ; franchement, en C ce n'est pas si chiant, faut juste gérer le buffer à la main mais c'est pas dur de s'écrire un chtit bout de code qui fait tout ça pour toi

                                                          une façon simple et suffisamment efficace pour la grande majorité des cas ne demandant pas des perfs de l'extrême qui surpassent tout sur un 486 avec 4M de RAM (qui implique que l'utilisateur ne va pas retaper le k&r en une ligne sur l'entrée standard) serait :

                                                          Note : Vu la coloration du C sur le forum, j'utilise la coloration C++ ; cela ne signifie pas que j'approuve l'usage du C++ comme si c'était du C et j'écris en effet du C. :p
                                                          #include <stdlib.h>
                                                          #include <string.h>
                                                          #include <stdio.h>


                                                          char *
                                                          agets(void)
                                                          {
                                                                  char *s = NULL, *p;
                                                                  size_t n = 1;

                                                                  do {
                                                                          p = realloc(s, n += 80);
                                                                          if (!p)
                                                                                  goto error;
                                                                          s = p;
                                                                          p = s + n - 81;

                                                                          if (!fgets(p, 81, stdin))
                                                                                  goto error;
                                                                  } while (p[strlen(p) - 1] != '\n');

                                                                  return s;

                                                          error:
                                                                  free(s);
                                                                  return NULL;
                                                          }

                                                          int
                                                          main(void)
                                                          {
                                                                  char *s;

                                                                  s = agets();
                                                                  printf("You entered: %s", s);
                                                                  free(s);
                                                          }


                                                          ps : Comme vous voyez j'utiliser des gotos pour gérer mes erreurs ; je trouve ça clair mais si vous n'aimez pas, je vous invite à le recoder comme il vous plaira. Les débutants sont invités à s'abstenir d'utiliser le goto à tort et à travers.

                                                          ps2 : Pour ceux qui connaissent un peu le C : Vous voyez ici une bavure de mon style de code ; étant donné que j'ai la flemme de mettre les void entre parenthèses lors de mes définitions de fonction ; dans le présent code vu que ma définition sert de déclaration, mes appels de fonction ne sont pas vérifiés. Mais je vais ptet changer cet aspect du style, c'est à méditer. Le fait est que ça fait 4 ans que je code comme ça alors pour changer les vieilles habitudes...

                                                          ps3 : Comme il ne faut pas trop donner de mauvaises habitudes aux débutants, j'ai rajouté les void. :p
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            1 décembre 2005 à 7:07:40

                                                            Je comprends pas pourquoi tu mets fgets dans une boucle. fgets n'est pas sensé te retourner direct un buffer avec une fin de ligne ?
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              1 décembre 2005 à 7:13:24

                                                              bah si l'utilisateur tape une ligne plus longue que ton buffer faut bien s'en occuper. ;)
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              probleme de boucle

                                                              × 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