• Java互评-有理数的设计


    1.有理数代码

    package rational;
    
    public class Rational {
    	private int numerator;//分子
    	private int denominator;//分母
    	
    	//分子和分母的Getter和setter
    	public int getNumerator() {
    		return numerator;
    	}
    	
    	public void setNumerator(int numerator) {
    		this.numerator = numerator;
    	}
    	
    	public int getDenominator() {
    		return denominator;
    	}
    	
    	public void setDenominator(int denominator) {
    		this.denominator = denominator;
    	}
    	
    	
    	public Rational() {//无参构造函数
    		this.numerator=0;
    		this.denominator=1;
    	}
    	public Rational(int numerator, int denominator) {//构造函数
    		int gcd = gcd(numerator,denominator);
    		this.numerator=((denominator>0)?1:-1)*numerator/gcd;
    		this.denominator=Math.abs(denominator)/gcd;
    	}
    	
    	private int gcd(int a,int b) {//求最大公约数
    		a=Math.abs(a);
    		b=Math.abs(b);
    		int t;
    		if(a<b) {
    			t=a;
    			a=b;
    			b=t;
    		}
    		t=a%b;
    		while(t!=0) {
    			a=b;
    			b=t;
    			t=a%b;
    		}
    		return b;
    	}
    	
    	public Rational add(Rational secondRational) {//加法
    		int numerator2 = this.numerator*secondRational.getDenominator() + this.denominator*secondRational.getNumerator();
    		int denominator2 = this.denominator*secondRational.getDenominator();
    		return new Rational(numerator2,denominator2);
    	}
    	
    	public Rational subtract(Rational secondRational) {//减法
    		int numerator2 = this.numerator*secondRational.getDenominator() - this.denominator*secondRational.getNumerator();
    		int denominator2 = this.denominator*secondRational.getDenominator();
    		return new Rational(numerator2,denominator2);
    	}
    	
    	public Rational multiply(Rational secondRational) {//乘法
    		int numerator2 = this.numerator*secondRational.getNumerator();
    		int denominator2 = this.denominator*secondRational.getDenominator();
    		return new Rational(numerator2,denominator2);
    	}
    	
    	public Rational divide(Rational secondRational) {//除法
    		int numerator2 = this.numerator*secondRational.getDenominator();
    		int denominator2 = this.denominator*secondRational.getNumerator();
    		return new Rational(numerator2,denominator2);
    	}
    	
    	public Rational abs() {//绝对值
    		int numerator2 = this.numerator;
    		int denominator2 = this.denominator;
    		if(numerator2<0) numerator2 = -numerator2;
    		if(denominator2<0) denominator2 = -denominator2;
    		return new Rational(numerator2,denominator2);
    	}
    	
    	public int compare(Rational secondRational) {//比较大小
    		if(this.subtract(secondRational).getNumerator()>0) {
    			return 1;
    		}else if(this.subtract(secondRational).getNumerator()<0) {
    			return -1;
    		}else return 0;
    	}
    	
    	public boolean equals(Rational secondRational) {//判断是否相等
    		if(this.subtract(secondRational).getNumerator()==0) {
    			return true;
    		}else return false;
    	}
    	
    	public String toString() {//转换成字符串类型
    		if(this.denominator==1) {
    			return this.numerator+"";
    		}else {
    			return this.numerator+"/"+this.denominator;
    		}
    	}
    	
    	public int intValue() {//转换成int类型
    		return (int)doubleValue();
    	}
    	
    	public long longValue() {//转换成long类型
    		return (long)doubleValue();
    	}
    	
    	public float floatValue() {//转换成float类型
    		return (float)doubleValue();
    	}
    	
    	public double doubleValue() {//转换成double类型
    		return 1.0*this.numerator/this.denominator;
    	}
    }
    
    

    2.测试代码

    (在与有理数类不同包的其他类中调用有理数类)

    package testrational;
    
    import rational.Rational;
    
    public class TestRational {
    	public static void main(String[] args) {
    		Rational a= new Rational(-5,8);
    		Rational b= new Rational(8,12);
    		
    		
    		System.out.println(a.toString());
    		System.out.println(b.toString());
    		
    		//测试有理数运算方法
    		System.out.println("a+b = "+a.add(b));
    		System.out.println("a-b = "+a.subtract(b));
    		System.out.println("a*b = "+a.multiply(b));
    		System.out.println("a/b = "+a.divide(b));
    		System.out.println("a的绝对值 = "+a.abs());
    		System.out.println("a和b比大小:"+a.compare(b));
    		System.out.println("a和b是否相等:"+a.equals(b));
    		System.out.println("a转换成int类型 = "+a.intValue());
    		System.out.println("a转换成long类型 = "+a.longValue());
    		System.out.println("a转换成float类型 = "+a.floatValue());
    		System.out.println("a转换成double类型 = "+a.doubleValue());
    	}
    }
    

    运行结果:

    3.描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

    C语言的代码更加面向过程,在解决问题时,不同于C语言使用函数,我设计的类的核心在于对象本身,而不是整个解决过程。并且我设计的具有面向对象语言的许多特征如封装性、继承等等等,也更方便他人调用。

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

    a.别人如何复用你的代码?

    导入相应包中的有理数类即可调用,如导入:import rational.Rational;

    b.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

    别人的代码不依赖我的有理数类的属性。、
    当我的有理数类的属性的数值、名称等修改时,因为属性定义为private,所以不影响;但当属性的类型变化时,如分子的int型修改为double型时,会影响到他人调用我的有理数类代码。

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

    大部分方法需要被其他类调用,设置为public方法是合适的。
    而将属性设置为private可以保证数据的安全性,也有部分辅助类方法设置为private,这些方法不需要被调用,例如如我的有理数类中的求最大公约数的方法就设置为private。

  • 相关阅读:
    数据库创建索引后如何查看是否生效
    两种动态代理的区别
    zuul请求过滤
    intellij idea 中 Job Debug特别缓慢问题
    vue路由注册及创建
    vue.config.js配置文件
    TypeScript配置文件
    如何发布自己的npm安装包
    npm常见命令
    通过foreach的方式批量插入
  • 原文地址:https://www.cnblogs.com/cjt0722/p/13766211.html
Copyright © 2020-2023  润新知