有理数类类的设计

一. 有理数类的代码:

package rational;

public class Rational{
      private long numerator;      //分子
      private long denominator;    //分母

      public Rational(){          //构造函数
            this(0,1);            
      }
      public static long gcd(long a,long b){      //计算最大公约数,简化有理数
            long a=Math.abs(a);
            long b=Math.abs(b);
            long c=Math.abs(b);
            if(a<b){
            long c=a;
            a=b;
            b=c;
            }
            long r=a%b;
            while(r!=0){
            a=b;
            b=r;
            r=a%b;
            }
            numerator=a/c;
            denominator=b/c;
            if(numerator<0&&denominator<0){
            numerator=-numerator;
            denominator=-denominator;
            }
      }
      
      public long getNumerator(){      //生成器
      return numerator;
      }
      public long getDenominator(){
      return denominator;
      }

      Rational add(Rational r){       //加法运算
        long a=r.getNumerator();
        long b=r.getDenominator();
        long newNumerator=numerator*b+denominator*a;
        long newDenominator=denominator*b;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
      }
      Rational sub(Rational r){      //减法运算
        long a=r.getNumerator();
        long b=r.getDenominator();
        long newNumerator=numerator*b-denominator*a;
        long newDenominator=denominator*b;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
      }
      Rational muti(Rational r){         //乘法运算
        long a=r.getNumerator();
        long b=r.getDenominator();
        long newNumerator=numerator*a;
        long newDenominator=denominator*b;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
      }
      Rational div(Rational r){        //除法运算
        long a=r.getNumerator();
        long b=r.getDenominator();
        long newNumerator=numerator*b;
        long newDenominator=denominator*a;
        Rational result=new Rational(newNumerator,newDenominator);
        return result;
      }
      
      public String toString(){         //重写toString类
        if(denominator==1){
            return numerator+"";
        }else{
            return numerator+"/"+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 numerator * 1.0 / denominator;
      }

      public int compareTo(Object o) {      //有理数值为正、负、零时,分别返回1、-1、0
            if (this.subtract((Rational) o).getNumerator() > 0) {
            return 1;
            }
            else if (this.subtract((Rational) o).getNumerator() < 0) {
            return -1;
            }  
            else {
            return 0;
            }
      }
}

二. 测试代码:

package test;

import rational.Rational;

public class Main {
	public static void main(String[] args) {
		Rational test1=new Rational(3,8);
		Rational test2=new Rational(-4,7);
		System.out.println("test1 + test2 = "+test1.add(test2));
		System.out.println("test1 - test2 = "+test1.subtract(test2));
		System.out.println("test1 * test2 = "+test1.multply(test2));
		System.out.println("test1 / test2 = "+test1.divide(test2));
	        System.out.println("abs(test2) = "+test2.abs());

                System.out.println("test2的int值为"+test2.intValue());
	        System.out.println("test2的long值为"+test2.longValue());
	        System.out.println("test2的float值为"+test2.floatValue());
	        System.out.println("test2的double值为"+test2.doubleValue());
	        System.out.println("test2的String值为"+test2.toString());

	        switch(test2.signum()) {
	        case 0:
	    	System.out.println("test2为0");
	    	break;
	        case 1:
	    	System.out.println("test2为正数");
	    	break;
	        case -1:	
	     	System.out.println("test2为负数");
	    	break;
	        }
	    
	}

}

三. Q&A:

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

A:C是结构化编程语言,Java是面向对象编程语言。在用Java设计有理数类时并不侧重过程与逻辑的设计,而是更侧重于类的设计。

Q:别人如何复用你的代码?

A:可以通过导入rational类的包来复用该代码。

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

A:依赖,因为调用是在不同包的两个类之间进行的;不影响,因为此有理数类属性为private型。

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

A:我认为合适。为了不让其示例对象直接通过对象.属性名来使用和修改,而是通过set属性名,get属性名,更安全,这样属性就不会随意的被赋值上任何非法的值。

posted on 2020-10-03 21:05  漆靖  阅读(153)  评论(0编辑  收藏  举报

导航