Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Zérothon] L'épreuve de C

    10 juillet 2006 à 20:13:25

    Image utilisateur


    Nous vous demandons pour cette épreuve de réaliser en C un générateur de phrases aléatoires sur le sujet du Site du Zero.

    Les délais


    Vous devez rendre votre copie avant le 1er août à minuit.

    Qu'est-ce-qu'un générateur de phrases aléatoires ?

    Il s'agit d'un programme qui génère aléatoirement des phrases syntaxiquement (et orthographiquement !) correctes. Vous devrez donc coder ce type de programme, capable de générer plusieurs types de phrases différents (présence de propositions par exemple, de compléments circonstanciels etc...). Nous ne vous imposons pas de vous cloisonner au thème du Site du Zero, mais ce serait bien plus amusant si votre programme génère des phrases sur ce sujet ^^ .

    Exemple : "Les floodeurs écrivent des posts ridicules dans le forum DG."
    Vous avez là 4 éléments syntaxiques (et oui, les cours de français, ça sert ! :p ) :
    • "Les floodeurs" en guise de sujet
    • "écrivent" comme verbe
    • "des topics ridicules" qui fait office de <acronym title="Complément d'Objet Direct">COD</acronym>
    • "dans le forum DG" pour <acronym title="Complément Circonstanciel de Lieu">CCL</acronym>

    Vous remarquerez que tous les accords sont parfaits... Vous devrez atteindre cet idéal.


    Attention, vous ne devez pas vous contenter uniquement de la structure sujet/verbe/compléments : n'hésitez pas à vous essayer aux relatives, etc.. On ne vous demande pas non plus de rentrer en dur 10 structures de phrases avec de légères variantes, et d'en choisir une au hasard. Ce qui fait tout l'intérêt de l'épreuve, c'est d'avoir un programme qui sait générer lui-même, au hasard (c'est à dire différemment à chaque lancement), la structure d'une phrase. Il pourrait par exemple décider d'insérer un complément de lieu, ou pas.
    C'est plus dur, évidemment. C'est fait pour ;)
    Il existe de très nombreuses méthodes pour faire ça, nous vous laissons improviser.

    Avoir une structure, un squelette de phrase, c'est bien, mais il vous faudra des mots pour la remplir. Pour avoir une phrase aléatoire, il vous faudra choisir les mots au hasard dans une base de mots (en faisant attention de respecter les règles de commentaire). Plus votre base de mots sera étendue, plus vos phrases seront diversifiées.
    Nous ne souhaitons pas que vous passiez tous vos après-midis à recopier le dictionnaire. Si vous le souhaitez, vous pouvez (mais évidemment, ce n'est pas obligatoire) vous mettre d'accord avec d'autres équipes et échanger une partie, ou la totalité de vos bases de mots. À vous de trouver un format qui permette un tel échange, et à vous de choisir les échanges les plus judicieux. N'hésitez pas non plus à faire travailler les autres membres de votre équipe :pirate:

    Ne vous affolez pas trop si vos phrases n'ont pas grand sens. Cela fait partie du contrat, et nous nous y attendons.
    Ce que nous espérons c'est que dans le lot, une partie aura du sens et sera amusante/instructive. Pour cela, n'hésitez pas à varier votre vocabulaire (introduire des éléments extérieurs au siteduzero n'est pas interdit, loin de là). Évidemment, les mots grossiers/injurieux ou autres sont interdits.

    Et c'est tout ?

    Et non, ce n'est pas tout. Afin de vous faire utiliser pleinement les cours, nous avons décidé de rajouter par dessus tout ça une petite interface en SDL qui vous permet d'afficher à l'utilsateur dans une présentation agréable les phrases que votre programme a générées. Plusieurs choix seront proposés à l'utilisateur, nous vous laissons assez libre sur ce point mais faites attention à ne pas y perdre trop de temps, ce ne sera pas la partie la mieux évaluée. Nous preferons largement un générateur syntaxiquement et orthographiquement performant avec une interface spartiate plutôt qu'un programme totalement incohérent avec une interface somptueuse et pleine de fonctionnalités inutiles.
    Nous ne vous imposons que deux fonctionnalités :
    • Permettre à l'utilisateur de choisir le nombre de phrases qu'il veut générer
    • Permettre à l'utilisateur de stocker les phrases qui lui conviennent dans un fichier texte (à vous de voir comment l'utilisateur choisira les phrases qu'il veut garder)



    Sur quoi serez-vous évalués ?

    Nous vous évaluerons sur la "richesse" de votre langage : les différents types de phrases que votre programme sera capable de générer, et la cohérence syntaxique des phrases générées. Évidemment, vous serez aussi noté en fonction de la propreté et la clarté de votre code, ainsi que de sa robustesse (comprenez "resistance aux bugs"). Bien entendu, nous tiendrons aussi compte de la qualité (facilité d'utilisation, esthétique...) de l'interface SDL.

    Voici à titre indicatif la répartition des points :
    • Qualité de l'interface SDL : 20%
    • Respect du sujet : 15%
    • Qualité du générateur : 35%
    • Propreté, clarté de tout le code : 30%



    À propos de la propreté, de la clarté et des autres détails qui concernent votre code, lisez le message suivant : il explique nos attentes plus en détail

    Sur ce, bon courage et bonne chance à tous !

    [merci à Javier pour la rédaction de l'immense majorité du sujet, et de la news]
    • Partager sur Facebook
    • Partager sur Twitter
      12 juillet 2006 à 14:38:42

      La présentation


      La présentation de votre code (son aspect visuel) est un critère déterminant dans la facilité de lecture (et donc de compréhension) par le correcteur. Vous devrez en prendre soin (tout autant que des autres parties de ce document, remarquez).

      L'indentation, mère de toutes les vertus



      Indenter, c'est faire ressortir à l'oeil, par des espacements/tabulations, les imbrications de bloc dans votre code source.
      Pour plus de détails : wikipédia

      L'indentation est absolument nécessaire. Il existe plusieurs styles d'indentation (voici les principaux), et vous êtes libre de choisir celui qui vous convient le mieux. Je vous conseille personnellement le style K&R, ou le style BSD.

      Mais prenez soin de rester cohérent, et de ne pas changer votre façon d'indenter toutes les 5 lignes.

      Pour ce qui est de la taille du 'saut' par défaut, je vous conseille soit d'utiliser 4 espaces. Beaucoup d'éditeurs permettent de faire correspondre un appui sur la touche tabulation au nombre d'espaces que vous souhaitez.

      80 colonnes


      La largeur de votre code est un facteur qui relève probablement plus du détail, mais qu'il ne faut pas négliger non plus. Si vous avez une très grosse résolution (ou une très petite police) vous pourriez être tentés d'utiliser toute la largeur de votre éditeur pour une ligne de code, ce qui aboutirait à des lignes de 200, 250 lettres (ou "colonnes").

      Le problème, c'est que si quelqu'un avec une police plus grosse ou une résolution plus faible essaie de lire votre code, les lignes "dépasseront" et seront découpées en une, deux, voire trois lignes, ce qui est extrêmement malcommode pour la lecture.

      Pour ce qui est du C, la convention est de se fixer une limite à 80 colonnes (ou 80 lettres de largeur, mais en comptant les espaces, etc...).
      C'est la largeur minimale de lecture pour tous, et elle possède un certain avantage : comme les lignes de codes doivent être assez étroites, vous ne pourrez pas faire 50 imbrications de blocs les uns dans les autres, et cela vous incitera à découper votre code en fonctions, ce qui n'est pas plus mal.

      Si vous avez vraiment beaucoup de mal à suivre cette convention, vous pouvez dépasser un peu (nous ne sommes pas non plus des obsédés des 80 colonnes) mais 90-100 colonnes de largeur me semblent être un maximum nécessaire.

      La découpe


      Découper votre code permet de séparer les instructions de votre programme selons les domaines qu'elles concernent.
      Une bonne découpe est un atout en matière de lisibilité, maintenabilité...

      Plusieurs fichiers


      La démarche pour faire plusieurs fichiers en C est décrite par M@teo : La programmation modulaire.

      C'est à vous de trouver la découpe qui vous semble la plus naturelle. À titre d'indication seulement, on peut approximer la taille maximale d'un fichier à 200 lignes (mais ça peut être plus, et c'est souvent beaucoup moins).
      Essayez de manière générale de ne pas faire de gros fichier de 900 lignes avec tout votre code dedans.

      ...mais pas trop


      La découpe c'est comme tout, il ne faut pas en abuser. Ce n'est pas forcément une bonne idée non plus de faire un fichier par fonction, avec 10 lignes de code par fichier.


      Le contenu


      Des noms explicites


      Donnez des noms un tantinet explicite à vos variables/fonctions.
      L'abus des variables courtes et anonymes est fortement déconseillé.

      Il ne faut pas non plus tomber dans l'excès.
      IndiceDuTableauModifieParLaFonctionDeTri (ou indice_du_tableau_modifie_par_la_fonction_de_tri, les deux notations sont acceptées) n'est pas un nom de variable agréable.

      commentaires


      Les commentaires seront probablement nécessaires à un moment ou un autre de votre code.
      Utilisez // ... pour des petits commentaires, /* ... */ pour les commentaires importants ou multi-lignes.
      L'utilité des commentaires est de faciliter la compréhension du code.

      Plus le code est clair (bien découpé, pas trop d'instructions en une seule ligne, variables bien nommées) moins vous aurez besoin de commentaires. Veillez à ne pas tomber dans l'excès :
      int n; // on déclare la variable n
      scanf("%d", &n); //on lit une valeur sur l'entrée courante
      return max(n, 0); //on renvoie 0 si n est négatif


      Si vous ne savez pas placer des commentaires, la meilleure chose à faire est de trouver un binôme qui comprend plus ou moins le C, lui faire lire votre code, et mettre des commentaires là où il demande des précisions. Avec un peu de chance, il repéra même certains bugs :p
      Vous pouvez aussi prendre l'habitude de mettre un commentaire décrivant chaque fonction au moment de sa déclaration.
      Évitez cependant de trop répeter l'entête : pour une fonction simple, si les arguments ont des noms pertinents, on n'a pas besoin de 5 lignes supplémentaires de commentaires qui ne feraient qu'alourdir la lecture.

      conventions


      Il existe quelques conventions de programmation; par exemple, l'habitude de mettre les noms des constante #define en majuscules, ou encore une majuscule à la première lettre des nom des type/struct. Vous êtes libre de choisir celles qui vous conviennent, mais essayez de rester cohérents : n'en changez pas toutes les 5 minutes.

      Si vous faites l'épreuve à plusieurs (si vous êtes plusieurs de l'équipe à faire du C, je veux dire : évidemment, votre (grand frère | grande soeur | grand mère) qui bosse chez Google ne doit pas participer au code ^^ ), vous devrez essayer de vous mettre d'accord pour que le produit fini soit cohérent.


      fonctions


      Les fonctions sont un aspect majeur de la programmation. N'hésitez pas à vous en servir.

      De manière générale, vous devez partir du principe qu'il ne faut jamais copier/coller du code à deux endroits différents. Je vous renvoie pour une explication claire et efficace au très bon document Comment coder en évitant les bugs.

      La SDL


      Si vous êtes amenés à faire de la programmation SDL, il existe quelques erreurs courantes à éviter.

      SDL : toujours une fonction pour quitter


      Quand vous soumettrez votre code, assurez vous que vous proposer une fonction pour quitter le programme qui marche dans tous les cas. Si au cours du test le correcteur se trouve bloqué avec une fenêtre impossible à fermer sans passer par un méchant appel système, il n'appréciera probablement que très modérément.

      SDL : ne pas abuser du processeur


      Assurez vous que votre programme a un usage raisonnable des ressources : processeur, mémoire vive. Ou alors, cotisez vous pour acheter des ordinateurs derniers cris à vos correcteurs. À priori, ils seront deux, il y a 47 équipes d'au moins 5 joueurs chacune : sur une base de 1500€ maximum par ordinateur, 12 euros par participant devraient suffire.

      Portabilité


      La SDL est, dixit M@teo, une bibliothèque (on dit bibliothèque, pas librairie, même si c'est très tentant) portable. Cela veut dire que quelque soit (ou presque) le système d'exploitation et l'ordinateur de celui qui veut utiliser votre code source, il pourra toujours utiliser telles quelles les fonctions de la SDL.

      C'est très bien, et vous devez faire pareil pour tout votre code. Si un membre de votre équipe est sous GNU/Linux ou MacOSX par exemple, essayez de lui faire compiler votre code.

      Le sujet de C est fait pour qu'il soit toujours possible d'utiliser des solutions portables. N'utilisez pas de bibliothèque spécifique à Windows (ou Linux ou MacOS), et évitez les fonctions systèmes : n'employez pas system("PAUSE"); par exemple.

      Nous ne sommes pas des puristes, et nous n'essaierons (sans doute) pas de compiler votre code sur un(e) game boy pour vérifier que tout marche bien. Mais si le code ne compile pas, ou a des problèmes lors de l'execution au moment de la correction, cela sera forcément pris en compte, et pas pour vous rajouter des points :D


      La compilation


      J'en arrive maintenant au point qui est le plus problématique : comment compile-t-on le programme ?
      Je ne connais pas par coeur le fonctionnement de SuperVisual::Blocks, donc je vais vous donner les options de compilation en ligne de commande à utiliser. Cela ne vous impose absolument pas de coder vous-même en ligne de commande : à vous de les adapter à votre IDE (en général un simple copier/coller dans le bon champ du bon formulaire suffit).
      Les options sont destinées au compilateur gcc (ou MingW sous windows). Si vous utilisez un autre compilateur, trouvez des options équivalentes. Ou alors, vous pouvez toujours coder avec ce que vous voulez pendant le développement de votre application, et passer quelques temps (voire assez longtemps, selon que vous avez codé comme un goret ou non), peu avant le rendu, pour le rendre conforme au options que nous demandons sur le compilateur que nous utiliserons.

      respect des standards


      (ce texte n'est pas destiné aux puristes mais aux débutants. Il pourrait y avoir quelques imprécisions)

      En C, comme en XHTML, il existe des standards. Les deux normes les plus connues sont les versions 89 et 99 du standard C. Le cours de M@teo se base dans sa grande majorité sur le standard C89. Nous vous conseillons de vous y conformer aussi.

      Cependant, pour des raisons de confort d'usage et/ou de liberté de code, nous acceptons les codes C99 (évitez les fonctionnalités trop ésotériques). L'option de compilation utilisée sous gcc sera -std=gnu99 -pedantic .

      warnings


      Les Warnings ('Avertissements') sont des options du compilateur qui font que quand il trouve un code bizarre, il le dit. Elles n'empêchent pas la compilation (ce n'est pas comme les erreurs de syntaxe ou autres), mais vous devez y faire attention : plus un code génère de warnings, plus il est codé salement, et plus il a de chance de planter lors de l'execution. Entre autres, ils constituent d'excellents détecteurs de problèmes de pointeurs : moins de warnings, c'est moins de chance de voir le beau parachute de la SDL :p

      Faire la chasse au warning c'est donc un bon moyen d'avoir un code plus net, et moins de bugs.

      Je vous conseille donc d'activer tous les warnings du compilateur, en lui fournissant l'option -Wall.

      Cependant, il n'est pas obligatoire de n'avoir aucun warnings : si votre code marche très bien et que vous avez un ou deux warning sur des choses peu gênantes (certains warnings sont parfois de l'ordre du détail, comme l'absence de saut de ligne en fin de fichier), ne faites pas une dépression pour autant. Les examinateurs ne sont pas des maniaques de la compilation 0 Warning. Vous devez juste en prendre bien soin, et essayer d'en avoir le moins possible : un code qui compile avec plein de warnings est très mauvais signe.


      Voici un petit récapitulatif de la commande de compilation qui sera probablement utilisée :
      gcc -std=gnu99 -pedantic -Wall

      Conclusion


      J'espère que mes conseils ne vous ont pas trop traumatisés :pirate:
      Si vous avez découvert plein de choses en lisant ce document, c'est très bien : vous vous coucherez plus soigneux ce soir :)

      Bonne chance pour le zérothon !

      [merci à iPoulet pour sa relecture (ou pas :-° )]
      • Partager sur Facebook
      • Partager sur Twitter
        12 juillet 2006 à 15:49:56

        Bon courage aux participant(e)s, vous en aurez besoin ! :D
        • Partager sur Facebook
        • Partager sur Twitter
          12 juillet 2006 à 15:53:48

          il est long le sujet
          ça va je pense qu'il est moins dur que le PHP :p
          quand se termine l'épreuve ?
          • Partager sur Facebook
          • Partager sur Twitter
            12 juillet 2006 à 15:57:27

            Ouf, je suis content de ne pas eu avoir le temps de m'inscrire car moi qui voulais l'épreuve du C/C++ ! Trop dur pour moi ! Bonne chance aux autres :D
            • Partager sur Facebook
            • Partager sur Twitter
              12 juillet 2006 à 16:02:12

              Bonne chance a tous , pas trés difficile comême , :D


              • Partager sur Facebook
              • Partager sur Twitter
                12 juillet 2006 à 16:02:39

                Wow, c'est vraiment une bonne idée cette épreuve ! Bonne chance aux codeurs en C ! :D
                • Partager sur Facebook
                • Partager sur Twitter
                  12 juillet 2006 à 16:05:50

                  A-t'on le droit d'utiliser des bibliothèques externes supplémentaires, si elles sont portables ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 juillet 2006 à 16:08:40

                    Super intéressant!
                    Mais j'ai juste une question: une phrase générée peut être tout a fait correcte, mais n'avoir aucun sens!
                    Exemple: Les floodeurs sont des topics inutiles qui racontent que les oiseaux volent le samedi soir.

                    Est-ce grave?
                    Merci!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 juillet 2006 à 16:09:08

                      :) j'aime bien ce sujet... sa me changera je trouvais pas vraiment de choses à faire à part un PacMan ou un Space Invaders ...

                      :p Aller, au boulot mon vieux , t'en a pour ton grade ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 juillet 2006 à 16:11:05

                        Je ne suis pas inscrit mais je pense que juste pour le fun je vais le faire pendant mes vacances (ça serait pas des vacances sinon :p ). Bonne chance aux participants ;) .
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 juillet 2006 à 16:11:56

                          Citation

                          A-t'on le droit d'utiliser des bibliothèques externes supplémentaires, si elles sont portables ?

                          Sauf contre-indications médicales, vous devriez ne vous servir que des librairies standard et de la SDL.

                          Citation

                          Mais j'ai juste une question: une phrase générée peut être tout a fait correcte, mais n'avoir aucun sens!


                          Citation : le sujet

                          Ne vous affolez pas trop si vos phrases n'ont pas grand sens. Cela fait partie du contrat, et nous nous y attendons. Ce que nous espérons c'est que dans le lot, une partie aura du sens ...

                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 juillet 2006 à 16:12:08

                            Ouf! Je vais me mettre au boulot tout de suite ^^

                            Par contre, l'originalité du sujet, je le trouve bof comparé aux autres qui sont vraiment originaux... mais celui-ci a plus de défi! :D

                            EDIT:
                            Si une ligne fait plus de 80 colonnes, a-t-on le droit de faire un Entrée, de l'aligner avec la ligne précédente et continuer? (sachant que les Entrée et les espaces n'altèrent généralement rien dans le code)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 juillet 2006 à 16:13:38

                              Citation

                              Par contre, l'originalité du sujet, je le trouve bof comparé aux autres qui sont vraiment originaux...



                              Je sais pas ce qu'il te faut >_<

                              "un Printf du SDZ en ASCII art" ? Peut être l'année prochaine...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 juillet 2006 à 16:17:21

                                Mais au moins c'est libre, ça on peut le dire ^^
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 juillet 2006 à 16:19:25

                                  Petite question avons nous le droit d'utiliser une librairie autre que la SDL pour l'interface ? Je pense notamment à GTK qui est tout aussi portable que l'est la SDL.
                                  Merci d'avance
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    12 juillet 2006 à 16:25:47

                                    Bonjour, je voudrais juste questionner est ce qu'on doit utiliser seulement la SDL, ou on doit utiliser la console avant?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      12 juillet 2006 à 16:30:05

                                      Matarc > non.

                                      oussama1305 > je pense qu'une possibilité de faire afficher les phrases dans la console serait pas mal.
                                      Tu peux soit choisir dynamiquement pendant l'execution si tu utilises la SDL ou la console (avec une option de lancement par exemple), soit pourquoi pas faire deux main différents.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        12 juillet 2006 à 16:33:20

                                        Oh My God

                                        j'y arriverais jamais
                                        heureuseument qu'on est plusieurs...

                                        sinon j'aime beaucoup l'idée
                                        bravo au redacteur
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          12 juillet 2006 à 16:34:13

                                          ??? Comment faire deux main? Pourquoi pas faire un tout petit main qui mène à une des deux fonctions?

                                          J'ai deux autres questions:

                                          Si une ligne fait plus de 80 colonnes, a-t-on le droit de faire un Entrée, de l'aligner avec la ligne précédente et continuer? (sachant que les Entrée et les espaces n'altèrent généralement rien dans le code)


                                          Quand est la date limite de l'épreuve (désolé si c'est inscrit quelque part, j'ai la flemme de relire :p )
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            12 juillet 2006 à 16:34:46

                                            oussama > bah t'as un fichier qui contient ta fonction main.
                                            Tu peux faire deux fichiers différents, et selon celui des deux qu'on compile, ça met soit la SDL, soit une interface simple en console.

                                            Ce n'est qu'une idée, hein.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              12 juillet 2006 à 16:35:46

                                              heureusement que j'ai pas participer c'a me laisse réfléchir pour l'annèe prochaine
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                12 juillet 2006 à 16:36:10

                                                Mais je me demande si on peut faire en console seulement, et puis aussi comment faire pour demander à l'utilisateur combien de phrases afficher en SDL ??
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  12 juillet 2006 à 16:37:01

                                                  Comme on dit : demerden Sie sich
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    12 juillet 2006 à 16:38:08

                                                    Bonne chance à tout(e) les participant(s/es) !
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 juillet 2006 à 16:38:46

                                                      Rebonjour,
                                                      j'ai jamais utilisé pedantic, et quand je l'ajoutes comme option à Code::Blocks, il me met le warning: "#include_next is a GCC extension" pour stddef.h et stdarg.h à la ligne 6, et ca ne compile pas...
                                                      Si je vire pedantic, tout marche!

                                                      D'ou ca peut venir et comment le corriger?

                                                      Merci
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        12 juillet 2006 à 16:44:05

                                                        #include_next ?
                                                        pourquoi tu mets pas #include ?
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        [Zérothon] L'épreuve de C

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown