Partage

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

30 août 2008 à 23:58:43

Si je puis me permettre,
- préférez toujours les exceptions dérivant de std::exception (ici : std::runtime_error est très bien)

- pour le isspace, allez le chercher dans la partie C++ et non la partie C -> <locale>, afin de passer la locale de la langue courante à std::isspace<>() -- j'avoue, je n'ai pas testé. Pour le ispace du C, il faut avoir changé la locale globale si je ne m'abuse.
NB: dans l'absolu, il faudrait jouer avec ispunct(...)||ispace(...)

- ou tout simplement, convertissez la ligne extraite en flux (std::istringstream), et utilisez ensuite l'opérateur d'extraction (op>>()) pour extraire chaque mot.

- ces fonctions me paraisse faire trop de choses. Il ne faut pas avoir peur de les découper.
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
1 septembre 2008 à 15:00:05

Arf j'avais carrément oublié cet exercice, y me manquait les paragraphes =/
Puis moi j'ai un code plus court :ohttp://pastebin.com/d4e1804d8
1 septembre 2008 à 15:54:25

Ta détection des paragraphes n'est pas bonne -- tu confonds "\\n" et "\n" qui sont tout deux inexploitables en fait, vu que tu extrais avec std::getline.

Un nouveau paragraphe commence sur le premier \S après un ^\s*$ (en notation expression régulière, ce qui n'est qu'un détail)

Pourquoi passer par un char* ? std::string fournit un opérateur [] (même si tu n'en as pas besoin)

On NE fait JAMAIS de lecture sur eof.
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
2 septembre 2008 à 10:02:10

J'ai une question que je me suis posé toujours, pourquoi on lis jamais sur eof ?
2 septembre 2008 à 10:34:05

Réponse dans la FAQ C++ de développez.
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
9 septembre 2008 à 21:25:34

je me demandais si il n'était pas possible de mettre les exos et les réponses dans un sujet à part de telle manière que pour trouver ou refaire des exos on aie pas à parcourir les 24 pages actuellement et les futurs 150 pages qui vont venir

voilà c'est tout sinon bon courage à nanoc qui fait unsuper boulot
9 septembre 2008 à 21:59:04

Nanoc édite régulièrement le 1er post pour y mettre les liens vers les posts de chaque énoncé et chaque solution.

Pas besoin de créer un nouveau topic.
15 septembre 2008 à 20:55:57

Exercice du mois de septembre 2008



Nom : ... et des lettres
Sujet : Algorithme


Introduction



Vous connaissez très certainement le célèbre jeu télévisé "Des chiffres et des lettres". Ce que je vous propose ce mois est de coder un programme qui résoud l'autre partie du jeu, "Le mot le plus long".

Les règles du jeu sont simples mais le jeu est assez difficile. On tire au hasard 9 lettres et on cherche un mot français (orthographié correctement) écrits avec ces 9 lettres. Si on ne trouve pas de mots de 9 lettres, on cherche en 8 lettres et ainsi de suite.

Le tirage des lettres, se passe de la manière suivante. On demande au joueur si il désire une consonne ou une voyelle et on lui donne une lettre au hasard selon son choix et on recommence pour les 8 autres. Le règlement impose qu'il y ait au minimum 2 voyelles. (Y est une voyelle)

L'exercice



Votre programme devra tirer au hasard des lettres selon les règles définies au-dessus.
Il devra ensuite chercher la meilleure solution possible à partir du dictionnaire suivant:

Dictionnaire de 323 578 mots (3.5 Mio)

et l'afficher à l'écran. Si il y a plusieurs solutions, libre à vous de les afficher toutes ou non.

Ce qui donne par exemple :
Tirage : S I N U S A M O R
Solutions possibles en 9 lettres :
MARSOUINS
SOUS-MARIN


Remarque concernant le dictionnaire: Le dico contient des verbes conjugués ainsi que des pluriels. Il est donc suffisament complet. Il ne contient que des caractères sans majuscules, sans accents et sans cédilles.

Votre programme devra fonctionner avec le dictionnaire situé dans le même dossier que l'exécutable et ne pas nécessiter d'autres fichiers que celui fourni.

----------------------------------------------------------------------

La donnée est assez courte, mais je pense que le tout est assez clair. N'hésitez pas à poser des questions si ce n'est pas le cas.

Vous avez jusqu'au 15 octobre pour soumettre vos réponses à Réponse_Exercices.

Bonne chance à tous !

Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
15 septembre 2008 à 21:13:11

Superbe exo :) ! Je me lance dès que mon site est fini !
16 septembre 2008 à 15:06:25

Bonjour à tous,

Sympa l'exo... mais pas simple pour autant :D

Pas question de modifier le contenu du dico (un classement par taille par ex) ?

a+
C_dur

16 septembre 2008 à 17:19:29

Ton programme peut très bien commencer par créer un nouveau fichier ne contenant que les mots de 9 lettres et moins à partir du dictionnaire fourni si tu veux. Tu peux également le classer par taille par la même occasion.

Mais par souci de comparaison, le dictionnaire doit être le même pour tout le monde.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
16 septembre 2008 à 17:30:07

Citation : Nanoc

et ne pas nécessiter d'autres fichiers que celui fourni.


Citation : Nanoc

Ton programme peut très bien commencer par créer un nouveau fichier



Je suppose que tu as voulu dire que je pouvais créer un fichier temporaire (dans la mémoire) ?

Merci pour les infos
C_dur
16 septembre 2008 à 17:34:50

Dans la RAM ou sur le disque peu importe.

Tu peux faire ce que tu veux en fait du moment que le programme n'a besoin que du fichier fourni.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
16 septembre 2008 à 19:00:50

ah, ok ! J'ai enfin compris la nuance :+(
Désolé pour le dérangement.... et merci encore pour l'exo
17 septembre 2008 à 22:35:13

Oups,

Je viens d'envoyer mon code pour le compte est bon un peu en retard à reponse-exercices du fait que je n'ai vu cet exercice que le 13 septembre, un peu avant de m'inscrire sur le site!

J'espére qu'il le verra!!! sinon tant pis :(
18 septembre 2008 à 10:50:53

Pas de problème ! Reponse_Exercice voit tout :)
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
26 septembre 2008 à 4:33:44

Bon désolé du retard dans la discussion... En passant, je suis content d'avoir proposé un code assez structuré pour être utiliser en exemple. Mon code semble ne pas faire l'unanimité, ce n'est pas grave. S'il plante, je suis désolé, j'ai fait ça sur l'heure du midi et j'avoue ne pas avoir rudement testé.

En réponse à Darkelfe et aussi Freedom

Citation : Darkelfe

C'est pas tellement un problème mais j'ai remarqué une "anomalie" dans le code de MatteX.

Le code suivant (qui ne doit pas fonctionner) passe très bien avec le programme de MatteX :

++++[>+++++++++<-]
].[



Si on observe le fonctionnement en détail, on voit que le programme se comporte comme si les deuxième ']' et '[' était inversé (il fait la boucle). [...]



Donc [ ] = tant que valeur du pointeur != 0
] [ = tant que valeur du pointeur == 0

Ce n'est pas décrit partout (le Wikipedia francophone parle seulement de la première forme), mais je trouvais que cela ajoutais du piquant à mon interpréteur et du Fuck au BrainFuck.

La difficulté réside dans la capacité de déterminer qu'est-ce qui débute une boucle et ce qui la termine... j'ai choisi, si ma mémoire est bonne, d'accepter l'imbrication seulement des boucles semblables.

Source :
http://en.wikipedia.org/wiki/Brainfuck
http://www.muppetlabs.com/~breadbox/bf/

Je suis bien d'accord pour le switch. C'est l'habitude des langages un peu moins évolués qui n'ont pas ce genre de structure conditionnelle qui me fait opter pour les if-else.


P.S. Si ça plante (ou plantais, je ne sais si Nanoc a corrigé) je suis navré. Je n'ai pas testé beaucoup de code BrainFuck dans mon interpréteur. D'ailleurs je suis encore surpris qu'il ai servi d'exemple principal. Merci :D
7 octobre 2008 à 17:50:23

Je me permet de faire un peu de pub pour la suite de mon tuto: http://www.siteduzero.com/tutoriel-3-8 [...] avancees.html

Sinon, pour répondre à MatteX: Oui j'ai corrigé ton code.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
7 octobre 2008 à 18:10:04

Super cool, je me mets tout de suite à la lecture du tuto :) .
7 octobre 2008 à 18:13:46

Merci beaucoup Nanoc pour ce tuto.
Est-ce que tu pourrais lister sur quoi va être ton tuto stp?

Merci d'avance
14 octobre 2008 à 15:29:02

Citation : Nanoc

Remarque concernant le dictionnaire: [...] Il ne contient que des caractères sans majuscules, sans accents et sans cédilles.



Je voudrais juste faire remarquer que le dictionnaire que tu fournis contient des lettres majuscules contrairement à ce qui est dit dans l'énoncé. Le 'A' par exemple (mais il y en a bien d'autres):
# cat liste_finale.txt | grep A
Antechrist
Antechrists
Ave


14 octobre 2008 à 22:07:20

Aaaarg ! Il me semblait pourtant avoir vérifié... Bon je vais corriger cela.

Mais bon, cela ne change rien à l'exercice.

@The French: Les sujets suivants devraient être:
- T.P. sur le polymorphisme
- Exceptions
- Templates (au moins 3 chapitres)
- T.P. sur les templates
- Héritage multiple (au moins 2 chapitres)
- T.P. sur l'héritage multiple
- ...

Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
14 octobre 2008 à 22:35:45

OuOuuu!! Je sens que je vais déguster! :) [Merci]
15 octobre 2008 à 18:09:52

Exercice du mois d'octobre 2008



Nom : Fractions
Sujet : Classes, surcharge d'opérateurs


En C++, vous pouvez représenter différents types de données. Les entiers, les nombres réels, les nombres complexes,... Mais il n'existe pas de type représentant une notion que l'on retrouve souvent en mathématique, les fractions. Vous l'avez sûrement deviné, je vous propose ce mois de créer une classe pour palier à ce "manque".
Cet exercice est également un grand classique de la programmation.

L'exercice



Le but de cet exercice est de réaliser une classe Fraction qui permettera de représenter la notion de fraction. Pour rappel, une fraction est un nombre donné par le rapport de deux nombres entiers. Par exemple <math>\(\frac{22}{7}\)</math> ou <math>\(\frac{355}{113}\)</math>.

Votre classe devra fournir les services suivants:

1) Construction à partir d'un nombre entier.

1 bis) Construction à partir d'un couple d'entier "Numérateur-Dénominateur".

2) Construction à partir d'un nombre à virgule (double).

3) Construction à partir d'une chaine de caractère de la forme "35/8" (sans les "").

4) Surcharge des opérateurs arithmétiques usuels (+,-,*,/) et pourquoi pas puissance via l'opérateur ^. Attention aux divisions par 0. Pensez également à implémenter les versions +=,-=,*=,/= et ^= des opérateurs. Vous pouvez également réfléchir à la question des opérateurs du type "Fraction + Entier" ou "Reel + Fraction".

5) Surcharger l'opérateur << pour l'affichage dans un flux. (Pensez au cas particulier des fractions comme <math>\(\frac{2}{1}\)</math> par exemple !)

6) Surcharger les opérateurs de comparaison (==,!=,<,>,<=,>=).

7) Proposer une fonction "toDouble" qui convertit la fraction en nombre à virgule.

8) Proposer un moyen de connaître le dénominateur et le numérateur.

Votre fraction devra toujours être exprimée sous forme irréductible. C'est-à-dire que <math>\(\frac{4}{8}\)</math> devra être converti en <math>\(\frac{1}{2}\)</math>


Pour trouver un moyen d'implémenter les opérateurs, je vous laisse revoir vos cours de maths ou Wikipedia par exemple.

Vous avez jusqu'au 14 novembre pour soumettre vos réponses à Réponse_Exercices.

Bonne chance à tous !

EDIT: Ajout d'un constructeur que j'avais oublié.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
15 octobre 2008 à 19:00:49

4) Le fait que tu ne parles par de "I + R", "R + I", "+=", etc.
C'est fait pour ?

(je soulève la question parce que le tuto n'a pas choisi de montrer la façon idiomatique de procéder, et que du coup ils risquent de reproduire l'erreur classique ; alors que l'exo en lui même est suffisamment simple pour guider vers cette solution idiomatique)
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
15 octobre 2008 à 20:02:30

Très bon exercice, je m'y mets tout de suite :) !
15 octobre 2008 à 20:05:42

Citation : lmghs

4) Le fait que tu ne parles par de "I + R", "R + I", "+=", etc.
C'est fait pour ?

(je soulève la question parce que le tuto n'a pas choisi de montrer la façon idiomatique de procéder, et que du coup ils risquent de reproduire l'erreur classique ; alors que l'exo en lui même est suffisamment simple pour guider vers cette solution idiomatique)



Non, cela me semblait évident. Mais tu as raison, je vais détailler.

Avec le constructeur depuis un double ou un int, les I+R et R+I ne devraient pas être nécessaires.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
15 octobre 2008 à 20:28:58

Qu'est-ce que tu entends par "construction à partir d'un entier" : un entier est déjà sous forme irrédutible, non ? Donc pas raison de le changer ?
(Je préfère être spur pour éviter de commencer par faire n'importe quoi ^^ )

Pour la construction à partir d'une chaîne de caractères, on a à gérer qu'une seule division, pas des cas du style : 35/3/2 ?

Edit : fautes de frappe (j'en ai maaare...)