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)
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).
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 :
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.
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 ?
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..