begin process at 2010 02 09 23:45:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

JavaBeans

 > LES NOMBRES RATIONNELS

LES NOMBRES RATIONNELS


 Information sur la source

Note :
Aucune note
Catégorie :JavaBeans Classé sous :Rationnel, Nombres rationnels, Nombre Niveau :Débutant Date de création :03/12/2008 Date de mise à jour :07/12/2008 02:30:20 Vu / téléchargé :2 101 / 56

Auteur : ynabid

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 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

  • 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);
  • }
  • }
  • }
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 :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

03 décembre 2008 23:35:27 :
une erreur d'orthographe
04 décembre 2008 01:42:03 :
j'ai défini un ensemble multiplicatif et j'ai oublié de faire la puissance
07 décembre 2008 02:30:27 :
j'ai ajouté et amélioré des méthodes

 Sources de la même categorie

Source avec Zip EXEMPLE DES EJB AVEC GLASSFISH par naf87
Source avec Zip CHIFFRAGE PARTIEL DE FICHIERS par kuangsaphir
Source avec Zip GESTION DES PHÉNOMÈNES D'ATTENTES par ditophoenix
Source avec Zip APPLET CLIENT + MAJ BASE DE DONNÉE COTE CLIENT DE CREATION D... par minosubb
Source avec Zip CLIENT MAIL SUITE par MathLapatate

 Sources en rapport avec celle ci

Source avec Zip ADDITION DE DEUX NOMBRES RÉELS "COMME A LA MATERNELLE" par zinotron
CALCUL DE PI par cyberfastfred
FORMATAGE DE NOMBRE À LA SORTIE par Jujufouq
COMPARAISON par paradoxreal8
ECRIRE UN NOMBRE ENTIER EN TOUTE LETTRE par JHelp

Commentaires et avis

Commentaire de petifa le 04/12/2008 12:39:36


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.

Commentaire de ynabid le 04/12/2008 20:55:23

je vais améliorer mon code et prendre en considération tout ce que vous avez dis.
Merci!!!

Commentaire de ynabid le 04/12/2008 22:34:25

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 :)

Commentaire de petifa le 04/12/2008 23:21:43

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

Commentaire de ynabid le 04/12/2008 23:40:44

je suis convaincu qu'il faut ajouté addition... et je vais garder equals en appliquant ce que tu as dis :)

Commentaire de petifa le 04/12/2008 23:51:51

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

Commentaire de ynabid le 04/12/2008 23:56:16

ça m'a aidé et ça m'a donné d'autre idées. Merci!!!

Commentaire de ynabid le 05/12/2008 00:23:19

juste pour les accésseurs, je n'ai pas compris pourquoi tu préfères les utilisés dans ta Class.

Commentaire de petifa le 05/12/2008 09:05:04

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.

Commentaire de ynabid le 05/12/2008 19:23:57

merci :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

JFileChooser- pb recupération du nombre de fichiers [ par Infameus ] Je developpe un diaporama et pour cela j'utilise la classe JfileChooser, avec la methode getFilesSelected, je récupère mes fichiers images, mais j'aim nombre de ligne JTextArea [ par kramp ] j'aimerais savoir comment récupérer le nombre de lignes affichées dans une JTextArea qui a été construite avec un String et la méthode setLineWrap(tru compteur d'images... [ par blubsy ] Bonjour, je voudrais pouvoir faire avoir un script qui me permet de compter le nombre de fois ou une image est appelé de mon site...Ce système doit èt ajouter un nombre à un nom [ par sanpexos ] Salut tout le mondeJ'aimerais savoir comment ajouter un nombre à un nom.J'ai une boucle à faire pour obtenir un certain nombre d'onglets défini par l' Jeux du nombre mysterieux [ par criss ] comment faire pour réaliser un programme qui permet à l'utilisateur de deviner un nombre caché. L'ordinateur choisit un nombre aléatoire (un entier) e probleme avec parseInt() [ par r3m1 ] Voila, j ai une zone de texte dans laquelle l'utilisateur doit saisir un nombre.Je veux ensuite transferer ce nombre dans un Integer.J'utilise le code Comment déterminer nombre de chiffres dans un int [ par Bouki ] la question est dans le sujetpar exemple si a == 10 ca renvoie 2 et si b == 9 ca renvoie 1 Limiter nombre caractère dans TextField [ par MrEddy ] SalutExiste t'il un moyen propre de limiter le nombre de caractère pouvant etre tappé dans un TextField ???Merci probleme d'affichage JPanel [ par topic1 ] je debute en programmation java j'essaye de creer dans une Jframe trois JPanel deux affichant un graphique et un troisieme contenant des boutonsmon pr Generation nombre aléatoire parmis liste [ par Sw1tch ] Salut,J'aimerais pouvoir générer un nombre aléatoire parmis une liste. Je prends un nombre aléatoire entre 1 et 78 avec (int)(Math.random() *78 + 1) ;


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales