3.1-互评-OO设计-有理数类的设计
仿照BigDecimal类以面向对象的方式设计有理数类
一、给出你的有理数类的代码
package oo3_1;
public class Rational {
private int num; //分子
private int den; //分母
public int GetNumerator() {
return num;
}
public int GetDenominator() {
return den;
}
private static int gcd(int x,int y) {
if(x%y==0)
return y;
else
return gcd(y, x%y);
}
public Rational (int num,int den) {
int gcd=gcd(num, den);
this.num=((den>0)?1:-1)*num/gcd;
this.den=Math.abs(den)/gcd;
}
public Rational() {
num=0;
den=1;
}
public Rational add(Rational newRational) {
int x=this.num*newRational.GetDenominator()+this.den*newRational.GetNumerator();
int y=this.den*newRational.GetDenominator();
return new Rational(x,y);
}
public Rational subtract(Rational newRational) {
int x=this.num*newRational.GetDenominator()-this.den*newRational.GetNumerator();
int y=this.den*newRational.GetDenominator();
return new Rational(x,y);
}
public Rational multiply(Rational newRational) {
int x=this.num*newRational.GetNumerator();
int y=this.den*newRational.GetDenominator();
return new Rational(x,y);
}
public Rational divide(Rational newRational) {
int x=this.num*newRational.GetDenominator();
int y=this.den*newRational.GetNumerator();
return new Rational(x,y);
}
public String toString() {
if (this.den==1)
{
return this.num+"";
}else{
return this.num+"/"+this.den;
}
}
public void compare(Rational newRational) {
if (this.subtract(newRational).GetNumerator()<0)
System.out.println("x<y");
else if(this.subtract(newRational).GetNumerator()==0)
System.out.println("x=y");
else
System.out.println("x>y");
}
public double doubleValue() {
return this.num*1.0/this.den;
}
public int intValue() {
return (int)doubleValue();
}
public long longValue() {
return (long)doubleValue();
}
public float floatValue() {
return (float)doubleValue();
}
}
二、给出你的测试代码,要在与有理数类不同包的其他类中调用有理数类
package oo3_1;
import oo3_1.Rational;
public class text {
public static void main(String[] args){
Rational x=new Rational(2,3);
Rational y=new Rational(6,7);
System.out.println("x="+x.toString());
System.out.println("y="+y.toString());
System.out.println("x+y="+x.add(y));
System.out.println("x-y="+x.subtract(y));
System.out.println("x*y="+x.multiply(y));
System.out.println("x/y="+x.divide(y));
x.compare(y);
System.out.println(x.intValue());
System.out.println(x.longValue());
System.out.println(x.floatValue());
System.out.println(x.doubleValue());
}
}
三、运行截图
四、尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
c语言更加面向过程,而java是对类的编写,可以直接进行调用
五、尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
a.别人如何复用你的代码?
导入自己编写的有理数包,从而调用类中的属性和方法
b.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖;不影响;
c.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,因为设置为private的方法只能在该类中运行,很好保护了一些重要代码的“隐私”。通过public的方法来访问其他的需要被使用到的代码,提高代码的安全性。