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);
}
public String toString() {
return elememt+"/"+denominator;
}
}
测试代码:
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();
}
}
- 尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
面向对象的方法让java
的有理数类更加系统,不同的功能被不同的模块分割清楚,需要使用时,只需调用相应的类即可。而C语言则不需要每个功能之间有联系,只有完成所需的功能即可。
3.尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
3.1别人如何拷贝你的代码?
拷贝代码时,需要将我的代码命名为RationalNum
类,然后才可以使用。
3.2 别人的代码是否依赖你的有理数类的内部属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖,当我修改时,会对其他人的使用产生影响。
3.3有理数类的public方法是否设置合适?为什么有的方法设置为private?
public是公共的大家都可以访问,难免会有一些非法访问的出现,用private的方法就只能这个类的本身访问,有效避免非法访问篡改数据的现象发生。
3.4你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
在寻找最大公约数时,用到了static方法,这个最大公约数在后序有其他用处,所以设为全局变量,以免频繁调用。