有理数类的设计
package Rational;
public class Rational {
private int molecule;// 分子
private int denominator;// 分母
// 构造函数
public Rational(int molecule, int denominator) {
int divisor = gcd(Math.abs(molecule), Math.abs(denominator));
this.molecule = molecule / divisor;
this.denominator = denominator / divisor;
}
// 求取最大公约数
private int gcd(int abs1, int abs2) {
// TODO Auto-generated method stub
if (abs2 == 0)
return abs1;
return gcd(abs2, abs1 % abs2);
}
// 获取分子
public int get_molecule() {
return this.molecule;
}
// 获取分母
public int get_denominator() {
return this.denominator;
}
// 运算方法:加法、减法、乘法、除法,运算结束返回新的对象;
// 加法运算
public Rational addition(Rational addend1, Rational addend2) {
int result_molecule = 0;
int result_denominator = 0;
result_molecule = addend1.molecule * addend2.denominator + addend2.molecule * addend1.denominator;
result_denominator = addend1.denominator * addend2.denominator;
// this.denominator=this.denominator*addend2.denominator;
// this.molecule=this.molecule*addend2.denominator+addend2.molecule*this.denominator;
// return this;
//
return new Rational(result_molecule, result_denominator);
}
// 减法运算
public Rational subtraction(Rational minuend, Rational reduction) {
// int result_molecule = 0;
// int result_denominator = 0;
int result_denominator = minuend.denominator * reduction.denominator;
int result_molecule = minuend.molecule * reduction.denominator - reduction.molecule * minuend.denominator;
return new Rational(result_molecule, result_denominator);
}
// 乘法运算
public Rational multiplication(Rational multiplier1, Rational multiplier2) {
int result_molecule = 0;
int result_denominator = 0;
result_molecule = multiplier1.molecule * multiplier2.molecule;
result_denominator = multiplier1.denominator * multiplier2.denominator;
return new Rational(result_molecule, result_denominator);
}
// 除法运算
public Rational division(Rational dividend, Rational divisor) {
int result_molecule = 0;
int result_denominator = 0;
result_molecule = dividend.molecule * divisor.denominator;
result_denominator = dividend.denominator * divisor.molecule;
if (result_molecule < 0 && result_denominator < 0) {
result_molecule *= -1;
result_denominator *= -1;
}
return new Rational(result_molecule, result_denominator);
}
// 比较运算:比较大小,是否相等
// 比较大小,返回大的一个数据对象
public Rational getbigger(Rational rational1, Rational rational2) {
return rational1.molecule * rational2.denominator >= rational2.molecule * rational1.molecule ? rational2
: rational1;
}
// 比较是否相等
public boolean equal(Rational rational1, Rational rational2) {
return rational1.molecule * rational2.denominator >= rational2.molecule * rational1.denominator ? true : false;
}
public String toString() {// 转换为字符串类型
if (this.denominator == 1) {
return this.molecule + "";
} else {
return this.molecule + "/" + this.denominator;
}
}
}
测试代码
package Rational;
import java.util.Scanner;
public class rationalTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt(), d = sc.nextInt();
Rational R1 = new Rational(a,b), R2 = new Rational(c,d);
System.out.println("有理数相加结果:"+R1.addition(R1,R2));
System.out.println("有理数相减结果:"+R1.subtraction(R1, R2));
System.out.println("有理数相乘结果:"+R1.multiplication(R1, R2));
System.out.println("有理数相除结果:"+R1.division(R1, R2));
System.out.println("有理数比大小结果:"+R1.getbigger(R1, R2)+"大");
System.out.println("有理数是否相等:"+R1.equal(R1, R2));
}
sc.close();
}
}
运行结果
尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言中的有理数的相关代码服务面仅针对一个具体的有理数数据,在后期对于新的有理数数据的使用时需要重新调用应用于新的有理数的函数,对于一个有理数的数据处理过于片面和短暂。我设计的类在处理一个有理数数据时,处理的的是在有理数的定义下,对于每一个新的有理数进行所有方面的分析并生成相应的方法和结果,在各个方法的开始于结束都是生成新的数据对象以延长数据的时效
尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
别人如何复用你的代码?
以下内容均尚处于思想思考层面,代码层面尚未完全实现
继承:在使用个人设计的代码中,设置有对于单个数据属性的修改的区域,用于继承数据的应用,防止数据的过度包装
组合:在代码的实现部分有对有理数的数据的拆箱操作, 可以对有理数数据的分子和分母单独出来用于和其他数据类型的组合使用,且在本地数据中对数据的封装严谨性,实现低耦合与高饱和度。
别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
需要依赖
不会影响
有理数类的public方法是否设置合适?为什么有的方法设置为private?
设置合适,设置为public的方法是提供给用户选择使用的,提供/提示用户在选择的时候明白该方法的正常使用语句方式。
设置为private的方法是为了保证代码不因用户的操作而改变核心的部分,且可更大程度的保证代码的封装性完好。