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 :

Organisation du code pour un pendu


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Organisation du code pour un pendu
    Bonjour à tous,
    Je suis depuis peu les cours de C et je dois réaliser un TP qui consiste à créer un jeu du pendu dans lequel le joueur a 10 essais. Je suis un peu (beaucoup) perdu, j'ai essayé d'organiser mes idées sur papier, et de laisser ce que je n'arrivais pas à traduire en code en français.
    Ainsi il me manque deux fonctions, que j'ai remplacé par du français dans mon code :

    - La première est une fonction qui affiche le mot recherché en remplaçant les lettres qui n'ont pas été trouvées par des "*".

    - La seconde vérifierait si toutes les lettres du mot ont été trouvées ou non.

    J'ai sûrement fait un très grand nombre d'erreurs, & je serai ravi qu'on me les fasse remarquer. Voici mon code pour main.c :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "main.h"
    #include <ctype.h>
     
     
    int main(int argc, char *argv[])
    {
        char lettreEntre[10]; // Pour enregistrer les 10 lettres que va taper le joueur
        char motSecret[] = "ROUGE"; // Le mot à trouver 
        char *pointeurMotSecret = &motSecret; // Pointeur sur le mot secret
        char *pointeurLettre = &lettreEntre; // Pointeur sur la lettre que va taper le joueur
        int i = 10; // Les 10 coups à jouer
        char *lettreTrouve = NULL; // Pointeur qui enregistre si on a trouvé le caractère entré
     
     
        for (i = 10; i > 0, Toutes les lettres ne sont pas trouvées; i -1)
        {
            printf("Il vous reste %d essais\n", i);
            printf("Quel est le mot ? Entrez un caractere\n", Afficher motSecret avec lettres trouvées);
            lettreEntre[i] = lireCaractere();
     
           lettreTrouve = strchr(motSecret, *pointeurLettre); // On recherche le caractère entré dans motSecret
     
            if (lettreTrouve != NULL) // S'il y est, on rajoute un coup
            {
                i ++;
            }
        }
     
        if (Toutes les lettres sont trouvées)
        {
            printf("Bravo, le mot était bien %s", motSecret);
        }
     
        else
        {
            printf("Perdu");
        }
     
     
    return 0;
    }
    Et pour main.h :

    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
    #ifndef DEF_MAIN.H // Si la constante n'a pas été définie le fichier n'a jamais été inclus
    #define DEF_MAIN.H // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
     
    char lireCaractere()
    {
        char caractere = 0;
     
        caractere = getchar(); // On lit le premier caractère
        caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
     
        // On lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer)
        while (getchar() != '\n') ;
     
        return caractere; // On retourne le premier caractère qu'on a lu
    }
     
    #endif
    Merci d'avance

  2. #2
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    Une remarque en passant (je n'ai pas encore regardé le code de près) : une fonction ne doit pas être implémentée dans le header (ton main.h) mais seulement déclarée avec son prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef DEF_MAIN.H // Si la constante n'a pas été définie le fichier n'a jamais été inclus
    #define DEF_MAIN.H // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
     
    char lireCaractere(void);
     
    #endif
    L'implémentation elle-même se fait alors dans le main.c :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    #include "main.h"
     
     
    int main(int argc, char *argv[])
    {
        char lettreEntre[10]; // Pour enregistrer les 10 lettres que va taper le joueur
        char motSecret[] = "ROUGE"; // Le mot à trouver 
        char *pointeurMotSecret = &motSecret; // Pointeur sur le mot secret
        char *pointeurLettre = &lettreEntre; // Pointeur sur la lettre que va taper le joueur
        int i = 10; // Les 10 coups à jouer
        char *lettreTrouve = NULL; // Pointeur qui enregistre si on a trouvé le caractère entré
     
     
        for (i = 10; i > 0, Toutes les lettres ne sont pas trouvées; i -1)
        {
            printf("Il vous reste %d essais", i);
            printf("Quel est le mot ? Entrez un caractere", Afficher motSecret avec lettres trouvées);
            lettreEntre[i] = lireCaractere();
     
           lettreTrouve = strchr(motSecret, *pointeurLettre); // On recherche le caractère entré dans motSecret
     
            if (lettreTrouve != NULL) // S'il y est, on rajoute un coup
            {
                i ++;
            }
        }
     
        if (Toutes les lettres sont trouvées)
        {
            printf("Bravo, le mot était bien %s", motSecret);
        }
     
        else
        {
            printf("Perdu");
        }
     
     
    return 0;
    }
     
    char lireCaractere()
    {
        char caractere = 0;
     
        caractere = getchar(); // On lit le premier caractère
        caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà
     
        // On lit les autres caractères mémorisés un à un jusqu'au \n (pour les effacer)
        while (getchar() != '\n') ;
     
        return caractere; // On retourne le premier caractère qu'on a lu
    }

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    "- La première est une fonction qui affiche le mot recherché en remplaçant les lettres qui n'ont pas été trouvées par des "*"." ->

    Pour ca, je ferais deux char* : le premier avec le mot a trouver, le deuxieme avec les lettres deja trouvees. Je m'explique. Le deuxieme commencerait avec toutes les lettres qui seraient des '*' puis que tu remplacerais au fur et a mesure que l'utilisateur trouverait les lettres.

    "- La seconde vérifierait si toutes les lettres du mot ont été trouvées ou non." ->

    Une fonction en C existe pour ca: strcmp.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef DEF_MAIN.H // Si la constante n'a pas été définie le fichier n'a jamais été inclus
    #define DEF_MAIN.H // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
    A noter que cela n'est valable que dans l'unité de compilation courante. Si on inclue ce fichier d'en-tête dans un autre file .c, alors la macro ne sera pas définie et le test donnera faux. C'est ici le but recherché : pouvoir inclure le même fichier dans plusieurs unités de compilation. Si celui-ci ne doit être inclus que dans une seule unité de compilation, il faut savoir que ce n'est pas la solution à adopter

    j'ai essayé d'organiser mes idées sur papier, et de laisser ce que je n'arrivais pas à traduire en code en français. Ainsi il me manque deux fonctions, que j'ai remplacé par du français dans mon code :
    Idéalement, tu devrais d'abord tout écrire en français, puis traduire en code C. C'est ce qu'on appelle la programmation par pseudo-code.

    Pour ce qui est du code, imperio a donné des solutions valables.

  5. #5
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Salut, merci de vos réponses, j'ai pas eu beaucoup de temps, mais j'ai essayé de refaire un peu le code. Je suis arrivé à ça :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "main.h"
    #include <ctype.h>
    #include <string.h>
     
    // FONCTIONS
     
    void affichage(char *trouves[])
    {
        int n;
     
        for (n = 0 ; n < 6 && trouves[6] != (1) ; n++)
            {
                if (trouves[n] = (1))
                {
                    printf("%c", trouves[n]);
                }
     
                else (trouves[n] = (0));
                {
                    printf("_ ");
                }
            }
     
    }
     
    // FIN DES FONCTIONS
     
    int main(int argc, char *argv[])
    {
        char lettreEntre = 0; // Pour enregistrer les lettres que va taper le joueur
        char motSecret[] = "ROUGE"; // Le mot à trouver
        int essais = 10; // Les 10 coups à jouer
        int n = 0;
        char trouves[6]= {0};
        char *pointeurTrouves = trouves;
     
        for (essais = 10; essais > 0; essais -- && n++)
        {
            printf("Il vous reste %d essais\n", essais);
     
            affichage(pointeurTrouves);
     
            printf("Quel est le mot ? Entrez un caractere en majuscule\n");
            scanf("%s", lettreEntre);
            printf("\n");
     
     
            if (strcmp(motSecret, lettreEntre) == 1) // S'il y est, on rajoute un coup
            {
                essais ++;
                pointeurTrouves[n] = (1);
            }
     
            else
            {
                printf("\nCette lettre n'est pas presente dans le mot\n");
            }
        }
     
     
    return 0;
    }
    Mais dès que j'entre une lettre, le programme s'arrête. J'utilise sûrement mal les pointeurs, et je ne suis pas sûr de ma fonction affichage() qui utilise les booléens..

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 178
    Points : 451
    Points
    451
    Par défaut
    Salut,

    Après avoir jeter un oeil flash éclair :

    ça plante car tu utilises mal "strcmp" qui est fait pour comparrer deux chaines, et comme le 2ème argument n'est pas un pointeur mais un char, il n'est vraiment pas content. De toute façon pointeur ou pas, tu dois utiliser une autre fonction pour ton test.

    Après il y a peut être d'autres problèmes...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par pythéas Voir le message
    Après il y a peut être d'autres problèmes...
    Effectivement
    • lettreEntre est bien un char, or tu fais
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      scanf("%s", lettreEntre);
      • De 1) c'est le format %c qu'il te faut utiliser ;
      • De 2), c'est son adresse qu'il faut rentrer.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      scanf("%c", &lettreEntre);
    • if (trouves[n] = (1)) La comparaison s'effectue avec le double == et non simple =, sinon tu mets d'abord trouves[n] à 1, puis vérifies si cette même valeur 1 est non nulle (qui sera donc toujours le cas).
    • else (trouves[n] = (0)); (outre la remarque précédente) on ne met pas de condition à la suite d'un else seul. ( L'instruction if)
    • void affichage(char *trouves[]) Là tu as un tableau de pointeurs en paramètre.

    Tu dois avoir un bon nombre de messages d'avertissement, je te conseille vivement de les régler

Discussions similaires

  1. [Débutant] Organiser son code pour une jointure entre 2 tables
    Par scude dans le forum ASP.NET MVC
    Réponses: 4
    Dernier message: 02/05/2012, 11h59
  2. Best practices pour l'organisation du code
    Par Yux dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 06/02/2009, 15h26
  3. Réponses: 1
    Dernier message: 04/05/2008, 10h05
  4. Organisation du code pour rester "objet"
    Par Nasky dans le forum Langage
    Réponses: 2
    Dernier message: 04/03/2007, 14h32
  5. code pour interbase 6.0 et 6.5 de generateur
    Par tripper.dim dans le forum InterBase
    Réponses: 4
    Dernier message: 01/07/2002, 11h29

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