JAVA-有理数的设计
一.仿照BigDecimal类设计有理数类的代码
package xs01;
public class Rational {
private int num; //分子
private int den; //分母
public Rational() {
num=0;
den=1;
}
public Rational (int num,int den) {
int gcd=gcd(num, den);
this.num=((den>0)?1:-1)*num/gcd;
this.den=Math.abs(den)/gcd;
}
private int GetNumerator() {
// TODO Auto-generated method stub
return num;
}
public int GetDenominator() {
return den;
}
private static int gcd(int a,int b) {
if(a%b==0)
return b;
else
return gcd(b, a%b);
}
//基础计算
public Rational add(Rational newRational) {
int a=this.num*newRational.GetDenominator()+this.den*newRational.GetNumerator();
int b=this.den*newRational.GetDenominator();
return new Rational(a,b);
}
public Rational subtract(Rational newRational) {
int a=this.num*newRational.GetDenominator()-this.den*newRational.GetNumerator();
int b=this.den*newRational.GetDenominator();
return new Rational(a,b);
}
public Rational multiply(Rational newRational) {
int a=this.num*newRational.GetNumerator();
int b=this.den*newRational.GetDenominator();
return new Rational(a,b);
}
public Rational divide(Rational newRational) {
int a=this.num*newRational.GetDenominator();
int b=this.den*newRational.GetNumerator();
return new Rational(a,b);
}
public void compare(Rational newRational) {
if (this.subtract(newRational).GetNumerator()<0)
System.out.println("a<b");
else if(this.subtract(newRational).GetNumerator()==0)
System.out.println("a=b");
else
System.out.println("a>b");
}
//转换类型
public double doubleValue() {
return this.num*1.0/this.den;
}
public int intValue() {
return (int)doubleValue();
}
public long longValue() {
return (long)doubleValue();
}
public float floatValue() {
return (float)doubleValue();
}
public String toString() {
if (this.den==1)
return this.num+"";
else
return this.num+"/"+this.den;
}
}
二.测试代码
package xs02;
import xs01.Rational;
public class Main_1 {
public static void main(String[] args) {
Rational x=new Rational(2,7);
Rational y=new Rational(3,5);
System.out.println("x="+x.toString());
System.out.println("y="+y.toString());
System.out.println("x+y="+x.add(y));
System.out.println("x-y="+x.subtract(y));
System.out.println("x*y="+x.multiply(y));
System.out.println("x/y="+x.divide(y));
x.compare(y);
System.out.println(x.intValue());
System.out.println(x.longValue());
System.out.println(x.floatValue());
System.out.println(x.doubleValue());
}
}
三.运行截图

四.讨论
1.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
发现c语言和java的不同。我们使用C语言的时候主要使用函数,但Java使用的是面向对象的类。
2.别人如何复用你的代码?
直接导入我编写的包,调用其中类即可
3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
否,并不依靠;是的
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
有些开放而有些属性设置为private,因为private本身可以保证数据的安全性,当然也有一些方法设置为private,因为我们不需要直接去调用。

浙公网安备 33010602011771号