一、代码预览
public class Rational {
private int num = 0;
private int deno = 1;
public Rational() {
this(0, 1);
}
public Rational(int num, int deno) // 约分到最简
{
int gcd = gcd(num, deno);
this.num = (deno > 0 ? 1 : -1) * num / gcd;
this.deno = Math.abs(deno) / gcd;
}
public static int gcd(int n, int d)// 寻找最大公约数
{
int nl = Math.abs(n);
int dl = Math.abs(d);
int gcd = 1;
int min = nl;
if (nl > dl) {
min = dl;
}
for (int i = 1; i <= min; i++) {
if (nl % i == 0 && dl % i == 0) {
gcd = i;
}
}
return gcd;
}
public int getNum() // 获得分子
{
return num;
}
public int getDeno() // 获得分母
{
return deno;
}
public Rational add(Rational second)// 加法运算
{
int n = num * second.getDeno() + deno * second.getNum();
int d = deno * second.getDeno();
return new Rational(n, d);
}
public Rational minus(Rational second)// 减法运算
{
int n = num * second.getDeno() - deno * second.getNum();
int d = deno * second.getDeno();
return new Rational(n, d);
}
public Rational multiply(Rational second)// 乘法运算
{
int n = num * second.getNum();
int d = deno * second.getDeno();
return new Rational(n, d);
}
public Rational divide(Rational second)// 除法运算
{
int n = num * second.getDeno();
int d = deno * second.getNum();
return new Rational(n, d);
}
public int intValue() // 转换为int类型
{
return (int) doubleValue();
}
public float floatValue() // 转换为float类型
{
return (float) doubleValue();
}
public double doubleValue() // 转换为double类型
{
return num * 1.0 / deno;
}
public long longValue() // 转换为long类型
{
return (long) doubleValue();
}
public String toString()// 转换为string类型
{
if (deno == 1) {
return num + "";
} else {
return num + "/" + deno;
}
}
public void compare(Rational second) // 比较两个有理数
{
Rational x = minus(second);
if (x.getNum() > 0) {
System.out.println(num + "/" + deno + "大于" + second.getNum() + "/" + second.getDeno());
} else if (x.getNum() == 0) {
System.out.println(num + "/" + deno + "等于" + second.getNum() + "/" + second.getDeno());
} else {
System.out.println(num + "/" + deno + "小于" + second.getNum() + "/" + second.getDeno());
}
}
}
二、测试代码
public static void main(String[] args) {
Rational x = new Rational(1, 3);
Rational y = new Rational(4, 6);
System.out.println(x.add(y));
System.out.println(x.minus(y));
System.out.println(x.multiply(y));
System.out.println(x.divide(y));
System.out.println(x.intValue());
System.out.println(x.floatValue());
System.out.println(x.doubleValue());
System.out.println(x.longValue());
System.out.println(x.toString());
x.compare(y);
}
三、运行结果
四、讨论
1.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
c语言中这些运算是通过函数来实现的。而设计的类会具象化,有属性和方法,这些都是比较直观的。
2.别人如何复用你的代码?
导入我写的有理数类方可使用。
3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
是,因为他调用了我的有理数类,也就调用了其中的属性。不会影响,属性设置为private型。
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
当你不希望你的方法可以被别人使用时可以使用private来设置方法,其具有一定的保护作用。而public就是公共的意思,方便调用。