• 有理数类的设计


    1.有理数类的代码

    package cn.edu.jmu;
    
    public class Rational {
    	private int numerator;		//分子
    	private int denominator;	//分母
    	
    	public int getNumerator() {
    		return numerator;
    	}
    	public int getDenominator() {
    		return denominator;
    	}
    
    	//无参构造函数
    	public Rational () {
    		this.numerator = 0;
    		this.denominator = 1;
    	}
    	//有参构造函数
    	public Rational (int numerator, int denominator) {
    		if (numerator < 0 && denominator < 0) {
    			this.numerator = -numerator;
    			this.denominator = -denominator;
    		}else if (numerator > 0 && denominator < 0) {
    			this.numerator = -numerator;
    			this.denominator = -denominator;
    		}else {
    			this.numerator = numerator;
    			this.denominator = denominator;
    		}
    	}
    	
    	//求最大公约数,化简用
    	private int gcd(int numerator, int denominator) {
            int x = Math.abs(numerator);
            int y = Math.abs(denominator);
            int tmp;
            while (y != 0) {
                tmp = x % y;
                x = y;
                y = tmp;
            }
            return x;
        }
    	
    	//相加
    	public Rational add (Rational x) {
    		int numerator2 = numerator * x.denominator + x.numerator * denominator;
    		int denominator2 = denominator * x.denominator;
    		return new Rational(numerator2, denominator2);
    	}
    	//相减
    	public Rational subtract (Rational x) {
    		int numerator2 = numerator * x.denominator - x.numerator * denominator;
    		int denominator2 = denominator * x.denominator;
    		return new Rational(numerator2, denominator2);
    	}
    	//相乘
    	public Rational multiply (Rational x) {
    		int numerator2 = numerator * x.numerator;
    		int denominator2 = denominator * x.denominator;
    		return new Rational(numerator2, denominator2);
    	}
    	//相除
    	public Rational divide (Rational x) {
    		int numerator2 = numerator * x.denominator;
    		int denominator2 = denominator * x.numerator;
    		return new Rational(numerator2, denominator2);
    	}
    	//求绝对值
    	public Rational abs () {
    		int numerator2 = numerator;
    		int denominator2 = denominator;
    		if (numerator2 < 0) {
    			numerator2 = -numerator2;
    		}
    		if (denominator2 < 0) {
    			denominator2 = -denominator2;
    		}
    		
    		return new Rational(numerator2, denominator2);
    	}
    	//判断是否相等
    	public boolean equals (Rational x) {
    		if (this.subtract(x).getNumerator() == 0) {
    			return true;
    		}else {
    			return false;
    		}
    	}
    	//比较大小,大于所比较的数返回1,小于返回-1,等于返回0
    	public int compareTo (Rational x) {
    		if (this.subtract(x).getNumerator() > 0) {
    			return 1;
    		}else if (this.subtract(x).getNumerator() < 0) {
    			return -1;
    		}else {
    			return 0;
    		}
    	}
    	//以字符串形式输出
    	public String toString () {
    		int t = gcd(numerator, denominator);
    		numerator /= t;
    		denominator /= t;
    		
    		if(denominator == 1) {
    			return numerator+"";
    		}else if (numerator == 0) {
    			return 0+"";
    		}else {
    			return numerator + "/" + denominator ;
    		}
    	}
    }
    

    2.测试代码

    package demo;
    
    import cn.edu.jmu.Rational;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Rational s1 = new Rational(1, 2);
    		Rational s2 = new Rational(3, 4);
    		Rational s3 = new Rational(8, -7);
    		Rational s4 = new Rational(3, 4);
    		Rational s5 = new Rational();
    		
    		System.out.println("s1+s2 = " + s1.add(s2).toString());
    		System.out.println("s1-s2 = " + s1.subtract(s2).toString());
    		System.out.println("s1*s2 = " + s1.multiply(s2).toString());
    		System.out.println("s1/s2 = " + s1.divide(s2).toString());	
    		System.out.println("|s3| = " + s3.abs().toString());
    		System.out.println("判断s1与s2是否相等:" + s1.equals(s2));
    		System.out.println("判断s2与s4是否相等:" + s2.equals(s4));
    		System.out.println("s1与s2比大小:" + s1.compareTo(s2));
    		System.out.println("无参构造:" + s5.toString());
    }
    

    3.运行结果

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

    c语言是以函数的形式编写,java是以类的形式编写,使用者在使用时只需导入即可,更加的方便,而且定义方法时可以进行重载,可为类似功能的方法提供统一名称,根据参数类型或个数的不同调用相对应的方法。而c语言一个函数只能有一种参数定义。

    5.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

    a.别人如何复用你的代码?

    导入对应包中的有理数类。例:import cn.edu.jmu.Rational;

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

    别人的代码依赖我的有理数类的属性。
    当我的有理数类的属性修改时,因为属性设置为private,所以不影响他人调用有理数类的代码。

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

    合适。
    防止使用者对数据进行错误修改造成程序崩溃;辅助编写public方法的方法,不应被使用者调用。

  • 相关阅读:
    浏览器不兼容原因及解决办法
    VC++ MFC DLL动态链接库编写详解
    Saas是什么?
    用CSS中的Alpha实现渐变
    一种真正意义上的Session劫持[转]
    使用.NET Framework中新的日期时间类型[转]
    Hook、钩子、VC++ 基本概念
    H264
    Windows编程中各种操作文件的方法
    将TCP/IP协议移植到内嵌的弹片机中配合GPRS无线模块开发应用
  • 原文地址:https://www.cnblogs.com/wzt392217419/p/13765998.html
Copyright © 2020-2023  润新知