一、有理数类代码
package text;
public class Rational {
private long numerator = 0; //分子
private long denominator = 1; //分母
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;
}
private long gcd(long numerator, long denominator) {
// TODO Auto-generated method stub
long n = Math.abs(numerator);
long d = Math.abs(denominator);
int gcd = 1;
for(int i=1;i<=numerator&&i<=denominator;i++) {
if(numerator%i == 0&&denominator%i == 0) {
gcd=i;
}
}
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);
}
public int Compare(Rational s) {
if(numerator == s.getNumerator()) {
return 0; //两数相等
}
else if((numerator > s.getNumerator() && denominator <= s.getDenominator())||(numerator == s.getNumerator()&&nenominator < s.getDenominator())) {
return 1; //前者大于后者
}
else {
return -1; //后者大于前者
}
}
}
二、测试代码
package text;
import text.Rational;
public class Main {
public static void main(String[] args) {
Rational r1 = new Rational(8,9);
Rational r2 = new Rational(2,3);
System.out.println("r1 + r2 = "+r1.add(r2).getNumerator()+'/'+r1.add(r2).getDenominator());
System.out.println("r1 - r2 = "+r1.subtract(r2).getNumerator()+'/'+r1.subtract(r2).getDenominator());
System.out.println("r1 * r2 = "+r1.multiply(r2).getNumerator()+'/'+r1.multiply(r2).getDenominator());
System.out.println("r1 / r2 = "+r1.divide(r2).getNumerator()+'/'+r1.divide(r2).getDenominator());
System.out.println("r1与r2比较结果:"+r1.Compare(r2)+"(0:r1=r2;1:r1>r2;-1:r1
}
}
三、运行截图
四、 描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言倾向于编写全部代码,重过程;Java更倾向于将数据和方法进行封装和调用,更加灵活
五、尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
别人如何复用你的代码?
导入我的数据包
别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,调用了我的有理数类。
不会,我的类属性修改,属于private型,不会影响他人调用。
有理数类的public方法是否设置合适?为什么有的方法设置为private?
是。
private型他人无法调用,保障了数据的安全性。