Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Femme Profil pro
    Inscrit en
    février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : février 2013
    Messages : 4
    Points : 1
    Points
    1

    Par défaut Organisation du code pour un pendu

    Bonjour à tous,
    Je suis depuis peu les cours de C sur le siteduzero, 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 :
    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 :
    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 chevronné
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    avril 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : avril 2009
    Messages : 120
    Points : 641
    Points
    641

    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 :
    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 :
    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
    }
    << Il n'est pas dans Ses intentions de tout faire, ni donc de nous dépouiller de notre libre-arbitre et de cette poignée de gloire qui nous appartient. >> (Le Prince, Nicolas Machiavel)

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2010
    Messages
    565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : mai 2010
    Messages : 565
    Points : 1 145
    Points
    1 145

    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
    Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    2 702
    Détails du profil
    Informations personnelles :
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2009
    Messages : 2 702
    Points : 7 179
    Points
    7 179

    Par défaut

    Code :
    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.
    Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseignez ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

    Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

    Pour vos problèmes d'embarqué, utilisez le forum dédié !

  5. #5
    Invité de passage
    Femme Profil pro
    Inscrit en
    février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : février 2013
    Messages : 4
    Points : 1
    Points
    1

    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 :
    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 éprouvé

    Inscrit en
    août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 174
    Points : 429
    Points
    429

    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
    Responsable FAQ C++
    Avatar de Winjerome
    Homme Profil pro Jérôme
    Inscrit en
    septembre 2009
    Messages
    7 858
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 7 858
    Points : 28 917
    Points
    28 917

    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 :
      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 :
      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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •