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 :

Un probléme de condition dans une boucle


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Points : 55
    Points
    55
    Par défaut Un probléme de condition dans une boucle
    Bonsoir, j'ai un probleme dans mon code, j'essaie de chercher cette erreur mais je m'embrouille avec les conditions dans une boucle voici le 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
    21
    char mot_secret[6]="livre";
    char lettre=0;
    int comptant=5;
    int i;
     
    while(comptant>0)
    {
    	printf("Entrer la lettre:");
    	scanf("%c",&lettre);
    	getchar();
     
    	for (i=0;i<6;i++)
    	{
    		if (mot_secret[i]==lettre)
    		printf("C'est la %de lettre\n",i+1);
    		else  // c'est ici quand j'entre la mauvaise lettre, il repete le printf() 6x c'est normal mais je sais pas comment eviter cela de plus, au lieu d'enlever -1 au comptant et bien ça quitte boucle c'est embettant
    		printf("Aucune lettre, vous perdez un tour\n");
    		comptant--;
    	}
     
    }
    Voila je vous remercie de votre aide !!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 401
    Points : 23 783
    Points
    23 783
    Par défaut
    Bonsoir,

    Lorsque tu écris :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		if (mot_secret[i]==lettre)
    		printf("C'est la %de lettre\n",i+1);
    		else
    		printf("Aucune lettre, vous perdez un tour\n");
    		comptant--;

    Ton programme exécute printf("C'est la lettre"); si ta condition est vraie et printf("Aucune lettre"); si elle est fausse. L'instruction « comptant-- » est donc en dehors de ton test if(), et est donc exécuté dans tous les cas. Si tu veux que « printf("Aucune lettre"); » et « comptant-- » tous les deux soumis à ton else, il faut les mettre dans un bloc. Autrement dit, il manque des accolades :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (mot_secret[i]==lettre) printf("C'est la %de lettre\n",i+1);
    else 
    {
        printf("Aucune lettre, vous perdez un tour\n");
        comptant--;
    }

    au lieu d'enlever -1 au comptant et bien ça quitte boucle c'est embettant.
    En fait, il ne quitte pas la boucle tout de suite, mais il fait six fois « -1 » parce qu'il fait six tours de boucle for();. Et comme « comptant » n'est initialisé qu'à 5 au départ, tu tombes en dessous de zéro et le jeu s'arrête.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Points : 55
    Points
    55
    Par défaut
    aa bha oui !! -1 ça le quitte ok cependant malgré que j'ai mis les accolades le code bug.

    J'avais pensé à mettre for (i=0;i<1;i++) pour que ca evite d'envoyer 6 printf() à la fois je sais pas si c'est judicieux car aprés lorsque j'entre la lettre i de livre et bien il ne la detecte pas il affiche le printf() de else ...


    PS: Voila mais je vois pas du tout comment le corriger ... si tu pourai m'eclaicir merci

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    printf("Entrer la lettre:");
    	scanf("%c",&lettre);
    	getchar();
     
    	for (i=0;i<sizeof(mot_secret);i++)
    	{
    		if (mot_secret[i]==lettre){
    		printf("C'est la %de lettre\n",i+1);}
    	}
    	if (!mot_secret[i]==lettre)
        {
            printf("Aucune lettre, vous perdez un tour\n");
    		comptant--;
        }

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( !mot_secret[i] == lettre )
    1) Ouille ! la priorité des opérateurs. ! a une priorité supérieure à ==.
    2) Le résultat de l'expression !qqchose vaut 0 ou 1.

    Attention également à ne pas confondre sizeof(tableau) et strlen(tableau). Dans le premier cas, c'est la taille du tableau (en bytes), alors que dans le second cas, c'est la longueur de la chaîne, ce qui n'est absolument pas pareil.
    Dans ton exemple, ton tableau fait non pas 5 mais 6 bytes (le \0 final est compté), et la chaîne qu'il contient fait 5 bytes.

    Ensuite, ton code doit-il trouver toutes les occurrences ou seulement la première ?
    1) S'il doit trouver seulement la première, dès qu'il la trouve, tu peux sortir de la boucle une fois le message affiché. Par conséquent, une fois sortis de boucle, on sait que i ne peut pas être égal à strlen(mot_secret). Tu peux t'en servir pour savoir si une occurrence a été trouvée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for ( i=0 ; i < strlen(mot_secret) ; i++ )
    {
    	if ( mot_secret[i] == lettre ) {
    		printf("C'est la %de lettre\n",i+1);
    		break; /* 1ère occurrence trouvée, pas besoin d'aller plus loin */
    	}
    }
    if ( i == strlen(mot_secret) ) /* si la condition est vraie, c'est qu'on a forcément parcouru toute la chaine sans trouver la lettre */
    {
    	printf("Aucune lettre, vous perdez un tour\n");
    	comptant--;
    }
    2) Si tu dois trouver toutes les occurrences, tu peux te servir d'une variable que tu initialiseras avant la boucle, et dont tu changeras la valeur dès la première occurrence trouvée. Une fois que la boucle est terminée, il te suffira alors de vérifier sa valeur. Si sa valeur n'a pas changé, c'est qu'aucune occurrence n'a été trouvée.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Points : 55
    Points
    55
    Par défaut
    a d'accord j'ai compris cependant je n'ai pas trés bien saisie le if ( i == strlen(mot_secret) ) .. ça te derange pas de me l'expliquer en details

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 401
    Points : 23 783
    Points
    23 783
    Par défaut
    Citation Envoyé par boubz013 Voir le message
    a d'accord j'ai compris cependant je n'ai pas trés bien saisie le if ( i == strlen(mot_secret) ) .. ça te derange pas de me l'expliquer en details
    C'est écrit dans son commentaire associé. Relis bien.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    /* si la condition est vraie, c'est qu'on a forcément parcouru toute la chaine sans trouver la lettre */

    C'est moins une question de programmation que de conception, à ce stade : il s'agit de décrémenter « comptant » seulement si la lettre n'a pas été trouvée dans le mot-mystère. Et ça, tu ne peux le savoir que si tu as parcouru toute ta chaîne. Étant donné que, pour une longueur l, ta boucle court de 0 à l-1, si i vaut l, c'est que ta boucle est allée jusqu'au bout.

    C'est un moyen de savoir, donc, si ta boucle précédente s'est terminée parce qu'elle est arrivée à son terme, ou si on a fait un break.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 110
    Points : 55
    Points
    55
    Par défaut
    a sayer enfin je viens de comprendre merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/03/2009, 18h08
  2. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  3. [FLASH MX2004] Deux conditions dans une boucle
    Par pierrot10 dans le forum Flash
    Réponses: 1
    Dernier message: 06/11/2005, 16h31
  4. Réponses: 6
    Dernier message: 17/08/2005, 12h38
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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