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 :

Premier programme en C, qu'en pensez-vous? [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Par défaut Premier programme en C, qu'en pensez-vous?
    Bonjour,
    je debute dans la programmation en C. J'ai réalisé ce petit et trés simple mastermind, pour mettre en pratique le code. Cependant, j'aimerais avoir vos commentaires (et critiques) sur ce programme. J'ai notamment des doutes sur la fonction de saisie.
    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
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
     
    #include <stdio.h>
     
    #include <stdlib.h>
    #include <time.h>
     
     
    #define COUP_MAX    10      // Nombre de coup Maximal
    #define NB_CHIFFRE  5       // Nombre de chiffre dans le code
    #define BORNE_MAX   10      // Borne superieur du hasard
     
     
    // Different entrees pour le menu d'affichage
    #define RESULTAT    'r'
    #define GAGNE       'g'
    #define PERDU       'p'
    #define MENU        'm'
     
     
    // Fonctions externes
    int hasard ();
    void saisie (int ROW);
    void teste (int i, int ROW);
    void affichage(char mode, int ROW);
    void init_res ();
     
     
    // Variables externes
    int essai[COUP_MAX][NB_CHIFFRE];        // Tableau conteant les combinaisons essayees
    char res[COUP_MAX][NB_CHIFFRE];         // Tableau contenant les resultats de chaques combinaisons
    int code[NB_CHIFFRE];                   // Tableau contenant le code a decouvrir
    int bon;                                // Indique le nombre de chiffre correctement decode
     
     
    // Programme principal
    int main()
     
    {
        int ROW;                        // Indique la ligne en cours de traitement
        int coup;                       // Indique le nombre de coup joue
        int i;
     
     
        coup = 1;
        ROW = 0;
     
        // initialise le tableau RES
        init_res ();
     
        // Generation du code aleatoire
        srand(time(NULL));
        for (i = 0; i < NB_CHIFFRE; i++)
            code[i] = hasard();
     
        // Affichage du menu
        affichage(MENU,0);
     
        // Test de l'essai
        do {
            saisie(ROW);
            bon = 0;
            for (i = 0; i < NB_CHIFFRE; i++) {
                teste(i,ROW);
            }
            affichage(RESULTAT,ROW);
     
            ROW++;
            coup++;
        }
        while (bon != NB_CHIFFRE && coup <= COUP_MAX);
     
     
        if (bon == NB_CHIFFRE)
            affichage(GAGNE,0);
        else
            affichage(PERDU,0);
     
     
        return 0;
    }
     
     
     
    // FONCTION INITIALISATION DU TABLEAU RESULTAT
    void init_res () {
     
        int i,j;
     
        for (j = 0; j < COUP_MAX; j++)
            for (i = 0; i < NB_CHIFFRE; i++) {
                res[j][i] = '.';
            }
    }
     
     
    // FONCTION HASARD
    int hasard() {
     
        return rand() % BORNE_MAX;
     
    }
     
     
    // FONCTION DE SAISIE DE LA COMBINAISON
    void saisie (int ROW) {
     
     
        int i;
        char c;
        char chaine[20];
     
        printf("\nEntrez votre combinaison : ");
        for (i = 0; (c = getchar()) != EOF && c != '\n'; i++) {
            chaine[i] = c;
        }
     
        sscanf(chaine, "%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
     
    }
     
     
    // FONCTION TEST
    void teste (int i, int ROW) {
     
        int j;
     
        if (essai[ROW][i] == code[i]) {
            bon++;
            res[ROW][i] = '#';
        }
     
        else
            for(j = 0; j < NB_CHIFFRE; j++)
                if (essai[ROW][i] == code[j])
                    res[ROW][i] = '*';
    }
     
     
    // FONCTION AFFICHAGE
    void affichage(char mode, int ROW) {
     
        int i, j;
     
        switch (mode) {
            case 'r' :
                system("clear");
                for (j = 0; j <= ROW; j++) {
                    for (i = 0; i < NB_CHIFFRE; i++)
                        printf("%d ", essai[j][i]);
                    printf("\t");
                    for (i = 0; i < NB_CHIFFRE; i++)
                        printf("%c ", res[j][i]);
                    printf("\n");
                }
                break;
     
            case 'p' :
                printf("\nPERDU, le code correct etait :\t");
                for (i = 0; i < NB_CHIFFRE; i++)
                    printf("%d ", code[i]);
                printf("\n\n");
                break;
     
            case 'g' :
                printf("\nGAGNE, le code etait bien :\t");
                for (i = 0; i < NB_CHIFFRE; i++)
                    printf("%d ", code[i]);
                printf("\n\n");
                break;
     
            case 'm' :
                printf("\t*****************************\n");
                printf("\t*                           *\n");
                printf("\t*        MASTERMIND         *\n");
                printf("\t*                           *\n");
                printf("\t*****************************\n");
                printf("\n\n");
                printf(" - Utilisez les combinaisons dans le style : a b c d e puis 'entree'\n");
                printf(" - Les nombres possibles sont compris entre 0 et 9");
                printf("\n\n");
                break;
     
        }
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par beware Voir le message
    Bonjour,
    je debute dans la programmation en C. J'ai réalisé ce petit et trés simple mastermind, pour mettre en pratique le code. Cependant, j'aimerais avoir vos commentaires (et critiques) sur ce programme. J'ai notamment des doutes sur la fonction de saisie.
    Les fonctions et variables ne sont pas 'externes'. Les fonctions (à part main()) sont 'privées, tant qu'il n'y a qu'un seul code source.

    Il est d'ailleurs inutile de leur définir de prototype séparé (sauf cas tordus peu recommandables). Il suffit de respecter le principe "définir avant d'utiliser".

    Quand aux variables, il n'y a pas de raison qu'elles soient globales. Des structures bien étudiées permettent d'éviter ça et de conserver des interfaces lisibles. En plus, cela favorise une meilleure organisation du code.

    Les fonctions sans paramètres doivent être définies avec (void) et non ().

    La fonction 'hasard()' est naïve. Il existe de meilleures formules...

    http://emmanuel-delahaye.developpez....d/inc/random.h

    Effectivement, la saisie est faible et fragile. Il vaut mieux utiliser fgets() , puis sscanf(), mais en s'assurant que les conversions se sont bien passées (tester le retour de sscanf(), lire la doc...)
    n'est pas portable et probablement inutile. Si on peut vraiment faire de la présentation, il y a des moyens plus radicaux... (PDCurses etc.)

    Sinon, c'est bien. Version solidifiée (sans globales, mais sans structures) :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
     
    #include <stdio.h>
     
    #include <stdlib.h>
    #include <time.h>
     
    /* Nombre de coup Maximal */
    #define COUP_MAX    10
    /* Nombre de chiffre dans le code */
    #define NB_CHIFFRE  5
    /* Borne superieur du hasard */
    #define BORNE_MAX   10
     
    /* Different entrees pour le menu d'affichage */
    #define RESULTAT    'r'
    #define GAGNE       'g'
    #define PERDU       'p'
    #define MENU        'm'
     
    /* FONCTION INITIALISATION DU TABLEAU RESULTAT */
    static void init_res (char res[COUP_MAX][NB_CHIFFRE])
    {
       int j;
     
       for (j = 0; j < COUP_MAX; j++)
       {
          int i;
          for (i = 0; i < NB_CHIFFRE; i++)
          {
             res[j][i] = '.';
          }
       }
    }
     
    /* FONCTION HASARD */
    static int hasard (void)
    {
       return rand () % BORNE_MAX;
    }
     
    /* FONCTION DE SAISIE DE LA COMBINAISON */
    static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE])
    {
       int const N=5;
       int n;
       do
       {
          char chaine[20];
     
          printf ("Entrez votre combinaison : ");
          fgets (chaine, sizeof chaine, stdin);
     
          n = sscanf (chaine, "%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1],
                      &essai[ROW][2], &essai[ROW][3], &essai[ROW][4]);
          if (n != N)
          {
             puts ("erreur");
          }
       }
       while (n != N);
    }
     
    /* FONCTION TEST */
    static void teste (int i, int ROW, int *p_bon, char res[COUP_MAX][NB_CHIFFRE],
                       int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE])
    {
       int j;
     
       if (essai[ROW][i] == code[i])
       {
          (*p_bon)++;
          res[ROW][i] = '#';
       }
     
       else
       {
          for (j = 0; j < NB_CHIFFRE; j++)
          {
             if (essai[ROW][i] == code[j])
             {
                res[ROW][i] = '*';
             }
          }
       }
     
    }
     
    /* FONCTION AFFICHAGE */
    static void affichage (char mode, int ROW, char res[COUP_MAX][NB_CHIFFRE],
                           int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE])
    {
     
       int i, j;
     
       switch (mode)
       {
       case 'r':
          for (j = 0; j <= ROW; j++)
          {
             for (i = 0; i < NB_CHIFFRE; i++)
                printf ("%d ", essai[j][i]);
             printf ("\t");
             for (i = 0; i < NB_CHIFFRE; i++)
                printf ("%c ", res[j][i]);
             printf ("\n");
          }
          break;
     
       case 'p':
          printf ("\nPERDU, le code correct etait :\t");
          for (i = 0; i < NB_CHIFFRE; i++)
             printf ("%d ", code[i]);
          printf ("\n\n");
          break;
     
       case 'g':
          printf ("\nGAGNE, le code etait bien :\t");
          for (i = 0; i < NB_CHIFFRE; i++)
             printf ("%d ", code[i]);
          printf ("\n\n");
          break;
     
       case 'm':
          printf ("\t*****************************\n");
          printf ("\t*                           *\n");
          printf ("\t*        MASTERMIND         *\n");
          printf ("\t*                           *\n");
          printf ("\t*****************************\n");
          printf ("\n\n");
          printf
             (" - Utilisez les combinaisons dans le style : a b c d e puis 'entree'\n");
          printf (" - Les nombres possibles sont compris entre 0 et 9");
          printf ("\n\n");
          break;
     
       }
    }
     
    /* Programme principal */
    int main (void)
    {
    /* Indique la ligne en cours de traitement */
       int ROW;
    /* Indique le nombre de coup joue */
       int coup;
       int i;
       int bon;
       coup = 1;
       ROW = 0;
    /* Tableau contenant les resultats de chaques combinaisons */
       char res[COUP_MAX][NB_CHIFFRE];
    /* Tableau contenant le code a decouvrir */
       int code[NB_CHIFFRE]={0};
    /* Tableau conteant les combinaisons essayees */
       int essai[COUP_MAX][NB_CHIFFRE]={{0}};
     
    /* initialise le tableau RES */
     
       init_res (res);
     
    /* Generation du code aleatoire */
     
       srand (time (NULL));
       for (i = 0; i < NB_CHIFFRE; i++)
       {
          code[i] = hasard ();
       }
     
    /* Affichage du menu */
     
       affichage (MENU, 0, res, code, essai);
     
    /* Test de l'essai */
     
       do
       {
          saisie (ROW, essai);
          bon = 0;
          for (i = 0; i < NB_CHIFFRE; i++)
          {
             teste (i, ROW, &bon, res, code, essai);
          }
          affichage (RESULTAT, ROW, res, code, essai);
     
          ROW++;
          coup++;
       }
       while (bon != NB_CHIFFRE && coup <= COUP_MAX);
     
       if (bon == NB_CHIFFRE)
          affichage (GAGNE, 0, res, code, essai);
       else
          affichage (PERDU, 0, res, code, essai);
     
       return 0;
    }
    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
    66
    67
    68
    69
    70
     
            *****************************
            *                           *
            *        MASTERMIND         *
            *                           *
            *****************************
     
     
     - Utilisez les combinaisons dans le style : a b c d e puis 'entree'
     - Les nombres possibles sont compris entre 0 et 9
     
    Entrez votre combinaison : 0 0 0 0 0
    0 0 0 0 0       . . . . .
    Entrez votre combinaison : 1 1 1 1 1
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    Entrez votre combinaison : 1 2 1 2 2
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    Entrez votre combinaison : 1 3 1 3 3
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    1 3 1 3 3       # . # . .
    Entrez votre combinaison : 1 4 1 4 4
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    1 3 1 3 3       # . # . .
    1 4 1 4 4       # # # * *
    Entrez votre combinaison : 1 4 1 5 5
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    1 3 1 3 3       # . # . .
    1 4 1 4 4       # # # * *
    1 4 1 5 5       # # # . .
    Entrez votre combinaison : 1 4 1 6 6
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    1 3 1 3 3       # . # . .
    1 4 1 4 4       # # # * *
    1 4 1 5 5       # # # . .
    1 4 1 6 6       # # # . .
    Entrez votre combinaison : 1 4 1 7 7
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    1 3 1 3 3       # . # . .
    1 4 1 4 4       # # # * *
    1 4 1 5 5       # # # . .
    1 4 1 6 6       # # # . .
    1 4 1 7 7       # # # # *
    Entrez votre combinaison : 1 4 1 7 8
    0 0 0 0 0       . . . . .
    1 1 1 1 1       # * # * *
    1 2 1 2 2       # . # . .
    1 3 1 3 3       # . # . .
    1 4 1 4 4       # # # * *
    1 4 1 5 5       # # # . .
    1 4 1 6 6       # # # . .
    1 4 1 7 7       # # # # *
    1 4 1 7 8       # # # # #
     
    GAGNE, le code etait bien :     1 4 1 7 8
     
     
    Press ENTER to continue.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par défaut
    Je ne connais pas "en détail" les règles du Mastermind donc ma question peut paraître stupide
    Si la combinaison est "1 4 1 7 8" et qu'on rentre "1 4 1 4 4" pourquoi les deux derniers "4" sont marqués "*" ? Je sais bien qu'ils ne sont pas à la bonne place mais étant donné que le "4" qui est à la bonne place a été marqué "correct" pourquoi les deux autres "4" sont aussi indiqués comme "présents" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Les fonctions et variables ne sont pas 'externes'. Les fonctions (à part main()) sont 'privées, tant qu'il n'y a qu'un seul code source.
    Il est d'ailleurs inutile de leur définir de prototype séparé (sauf cas tordus peu recommandables). Il suffit de respecter le principe "définir avant d'utiliser".
    Quand aux variables, il n'y a pas de raison qu'elles soient globales. Des structures bien étudiées permettent d'éviter ça et de conserver des interfaces lisibles. En plus, cela favorise une meilleure
    organisation du code.
    En fait, c'est une maladresse de ma part. J'avais fait plusieurs fichiers sources au debut, avant de tout mettre dans le même. C'est pour ca que j'avais les variables externes. De plus, si je declare
    les fonctions de cette maniere, c'est simplement car je l'ai vu faire dans le bouquin que j'utilise : le Kernighan & Ritchie (2e Ed). Et donc je reproduis ce schema.


    Citation Envoyé par Emmanuel Delahaye Voir le message
    Les fonctions sans paramètres doivent être définies avec (void) et non ().
    Ok, c'est noté.


    Citation Envoyé par Emmanuel Delahaye Voir le message
    Effectivement, la saisie est faible et fragile. Il vaut mieux utiliser fgets() , puis sscanf(), mais en s'assurant que les conversions se sont bien passées (tester le retour de sscanf(), lire la
    doc...)
    n'est pas portable et probablement inutile. Si on peut vraiment faire de la présentation, il y a des moyens plus radicaux... (PDCurses etc.)
    D'accord. Je connaissais pas fgets. C'est donc plus sur de l'utiliser, alors allons-y. Pour ce qui est de la mise en forme, je veut pas pousser trop loin, c'est pour ca que j'utilise les "clear".


    J'ai deux autres questions :

    1 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]) {
    Pourquoi indiquer "static" devant chaque fonction?


    2 -
    Est-ce qu'il y a une difference (ou une importance) a mettre les fonctions aprés (ou avant) la fonction 'main'?


    Citation Envoyé par Sve@r Voir le message
    Je ne connais pas "en détail" les règles du Mastermind donc ma question peut paraître stupide
    Si la combinaison est "1 4 1 7 8" et qu'on rentre "1 4 1 4 4" pourquoi les deux derniers "4" sont marqués "*" ? Je sais bien qu'ils ne sont pas à la bonne place mais étant donné que le "4" qui est à
    la bonne place a été marqué "correct" pourquoi les deux autres "4" sont aussi indiqués comme "présents" ???
    Euh, faut que je me replonge dans les regles. Merci pour la remarque.

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par beware Voir le message
    1 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]) {
    Pourquoi indiquer "static" devant chaque fonction?
    Pour indiquer que ces fonctions sont privees a l'unite de compilation (un fichier .c, pour simplifier) en cours. Lorsqu'on divise un projet en plusieurs unites de compilations, certaines fonctions ne sont pas destinees a etre vues par les autres unites (parce qu'elles ne sont appellees qu'en interne). Pour s'assurer de cela, on qualifie les fonctions de static.

    2 -
    Est-ce qu'il y a une difference (ou une importance) a mettre les fonctions aprés (ou avant) la fonction 'main'?
    Ce qui importe, c'est que le prototype de chaque fonction est connu au moment ou l'on utilise cette fonction. On peut:
    • - lister tous les prototypes ou inclure les fichier entete qui correspondent, puis donner le code ailleurs (plus loin dans le fichier, ou dans un autre fichier)
    • - donner le prototype et le code en meme temps.

    En general, on utilise la premiere methode pour les fonctions publiques, la deuxieme pour les fonctions privees (static donc). Mais ce n'est obligatoire, c'est plutot conventionnel.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par beware Voir le message
    1 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]) {
    Pourquoi indiquer "static" devant chaque fonction?
    http://emmanuel-delahaye.developpez....tes.htm#static
    2 -
    Est-ce qu'il y a une difference (ou une importance) a mettre les fonctions aprés (ou avant) la fonction 'main'?
    Les mettre avant permet de respecter le principe simple "définir avant d'utiliser" qui inclue le principe obligatoire "déclarer avant d'utiliser" et permet d'éviter des déclarations inutiles.

    Il n'y a rien d'obligatoire, c'est juste parce que moins on écrit de code, moins on a de chances de faire une erreur... (Autre principe de programmation bien connu...)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    J'ai regardé rapidement mais je ne crois pas que ton nouveau "teste" réponde à la règle du jeu.

    Essaye de faire passer : mot secret = 10235, mot proposé = 21214, tu vas restituer : **#*_ au lieu de : bien placées = 1, mal placées = 1 (car au Mastermind, on ne restitue que le nombre de biens placées / mal placées).

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je ne connais pas "en détail" les règles du Mastermind donc ma question peut paraître stupide
    Si la combinaison est "1 4 1 7 8" et qu'on rentre "1 4 1 4 4" pourquoi les deux derniers "4" sont marqués "*" ? Je sais bien qu'ils ne sont pas à la bonne place mais étant donné que le "4" qui est à la bonne place a été marqué "correct" pourquoi les deux autres "4" sont aussi indiqués comme "présents" ???
    Oui, je confirme, le principe du Mastermind est de ne pas compter plusieurs fois la même chose :
    - 1 lettre dans le mot secret présente plusieurs fois dans le mot proposé : 1 bien placé si l'une des lettre est bien placée, 1 mal placé sinon.
    - 1 lettre proposée présente plusieurs fois dans le mot secret : 1 bien placé si la lettre est placée comme l'une de celle du mot secret, 1 mal placé sinon.

    C'est ce qui fait que l'algo est assez intéressant pour de l'initiation à la programmation...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Par défaut
    Effectivement, vous avez raison. J'avais mal interpreté les régles du jeu. J'ai donc changé un poil la définition des testes, pour mieux y coller.

    J'ai également tenu compte des conseils d'Emmanuel.

    Voici donc la nouvelle version :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
    #include <stdio.h>
     
    #include <stdlib.h>
    #include <time.h>
     
     
    #define COUP_MAX    12      // Nombre de coup Maximal
    #define NB_CHIFFRE  4       // Nombre de chiffre dans le code
    #define BORNE_MAX   10      // Borne superieur du hasard
     
     
    // Different entrees pour le menu d'affichage
    #define RESULTAT    'r'
    #define GAGNE       'g'
    #define PERDU       'p'
    #define MENU        'm'
     
     
    // Fonctions
    void init_res (char res[COUP_MAX][NB_CHIFFRE]);
    int hasard(void);
    void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]);
    void teste (int ROW, int *p_bon,char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE]);
    void affichage(char mode, int ROW, char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE]);
     
     
     
    // Programme principal
    int main(void)
     
    {
        int essai[COUP_MAX][NB_CHIFFRE] = {{0}};        // Tableau conteant les combinaisons essayees
        char res[COUP_MAX][NB_CHIFFRE];         // Tableau contenant les resultats de chaques combinaisons
        int code[NB_CHIFFRE] = {0};                   // Tableau contenant le code a decouvrir
     
        int bon;
        int ROW;                        // Indique la ligne en cours de traitement
        int coup;                       // Indique le nombre de coup joue
        int i;
        int diese;
        int etoile;
     
     
        coup = 1;
        ROW = 0;
        diese = 0;
        etoile = 0;
     
     
        // initialise le tableau RES
        init_res (res);
     
        // Generation du code aleatoire
        srand(time(NULL));
        for (i = 0; i < NB_CHIFFRE; i++)
            code[i] = hasard();
     
     
     
     
        // Affichage du menu
        affichage(MENU,0,res,code,essai);
     
        // Test de l'essai
        do {
            saisie(ROW,essai);
            bon = 0;
            teste(ROW,&bon,res,code,essai);
            affichage(RESULTAT,ROW,res,code,essai);
            ROW++;
            coup++;
        }
        while (bon != NB_CHIFFRE && coup <= COUP_MAX);
     
     
        if (bon == NB_CHIFFRE)
            affichage(GAGNE,0,res,code,essai);
        else
            affichage(PERDU,0,res,code,essai);
     
     
        return 0;
    }
     
     
     
    // FONCTION INITIALISATION DU TABLEAU RESULTAT
    static void init_res (char res[COUP_MAX][NB_CHIFFRE]) {
     
        int j;
     
        for (j = 0; j < COUP_MAX; j++) {
            int i;
            for (i = 0; i < NB_CHIFFRE; i++)
                res[j][i] = '.';
        }
     
    }
     
     
    // FONCTION HASARD
    static int hasard(void) {
        return (int)(rand()/(double)RAND_MAX * (BORNE_MAX));
        //return rand() % BORNE_MAX;
     
    }
     
     
    // FONCTION DE SAISIE DE LA COMBINAISON
    static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]) {
     
        int n;
     
        do {
            char chaine[20];
            printf("\nEntrez votre combinaison : ");
            fgets(chaine, sizeof chaine, stdin);
     
            n = sscanf(chaine, "%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
     
            if (n != NB_CHIFFRE)
                puts("ERREUR");
        }
        while (n != NB_CHIFFRE);
     
    }
     
     
    // FONCTION TEST
    static void teste (int ROW, int *p_bon, char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE]) {
     
        int i,j,k;
     
        k = 0;
     
        /* boucle pour les valeurs presentes et bien placees*/
        for (i = 0; i < NB_CHIFFRE; i++)
            if (essai[ROW][i] == code[i]) {
                res[ROW][k++] = '#';
                (*p_bon)++;
            }
     
        /* boucle pour les valeurs presentes mais mal placees */
        for (i = 0; i < NB_CHIFFRE; i++)
            for (j = 0; j < NB_CHIFFRE; j++)
                if (essai[ROW][i] == code[j] && j != i)
                    res[ROW][k++] = '*';
     
    }
     
     
    // FONCTION AFFICHAGE
    static void affichage(char mode, int ROW, char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE]) {
     
        int i, j;
     
        switch (mode) {
            case 'r' :
                 for (j = 0; j <= ROW; j++) {
                    for (i = 0; i < NB_CHIFFRE; i++)
                        printf("%d ", essai[j][i]);
                    printf("\t");
                    for (i = 0; i < NB_CHIFFRE; i++)
                        printf("%c ", res[j][i]);
                    printf("\n");
                }
                break;
     
            case 'p' :
                printf("\nPERDU, le code correct etait :\t");
                for (i = 0; i < NB_CHIFFRE; i++)
                    printf("%d ", code[i]);
                printf("\n\n");
                break;
     
            case 'g' :
                printf("\nGAGNE, le code etait bien :\t");
                for (i = 0; i < NB_CHIFFRE; i++)
                    printf("%d ", code[i]);
                printf("\n\n");
                break;
     
            case 'm' :
                printf("\t*****************************\n");
                printf("\t*                           *\n");
                printf("\t*        MASTERMIND         *\n");
                printf("\t*                           *\n");
                printf("\t*****************************\n");
                printf("\n\n");
                printf(" - Utilisez les combinaisons dans le style : a b c d puis 'entree'\n");
                printf(" - Les nombres possibles sont compris entre 0 et 9");
                printf("\n\n");
                break;
     
        }
    }

Discussions similaires

  1. Deuxieme programme en C, qu'en pensez-vous?
    Par beware dans le forum Débuter
    Réponses: 6
    Dernier message: 19/03/2009, 11h54
  2. Réponses: 59
    Dernier message: 07/02/2009, 14h10
  3. Réponses: 13
    Dernier message: 11/05/2003, 13h25

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