一. 有理数类的代码:
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属性名,更安全,这样属性就不会随意的被赋值上任何非法的值。