有理数类的设计
一、有理数类代码
public class Rational {
private int numerator;//分子
private int denominator;//分母
public Rational() {
this(0,1);
}
//构造函数
public Rational(long numerator, long denominator) {
long gcd = gcd(numerator,denominator);
this.numerator= ((denominator>0)? 1 : -1)*numerator / gcd;
this.denominator=Math.abs(denominator)/gcd;
}
//求最大公约数,便于简化有理数
public static long gcd(long n,long d){
long n1=Math.abs(n);
long n2=Math.abs(d);
int gcd=1;
for(int k=1;k<=n1&&k<=n2;k++){
if(n1%k==0&&n2%k==0){
gcd=k;
}
}
return gcd;
}
//生成器
public long getNumerator(){
return numerator;
}
public long getDenominator(){
return denominator;
}
//实现加法
public Rational add(Rational secondRational){
long n=numerator*secondRational.getDenominator()+
denominator*secondRational.getNumerator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
//实现减法
public Rational subtract(Rational secondRational){
long n=numerator*secondRational.getDenominator()-
denominator*secondRational.getNumerator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
//实现乘法
public Rational multiply(Rational secondRational){
long n=numerator*secondRational.getNumerator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
//实现除法
public Rational divide(Rational secondRational){
long n=numerator*secondRational.getDenominator();
long d=denominator*secondRational.numerator;
return new Rational(n,d);
}
//重写toString类
public String toString(){
if(denominator==1){
return numerator+"";
}else{
return numerator+"/"+denominator;
}
}
}
二、测试代码
public static void main(String[] args){
Rational x=new Rational(5,3);
Rational y=new Rational(8,5);
System.out.println(x.toString());
System.out.println(y.toString());
System.out.println(x.add(y));
System.out.println(x.subtract(y));
System.out.println(x.multiply(y));
System.out.println(x.divide(y));
}
}
三、讨论
1.描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
c语言和Java有一部分功能是相似的,但是Java更加面向对象,因为Java直接在类里把类的属性什么的都写清楚了,在同一个包里的另一个class里直接用就可以了。
c语言设计时更偏向过程,要用怎样的函数来实现这个过程。
2.别人如何复用你的代码?
使用我代码中的有理数类的属性就可以复用。
3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,不会影响。
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,因为有的方法只能运用在类中,不能随便更改,保证数据的安全性,而有的方法希望可以被使用,因此就通过public方法来访问。