# 创建有理数对象

#### 有理数类的设计

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;
}

// 运算方法：加法、减法、乘法、除法,运算结束返回新的对象;

// 加法运算
int result_molecule = 0;
int result_denominator = 0;
//			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.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?

posted @ 2020-10-04 11:43  网络1912刘怀宇  阅读(142)  评论(1编辑  收藏  举报