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