仿照BigDecimal类以面向对象的方式设计有理数类。
-
给出你的完整的有理数类的代码。
-
给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
-
尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
-
尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
-
别人如何复用你的代码?
-
别人的代码是否依赖你的有理数类的内部属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
-
有理数类的public方法是否设置合适?为什么有的方法设置为private?
-
你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
-
1.完整的有理类代码
package BigDecimal;
public class RationalNum {
private int elememt;//分子
private int denominator;//分母
public int GetElememt() {return elememt;}
public int GetDenominator() {return denominator;}
public static int Gcd(int elememt,int denominator) {//找到最大公约数
int m = Math.abs(elememt);
int n = Math.abs(denominator);
int temp = 1;
while(n!=0) {
temp = m % n;
m=n;
n=temp;
}
return m;
}
public RationalNum(int elememt,int denominator) {//约分
int gcd = Gcd(elememt,denominator);
if(elememt>0)this.elememt = elememt / gcd;
else this.elememt = elememt * (-1) / gcd;
this.denominator = Math.abs(denominator) / gcd;
}
public RationalNum add(RationalNum number1,RationalNum number2) {//加法
int n = number1.GetElememt()*number2.GetDenominator()+number1.GetDenominator()*number2.GetElememt();
int m = number1.GetDenominator()*number2.GetDenominator();
return new RationalNum(n,m);
}
public RationalNum subtract(RationalNum number1,RationalNum number2) {//减法
int a = number1.GetElememt()*number2.GetDenominator()-number1.GetDenominator()*number2.GetElememt();
int b = number1.GetDenominator()*number2.GetDenominator();
return new RationalNum(a,b);
}
public RationalNum multiply(RationalNum number1,RationalNum number2) {//乘法
int c = number1.GetElememt()*number2.GetElememt();
int d = number1.GetDenominator()*number2.GetDenominator();
return new RationalNum(c,d);
}
public RationalNum division(RationalNum number1,RationalNum number2) {//除法
int e = number1.GetElememt()*number2.GetDenominator();
int f = number1.GetDenominator()*number2.GetElememt();
return new RationalNum(e,f);
}
}
2.测试代码
package Test;
import java.util.Scanner;
import BigDecimal.RationalNum;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数的分子和分母");
int a = sc.nextInt(),b = sc.nextInt();
System.out.println("请输入第二个数的分子和分母");
int c = sc.nextInt(),d = sc.nextInt();
RationalNum num1 = new RationalNum(a,b);
RationalNum num2 = new RationalNum(c,d);
System.out.println("第一个有理数是"+num1.GetElememt()+"/"+num1.GetDenominator());
System.out.println("第二个有理数是"+num2.GetElememt()+"/"+num2.GetDenominator());
System.out.println("1.相加;2.相减;3.相乘;4.相除;请输入你的选择:");
int n = sc.nextInt();
if(n==1) {
System.out.println("相加得:");
System.out.println(num1.add(num1, num2));
}
if(n==2) {
System.out.println("相减得:");
System.out.println(num1.subtract(num1, num2));
}
if(n==3) {
System.out.println("相乘得:");
System.out.println(num1.multiply(num1, num2));
}
if(n==4) {
System.out.println("相除得:");
System.out.println(num1.division(num1, num2));
}
sc.close();
}
}
3.尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象
这个Java的有理数类更加系统,不同的功能被不同的模块,不同的类分割清楚,要求不同功能之间有联系,需要使用时,只需要使用我们所需要的类即可。而C语言则不需要每个功能之间有联系,只有完成所需的功能即可。
4.尝试从代码复用的角度来描述你设计的有理数类
4.1别人如何拷贝你的代码?
拷贝我的代码并命名为RationalNum的类,然后就可以使用,或者更改类名,在后续调用时,也需要更改名字。
4.2 别人的代码是否依赖你的有理数类的内部属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,当我修改时,会对其他人的使用产生影响。
4.3有理数类的public方法是否设置合适?为什么有的方法设置为private?
public是公共的,大家都可以访问,而private有限制,只能这个类本身访问。
4.4 你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
有使用到static,找最大公约数时,使用了。即那个最大公约数就可以在后序中使用。即为全局变量。