Les nombres rationnels

Soyez le premier à donner votre avis sur cette source.

Vue 11 624 fois - Téléchargée 519 fois

Description

une implémentation des nombres rationnels avec toutes leurs opérations;addition, soustraction, multiplication, division et depuis un nombre rationnel donner sa forme canonique(ex: 2/4 ---> 1/2)

Source / Exemple :


package rationnel;

/**
 *

  • @author yassine
  • /
public class Rationnel extends Number implements Comparable<Rationnel>{ private int numerateur; private int denominateur; static final int DIVISION_PAR_0=0; public void setNumerateur(int a){ numerateur=a; } public int getNumerateur(){ return numerateur; } public void setDenominateur(int a){ if(a==0) erreur(DIVISION_PAR_0); else denominateur=a; } public int getDenominateur(){ return denominateur; } public Rationnel(int n,int d){ this.setNumerateur(n); this.setDenominateur(d); } public Rationnel(int n){ this(n,1); } public Rationnel(){ this(0,1); } public Rationnel(Rationnel r){ this(r.numerateur,r.denominateur); } /*
  • pour a>b>0 pgcd(a,b)=pgcd(a-b,b);
  • /
public static int pGCD(int a,int b){ if(a<0) a=-a; else if(a==0) return b; if(b<0) b=-b; else if(b==0) return a; if(a==b) return a; if(a<b) return pGCD(a,b-a); return pGCD(a-b,b); } public static Rationnel toCanonique(Rationnel r){ int pgcd=pGCD(r.getNumerateur(),r.getDenominateur()); r.setNumerateur(r.getNumerateur()/pgcd); r.setDenominateur(r.getDenominateur()/pgcd); return r; } public Rationnel toCanonique(){ return Rationnel.toCanonique(this); } static Rationnel moinsUnaire(Rationnel r){ Rationnel tmp=new Rationnel(r); tmp.setNumerateur( tmp.getNumerateur()*-1); return tmp; } static Rationnel inverse(Rationnel r){ Rationnel r2=new Rationnel(r); int tmp=r2.getNumerateur(); r2.setNumerateur(r2.getDenominateur()); r2.setDenominateur(tmp); return r2; } private static int numAPB(Rationnel a,Rationnel b){ return a.getNumerateur()*b.getDenominateur()+a.getDenominateur()*b.getNumerateur(); } private static int numAB(Rationnel a, Rationnel b){ return a.getNumerateur()*b.getNumerateur(); } private static int denAB(Rationnel a,Rationnel b){ return a.getDenominateur()*b.getDenominateur(); } public static Rationnel addition(Rationnel a,Rationnel b){ Rationnel tmp=new Rationnel(numAPB(a,b),denAB(a,b)); return toCanonique(tmp); } public static Rationnel soustraction(Rationnel a,Rationnel b){ return Rationnel.addition(a,Rationnel.moinsUnaire(b)); } public static Rationnel multiplication(Rationnel a,Rationnel b){ return toCanonique(new Rationnel(numAB(a,b),denAB(a,b))); } public static Rationnel division(Rationnel a,Rationnel b){ return Rationnel.multiplication(a,inverse(b)); } public static Rationnel puissance(Rationnel r,int n){ return (new Rationnel((int)Math.pow(r.numerateur, n), (int)Math.pow(r.denominateur, n))).toCanonique(); } public Rationnel addition(Rationnel r){ return Rationnel.addition(this, r); } public Rationnel soustraction(Rationnel r){ return Rationnel.soustraction(this, r); } public Rationnel multiplication(Rationnel r){ return Rationnel.multiplication(this, r); } public Rationnel division(Rationnel r){ return Rationnel.division(this,r); } public Rationnel puissance(int n){ return Rationnel.puissance(this,n); } public void affecter(Rationnel a,Rationnel b){ a.setNumerateur(b.getNumerateur()); a.setDenominateur(b.getDenominateur()); } //les mêmes opération avec une affectation sur l'instance courante public void additionA(Rationnel r){ Rationnel tmp=addition(this,r); affecter(this,tmp); } public void soustractionA(Rationnel r){ Rationnel tmp=soustraction(this,r); affecter(this,tmp); } public void multiplicationA(Rationnel r){ Rationnel tmp=multiplication(this,r); affecter(this,tmp); } public void divisionA(Rationnel r){ Rationnel tmp=division(this,r); affecter(this,tmp); } public void puissanceA(int n){ Rationnel tmp=puissance(this,n); affecter(this,tmp); } public int compareTo(Rationnel o) { return this.soustraction(o).numerateur; } @Override public int hashCode() { int hash = 7; this.toCanonique(); hash = 41 * hash + getNumerateur(); hash = 41 * hash + getDenominateur(); return hash; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Rationnel other = (Rationnel) obj; return compareTo(other)==0; } @Override public Rationnel clone(){ return new Rationnel(this); } @Override public String toString(){ return getNumerateur()+"/"+getDenominateur(); } @Override public int intValue() { return (int) getNumerateur()/getDenominateur(); } @Override public long longValue() { return (long) getNumerateur()/getDenominateur(); } @Override public float floatValue() { return (float) getNumerateur()/getDenominateur(); } @Override public double doubleValue() { return (double) getNumerateur()/getDenominateur(); } static void erreur(int n){ switch(n){ case DIVISION_PAR_0: System.out.println("Erreur: Division par 0"); System.exit(-1); break; default: System.exit(-1); } } }

Conclusion :


si vous avez trouver une erreur prévenez moi :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
24
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
9 août 2010

merci :)
Messages postés
215
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
10 mars 2014

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.
Messages postés
24
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
9 août 2010

juste pour les accésseurs, je n'ai pas compris pourquoi tu préfères les utilisés dans ta Class.
Messages postés
24
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
9 août 2010

ça m'a aidé et ça m'a donné d'autre idées. Merci!!!
Messages postés
215
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
10 mars 2014

:), ce que je dis est simplement une suggestion d'amélioration (a mon avis)
si ca a pu t'aider c le principal
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (ynabid)