Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Exercices] Venez vous entraîner !

Ce mois: Parseur de fonctions mathématiques

15 octobre 2008 à 20:34:26

Construction depuis un entier. Par exemple pouvoir faire qqch comme:

Fraction a(12);


Construction depuis une chaine: Non. Juste le cas simple est demandé. Mais si tu veux faire plus, libre à toi. Mais il devient rapidement difficile de fixer une limite.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
15 octobre 2008 à 20:40:13

OK merci.
J'essairais de commencer ce week-end. Pile-poil pour mon interro de maths (ha la seconde :D ), qui ne portera pas sur les fractions, hélas.
  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2008 à 20:40:43

la construction a partir d'un entier reviens à la construction à partir d'un float, non?
  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2008 à 20:51:27

Disons que l'on peut passer un entier dans le constructeur:

Fraction::Fraction(double x)


mais cela a deux (au moins !) désavantages:

1) On a une conversion implicite d'un type dans un autre. Mais ici c'est pas trop grave.

2) La construction depuis un entier est très simple. Depuis un double, c'est plus compliqué.

  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
15 octobre 2008 à 20:53:20

Mais la construction à partir d'un entier demande moins de traitement, non ? [ J'espère sinon je suis bon pour retourner en cours pendant les vacances :-° . ]
  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2008 à 20:55:03

EDIT: J'ai ajouter un constructeur à la liste. Cela devrait vous simplifier le travail.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
15 octobre 2008 à 20:58:36

Citation : Nanoc

EDIT: J'ai ajouter un constructeur à la liste. Cela devrait vous simplifier le travail.

Alors ma remarque perd son utilité. Merci. :)
  • Partager sur Facebook
  • Partager sur Twitter
15 octobre 2008 à 21:03:57

Cela "ne sera pas nécessaire" uniquement s'ils implémentent bien l'addition sous forme d'un opérateur libre. Sans cela, ils vont avoir quelques surprises.

@raphamil, si ta construction foire, ou si tu construis avec un dénominateur nul, => exception!
  • Partager sur Facebook
  • Partager sur Twitter
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.
Anonyme
16 octobre 2008 à 16:59:24

Est-ce qu'on est obligé de respecter la convention m_nomAttribut pour les attributs de la classe ? J'ai plutôt tendance à y accéder avec this->attribut.

Est-on obligé de créer notre propre classe d'exception ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
16 octobre 2008 à 17:21:07

Citation : raphamil

Est-ce qu'on est obligé de respecter la convention m_nomAttribut pour les attributs de la classe ? J'ai plutôt tendance à y accéder avec this->attribut.

Ce que tu as écris n'est pas équivalent.
  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2008 à 17:53:20

Le nom que tu donnes a ton attribut importe peu. Mais y acceder via this est une erreur. C'est plus lent et c'est inutile. (Tu fais du JAVA ?)

Sinon, pour les exceptions (bonne initiative), tu peux utiliser le type standard std::runtime_error par exemple ou tout autre de tonc choix.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
16 octobre 2008 à 17:56:38

Bon tant pis.
Merci pour cette réponse Nanoc. Je trouve juste ça plus clair (beaucoup d'autres langages le font self.attr );
J'avance bien :D Le coeur de la classe est terminé (simplification, construction à partir de 2 entiers || d'un double (je me casse la tête sur celui avec la std::string)).

Par contre, je ne comprends pas comment mon code fonctionne (oui je sais je suis bizarre) (mais il marche) :
return a % b != 0 ? Fraction::PGCD(a % b, a) : b;
(Fraction::PGCD(a, b) est ici récursive.)
  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2008 à 18:02:18

Ce n'est pas plus lent. C'est plus lourd à taper, et obligatoire pour les templates.
C'est juste que la convention (et ce n'est rien d'autre) m_lowerCamelCase est assez répandue pour les variables membre.
  • Partager sur Facebook
  • Partager sur Twitter
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.
16 octobre 2008 à 19:17:49

je suis même pas sur qu'on puisse parler d'une convention là...
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
16 octobre 2008 à 19:27:42

Si je ne m'abuse, Stroustrup, dans son livre, préfère la syntaxe sans le this->. [J'ai pas été vérifier.]
  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2008 à 19:42:54

est ce qu'on doit fixer le taux de precision des float?
sinon y a t il un moyen de savoir le nombre des chiffres apres la virgules?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
16 octobre 2008 à 19:51:29

Est-ce qu'une exception déclenchée dans un constructeur doit annuler la création de l'objet ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
16 octobre 2008 à 19:56:44

@ raphamil: http://www.siteduzero.com/tutoriel-3-3 [...] ceptions.html §Gérer une exception dans un constructeur

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2008 à 20:32:28

Citation : lmghs

Ce n'est pas plus lent.

Il me semblait qu'on payait un dereferencement. Mais tu as certainement raison, le compilateur doit optimiser.

Citation : Bachir ElMagnifico

est ce qu'on doit fixer le taux de precision des float?



Je comprends pas la question.

Citation : Bachir ElMagnifico

sinon y a t il un moyen de savoir le nombre des chiffres apres la virgules?



Regarde dans la doc. Et puis, si jamais, ce n'est pas bien difficile à programmer.

Citation : raphamil

Est-ce qu'une exception déclenchée dans un constructeur doit annuler la création de l'objet ?



Hiura te donne la reponse.


  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
16 octobre 2008 à 21:40:16

Citation : Bachir ElMagnifico

sinon y a t il un moyen de savoir le nombre des chiffres apres la virgules?



modf ;)


Nanoc: lorsque tu dis qu'il faudrait s'intéresser aux cas " "Fraction + Entier" ou "Reel + Fraction" ", ne me dis pas qu'il faut déclarer tous les opérateurs en double o_O . J'en ai déjà une vingtaine avec ceux de comparaisons.
  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2008 à 23:18:15

Voilà l'erreur donc parlait lmghs.
Tu n'as qu'a implémenter "Fraction operator+(const Fraction &Lhs, const Fraction &Rhs);"
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 octobre 2008 à 11:42:20

Est-ce que tu accepte ce genre de trucs :

const int numerateur  () const {return m_numer;};
    const int denominateur() const {return m_denom;};
    const int getPGCD     () const {return m_pgcd;};
    const double toDouble () const {return static_cast<double>(m_numer) / m_denom;};


Parce qu'après c'est lourd à mettre dans le .cpp.
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2008 à 11:46:42

Merci de pas dévoiler tout le code non plus.

Sinon, comment tu veux faire autrement ?

Pour les opérateurs, Chlab_lak t'as donné une solution. C'est aussi pour ça que j'ai mis "réfléchir à".
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
Anonyme
17 octobre 2008 à 11:54:29

OK-OK je mets en secret :euh:
Ce que je voulais dire c'est mettre certaines définition de fonctions dans le .h.

Et ce genre de machin illisible ?

Fraction& Fraction::fct(const Fraction& f) {
    return fctMembre(f), *this; //Une instruction à virgule, beurk 
}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 octobre 2008 à 12:14:56

Si tu as pas mal de problèmes, je te conseilles de faire une nouveau thread pour ça.
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2008 à 12:18:13

Le dernier truc est sale, dur à maintenir et sans intérêts ici.

PS: je ne vois pas ce que vient faire le PGCD en propriété d'un nombre rationnel, ni pourquoi ce nombre aurait des fonctions membres PGCD et PPCM. Ces fonctions existent en dehors de toute notion de nombre rationnel.
J'ai bien une adresse de solution où vous envoyer (pour voir l'interface type par des pros), mais l'exo perdrait un de ces intérêts.
  • Partager sur Facebook
  • Partager sur Twitter
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.
Anonyme
17 octobre 2008 à 13:07:53

Citation : lmghs

J'ai bien une adresse de solution où vous envoyer (pour voir l'interface type par des pros), mais l'exo perdrait un de ces intérêts.

Pourrais-tu la communiquer à Nanoc pour qu'il la donne avec la solution ?
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2008 à 14:05:09

Je serais surpris qu'il n'ait pas connaissance de cette suite de bibliothèques qui booste notre productivité.
(pour continuer dans le second degré <rot13>vy l n har pynffr qr zêzr pbzcyrkvgé qnaf yn ovoyvbguèdhr fgnaqneq</rot13>)
  • Partager sur Facebook
  • Partager sur Twitter
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.
17 octobre 2008 à 14:12:33

Je vois tout à fait à quoi il fait référence.

<rot13>GBA PELCGRHE TRER ZNY YRF NPPRAGF</rot13>
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
17 octobre 2008 à 14:16:48

Purm zbvyrf nppragfg qr fba pbqr znepur cnesnvgrzrag
fvaba, nhgnag hgvyvfre yn zc cyhgbg dh'ha zrffntr pelcgé ;)
  • Partager sur Facebook
  • Partager sur Twitter