Fork me on GitHub

OO设计-有理数类的设计

有理数类代码

public class Rational {
	int num;
    int den;
    void setNumAndDen(int fenzi,int fenmu){
        int m=1,n=1;
        if(fenzi<0)
            m=-1*fenzi;
        if(fenmu<0)
            n=-1*fenmu;
        if(fenzi==0){
            num=0;
            den=1;
            return ;
        }              
        int c=f(m,n);//把输入的分数进行约分
        num=fenzi/c;
        den=fenmu/c;
        if(num<0&&den<0){
            num=-num;
            den=-den;//如果分子和分母都是负的,那就转换为正的
        }
    }
    int getNum(){
        return num;    
    }
    int getDen(){
        return den;
    }
    int f(int a,int b){
        if(a<b){
        int c=a;
        a=b;
        b=c;   
        }//转换使运算的时候a是最大的再进行求最大公约数
     int r=a%b;
     while(r!=0){
         a=b;
         b=r;
         r=a%b;
     }
        return b;
    }
    Rational add(Rational r){//加法运算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*b+den*a;//分子等于两数的分子都乘以对方的分母再相加
        int newDen=den*b;//分母等于两个分母相乘
        Rational result=new Rational();//新的分数
        result.setNumAndDen(newNum,newDen);//再进行约分
        return result;
    }
     Rational sub(Rational r){//减法运算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*b-den*a;//分子等于两数的分子都乘以对方的分母再相减
        int newDen=den*b;//分母等于两个分母相乘
        Rational result=new Rational();//新的分数
        result.setNumAndDen(newNum,newDen);//再进行判断约分
        return result;      
    }
      Rational muti(Rational r){//乘法运算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*a;//分子等于两数的分子相乘
        int newDen=den*b;//分母都与两个分母相乘
        Rational result=new Rational();//新的分数
        result.setNumAndDen(newNum,newDen);//再进行判断约分
        return result;  
   
    }
       Rational div(Rational r){//除法运算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*b;//
        int newDen=den*a;//改为乘以倒数的形式
        Rational result=new Rational();//新的分数
        result.setNumAndDen(newNum,newDen);//再进行判断约分
        return result;     
    }
}

测试代码

 public static void main(String[]args){
           Rational r1=new Rational();
           Rational r2=new Rational();//声明两个分数对象
           r1.setNumAndDen(3,5);
           int r1fenzi=r1.getNum();
           int r1fenmu=r1.getDen();//输入第一个分数并化简
           r2.setNumAndDen(3,2);
           int r2fenzi=r2.getNum();
           int r2fenmu=r2.getDen();//输入第二个分数并化简
           Rational result=r1.add(r2);
           int resultFenzi=result.getNum();
           int resultFenmu=result.getDen();//得到结果
           System.out.printf("\n%d/%d+%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
           result=r1.sub(r2);//减法
           resultFenzi=result.getNum();
           resultFenmu=result.getDen();
           System.out.printf("\n%d/%d-%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
           result=r1.muti(r2);//乘法
           resultFenzi=result.getNum();
           resultFenmu=result.getDen();
           System.out.printf("\n%d/%d*%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
           result=r1.div(r2);//除法
           resultFenzi=result.getNum();
           resultFenmu=result.getDen();
           System.out.printf("\n%d/%d/%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
    
       }

运行样例

尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象

  • 语言的代码首先会从函数功能的实现来考虑,java是将数据和处理作为一个整体,将函数与属性放在一起,更易于维护。

别人如何复用你的代码

  • 继承

别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?

  • 依赖,当有理数属性修改为其他类型的属性时,会影响其他人调用

有理数类的public方法是否设置合适?为什么有的方法设置为private

  • 合适,对于其他类来说是隐藏的,可以保护方法中的赋值不被外界干扰
posted @ 2020-10-04 20:43  清ぃ影  阅读(131)  评论(0编辑  收藏  举报