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 :

probléme boucle for [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut probléme boucle for
    Bon jour a tous !! je suis debutant en c !! ici je narrive pas a faire tourné ma boucle 5 fois !! je voudrai que a chaque saisi d'une lettre la phrase "saisir un nombre"s'affiche a nouveau , automatiquement!



    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
     
    #include <stdio.h>
    char tab[10];
    int i,boolean,cpt;
    main()
    {
     do
     {
    	printf(" \nsaisir une couleur : ");
    	scanf("%c",&tab[i]);
    	printf("%c",tab[i]);
       tab[i]=i+1;
     }
     while(tab[i]<=i);
     
     return 0;
    }
    Merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut
    avec ça, ta fonction va tourner en boucle indéfiniment.
    il faudrait limiter a 5

    sinon moi je te proposerais d'utiliser la boucle for

    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
     
    #include <stdio.h>
     
    int main()
    {
     char tab[10];
     int i;
     
     for(i = 0 ; i <= 5 ; i++)
     {
    	printf(" \nsaisir une couleur : ");
            fflush(stdin);
    	scanf("%c",&tab[i]);
    	printf("%c",tab[i]);
     }
     
     system("PAUSE");
     return 0;
    }
    oublie pas de mettre le fflush(stdin); avant chaque appel de scanf !

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin il faut peut-être incrémenter ton compteur, ici la variable i ! D'ailleurs si tu connais le nombre de fois qu'une boucle doit tourner, utilise plutôt une boucle for:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i = 0; i < 5; i++)
    {
       /* ton code ici... */
    }

    EDIT: grillaide...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    il manque quelques details dans ce code

    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
     
    #include <stdio.h>
    char tab[10];
    int i /*,boolean ,cpt sert a riien cette variable non ? */ = 0; //il faut initialiser les variables en C, car la norme de garantie pas de valeurs par defaut
    main()
    {
     do
     {
    	printf(" \nsaisir une couleur : ");
            fflush( stdout ); // vider le buffer pour forcer l affichage
    	scanf("%c",&tab[i]);
    	printf("mon caractere frappe : <%c>\r\n",tab[i]);
           /* tab[i]=i+1; pourquoi mettre une autre valeur dans tab[ i ]que celle tappee au clavier ? */
           i += 1;
     }
    /* while(tab[i]<=i); */
    while( i < 5 );
     
     return 0;
    }
    voila de cette maniere ca devrait le faire

    par contre petite remarque :
    pourquoi declarer tes variables a l exterieur du main, l usage de variables globales est deconseillé en C
    si t as des questions n hesite pas

    EDIT P.S. : fflush( stdin ) est a bannir : comportement non defini
    il vaut mieux utiliser un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void fclean( void )
    {
       char buff;
       while( ( buff = getchar() ) != '\n' || buff != EOF ) 
       {
       }
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut
    Merci beaucoup effectivement en a joutant " fflush(stdin);" sa marche beaucoup mieu!!! serieusement merci beaucoup pour vos reponse!! sé la premiére fois que je viens sur ce forum!! et je pense que se sera pas la derniére!

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Citation Envoyé par kamnouz Voir le message
    en a joutant " fflush(stdin);" sa marche beaucoup mieu!!!
    AHAHAH
    oui tout ca !
    fflush sur stdin c'est mal, (comme les char etoile en C++ ).

    faut utiliser le fclean que je t ai filer

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut
    Quelqu'un pourrait-il me dire a quoi correspond cette ligne de command , je ne comprend pas sa signification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((c = fgetc(stdin)) != '\n' && c != EOF)

  8. #8
    Inactif  
    Inscrit en
    Mars 2006
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 352
    Par défaut
    Citation Envoyé par kamnouz Voir le message
    Quelqu'un pourrait-il me dire a quoi correspond cette ligne de command , je ne comprend pas sa signification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((c = fgetc(stdin)) != '\n' && c != EOF)
    Tant que le caractère lu est différent du caractère retour chariot et différent du caractère fin de fichier, faire traitement !

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par kamnouz Voir le message
    Quelqu'un pourrait-il me dire a quoi correspond cette ligne de command , je ne comprend pas sa signification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ((c = fgetc(stdin)) != '\n' && c != EOF)
    On lit le flux d'entrée standard caractère par caractère jusqu'à ce qu'on rencontre un caractère de fin de ligne (placé dans le tampon du flux d'entrée standard lorsque l'utilisateur valide sa saisie avec ENTER) ou le caractère indicateur de fin fichier (présent lorsque l'utilisateur envoie un fichier sur le flux d'entrée standard).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par BainE Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	printf("mon caractere frappe : <%c>\r\n",tab[i]);
    Pourquoi un retour chariot avant la fin de ligne?

    Voici mes corrections. Il faut vider le tampon du flux d'entrée standard à chaque tour sinon attention aux problèmes:

    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
    #include <stdio.h>
     
    /* -tc- evite les variables globales lorsque ce n'est pas necessaire */
     
    /* -tc- purge le flux d'entree standard */
    void purger(void)
    {
        int c;
     
        while ((c = fgetc(stdin)) != '\n' && c != EOF)
        {
        }
    }
     
     
    /* -tc- main() retourne un entier de type int, toujours! */
    int main(void)
    {
        char tab[10];
        int i = 0;
     
        while (i < 10)
        {
            printf("saisir une couleur : ");
            /* -tc- force l'affichage de l'invite */
            fflush(stdout);
            scanf("%c",&tab[i]);
            if (tab[i] != '\n' && tab[i] != EOF)
            {
                purger();
            }
            i = i+1;
        }
     
        return 0;
    }
    Citation Envoyé par kamnouz
    Merci beaucoup effectivement en a joutant " fflush(stdin);" sa marche beaucoup mieu!!! serieusement merci beaucoup pour vos reponse!! sé la premiére fois que je viens sur ce forum!! et je pense que se sera pas la derniére
    Ne surtout pas utiliser fflush() sur un flux entrant. Comportement indéfini! Tout peux arriver...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Pourquoi un retour chariot avant la fin de ligne?
    parce que je ne connais pas l OS (j ai supposé un Winxxx ) désolé

    fgetc( stdin ) lit un caractere sur le flux passe en parametre, ici stdin.

    tant que le caractere lu n'est pas le marqueur de fin de ligne ou End-Of-File on lit le suivant

    Tout ca pour vider le buffer sans utiliser fflush qui est "interdit" sur un flux entrant.
    voir le man pour la confirmation

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par BainE Voir le message
    parce que je ne connais pas l OS (j ai supposé un Winxxx ) désolé
    Que vient faire l'OS là dedans? La conversion \n -> \r\n est automatique et transparente sur tous les flux ouvert en mode texte.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  13. #13
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    au temps pour moi, je ne savais pas ca.

    je vais regarder ca de plus pres.

Discussions similaires

  1. Problème boucle for
    Par revsys dans le forum Delphi
    Réponses: 20
    Dernier message: 24/05/2007, 15h50
  2. Problème boucle for
    Par rouliane dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2006, 14h37
  3. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  4. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

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