有理数类的设计
目录
关于有理数类的相关代码
-
Rational.java
package JavaLearn;
public class Rational {
private int numerator;//分子
private int denominator;//分母
public int getNumerator(){
return numerator;
}
public int getDenominator(){
return denominator;
}
public int gcd(int a,int b){//计算最大公约数
if(a<b){
int c=a;
a=b;
b=c;
}
int r=a%b;
while(r!=0){
a=b;
b=r;
r=a%b;
}
return b;
}
public void setNum(int a,int b){ //设置分子和分母
int c=gcd(Math.abs(a),Math.abs(b));
numerator=a/c;
denominator=b/c;
if(numerator<0&&denominator<0){
numerator=-numerator;
denominator=-denominator;
}
}
public Rational(int a,int b){ //构造有理数
if(a==0){
numerator=0;
denominator=0;
}
else{
setNum(a,b);
}
}
public Rational add(Rational r){ //加法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b+denominator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
public Rational sub(Rational r){ //减法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b-denominator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
public Rational muti(Rational r){ //乘法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
public Rational div(Rational r){ //除法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b;
int newDenominator=denominator*a;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
}
-
Main.java
package JavaLearn;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入第一个数的分子、分母:");
int a = sc.nextInt();
int b = sc.nextInt();
System.out.print("请输入第二个数的分子、分母:");
int c = sc.nextInt();
int d = sc.nextInt();
Rational num1 = new Rational(a,b);
Rational num2 = new Rational(c,d);
Rational result=num1.add(num2);//加法运算
System.out.print(a+"/"+b+" + "+c+"/"+d+" = ");
System.out.println(result.getNumerator()+"/"+result.getDenominator());
result=num1.sub(num2);//减法运算
System.out.print(a+"/"+b+" - "+c+"/"+d+" = ");
System.out.println(result.getNumerator()+"/"+result.getDenominator());
result=num1.muti(num2);//乘法运算
System.out.print(a+"/"+b+" * "+c+"/"+d+" = ");
System.out.println(result.getNumerator()+"/"+result.getDenominator());
result=num1.div(num2);//除法运算
System.out.print(a+"/"+b+" / "+c+"/"+d+" = ");
System.out.println(result.getNumerator()+"/"+result.getDenominator());
sc.close();
}
}
-
运行结果示例
关于有理数类的相关问题
1.与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
在使用C语言编写有理数代码过程中,注重的更多是完成这个功能,不要求功能与功能之间的联系,而面向对象编程则更加系统,不同的功能被不同的类,模块分隔的清楚,需要使用的时候只要使用我们所需的功能即可。
2.别人如何复用你的代码?
直接复制我的代码并命名为Rational的类,需要使用的时候导出或新建一个类调用Rational的方法即可。
3.别人的代码是否依赖你的有理数类的内部属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
依赖;当我的有理数类的属性修改时,会影响他人调用我的有理数类的代码。
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适,当其他类要使用该类时,public可以直接调用,而private用来限制自身访问。
5. 你的类里面有static属性或方法吗?如果有,为什么要设置为static的?
有,要把这个返回到其它函数里面,于是要求退出函数不释放。