Peut on tout mettre dans des fonctions (fichier.c)
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Peut on tout mettre dans des fonctions (fichier.c)



  1. #1
    frequi1

    Peut on tout mettre dans des fonctions (fichier.c)


    ------

    Bonjour ou bonsoir,

    Je code le petit jeu (plus moins) depuis quelques temps et j'essaie de l'améliorer régulièrement.
    Mais améliorer un programme en C c'est aussi souvent le rendre illisible et je m'y perd un peu dans toutes les ligne de codes accolades ouvrantes et fermantes etc.

    Ma question est : est ce que par exemple un boucle do.....while comme celle la peut etre incluse dans un autre fichier.c
    Code:
      do //BLOC DU JEU
            {
            scanf ("%d", &nombrePropose);
            nombreDeCoup++;
            if (nombrePropose >max)
            printf("HORS LIMITE\n");
            else if (nombrePropose < nombreMystere)
            printf ("Plus grand\n ");
            else if (nombrePropose > nombreMystere)
            printf("Plus petit\n");
            else
            printf ("FELICITATIONS, vous avez trouve la reponse en %d coups", nombreDeCoup);
            }while (nombreMystere != nombrePropose); // Fin du BLOC DE JEU
    ou bien la gestion d'un nombre aléatoire par exemple :
    Code:
      int nombreMystere = 0 ;
        srand(time(NULL));
        nombreMystere = (rand() % (max - MIN + 1)) + MIN;
    Qui rendrait plus lisible mon main()
    Si toutefois cela était possible pourrais je avoir un exemple de headers.
    Merci a vous

    -----

  2. #2
    Zartan

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Bonjour, oui c'est possible.

    Mais il faut faire attention aux variables globales que l'on doit soit passer en paramètre des fonctions, soit déclarer avec le mot clé extern dans le fichier .h

    Le fichier .h contiendra les déclarations et le fichier .c les définitions

    On peut faire comme ça :

    Code:
    #if !defined(MON_FICHIER_H)
    #define MON_FICHIER_H
    void mafonction(int param); /* déclaration de fonction */
    extern int nombreMystere; /* déclaration de variable globale */
    #endif
    Dans monfichier.c on aura le code de mafonction(), par contre la variable globale nombreMystere sera déclarée dans main.c


    Ce qui sera utile pour éviter les inclusions multiples

    Comme on a vu que les variables globales peuvent poser problème certains déclarent un fichier global.h qui rassemble tout le monde, voire même un fichier global.c quand il y en a vraiment beaucoup. C'est une question d'organisation et de choix personnel ou d'équipe.

  3. #3
    frequi1

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Wahou ça va être encore trop compliqué pour mon niveau ca.....

  4. #4
    Zartan

    Re : Peut on tout mettre dans des fonctions (fichier.c)


  5. A voir en vidéo sur Futura
  6. #5
    kwariz

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Bonsoir,

    La lisibilité d'un code est souvent subjective et dépend de ton background. Souvent un code lisible produit par un guru du C est complètement illisible pour un débutant, de même qu'un code produit par un débutant sera considéré souvent comme inélégant/illisible/moche par des habitués du C.
    Néanmoins il y a de nombreuses bonnes pratiques à mettre en oeuvre pour que ton code ne soit pas illisible ou chaotique.
    La première des bonnes pratiques, à mon sens, est de savoir où l'on va avant d'y aller : c'est une manière de faire pour de petits projets, l'approche top/bottom.
    L'idée est de construire ton programme en utilisant des fonctions que tu écriras plus tard. Par exemple en commençant par ton main :
    Code:
    int main(int argc, char** argv)
    {
      int min,max,nombre_mystere;
      lire_options(argc, argv, &min, &max);
      do {
        nombre_mystere = choix_nombre_mystere(min, max);
        jouer(nombre_mystere);
      } while ( demander_recommencer("Un nouveau jeu ?") )
    
      return 0;
    }
    On lit facilement qu'on détermine le min et le max suivant les options passées sur la ligne de commande, qu'ensuite tant qu'on veut jouer on tire un nombre mystere et on lance le jeu.

    Ensuite, fonctionnellement il y a trois parties : la partie où on traite la ligne de commande, la partie où on joue, la partie où on décide si on continue ou non.
    Tu remarqueras qu'avec cette conception il est impossible d'arrêter un jeu en cours ...

    On peut créer les modules options.h/options.c , jeu.h/jeu.c, input.h/input.c

    options.h sera relativement simple :
    Code:
    #ifndef __code_h__
    #define __code_h__
    
    void lire_options(int, char**, int*, int*);
    
    #endif /* __code_h__ */
    jeu.h contiendra les déclarations de tout ce qu'il faut pour jouer. jeu.c contient la fonction jouer qu'on pourrait inplémenter comme :

    Code:
    void jouer(int nombre_mystere)
    {
      int trouve=0;
      int tour=0;
      while (! trouve) {
        tour = tour + 1;
        nombre = lire_nombre();
        if (nombre<nombre_mystere) {
          printf(...);
        } else if (nombre>nombre_mystere) {
          printf(...);
        } else {
          printf(...);
          trouve = 1;
        }
      }
    }
    tu vois que tu fais appel à lire_nombre. Tu peu décider de soit l'implémenter dans le module jeu ou de l'implémenter dans le module input. On va dire qu'on le met dans le module input.
    Dans ce cas le header du module jeu sera :
    Code:
    #ifndef __jeu_h__
    #define __jeu_h__
    
    void jouer(int);
    
    #endif /* __jeu_h__ */
    et le début de jeu.c ressemblera à :
    Code:
    #include <...>
    #include "jeu.h"
    #include "input.h"
    
    ....
    Dans input.h on va déclarer deux fonctions :
    Code:
    #ifndef __input_h__
    #define __input_h__
    
    int demander_recommencer(char*);
    int lire_nombre();
    
    #endif /* __input_h__ */
    Une fois que tu as ces modules il faut aussi un moyen pour créer l'exécutable etc ... un makefile est idéal.

    Ce qui est très important surtout : IL NE FAUT JAMAIS COMMENCER PAR CODER.

  7. #6
    frequi1

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    excuser moi mais je crois que je veux aller trop loin par rapport a mes connaissances.
    le tuto du site du zeros (qui est d’ailleurs excellent c'est pour cette raison que j'ai commander le livre) apporte de très bonne techniques de travail.
    je potasse ce bouquin dans tous les sens dans la limite de mes connaissances........ et je crois que je veux dépasser ces limites mais je crois aussi que j'ai beaucoup de lacunes pour améliorer mes codes pour le moment.
    voici le code de mon (plus moins)
    ou je voudrais créer un mode 2 joueurs (le 2eme joueur choisi le nombre a découvrir).... et la je plante.

    Code:
     #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "fonction.h"
    
    int main()
    
    {   int rejouer = 1;
        int choixJoueur = 0;
        do
                {// debut 1er do while
        printf("\nChoisissez le nombre de joueurs\n1. 1 JOUEUR\n2. 2 JOUEURS\nVotre Choix :");
        scanf ("%d", &choixJoueur);
    
            if (choixJoueur == 1)
                {// debut if choixJoueur == 1
    
                printf ("\nPartie contre l'ordinateur");
                const int MIN = 1;
                int nombreMystere, max = 0;
                int choixDeJeu = 0;
    
    
    
                        printf ("\nChoix de la difficulte :\n1. Entre 1 et 100\n2. Entre 1 et 500\n3. Entre 1 et 1000\n Votre Choix SVP :   ");
                        scanf ("%d", &choixDeJeu);
                        switch (choixDeJeu)
                            {//debut switch
                                case 1 :
                                max = 100;
                                affiche (MIN,max);
                                break;
                                case 2 :
                                max = 500;
                                affiche (MIN, max);
                                break;
                                case 3 :
                                max = 1000;
                                affiche (MIN,max);
                                break;
                                default :
                                printf ("\nChoix impossible");
                                break;
                            }//fin switch
    
                    srand(time(NULL));
                    nombreMystere = (rand() % (max - MIN + 1)) + MIN;
                    int nombrePropose = 0, nombreDeCoup = 0,encore = 0;
                    printf ("\n\nC'est parti");
                    printf("\nChoisi un nombre entre 1 et %d :",max);
    
                    do //Début 2eme do while BLOC DU JEU
                            {
                                scanf ("%d", &nombrePropose);
                                nombreDeCoup++;
                                if (nombrePropose >max)
                                    printf("HORS LIMITE\n");
                                else if (nombrePropose < nombreMystere)
                                    printf ("Plus grand\n ");
                                else if (nombrePropose > nombreMystere)
                                    printf("Plus petit\n");
                                else
                                    printf ("FELICITATIONS, vous avez trouve la reponse en %d coups", nombreDeCoup);
                            }while (nombreMystere != nombrePropose); // Fin 2eme do while du BLOC DE JEU
    
    
                    printf("\nVoulez vous faire une nouvelle partie\n1.OUI\n2.NON\n");
                    scanf ("%d", &encore);
                    if (encore == 1)
                        rejouer = rejouer;
                    else if (encore == 2)
                        rejouer = rejouer--;
                    else
                        printf ("choix impossible");
    
    
        }// fin du if choixJoueur == 1
        else if (choixJoueur == 2)
        {// debut du else if choixJoueur == 2
            printf ("Veuillez me donner le nombre mystere a l'abri des regard indiscret : ");
            
        }// fin du else if choixJoueur ==2
         }while (rejouer);//fin du 1er do while
         return 0;
    }
    d'apres ce code est-ce que vous pensez que je peux finir ce mode 2 joueurs ? est ce que mon code est assez clair ?
    encore merci a vous

  8. #7
    Zartan

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Oui mais il faut utiliser des fonctions :

    Code:
    nbJoueurs = demanderCombienDeJoueurs() ;
    
    continuer = TRUE;
    
    while (continuer)
    {
      if (nbJoueurs == 1)
      {
         nombre = tirerUnNombreAuHasard() ;
      }
      else
      {
        nombre = demanderUnNombreAJoueur2() ;
      }
      trouve = FALSE;
      while (!trouve)
      {
         trouve = faireDevinerJoueur1() ;
      }
      continuer = demanderSiOnContinue() ;
    }
    Voilà, à vous d'écrire les fonctions. Vous pouvez les laisser dans le même fichier dans un premier temps.
    Dernière modification par Zartan ; 31/10/2012 à 20h35.

  9. #8
    kwariz

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Honnêtement ton code est monolithique et pas très clair : en un mot c'est pourri (si ça peut te rassurer c'est normal : tu débutes). Il faut le segmenter beaucoup plus, utilise plus de fonctions auxilliaires et essaye de créer des structures de données adaptées (ça c'est très important) ; quelquechose qui ne va pas te parler tout de suite : tu ne sépares par la présentation (menu, affichage, saisies) du boulot à proprement parler (gérer un jeu).
    Le gros problème avec un code comme celui-ci est qu'à force tu ne sais plus où tu fais quoi : il devient vite trop long, immodifiable, tu finiras par ne même plus savoir pourquoi ça fonctionne ... on appelle ça une usine à gaz.

    Quelques points positifs : tu utilises des noms de variables relativement clairs, tu commentes même si cela reste parfois maladroit ( par exemple : début 1er do while, ça me fait une belle jambe : je préfèrerais savoir ce que va faire cette boucle par exemple). L'indentation est relativement cohérente et suivie, perso je la trouve un peu large.

    Si j'étais toi, j'essayerais d'abord de modulariser le jeu à 1 joueur avant de rajouter des fonctionnalités.
    Ok, je radote, mais le premier outil pour développer un programme utile est le papier et le crayon : la conception même minimale est indispensable. Si tu as un programme monojoueur stable et bien conçu/compris alors rajouter une fonctionnalité sera bien moins pénible.

    PS: je ne cherche pas à te faire abandonner ou à minimiser le travail que tu fournis, bien au contraire. J'ai surtout envie de t'éviter des impasses qui vont te dégouter de la programmation
    Dernière modification par kwariz ; 31/10/2012 à 20h39.

  10. #9
    frequi1

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Le gros problème avec un code comme celui-ci est qu'à force tu ne sais plus où tu fais quoi : il devient vite trop long, immodifiable, tu finiras par ne même plus savoir pourquoi ça fonctionne ...
    Tu as entièrement raison c'est tout a fait ca......

    Si j'étais toi, j'essayerais d'abord de modulariser le jeu à 1 joueur
    Le jeu a un joueur fonctionner très bien
    même avec ses 3 niveaux de difficulté que j'ai rajouté plus tard

    TRUE et FALSE sont des commandes ? ou c'est juste pour dire vrai ou faux
    si ce sont des commandes je ne les connais pas encore.

  11. #10
    kwariz

    Re : Peut on tout mettre dans des fonctions (fichier.c)

    Citation Envoyé par frequi1 Voir le message
    Tu as entièrement raison c'est tout a fait ca......
    Bonjour,
    c'est valable quel que soit le langage et quel que soit le problème à résoudre.

    Citation Envoyé par frequi1 Voir le message


    Le jeu a un joueur fonctionner très bien
    même avec ses 3 niveaux de difficulté que j'ai rajouté plus tard
    Il fonctionne bien mais as-tu une fonction main qui fait plus de 10 lignes ? as-tu essayé de le modulariser ?

    Citation Envoyé par frequi1 Voir le message
    TRUE et FALSE sont des commandes ? ou c'est juste pour dire vrai ou faux
    si ce sont des commandes je ne les connais pas encore.
    TRUE et FALSE sont généralement des #define du genre :
    Code:
    #define FALSE (0)
    #define TRUE (!FALSE)
    Cela rend le code plus lisible en un sens car on indique explicitement au lecteur qu'on utilise des entiers comme des booléens.

Discussions similaires

  1. Peut-on mettre un fichier sonore sur youtube (sans vidéo) ?
    Par Cornemuse dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 28/05/2011, 06h45
  2. Mettre plusieurs fichier c dans un même programme
    Par krimo-30 dans le forum Électronique
    Réponses: 4
    Dernier message: 25/05/2011, 08h20
  3. mettre une ligne en commentaire dans un fichier toto.ini
    Par abracadabra75 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 02/07/2010, 09h40
  4. comment mettre un .bat et un .exe dans un seul fichier
    Par chatelot16 dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 31/12/2007, 15h21