【Java笔记】有理数的类封装

分数是有理数(Rational),我们经常做分数的四则运算得到的是小数,如果我们运行分数的四则运算想要得到分数,要怎样做呢?

用类实现对有理数的封装可以做到。

有理数有两个重要的成员,即分子(numerator)分母(denominator),另外还有重要的四则运算。

Rational类应该具有以下属性(成员变量)和功能(方法):
1.成员变量:int型变量numerator(分子)、denominator(分母)

2.方法(分数的四则运算):
(1)提供Rational add(Rational r)方法,即有理数调用该方法和参数指定的有理数做加法运算,并返回一个Rational对象。

int newNumerator=numerator*b+denominator*a;//通分后的分子运算
int newDenominator=denominator*b;//分母通分

(2)提供Rational sub(Rational r)方法,即有理数调用该方法和参数指定的有理数做减法运算,并返回一个Rational对象。

int newNumerator=numerator*b-denominator*a;//通分后的分子运算
int newDenominator=denominator*b;//分母通分

(3)提供Rational muti(Rational r)方法,即有理数调用该方法和参数指定的有理数做乘法运算,并返回一个Rational对象。

int newNumerator=numerator*a;//分子相乘
int newDenominator=denominator*b;//分母相乘

(4)提供Rational div(Rational r)方法,即有理数调用该方法和参数指定的有理数做除法运算,并返回一个Rational对象。

int newNumerator=numerator*b;//一个数除于另一个数等于一个数剩于另一个数的倒数
int newDenominator=denominator*a;

根据以上分析,给出Rational类代码如下:
Rational.java

public class Rational {
    int numerator;     //分子
    int denominator;  //分母
    Rational(){

    }
    Rational(int a,int b){    //有参构造函数
        if(a==0){
            numerator=0;
            denominator=0;
        }
        else{
            setNumeratorAndDenominator(a,b);
        }
    }
    void setNumeratorAndDenominator(int a,int b){    //设置分子和分母
        int c=f(Math.abs(a),Math.abs(b));            //计算最大公约数
        numerator=a/c;
        denominator=b/c;
        if(numerator<0&&denominator<0){
            numerator=-numerator;
            denominator=-denominator;
        }
    }
    int getNumerator(){
        return numerator;
    }
    int getDenominator(){
        return denominator;
    }
    int f(int a,int b){              //计算最大公约数
        if(a<b){
            int c=a;
            a=b;
            b=c;
        }
        int r=a%b;
        while(r!=0){
            a=b;
            b=r;
            r=a%b;
        }
        return b;
    }
    Rational add(Rational r){       //加法运算
        int a=r.getNumerator();
        int b=r.getDenominator();
        int newNumerator=numerator*b+denominator*a;
        int newDenominator=denominator*b;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
    }
    Rational sub(Rational r){      //减法运算
        int a=r.getNumerator();
        int b=r.getDenominator();
        int newNumerator=numerator*b-denominator*a;
        int newDenominator=denominator*b;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
    }
    Rational muti(Rational r){         //乘法运算
        int a=r.getNumerator();
        int b=r.getDenominator();
        int newNumerator=numerator*a;
        int newDenominator=denominator*b;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
    }
    Rational div(Rational r){        //除法运算
        int a=r.getNumerator();
        int b=r.getDenominator();
        int newNumerator=numerator*b;
        int newDenominator=denominator*a;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
    }

}

现在有了Rational类,接下来就可以让该类创建若干个对象,并让它们交互信息必要的四则运算来完成程序要达成的目的(两个或两个以上的分数进行四则运算得到分数),下面的主类MainClass只用Rational对象计算两个分数的四则运算,并计算了2/1+3/2+5/3+…的前10项的和:
MainClass.java

public class MianClass {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Rational firstRational=new Rational(2,10);       //第一个分数
        Rational secondRational=new Rational(10,5);       //第二个分数

        //加法运算
        Rational resultRational=firstRational.add(secondRational); //进行加法运算
        int resultNumerator=resultRational.getNumerator(); //进行加法运算后的分子
        int resultDenominator=resultRational.getDenominator();//进行加法运算后的分母
        System.out.println("2/10+10/5="+resultNumerator+"/"+resultDenominator);

        //减法运算
        resultRational=firstRational.sub(secondRational);
        resultNumerator=resultRational.getNumerator();
        resultDenominator=resultRational.getDenominator();
        System.out.println("2/10-10/5="+resultNumerator+"/"+resultDenominator);

        //乘法运算
        resultRational=firstRational.muti(secondRational);
        resultNumerator=resultRational.getNumerator();
        resultDenominator=resultRational.getDenominator();
        System.out.println("2/10*10/5="+resultNumerator+"/"+resultDenominator);

        //除法运算
        resultRational=firstRational.div(secondRational);
        resultNumerator=resultRational.getNumerator();
        resultDenominator=resultRational.getDenominator();
        System.out.println("2/10÷10/5="+resultNumerator+"/"+resultDenominator);

        //2/1+3/2+5/3+...的前10项的和
        int k=1,n=10;                  //项数
        System.out.println("计算2/1+3/2+5/3+...的前"+n+"项的和:");
        Rational sum=new Rational(0,1);//和,初始为0
        Rational item=new Rational(2,1);//项值,首项为2/1
        while(k<=n){
            sum=sum.add(item);
            k++;
            int prevNumerator=item.getNumerator();
            int prevDenominator=item.getDenominator();
            item=new Rational(prevNumerator+prevDenominator,prevNumerator);
        }
        resultNumerator=sum.getNumerator();
        resultDenominator=sum.getDenominator();
        System.out.println("用分数表示:"+resultNumerator+"/"+resultDenominator);
        double doubleResult=(resultNumerator*1.0)/resultDenominator;
        System.out.println("用小数表示:"+doubleResult);  
    }
}

运行结果为:
运行结果

(整理自Java面向对象程序设计第2版)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值