• 有理数类类的设计


    一. 有理数类的代码:

    package rational;
    
    public class Rational{
          private long numerator;      //分子
          private long denominator;    //分母
    
          public Rational(){          //构造函数
                this(0,1);            
          }
          public static long gcd(long a,long b){      //计算最大公约数,简化有理数
                long a=Math.abs(a);
                long b=Math.abs(b);
                long c=Math.abs(b);
                if(a<b){
                long c=a;
                a=b;
                b=c;
                }
                long r=a%b;
                while(r!=0){
                a=b;
                b=r;
                r=a%b;
                }
                numerator=a/c;
                denominator=b/c;
                if(numerator<0&&denominator<0){
                numerator=-numerator;
                denominator=-denominator;
                }
          }
          
          public long getNumerator(){      //生成器
          return numerator;
          }
          public long getDenominator(){
          return denominator;
          }
    
          Rational add(Rational r){       //加法运算
            long a=r.getNumerator();
            long b=r.getDenominator();
            long newNumerator=numerator*b+denominator*a;
            long newDenominator=denominator*b;
            Rational result=new Rational(newNumerator,newDenominator);
            return result;
          }
          Rational sub(Rational r){      //减法运算
            long a=r.getNumerator();
            long b=r.getDenominator();
            long newNumerator=numerator*b-denominator*a;
            long newDenominator=denominator*b;
            Rational result=new Rational(newNumerator,newDenominator);
            return result;
          }
          Rational muti(Rational r){         //乘法运算
            long a=r.getNumerator();
            long b=r.getDenominator();
            long newNumerator=numerator*a;
            long newDenominator=denominator*b;
            Rational result=new Rational(newNumerator,newDenominator);
            return result;
          }
          Rational div(Rational r){        //除法运算
            long a=r.getNumerator();
            long b=r.getDenominator();
            long newNumerator=numerator*b;
            long newDenominator=denominator*a;
            Rational result=new Rational(newNumerator,newDenominator);
            return result;
          }
          
          public String toString(){         //重写toString类
            if(denominator==1){
                return numerator+"";
            }else{
                return numerator+"/"+denominator;
            }
          }
    
          public int intValue() {            //转化为int类型
                return (int) doubleValue();
          }
    
          public long longValue() {          //转化为long类型
                return (long) doubleValue();
          }
    
          public float floatValue() {        //转化为float类型
                return (float) doubleValue();
          }
    
          public double doubleValue() {      //转化为double类型
                return numerator * 1.0 / denominator;
          }
    
          public int compareTo(Object o) {      //有理数值为正、负、零时,分别返回1、-1、0
                if (this.subtract((Rational) o).getNumerator() > 0) {
                return 1;
                }
                else if (this.subtract((Rational) o).getNumerator() < 0) {
                return -1;
                }  
                else {
                return 0;
                }
          }
    }
    

    二. 测试代码:

    package test;
    
    import rational.Rational;
    
    public class Main {
    	public static void main(String[] args) {
    		Rational test1=new Rational(3,8);
    		Rational test2=new Rational(-4,7);
    		System.out.println("test1 + test2 = "+test1.add(test2));
    		System.out.println("test1 - test2 = "+test1.subtract(test2));
    		System.out.println("test1 * test2 = "+test1.multply(test2));
    		System.out.println("test1 / test2 = "+test1.divide(test2));
    	        System.out.println("abs(test2) = "+test2.abs());
    
                    System.out.println("test2的int值为"+test2.intValue());
    	        System.out.println("test2的long值为"+test2.longValue());
    	        System.out.println("test2的float值为"+test2.floatValue());
    	        System.out.println("test2的double值为"+test2.doubleValue());
    	        System.out.println("test2的String值为"+test2.toString());
    
    	        switch(test2.signum()) {
    	        case 0:
    	    	System.out.println("test2为0");
    	    	break;
    	        case 1:
    	    	System.out.println("test2为正数");
    	    	break;
    	        case -1:	
    	     	System.out.println("test2为负数");
    	    	break;
    	        }
    	    
    	}
    
    }
    

    三. Q&A:

    Q:与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

    A:C是结构化编程语言,Java是面向对象编程语言。在用Java设计有理数类时并不侧重过程与逻辑的设计,而是更侧重于类的设计。

    Q:别人如何复用你的代码?

    A:可以通过导入rational类的包来复用该代码。

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

    A:依赖,因为调用是在不同包的两个类之间进行的;不影响,因为此有理数类属性为private型。

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

    A:我认为合适。为了不让其示例对象直接通过对象.属性名来使用和修改,而是通过set属性名,get属性名,更安全,这样属性就不会随意的被赋值上任何非法的值。

  • 相关阅读:
    codeforces round #234B(DIV2) B Inna and New Matrix of Candies
    关于禁止ipad的home键解决方法
    ios cocos2d 画线出现闪烁问题
    ios 关于[xxx timeIntervalSinceNow]出现EXC_BAD_ACCESS错误的解决办法
    Codeforces Round #228 (Div. 2) B. Fox and Cross
    Codeforces Round #228 (Div. 2) A. Fox and Number Game
    c语言 %p
    xcode 编译opencv ios容易出现的错误
    ios编译ASIHTTPRequest时出现 'libxml/HTMLparser.h' file not found in ASIHTTPRequest
    当编译CCBReader时出现 “ CCBAnimationManager.m Use of undeclared identifier 'other‘ ” 解决方法
  • 原文地址:https://www.cnblogs.com/qijing-cy/p/13765195.html
Copyright © 2020-2023  润新知