Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/02/2013, 17h34   #1
smohrt
Invité de passage
 
Femme
Inscription : 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
smohrt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 18h51   #2
Ngork
Membre chevronné
 
Homme
Auditeur informatique
Inscription : avril 2009
Messages : 119
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Auditeur informatique
Secteur : Finance

Informations forums :
Inscription : avril 2009
Messages : 119
Points : 681
Points : 681
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)
Ngork est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/02/2013, 14h48   #3
imperio
Membre éprouvé
 
Avatar de imperio
 
Homme Guillaume Gomez
Étudiant
Inscription : mai 2010
Messages : 239
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Gomez
Localisation : France

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

Informations forums :
Inscription : mai 2010
Messages : 239
Points : 467
Points : 467
"- 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.
imperio est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/02/2013, 08h04   #4
Bktero
Modérateur
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 821
Détails du profil
Informations personnelles :
Âge : 25
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 : 1 821
Points : 4 595
Points : 4 595
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

Citation:
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 renseigner 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é !
Bktero est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/02/2013, 18h07   #5
smohrt
Invité de passage
 
Femme
Inscription : 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
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..
smohrt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2013, 18h46   #6
pythéas
Membre éclairé
 
Inscription : août 2007
Messages : 174
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 174
Points : 393
Points : 393
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...
pythéas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2013, 19h24   #7
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 327
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 26
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 327
Points : 13 429
Points : 13 429
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
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h10.


 
 
 
 
Partenaires

Hébergement Web