有理数类的设计--Java
有理数类的设计--Java
1.有理数代码
package rational;
public class Rational {
private long Numerator = 0;
private long Denominator = 1;
//访问private中的Numerator和Denominator
public long getNumerator() {
return Numerator;
}
public long getDenominator() {
return Denominator;
}
public Rational(long Numerator, long Denominator) {
// TODO Auto-generated constructor stub
long gcd = gcd(Numerator,Denominator);
long temp;
if(Denominator>0) {
temp = 1;
}else {
temp = -1;
}
this.Numerator = temp * 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);
long gcd = 1;
for (int i = 1; i < D&&i <= N; i++) {
if(N % i == 0&&D % i == 0) {
gcd = i;
}
}
return gcd;
}
//加法
public Rational Add(Rational s) {
long N = Numerator * s.getDenominator() + Denominator * s.getNumerator();
long D = Denominator * s.getDenominator();
/*分子=分子1*分母2+分母1*分子2
* 分母=分母1*分母2*/
return new Rational(N,D);
}
//减法
public Rational Subt(Rational s) {
long N = Numerator * s.getDenominator() - Denominator * s.getNumerator();
long D = Denominator * s.getDenominator();
return new Rational(N,D);
}
//乘法
public Rational Mult(Rational s) {
long N = Numerator * s.getNumerator();
long D = Denominator * s.getDenominator();
return new Rational(N,D);
}
//除法
public Rational Divi(Rational s) {
long N = Numerator * s.getDenominator();
long D = Denominator * s.getNumerator();
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()&&Denominator < s.getDenominator())) {
return 1;//前者大于后者
}else {
return -1;//后者大于前者
}
}
//转换为double类型
public double doubleValue(Rational s) {
double value = Numerator * 1.0 / Denominator;
return value;
}
}
2.测试代码
package rational;
import rational.Rational;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Rational ra1 = new Rational(5,21);
Rational ra2 = new Rational(2,7);
System.out.println("ra1转换为double型的值为:"+ra1.doubleValue(ra1));
System.out.println("ra2转换为double型的值为:"+ra2.doubleValue(ra2));
System.out.println("ra1 + ra2 = "+ra1.Add(ra2).getNumerator()+'/'+ra1.Add(ra2).getDenominator());
System.out.println("ra1 - ra2 = "+ra1.Subt(ra2).getNumerator()+'/'+ra1.Subt(ra2).getDenominator());
System.out.println("ra1 * ra2 = "+ra1.Mult(ra2).getNumerator()+'/'+ra1.Mult(ra2).getDenominator());
System.out.println("ra1 / ra2 = "+ra1.Divi(ra2).getNumerator()+'/'+ra1.Divi(ra2).getDenominator());
System.out.println("ra1与ra2相比较的结果为:"+ra1.Compare(ra2)+" (1:前者大于后者;0:二者相等;-1:后者大于前者)");
}
}
3.运行结果截图
4.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言是一种通用的、面向过程式的加算计程序设计语言,是仅产生少量的机器语言以及不需要腾和运行环境支持便能运行的。Java是面向对象编程,它利用了类和对象编程。类是对于事物的抽象,对象是具体的一个事物。
5.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
a.别人如何复用你的代码?
导入我的代码数据包,并且在首行import调用我的代码数据包。
b.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
别人的代码会依赖我的有理数类的属性。当我的有理数类的属性修改时,不会影响其他人对我有理数类代码的调用,因为属性的修饰类型为private型。
c.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适。因为设置为private型,他人就不能在其他的类中使用和修改,对代码有一定的保护作用。