有理数类的设计

有理数类的设计,第1张

仿照BigDecimal类以面向对象的方式设计有理数类 有理数类的代码
package test;

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 test;

import java.util.Scanner;

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的?

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/2991206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存