# 一. 有理数类的代码：

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

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.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编辑  收藏  举报