有理数设计
1、代码
public class RationalNumber {
private String numString;
private int numerator;
private int denominator;
private int pointIndex;
@Override
public String toString() {
// TODO Auto-generated method stub
StringBuilder toToString = new StringBuilder();
toToString.append(this.numerator / this.denominator);
toToString.append('.');
toToString.append(this.numerator % this.denominator);
return toToString.toString();
}
public int getNumerator() {
return numerator;
}
public int getDenominator() {
return denominator;
}
//无参构造法
public RationalNumber() {
// TODO Auto-generated constructor stub
this.numString = "0.0";
this.pointIndex = 1;
this.numerator = 0;
this.denominator = 1;
}
//字符串构造法
public RationalNumber(String numStr) {
this.numString = numStr;
this.pointIndex = numStr.lastIndexOf('.') ;
this.denominator = (int) Math.pow(10, this.pointIndex - 1);
String tmpString = numStr.substring(0, this.pointIndex) + numStr.substring(this.pointIndex+1, numStr.length());
this.numerator = Integer.parseInt(tmpString);
}
public String getNumString() {
return numString;
}
public int getPointIndex() {
return pointIndex;
}
//分子分母构造法
private RationalNumber(int numerator, int denominator){
this.numerator = numerator;
this.denominator = denominator;
this.numString = toString();
this.pointIndex = numString.lastIndexOf('.');
}
//相加
public RationalNumber add(RationalNumber toNumber) {
int minCommonMultiple = minCommonMultiple(this.denominator, toNumber..getDenominator());
int newNumerator = (minCommonMultiple/this.denominator) * this.numerator +
(minCommonMultiple/toNumber.getDenominator()) * toNumber.getNumerator();
return new RationalNumber(newNumerator, minCommonMultiple);
}
//相减
public RationalNumber subtract(RationalNumber toNumber)
{
int newNumerator = this.numerator * toNumber.getDenominator() - this.denominator * toNumber.getNumerator();
int newDenuminator = this.denominator * toNumber.getDenominator();
return new RationalNumber(newNumerator, newDenuminator);
}
//相乘
public RationalNumber multiply(RationalNumber toNumber)
{
int newNumerator = this.numerator * toNumber.getNumerator();
int newDenuminator = this.denominator * toNumber.getDenominator();
return new RationalNumber(newNumerator,newDenuminator);
}
//相除
public RationalNumber divide(RationalNumber toNumber)
{
int newNumerator = this.numerator * toNumber.getDenominator();
int newDenuminator = this.denominator * toNumber.getNumerator();
return new RationalNumber(newNumerator, newDenuminator);
}
//最小公倍数
public static int minCommonMultiple(int m, int n) {
return m * n / gcd(m, n);
}
//最大公约数
public static int gcd(int n,int d){
int n1=Math.abs(n);
int n2=Math.abs(d);
int tmp;
while (n2 != 0) {
tmp = n1 % n2;
n1 = n2;
n2 = tmp;
}
return n1;
}
}
2、测试代码
3、测试结果
4、讨论
1、别人如何复用你的代码?
导入我的有理数类包
2、别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
会依赖,会影响到
3、有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,private方法仅在该类中提供给代码编写者,可以保护一些重要代码不被使用者更改。public方法提供给使用者安全调用代码。