zoukankan      html  css  js  c++  java
  • 有理数类类的设计

    一. 有理数类的代码:

    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属性名,更安全,这样属性就不会随意的被赋值上任何非法的值。

  • 相关阅读:
    ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布
    SpreadJS 中应用 KnockoutJS 技术
    HTML5 Wijmo:控制 Wijmo Grid 插件的编辑模式
    Studio for WPF:使用 C1TileView 创建图片库
    随心所欲导出你的 UI 界面到 PDF 文件
    Studio for Winforms FlexGrid: 创建分类汇总
    Hibernate中事务中事务相关知识点
    Hibernate-一级缓存
    Hibernate-实体详解
    算法之旅-First之选择排序
  • 原文地址:https://www.cnblogs.com/qijing-cy/p/13765195.html
Copyright © 2011-2022 走看看