java有理数类的封装_【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(awhile(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);

}

}

运行结果为:

c63657a04131eb1a04698fc7d62eedfd.png

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

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值