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 :

[DEBUTANT]Quelques petites mises au point


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Preez
    Oui, je me rapelle de ces trois phases (tu m'avais expliqué), mais que c'est dur à mettre en oeuvre...
    Essaye, au moins... En MP, si tu veux, pour ne pas polluer le forum...
    Pour les structures, je connais pas encore !
    Alors, le projet est peut être un peu gros pour toi ? (je n'ai pas regardé...)
    Bien, alors j'ai utilisé getchar(), mon bloc s'execute toujours deux fois...
    M'enfin, on te dit d'utiliser fgets(), personne n'a parlé de getchar(). Tu veux faire le malin ou quoi ?

    Si tu veux en connaitre les raisons, tout est là :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    M'enfin, on te dit d'utiliser fgets(), personne n'a parlé de getchar(). Tu veux faire le malin ou quoi ?
    Ouais au moins ça, "je me la pète grave avec mon getchar()", déjà que je peine à maitriser des fonctions que je pensais connaître, alors celles que je ne connais pas.
    Enfin bref, ça m'a obligé à chercher ce qu'était sizeof, et ça ne résouds toujours pas mon problème. Si l'utilisateur rentre 'E', fgagne retourne 1, et le bloc s'exécute deux fois...
    Et non, le projet n'est pas trop gros, enfin, il doit être réalisable sans "structures", trois petites fonctions, une boucle et deux/trois conditions.

  3. #23
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     char caractere = ' '; 
    ....   
    lectureCaractere(motSecret, boolmotSecret, caractere);
    Apparemment, main n'a en fait rien à faire avec caractere. De plus, et plus grave, le troisième argument n'est pas du bon type (char au lieu de char *) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void lectureCaractere(char *motSecret, int *boolmotSecret, char *caractere)
    {
     
        caractere = getchar();
        int i = 0;
        for(i = 0; i < 11; i++)
        {
            if(caractere == motSecret[i])
            boolmotSecret[i] = 1;
        }
    }
    caractere serait mieux en variable locale à la fonction et totalement enlevé de main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void lectureCaractere(char *motSecret, int *boolmotSecret)
    {
     
       char caractere = getchar();
        int i ;
        for(i = 0; i < 11; i++)
        {
            if(caractere == motSecret[i])
            boolmotSecret[i] = 1;
        }
    }
    Accessoirement, ce 11 est déplaisant alors que la fin est bien déterminée par la présence de '\0' dans motSecret

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    D'accord, merci!
    J'ai redefini caractère en locale à "lectureCaractere":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void lectureCaractere(char *motSecret, int *boolmotSecret)
    {
     
        char caractere[1];
        fflush(stdout);
        fgets(caractere, sizeof caractere, stdin);
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            if(*caractere == motSecret[i])
            boolmotSecret[i] = 1;
        }
    }
    J'effectuerai le test d'erreur sur fgets() lorsque le programme fonctionnerait "passablement".

    J'ai un petit souci là-dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `fgagne':
    main.c:85: warning: control reaches end of non-void function
    Qui corresponds à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int fgagne(int *boolmotSecret)
    {
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            if(boolmotSecret[i] == 0)
            return 0;
          return 1;
        }
    }
    Ma question est là suivante, les return étant à l'interieur du for, ils retournent quand même un int, ou rien du tout??

  5. #25
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int fgagne(int *boolmotSecret)
    {
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            if(boolmotSecret[i] == 0)
            return 0;
          return 1;
        }
    }
    Bon, quand t as une erreur pareille, ça veut dire qu il y a des cas ou tu n'a pas mis de return.

    La en l'occurence, tu ne fais qu'un tour de boucle et tu retournes 0 ou 1 suivant la premiere lettre, ce qui explique peut etre ton probleme avec le E.

    Donc, ce code ce n'est pas celui que je t'ai donné, le return 1 c'est seulement quand tu as parcouru TOUTE la boucle sans trouvé de lettre qui diffère.

    Apres c'est de la logique je dirais

  6. #26
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int EstMotTrouve(int const * pcBoolMotSecret, size_t taille)
    {
        size_t i;
        for(i = 0 ; i < taille ; i++)
        {
            if( ! pcBoolMotSecret[i] )
                return 0;
        }
        return 1;
    }

  7. #27
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void lectureCaractere(char *motSecret, int *boolmotSecret)
    {
     
        char caractere[1];
        fflush(stdout);
        fgets(caractere, sizeof caractere, stdin);
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            if(*caractere == motSecret[i])
            boolmotSecret[i] = 1;
        }
    }
    -fflush(stdout) n'a rien à voir avec la lecture d'un caractère. Si tu as des problèmes de vidage du tampon d'entrée voir la FAQ C "Comment vider le tampon d'entrée.
    -fgets demande comme deuxième argument le nombre de caractères maximum à lire +1 . Si tu veux lire un caractère, le tableau doit être de 2 char minimum. Personnellement, je ne vois pas bien l'avantage de fgets pour lire 1 caractère.
    -Ma remarque sur le 11 ne concernait pas la borne supérieure qui est maintenant de 10, mais le fait que motSecret est strictement limité : il doit avoir exactement 10 caractères, ni plus, ni moins. Cette limitation est inutile, puisque motSecret se termine lorsque motSecret[i] == '\0' et la condition de boucle devrait être motSecret[i] != '\0'

  8. #28
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    1-D'accord j'ai modifié tout ça. Cependant, lorsque la boucle for se termine, l'instruction qui se trouve après est executée, non? Même si l'on met un return 0; dans la boucle for, la fonction devrait retourner 1 dans tous les cas (avec l'execution du return 1, non? Enfin, ça fonctionne et tant mieux, mais ça veut donc dire qu'après un return; dans une fonction, les instructions ne sont pas executées? Ou ce n'est valable que pour les return; qui suivent?

    2-Pour ma fonction lectureCaractere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void lectureCaractere(char *motSecret, int *boolmotSecret)
    {
     
        char caractere[2];
        fflush(stdout);
        fgets(caractere, sizeof caractere, stdin);
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            if(*caractere == motSecret[i])
            boolmotSecret[i] = 1;
        }
    }
    Le programme fonctionne, la saisie du caractere, seulement pour le fflush(), le résultat est exactement égal avec ou sans cette fonction. Est-elle néanmoins utile dans mon cas? Mon usage de fgets() semble correct ou non?

    3-J'ai toujours deux fois l'affichage de mon bloc central, (j'ai essayé la technique du (!quit), ça reviens au même, je ne comprends pas d'où l'erreur provient... A la première execution de la boucle, il s'execute une fois, et attends l'interaction avec l'utilisateur (fgets()), ensuite, entre les deux fgets() il s'execute deux fois... Ca veut dire qu'à la première des deux executions (non-voulue) le fgets() ne s'execute pas, non? Sinon le programme serait en pause jusqu'à la saisie du caractère? Donc, lectureCaractere s'execute une fois sur deux, pourquoi?

    Je remet le code, modifié:
    pendub.c

    En attendant, je vais essayer de detecter et gérer les erreurs, et de mettre toupper() pour le caractere.

    Edit: Merci Diogène, euh pour les tampons, buffer etc. je n'y connais rien du tout, je vais donc aller voir la FAQ et puis les cours dans mon bouquin (grr ça va me faire sauter 5/6 chapitres...). C'est déjà ça de reglé. Merci aussipour la condition de boucle, et puis c'est plus pratique si ensuite j'arrive à implémenter un fichier contenant tous les mots, donc à taille variable, ce sera déjà ça de gagné.

  9. #29
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1-
    mais ça veut donc dire qu'après un return; dans une fonction, les instructions ne sont pas executées?
    Bien sur, sur un return on quitte la fonction.
    2 et 3-
    J'ai toujours deux fois l'affichage de mon bloc central,
    Cela vient du fait qu'après le fgets sur deux caractères, il reste un caractère dans le tampon d'entrée : Par exemple, pour répondre, on tape une lettre , par exemple A et le retour chariot (RC). Après le RC, le fgets transmet le A dans le tableau caractere et termine le tableau par '\0'. Le RC n'a pas été transmis et reste dans le tampon. Au fgets suivant, on trouve ce RC que le fgets met dans le tableau caractere qu'il termine là aussi par zéro. Le second fgets a été accompli sans aucune entrée supplémentaire de l'utilisateur et le bloc central a été exécuté deux fois ! Pour éviter ceci, il faut que le tampon soit vide en sortie de la fonction lectureCaractere. On peut par exemple dimensionner le tableau caractere à trois. Alors le premier fgets mettra dans caractere le A puis le RC (ce qui vide le tampon) puis le '\0'. Toutefois, il ne faut pas que l'utilisateur entre par mégarde plus d'un caractère avant le RC. Pour se prémunir contre les fautes d'entrée de l'utilisateur, il est plus simple de lire l'entrée par un getchar() puis de purger le tampon comme expliqué dans la FAQ C "Comment vider le tampon d'entrée".
    On obtient après ces divers correctifs par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void lectureCaractere(char *motSecret, int *boolmotSecret)
    {
        int i;
        char caractere;
        int c;
        caractere = getchar();
        while ((c = getchar()) != '\n' && c != EOF); /* mange le tampon Voir FAQ*/
        for(i = 0; motSecret[i]!= '\0'; i++)
            if(caractere == motSecret[i]) boolmotSecret[i] = 1;
    }

  10. #30
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    Super, merci beaucoup!!
    getchar() powered...

  11. #31
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Super, merci beaucoup!!
    Non, ce n'est pas encore "super".:
    Il reste à
    - Régler le problème de la dimension dans les fonctions affiche et fgagne
    - faire du ménage dans main et notamment à se débarrasser de ce while(1) qui semble t-il devrait être plutôt un while(!fgagne(...))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else /*Sinon, erreur*/
          printf("Erreur d'execution du programme");
    Je ne vois pas sous quelles conditions on pourrait être amené à exécuter ce code.

    - Je ne crois pas que la représentation des données que tu utilises soit très bonne, notamment à cause de ce tableau boolmotSecret de int. Personnellement, j'aurais sans doute utilisé un autre tableau de char initialisé avec des '*' et j'aurais remplacé les '*' par les caractères trouvés. Dans ce cas, la longueur de ce tableau résultat est implicite avec son '\0' terminal, et la fonction affiche se résume à un simple printf("%s", resultat); La fonction lectureCaractere n'est pas plus complexe et fgagne n'a plus besoin d'argument supplémentaire pour passer la dimension du tableau.

  12. #32
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Preez
    2-Pour ma fonction lectureCaractere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void lectureCaractere(char *motSecret, int *boolmotSecret)
    {
     
        char caractere[2];
        fflush(stdout);
        fgets(caractere, sizeof caractere, stdin);
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            if(*caractere == motSecret[i])
            boolmotSecret[i] = 1;
        }
    }
    Le programme fonctionne, la saisie du caractere, seulement pour le fflush(), le résultat est exactement égal avec ou sans cette fonction. Est-elle néanmoins utile dans mon cas? Mon usage de fgets() semble correct ou non?
    Non Elle ne sert à rien ici. Elle agit sur le flux sortant, or tu cherches à utiliser le flux entrant. Je ne vois pas le rapport. Il faut cesser de coder au hasard. Chaque instruction a un rôle précis qu'on doit être capable de justifier. Le codage, c'est pas de la magie.

    La saisie d'un caractère nécessite un tableau de 3 char, il me semble l'avoir déjà expliqué. Quand on tape a<enter>, on entre :
    'a', '\n' et un 0 est ajouté la fin, ce qui fait bien 3 char.

    Ensuite, il faut appeler la fonction de nettoyage (clean() déjà évoqué un zillion de fois) pour supprimmer le \n ou purger ce qui a été saisi en trop et ensuite s'intéresser au 1 er élément du tableau (en [0]). C'est là que se trouve le caractère saisi. Si il y a quelque chose à retourner, par exemple, c'est ce caractère.

    Quand je te dis d'utiliser exclusivement fgets() pour faire tes saisies, c'est pour que toutes les saisies soient sûres et propres et que la saisie suivante soit stable. Bien sûr, ça suppose qu'on fasse le nettoyage à chaque fois (selon le principe 'laisser propre en sortant'), ce que tu n'as pas fait. Ca peut expliquer des instabilités lors du prochain appel d'une fonction de lecture ('\n' 'pendant').

    Enfin, la fonction s'appelle LectureCaractere, mais elle fait plus que ça, puisqu'elle va ensuite bricoler avec des tableau de char...

    Il ne faut pas mentir à ses lecteurs. Si tu annonces LectureCaractère, tu fais lecture caractère et rien d'autre (mais tu le fais bien).

  13. #33
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Preez
    Super, merci beaucoup!!
    getchar() powered...
    Oui, c'est une autre solution qui ne nécessite pas de tableau de 3 char. OK, mais il faut encore savoir la mettre en oeuvre...

  14. #34
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    Merci pour l'idée du tableau de char (avec des '*'), ça va me simplifier l'affaire! je me suis compliqué la tache pour rien avec du recul...
    En effet, j'ai encore beaucoup de ménage à faire, et encore vous avez pas vu mon code actuel, un vrai champ de bataille...
    Enfin bon, j'ai compris ce que chaque fonction doit faire, tout fonctionne, je vais tout recommencer plus proprement (et essayer de planifier un peu l'affaire sur papier avant), m'atteler à la meilleur compréhension de fgets() et getchar(), histoire de partir sur de bonnes bases pour les améliorations qui vont suivre.
    Merci à tous pour vos rectifications et conseils!

  15. #35
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    Bon, et bien voilà,
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    /*Prototypes*/
    void lectureCaractere(char *motSecret, char *boolmotSecret);
    int fgagne(char *boolmotSecret, char *motSecret);
     
    /*Foncton principale*/
    int main()
    {
      /* Declaration des variables et tableaux */
      char motSecret[11] = "EXACTEMENT";
      char boolmotSecret[11];
      int i = 0;
      for(i = 0; i < 10; i++)
        boolmotSecret[i] = '*';
     
      printf("==Le PenDu==\n\n");
      while(!fgagne(boolmotSecret, motSecret)) /*Boucle principale*/
        {
          printf("TrouvE le Mot SecrEt!\n");
          printf("Le MoT SeCReT est :");
          printf("%s", boolmotSecret);
          printf("\nEntrez une lettre (majuscule):");
          lectureCaractere(motSecret, boolmotSecret);
          printf("\n");
        }
     
      if(fgagne(boolmotSecret, motSecret)) /*il a gagné, on affiche un message avec le motSecret*/
        {
          printf("Bravo! Vous avez trouve, le mot secret etait bien ");
          printf("%s", boolmotSecret);
        }
     
      printf("\n\n");
      return 0;
    }
     
    void lectureCaractere(char *motSecret, char *boolmotSecret)
    {
     
      int i;
      char caractere;
      int c;
      caractere = getchar();
      caractere = toupper(caractere);
      while ((c = getchar()) != '\n' && c != EOF)
        ;
      for(i = 0; motSecret[i]!= '\0'; i++)
        {
          if(caractere == motSecret[i])
            boolmotSecret[i] = caractere;
        }
     
    }
     
    int fgagne(char *boolmotSecret, char *motSecret)
    {
      int i = 0;
      for(i = 0; i < 10; i++)
        if(boolmotSecret[i] != motSecret[i])
          return 0;
      return 1;
    }
    Pour ma part je me retrouve avec un code fonctionnel (sauf le petit coeur qui s'affiche tout le temps à la fin des "********" du mot secret ), j'ai essayé de suivre vos conseils, avec ce que je savais faire. Est-ce qu'il reste des améliorations notables à effectuer? Des simplifications? Des cas d'erreur que je ne gère pas?
    J'ai supprimer la fonction affiche, qui, comme tu l'as si bien dit Diogène, ne se résume plus qu'à un printf("%s", boolmotSecret).
    J'ai changé mon while(1), j'ai rajouté char *motSecret en paramètre de fgagne, pour effectuer la comparaison (vu que ce n'est plus des "booléens") et voilou.
    Si il y a encore des choses qui pêchent , merci de me mettre sur la voie!
    Merci à tous!

  16. #36
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1-
    sauf le petit coeur qui s'affiche tout le temps à la fin des "********" du mot secret
    Cela vient du fait que boolmotSecret n'est pas correctement terminé par '\0'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      for(i = 0; i < 10; i++)
        boolmotSecret[i] = '*';
      boolmotSecret[i] = '\0';
    2- fgagne n'a pas besoin de connaître motSecret : c'est perdu si il y a encore une '*' dans boolmotSecret et gagné si il n'y en a plus.
    3- fgagne continue à restreindre les mots à exactement 10 caractères! L'inconvénient a été levé dans lectureCaractere et doit être levé de la même façon dans fgagne
    4- Cet inconvénient subsiste dans le main : des 10 ou 11 se balladent partout.
    Or boolmotSecret peut être largement dimensionné pour contenir un mot arbitrairement très long. Lors de l'initialisation de boolmotSecret des * sont copiées tant que des caractères != '\0' sont contenus en même position dans motSecret et un '\0' est ajouté derriere. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      char motSecret[] = "SECRET";
      char boolmotSecret[32];
      int i ;
      for(i = 0; motSecret[i] != '\0'; i++)
        boolmotSecret[i] = '*';
      boolmotSecret[i] = '\0';
    Pour changer le mot secret, une seule ligne est alors à modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char motSecret[] = "PROGRAMMATION";
    recompiler et tout marche.
    5- Cette suppression de la dépendance sur le nombre de caractères permet d'envisager d'entrer un mot secret quelconque à partir d'un fichier (merci à fgets) ce qui évite la recompilation (pas au clavier sinon le secret devient un secret de Polichinelle )

    Bon courage

  17. #37
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Points : 18
    Points
    18
    Par défaut
    D'accord! Je m'y atelle! Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Debutant] Mise au point d'une temporisation
    Par Slivo dans le forum Débuter
    Réponses: 5
    Dernier message: 25/04/2007, 00h18
  2. Réponses: 9
    Dernier message: 17/08/2006, 12h20
  3. [petites questions][debutant]run et mise en forme
    Par kurgan dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 22/10/2005, 17h40
  4. Petite mise au point avec gluUnProject.
    Par fatpat94 dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/07/2005, 15h40

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