有理数类的设计

仿照BigDecimal类以面向对象的方式设计有理数类

有理数类的代码

package rational;

public class Rational{
	private int molecule = 0;//分子
	private int denominator = 0;//分母
	
	public Rational(int molecule, int denominator) {
		this.molecule = molecule;
		this.denominator = denominator;
	}

	public int getMolecule() {
		return molecule;
	}

	public void setMolecule(int molecule) {
		this.molecule = molecule;
	}

	public int getDenominator() {
		return denominator;
	}

	public void setDenominator(int denominator) {
		this.denominator = denominator;
	}

	@Override
	public String toString() {
		int m =1;
		int x = this.molecule;
		int y = this.denominator;
		if(this.molecule%this.denominator==0)
		{
			return  this.molecule/this.denominator+"";
		}
		else
		{
			if(x<y)
			{
				int temp = x;
				x=y;
				y=temp;
			}
			while(y!=0)
			{
				m=x%y;
				x=y;
				y=m;
			}
			return (this.molecule/x)+"/"+(this.denominator/x);
		}
	}
	
	public Rational rationalAdd(Rational x) {//加法
		int a=this.molecule*x.denominator+x.molecule*this.denominator;
		int b=this.denominator*x.denominator;
		return new Rational(a,b);
	}
	public Rational rationalSub(Rational x) {//减法
		int a=this.molecule*x.denominator-x.molecule*this.denominator;
		int b=this.denominator*x.denominator;
		return new Rational(a,b);
	}
	public Rational rationalMul(Rational x) {//乘法
		int a=this.molecule*x.molecule;
		int b=this.denominator*x.denominator;
		return new Rational(a,b);
	}
	public Rational rationalDiv(Rational x) {//除法
		int a=this.molecule*x.denominator;
		int b=this.denominator*x.molecule;
		return new Rational(a,b);
	}
	public double rationalSqrt() {//开平方
		double x;
		x=1.0*this.molecule/this.denominator;
		double num = Math.sqrt(x);
		return num;
	}
	public int compareTo(Rational x) {//比较大小
		if(this.rationalSub(x).getMolecule()>0)
			return 1;
		else if(this.rationalSub(x).getMolecule()<0)
			return -1;
		else
			return 0;
	}
	public double doubleValue() {//转化为double类型
		return 1.0*this.molecule/this.denominator;
	}
	public int intValue() {//转化为int类型
		return (int)doubleValue();
	}
	public long longValue() {//转化为long类型
		return (long)doubleValue();
	}
}

测试代码

package pta;

import java.util.Scanner;
import rational.Rational;

public class pta {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入四个数字构成两个有理数分数");
		 Rational a = new Rational(sc.nextInt(), sc.nextInt());
	     Rational b = new Rational(sc.nextInt(), sc.nextInt());
	     System.out.println("两个有理数相加结果");
	     System.out.println(a.rationalAdd(b));
	     System.out.println("两个有理数相减结果");
	     System.out.println(a.rationalSub(b));
	     System.out.println("两个有理数相乘结果");
	     System.out.println(a.rationalMul(b));
	     System.out.println("两个有理数相除结果");
	     System.out.println(a.rationalDiv(b));
	     System.out.println("两个数分别开平方的结果");
	     System.out.println(a.rationalSqrt());
	     System.out.println(b.rationalSqrt());
	     System.out.println("比较两个有理数大小结果:大于输出1,等于输出0,小于输出-1");
	     System.out.println(a.compareTo(b));
	     System.out.println("将两个有理数转换成字符串型");
	     System.out.println(a.toString());
	     System.out.println(b.toString());
	     System.out.println("将两个有理数转化为double类型");
	     System.out.println(a.doubleValue());
	     System.out.println(b.doubleValue());
	     System.out.println("将两个有理数转化为int类型");
	     System.out.println(a.intValue());
	     System.out.println(b.intValue());
	     System.out.println("将两个有理数转化为long类型");
	     System.out.println(a.longValue());
	     System.out.println(b.longValue());
    }
}


结果

输入四个数字构成两个有理数分数
1 2 3 1
两个有理数相加结果
7/2
两个有理数相减结果
5/-2
两个有理数相乘结果
3/2
两个有理数相除结果
1/6
两个数分别开平方的结果
0.7071067811865476
1.7320508075688772
比较两个有理数大小结果:大于输出1,等于输出0,小于输出-1
-1
将两个有理数转换成字符串型
1/2
3
将两个有理数转化为double类型
0.5
3.0
将两个有理数转化为int类型
0
3
将两个有理数转化为long类型
0
3

尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

c语言是面向过程编程,用c语言来编写Rational就需要用不同的函数来实现,而java是面向对象编程,用java来编写Rational就需要设置不同的属性跟方法,创建新的对象后调用其方法来实现代码。我设计的有理数类,考虑了有理分数的属性,编写了加分 减法等方法。

尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

别人如何复用你的代码?

将我的类导入即可,因为我用的是public来修饰

别人的代码是否依赖你的有理数类的内部属性?当你升级了你的有理数类,将其的属性名改变时。是否会影响他人以前编写的调用你有理数类的代码(假设他将使用了你升级后有理数类)?

用了我的代码肯定得依赖我的有理数类的属性,不会影响,因为我的代码的有理数的属性使用的是private,当修改时,不会影响他人调用我的有理数代码。

有理数类的public方法是否设置合适?为什么有的方法设置为private?

合适,有理数类的public方法可以方便随时抽取调用,因为有一些我不希望别人访问的方法,这些就需要设置成private

你的类里面有static属性或方法吗?如果有,为什么要设置为static的?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值