Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Défis] Recensement et informations

    14 mai 2012 à 3:18:50

    Ben je vous propose pour ce qui est de recoder printf :
    Il faut gérer les listes variables d'arguments et donc en gros pouvoir sortir un print(chaineFinale); à la fin de la fonction quelque soit ce qu'il y avait dedans. Ensuite un peu plus dur, en plus des %s %c %d %lf et autres classiques elle doit gérer les accents (donc recoder fwprintf en somme) avec wchar et pour la pratique doit aussi pouvoir faire des retours à la ligne automatiques. En gros la fonction ne couperait plus les mots en plein milieu; Elle compte le nombre de caractères du mot et s'il est trop long elle va à la ligne. Bien sûr, ça n'empêche pas notre fonction de gérer les \n, bien au contraire. Et pour un niveau VRAIMENT supérieur, vous pouvez demander à ce que ce soit fait en SDL avec SDL_ttf pour que l'on puisse changer la police d'un appel de la fonction à l'autre et que l'on puisse aussi changer la couleur du texte, etc... Le dernier niveau serait pour les plus aventuriers d'entre nous mais rien ne nous empêche de peaufiner encore et encore cette fonction d'écriture qui s'avère être une plaie quand on ne sait pas la faire pour un jeu en SDL qui a beaucoup de texte (je sais de quoi je parle, regardez le jeu dans ma bio, j'ai passé 4 mois à coder pour avoir une fonction d'écriture correcte la plus parfaite possible)
    • Partager sur Facebook
    • Partager sur Twitter
    qry = 2b || !2b
      14 mai 2012 à 8:47:16

      Bof, je vois pas vraiment le rapport avec la SDL si le TP est de recoder printf. Je trouve même ça dommage pour des gens comme moi qui n'aiment pas vraiment cette bibliothèque. Sinon, si jamais vous n'arrivez pas vraiment à trouver de niveaux de difficulté, vous pouvez poser de le problème dans un sujet à part (à la manière dont cela a été fait ici par exemple).
      • Partager sur Facebook
      • Partager sur Twitter
      Staff désormais retraité.
      Anonyme
        14 mai 2012 à 19:55:47

        Avant de créer un topic, autant voir déjà si le projet est réalisable. Je vous met ci-dessous la présentation que j'ai fait.

        Bonjour à tous,

        Cette semaine, le but de ce défi est de recoder la célèbre fonction printf. Bien entendu, nous n'allons pas faire une fonction aussi complexe et complète que l'originale, mais néanmoins notre version reprendra les bases de printf.

        Si vous souhaitez plus de renseignements sur les défis, rendez vous sur le topic de recensement des défis, vous y trouverez également les règles principales.

        zPrintf



        Retour sur la fonction originale



        La fonction printf sert à produire des sorties sur le flux standard stdout. Elle permet ainsi non seulement d'afficher une chaîne de caractères, mais permet aussi de prendre et d'afficher autant d'arguments que l'on veut :

        printf("Salut %s, %d, %c", "zero", 42, 'z');
        


        Et ces arguments peuvent recevoir des attributs, comme n'afficher que 2 chiffres après la virgule, ou bien écrire en écriture scientifique. Ces arguments sont très nombreux, et pour les découvrir je vous renvoie à la page de man de printf.

        Pistes



        Notre but est de faire un mini-version de printf. Or on sait que cette fonction peut prendre autant de paramètre que l'on veut. Il faut donc penser à la gestion des paramètres. Il faut aussi gérer les différents attributs, ainsi que trouver comment afficher le résultat. Dernier point : il ne faut pas oublier que les nombres doivent être convertis en chaînes de caractères. ;)

        Consignes



        Le but n'est pas de recopier entièrement la fonction printf, ce qui est compliqué et assez long, mais de faire une version simplifiée. On doit néanmoins pouvoir utiliser les principaux indicateurs de conversion :

        zPrintf("Salut %d %i %c %.3f\n %s", 42, -24, 'a', 2.718281828, "zPrintf");
        


        Salut 42 -24 a 2.718
        zPrintf


        Pour rendre l'exercice plus amusant, les seuls éléments de la bibliothèque standard autorisés sont la fonction fwrite et les macros va_start, va_arg et va_end. Toutes les autres fonctions utilisées doivent être recodées.

        Objectifs



        • Manipuler les fonctions à nombre variable d'arguments.
        • Apprendre à réfléchir aux fonctions utilisées.
        • Découvrir de manière approfondie la bibliothèque standard.


        Énoncé



        Niveau 1

        Dans un premier temps, il ne faudra gérer que %c, %d, %i et %s, ainsi que %%.

        zPrintf("%d %s", 4882, "SdZ");
        


        doit afficher :

        4882 SdZ


        Pensez à une fonction pour convertir les nombres en chaîne de caractères.

        Niveau 2

        Cette fois, le programme doit gérer %o, %u, %x et %X.

        zPrintf("%d %o %X", 47, 47, 47);
        


        doit afficher :

        47 57 2F
        


        Essayez de reprendre votre fonction de conversion et de l'adapter pour la rendre générique pour n'importe quelle base. ;)

        Niveau 3

        La prochaine étape prend en charge les flottants et l'écriture scientifique avec %f, %F %e, %E, %g, %G, %a et %A.

        zPrintf("%f %e %G", 3.1415, 3.1415, 3.1415);
        


        doit afficher :

        3.141500 3.141500e+000 3.1415


        Niveaux supplémentaires

        La page de man ! Essayez d'implémenter le plus de choses possibles, comme les caractères d'attribut, les modificateur de longueur, les largeurs de champ, la précision, etc. Vous pouvez également tenter de réécrire d'autres fonctions de la famille de printf.

        Bon courage à tous et amusez-vous bien. ;)

        PS : si vous n'avez pas compris quelque chose, n'hésitez pas à poser votre question.



        Des avis pour améliorer ça ?
        • Partager sur Facebook
        • Partager sur Twitter
          14 mai 2012 à 20:28:12

          Je vois pas l'intérêt de se limiter à fwrite. Notamment pour écrire un simple caractère sur stdout, où putchar me paraît plus adapté.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            14 mai 2012 à 20:31:38

            Oui c'est inutile, mais ça force à réécrire putchar. :)

            Mais je te l'accorde, on peut utiliser putchar directement.
            • Partager sur Facebook
            • Partager sur Twitter
              22 mai 2012 à 16:56:35

              Une autre proposition pendant que j'y pense : coder un interpréteur Brainfuck ! Je dis bien interpréteur et non compilateur (ce dernier nécessitant de faire du code non portable et de maîtriser l'assembleur et le format d'un fichier binaire exécutable).
              Le codage d'un interpréteur pour un langage donné est compliqué d'habitude, il faut de l'analyse syntaxique et tout et tout, avec détection des erreurs, mais pour le Brainfuck c'est d'une simplicité renversante : il suffit de lire les caractères du code source un à un et d'effectuer l'action basique qui y est associée.

              La seule difficulté pour un débutant est de gérer les boucles [ ]. C'est aussi la seule source possible d'erreur de syntaxe.

              Donc ce n'est peut-être pas d'une difficulté digne des défis (peut-être dans les exercices simples), mais ça peut être amusant, non ?
              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2012 à 17:05:02

                Bonne idée (même si il y a un pseudo-defi (sans indications, il y a eu deux codes de postés mais bon) interpréteur befunge en ce moment), mais il y a déjà eu cet exercice sur les forums C++ et autres langages..
                • Partager sur Facebook
                • Partager sur Twitter
                Staff désormais retraité.

                [Défis] Recensement et informations

                × 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