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