Partage

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

30 mars 2008 à 17:47:52

onne chance à tous et bien du plaisir
savez certainement, pour progresser en informatique, il faut pratiquer le plus possible. C'est en forgeant qu'on devient forgeron. Malheureusement il est parfois difficile de trouver des exercices pour travailler un point particulier du langage. Ce topic a pour but de vous proposer chaque mois un exercice qui approfondi un aspect du langage C++.

Comment ça marche ?



Chaque début de mois, je vous proposerai un exercice avec parfois plusieurs niveau de difficulté. Ces exercices seront conçu de manière à être réalisables en quelques heures si vous avez choisi le niveau correspondant à vos aptitudes.

Vous aurez alors pendant un mois la possibilité de soumettre vos exercices et la meilleure solution proposée par vous, les zéros, sera donnée comme correction à la fin du mois. Si aucune solution valable n'est proposée, je proposerai un corrigé complet de l'exercice.

Si le concept a du succés, il se peut que la cadence augmente un peu.

Quels sujets seront abordés ?



J'aborderai principalement des sujets en rapport avec le cours de M@teo21 qui ne nécessitent aucune bibliothèque tierce. Il y aura principalement des exercices sur les chaînes de caractères, les flux vers les fichiers, des algorithmes simples et la rédaction de classes "classiques". Vous trouverez toutes les informations nécessaires à la résolution des exercices sur ce site, soit dans le tuto de M@teo21, soit dans les différents tutoriels des membres.

Le but est à terme de proposer une sorte de base de données d'exercices disponibles pour tous en marge des tutoriels du site.


Soumission des réponses



Pour proposer votre réponse à l'exercice du mois, il faut envoyer un message privé à: Réponse_Exercices, qui respecte le format suivant:

Mettez dans le titre le mois de l'exercice et votre pseudo:
Exercice MOIS ANNEE - VOTRE_PSEUDO


Par exemple :

Exercice avril 08 - Nanoc



Dans le corps du message, mettez votre code source dans les balises de code, chaque fichier (si il y en a plusieurs), dans un bloc séparé. Si il y a plusieurs niveaux, indiquez quel niveau vous avez choisi.

Merci de ne pas m'envoyer de MP (à Nanoc) pour soumettre vos réponses.


Il ne sert à rien d'envoyer un code qui ne compile pas ou qui ne fonctionne pas !!


Les exercices



Voici la liste des exercices qui ont déjà été proposés:

Pendant les vacances d'été, un exercice supplémentaire au milieu du mois est proposé. Il s'agit d'exercices plus technique et peut-être un peu plus difficile. Dans le tableau ci-dessous, ils sont suivi d'un petit "2" dans la colonne date.


Date Nom de l'exercice Sujet Solution proposée par: Solution Nombre de réponses
Avril 08 Cowsay ! Chaînes de caractères Nanoc solution 20
Mai 08 Le plus grand nombre Classe, opérateurs, tableaux Nanoc solution 7
Juin 08 Compression RLE Fichiers, chaînes de caractères lanfeusst solution 22
Juin 08 - 2 Opérateur virgule Surcharge d'opérateurs Nanoc solution 4
Juillet 08 Statistiques sur des fichiers Fichiers Leilo solution 11
Juillet 08 - 2 Interpréteur BrainFuck Fichiers, pointeurs MatteX et Masthiks solution 25
Août 08 Des chiffres... Algorithme Nanoc solution 5
Sept. 08 ... et des lettres Algorithme Nanoc solution 14
Octobre 08 Fractions Classes, surcharge d'opérateurs Nanoc solution 22
Novembre 08 CRYPTO 1: Le chiffre de César string, algorithmes Chlab_lak solution 15
Décembre 08 CRYPTO 2: Le chiffre de Vigenère string, algorithmes iNaKoll solution 8
Noël 08 Bonus: Project Euler Algorithmes -- -- --
Janvier 09 CRYPTO 3: Cryptage XOR string, algorithmes Nanoc solution 8
Février 09 Chiffres romains string, algorithmes Nanoc solution 23
Avril 09 Polynômes Classe, opérateurs, algorithmes Nanoc solution 3
Vacances de Printemps 09 Bonus: P'tit Langage Tout ! ;) -- -- --
Mai 09 Diff Fichiers -- -- --
Juin 09 Figlet ! Fichiers, chaines de caractères -- -- --
Août 09 Parseur de fonctions mathématiques Chaînes, algorithmes -- -- --




Remarques



Il ne sert strictement à rien de devenir ami avec Reponse_Exercices. Il se connecte qu'une fois par mois pour récupérer les fichiers envoyés.


Si vous avez des questions sur le fonctionnement du tout, n'hésitez pas à les poser dans ce thread. Si vos questions portent plutôt sur un problème de résolution d'exercice, créez un autre fil pour avoir plus de chance d'être lu !

B
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
30 mars 2008 à 17:48:13

Pour les modos: Possible de mettre en post-it ? Merci d'avance !
30 mars 2008 à 17:48:28

Exercice du mois d'avril 2008



Nom : Cowsay !
Sujet : Chaînes de caractères


Si vous êtes dans le monde de Linux, vous connaissez certainement le petit programme "Cowsay". On lui passe une chaîne de caractère en argument et il dessine une vache dans la console ainsi qu'une petite bulle de bande dessinée où se trouve le texte qu'on lui a passé en argument. Par exemple:

Image utilisateur
Ce que je vous propose c'est de réaliser ce petit programme. Il devra remplir le cahier des charges suivant:

1) Récupérer les arguments du main.
2) Afficher la phrase entrée dans une "bulle" en coupant la phrase au bon endroit (voir l'exemple ci-dessous).
3) Dessiner dessous l'animal (Zozor ?) de votre choix.
4) Utiliser si possible les std::string.

Il ne vous est pas demandé ici d'écrire de classe. Si vous ne savez pas comment faire le point 1, vous pouvez aussi demander à l'utilisateur de rentrer une chaîne après que le programme soit lancé ou consulter le tutoriel disponible dans la catégorie "C": ici.

Si la phrase est trop longue, le programme devra la couper au bon endroit, soit par exemple:

Image utilisateur

avec un découpage au niveau des espaces si il y en a et après un certain nombre de caractère si il n'y en a pas.

Image utilisateur

Vous avez jusqu'au 30 avril pour soumettre vos réponses à Réponse_Exercices.

Bonne chance à tous !

EDIT: Ajout du lien pour le tuto C sur les arguments du main et changement des images.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
30 mars 2008 à 17:50:51

Tres bonne idée, jy participerais surment... :D
Anonyme
30 mars 2008 à 18:07:15

Oui, Très très bonne initiative!

PS : faute de frape : "pendnat" (§Comment ça marche). :p
30 mars 2008 à 18:09:01

Je vais faire ça aussi tiens :) .

EDIT: Hop, de mon côté c'est fini (42 minutes tout pile \o/), je MP ça au compte pour les réponses aux exos ;) .
31 mars 2008 à 17:27:34

J'ai déjà reçu plusieurs réponses. Mais la perfection n'est pas encore là :) . Tentez votre chance !
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
31 mars 2008 à 18:07:59

En quoi consisterait la récupération des arguments du main ? A récupérer le texte d'un fichier déposé sur l'application ?
31 mars 2008 à 18:14:10

Non, le texte doit directement être passé en paramètre. Exactement comme le montre l'exemple donné par Nanoc :
Nanoc: cowsay "Salut les zéros"

Ainsi on a juste a appeler le programme cowsay suivit de la chaine à "cowsayer" ... ^^
Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
Anonyme
31 mars 2008 à 18:17:32

De toute façon, je ne pense avoir les connaissances suffisantes (args de main, par exemple), ni la volonté d'être bourrin au point de dessiner un vache à grands coups de cout ^^
31 mars 2008 à 18:39:08

Oups, j'ai bien fait sa mais a part que j'ai pas mis le besoin de mettre les "", ils sont indispensables ou pas ??
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
31 mars 2008 à 20:42:22

Non, mais ça m'intéresse de davoir comment t'as gérer les espaces sans.

@Raphamil: Tu peux aussi, comme propoé, demander à l'utilisateur de rentrer une chaîne après le début du programme. Pour les arguments du main y a un tuto sur ce site, dans la partie "C".
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
31 mars 2008 à 20:51:23

Je t'es envoyé mon code, tu as qu'a regarder, je savait pas que quand on m'était des apostrophe sa fessait que un paramètre. Ça veut dire que ce que j'ai fait était pas du tout ce que tu attendais.
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
31 mars 2008 à 20:56:45

Je n'ai dit nul part que les apostrophes ne faisaient qu'un paramètre !
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
1 avril 2008 à 20:24:40

Très bonne idée ces exercices je m'y mets dès que j'ai fini mon projet en cours :) .
1 avril 2008 à 21:18:08

effectivement, une super initiative ;)
1 avril 2008 à 22:31:26

Pourras-t-on voir les pires réponses ? :-'
Genre les plus moches / bugguées :p
Ca permettrait de montrer l'exemple de ce qu'il ne faut pas faire.
Anonyme
2 avril 2008 à 13:32:47

Citation : mt9

Pourras-t-on voir les pires réponses ? :-'
Genre les plus moches / bugguées :p
Ca permettrait de montrer l'exemple de ce qu'il ne faut pas faire.

Je doute que ce soit une bonne idée. Après tu risques de confondre se qui est bien et ce qui ne l'est pas.
2 avril 2008 à 16:36:15

Petite question: pourquoi est-il nécessaire de mettre des guillemets? Pourquoi ne pas simplement concaténer tous les arguments?

EDIT: Nan, c'est bon, merci.
2 avril 2008 à 18:12:35

@mt9: Quel intéret ? Je peux par contre indiquer quelques erreurs courantes qui ont été faites. Mais montrer les "plus moches" pour avoir ensuite des trucs du genre "Pfff UnTel est un n@@b il c pas codé", non merci.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
2 avril 2008 à 18:23:02

Citation : Loumnam

Petite question: pourquoi est-il nécessaire de mettre des guillemets? Pourquoi ne pas simplement concaténer tous les arguments?

EDIT: Nan, c'est bon, merci.



C'est une convention, les guillemets délimites une chaine complète pouvant contenir des caractères blancs.

Pour Linux je ne sais pas, mais en Windows les guillemets sont gérés par l'interpréteur de commande.

Programme.exe "Allo mon ami" ca va bien?


Le programme va recevoir un tableau argv contenant 5 chaine:

[0] <chemin>\Programme.exe
[1] Allo mon ami
[2] ca
[3] va
[4] bien?


Notez qu'il n'y a pas de guillemets à la case 1.

Programme de test:
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. int main( int argc, char* argv[] )
  5. {
  6.     std::vector<std::string> args( argv, (argv + argc) );
  7.     for( size_t i = 0; i < args.size(); i++ )
  8.     {
  9.         std::cout << "[ " << (i + 1) << "] " << args[ i ] << '\n';
  10.     }
  11.     std::cout << std::endl;
  12.     return 0;
  13. }
2 avril 2008 à 19:17:03

C'est toujours l'interpréteur de commandes qui s'occupe de la répartition des caractères entres les divers argv[]
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 avril 2008 à 19:28:01

C'est ce que je pensais, mais je ne pouvais pas l'affirmer personnellement pour Linux car je n'ai jamais développé sur cette plateforme.

J'en ai juste fait la preuve pour calmer la crainte d'avoir à gérer les guillemets.
3 avril 2008 à 7:27:02

tres bonne idéé sa... je vais probablement mis mettre (des que j'ai fini mon @£#%* travaille de philo...)

mais c'est sourtout la partit créé des class qui mintéressera je croi parce que je manque énormément de pratique sur sa :(
3 avril 2008 à 9:41:34

Yo,

J'ai commencé le C++ hier et je me lance dans cette exercie ^^

Cdt,
Noodle Juice.
Anonyme
3 avril 2008 à 14:35:06

Serait-il possible d'avoir plus d'info sur ce que tu entends par bon ou mauvais programme/code car pour cet exercice, on peut tout faire dans le main (qui sera très gros) ou découper le code en pleins de fonctions. C'est juste pour avoir une idée !!!
3 avril 2008 à 15:49:49

d'abord Micbeastkiller je pense que c'est toi qui choisi le code le plus clair possible pour toi.
a toi de voir ^^

sinon a quand le prochain exercice :-°
3 avril 2008 à 17:12:57

@MicBeastKiller:
En général on dit: Une tâche = une fonction.
Tout dépend de l'interprétation que tu fais de cette phrase. Disons que tout dans le main n'est pas une bonne manière de présenter le code.

@danman:
A la fin du mois. Je vais pas changer maintenant alors que je commence à recevoir des réponses intéressantes.

@djo0012:
Le prochain exercice traitera des classes.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
3 avril 2008 à 17:23:48

On peut renvoyer son code si on a fait une petite erreur, ou on a droit qu'à un essai ? :-°
3 avril 2008 à 17:25:28

Ca serait quand même sympa de pas trop spammer... mais si c'est juste une fois, pas de problème.
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.