LES NOMBRES RATIONNELS

cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014 - 4 déc. 2008 à 12:39
ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010 - 5 déc. 2008 à 19:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48625-les-nombres-rationnels

ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010
5 déc. 2008 à 19:23
merci :)
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
5 déc. 2008 à 09:05
pas forcément pour les accesseurs, mais pour les mutateurs, enfin les setNum et setDenom ca sert. En fait logiquement quand tu fais des accesseurs et de mutateurs, c'est pour faire des traitements spécifiques et gérer certains cas... DOnc pour éviter de devoir refaire ces cas il faut les utiliser dans la classe meme et si tu change un endroit ca te changera tout.
Après pour les accesseurs c'est vrai que c'est pas trop utile dans ton cas.
ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010
5 déc. 2008 à 00:23
juste pour les accésseurs, je n'ai pas compris pourquoi tu préfères les utilisés dans ta Class.
ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010
4 déc. 2008 à 23:56
ça m'a aidé et ça m'a donné d'autre idées. Merci!!!
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
4 déc. 2008 à 23:51
:), ce que je dis est simplement une suggestion d'amélioration (a mon avis)
si ca a pu t'aider c le principal
ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010
4 déc. 2008 à 23:40
je suis convaincu qu'il faut ajouté addition... et je vais garder equals en appliquant ce que tu as dis :)
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
4 déc. 2008 à 23:21
jsuis d'accord que c pas compliqué mais dans l'utilisation c'est plus propre pour l'utilisateur de dire a.addition(b) va ajouter b a a et le stocker dans a. Enfin je vois ca comme ca.

Pouruqoi ne pas etre d'accord avec moi pour la equals?
# public boolean equals(Object obj) {
# return (obj == null || getClass()!=obj.getClass() || this.compareTo((Rationnel) obj)!=0)
# }

cette fonction comme ca va bien faire les tests que tu avais marqué et faire une soustraction. Il n'y a pas de comparaison entre num et dénom, la soustraction est faire lors de l'appel de compareTo.
Dans mon explication précédente j'aurais utilisé la fonction addition, car celle ci fait a la fin une simplification en forme canonique. ET donc il n'est pas necessaire de faire dans ta fonction equal deux conversions en formes canoniques et après des tests sur les valeurs...

Et si tu préfère laisser comme ca, fait le test du dénominateur en premier. Car si le dénominateur est différent ca coupe et tu économises un test
voila
ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010
4 déc. 2008 à 22:34
une remarque à propos des accésseurs: normalement les accésseurs sont fait pour satisfaire le principe de l'encapsulation surtout pour l'écriture dans les variables. Puisque je travaille dans la Class Rationnel, pourquoi utiliser les accésseurs(get/set) pour les objets de type Rationnel? Et tu peux remarquer aussi que quand je veux modifier le dénominateur je ne teste pas si c'est égal à 0 ou non, sauf pour le constructeur(parce que c'est l'utilisateur qui donne les paramètres).
Une autre remarque: pour ce que tu as dis à propos de equals je ne suis pas d'accord, car pour savoir si c'est égal ou non on doit faire la soustraction. Pourquoi ne pas comparer le numérateur et le dénominateur directement?!

aussi pour l'ajout de addition et soustraction qui modifie les valeurs... j'ai déjà pensé à ça mais j'ai dis que l'utilisateur peut utiliser sa variable dans plusieurs opération(a=b.addition(c); d=b.soustraction(e);...) alors j'ai vu qu'il ne faut pas changer la valeur et si il veut le faire alors il peut faire par exemple(a=a.addition(b);// c'est pas compliqué)

pour les autres choses je suis d'accord avec toi :)
ynabid Messages postés 24 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 9 août 2010
4 déc. 2008 à 20:55
je vais améliorer mon code et prendre en considération tout ce que vous avez dis.
Merci!!!
cs_petifa Messages postés 215 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 10 mars 2014
4 déc. 2008 à 12:39
slt
Et bien je ne dis pas que j'ai trouvé une erreur.
Mais j'ai trouvé des petites choses a changer et j'ai quelques remarques pour améliorer ton code :
- tu aurais pu ajouter des fonctions internes a la classe. Comme
public int PGCD()
{
return Rationnel.PGCD(this.numerateur...)
}

- Dans ton constructeur
# public Rationnel(int n,int d){
tu devrais utiliser les fonction pour initialiser tes valeurs
# this.setNumerateur(n);
# this.setDenomiateur(d);
Comme ca les traitements que tu effectue dans ces diverses fonctions ne sont pas a redéfinir.

- Dans ta fonction pgcD, tu devrais prendre les cas ou a<0 et b<0. Même si tu le prends en comptes dans d'autres fonction et tu règle le cas dans toCanonique avec Math.abs.... Si quelqu'un utilise ta fonction en mettant une valeur négative ça foire. Donc il faut quand même faire

- dans tes fonction static comme
# public static Rationnel toCanonique(Rationnel r){
# int pgcd=pGCD(Math.abs(r.numerateur),Math.abs(r.denominateur));
utilise plutot r.getNumerateur() et r.getDenominateur()
- Dans : toCanonique
# r.numerateur/=pgcd;
# r.denominateur/=pgcd;
tu devrais mettre r.setDenomnateur(r.getNumerateur()/pgcd), ça rend le code plus propre et au moins tu peux gérer des erreurs dans les fonctions set.
- pourquoi faire une boucle while pgcd!=1 ?? Logiquement le pgcd calculer est comme le dit son nom plus GRAND Diviseur donc en une passe tu es sur que le prochain PGCD sera 1, sinon c'est que ton calcul pgcd doit être faux

- tu devrais ajouter des fonction ADDITION et soustraction et autre dans la classe et modifier directement les valeurs du numérateur et dénominateur. Tes fonction sont utiles mais elle ne changent jamais tes valeur dans la classe ce qui est dommage si tu veux additionner avec un rationnel.

- dans
# public int compareTo(Rationnel o) {
# Rationnel.toCanonique(this);
# Rationnel.toCanonique(o);
# Rationnel tmp=this.soustraction(o);
#
# return tmp.numerateur;
# }
Je ne suis pas d'accord, c'est inutile et rajoute des calcul car a vrai dire tu fais ces traitements a la fin des fonctions addition, multiplication ...
# public static Rationnel addition(Rationnel a,Rationnel b){
....
# return toCanonique(...);
# }

- enfin ta fonction equals devrait utiliser compareTo
# public boolean equals(Object obj) {
# return (obj == null || getClass()!=obj.getClass() || this.compareTo((Rationnel) obj)!=0)
# }
Pas testé mais ceci devrait simplement faire l'affaire.

Pour le reste j'ai pas testé le programme, juste regardé donc je ne pourrais pas dire si tous les traitements sont bon ou pas. Je le ferais si j'ai le temps.
Rejoignez-nous