3.1-有理数类的设计

有理数设计

一. 有理数类代码

package rationalNumberDesign;

public class Rational {

	private int numberator;//分子
	private int denominator;//分母
	
	public Rational(int numberator,int denominator) {//构造
		int gcd = gcd(numberator,denominator);
		this.numberator = numberator/gcd;
		this.denominator = denominator/gcd;
	}
	public int getNumberator() {//获取分子
		return  this.numberator;
	}
	public int getDeminator() {//获取分母
		return this.denominator;
	}
		
	private static int gcd(int numberator,int denominator) {//碾转相除法求最大公约数
		int n1 = Math.abs(numberator);
		int n2 = Math.abs(denominator);
		int temp;
		while (n2 != 0) {
			temp = n1%n2;
			n1 = n2;
			n2 = temp;
		}
		return n1;
	}
	
	public Rational add(Rational first,Rational second) {//加法
		int num = first.numberator * second.denominator + second.numberator * first.denominator;
		int den = first.denominator * second.denominator;

		return new Rational(num,den);
	}
	
	public Rational subtract(Rational first,Rational second) {//减法
		int num = first.numberator * second.denominator - second.numberator * first.denominator;
		int den = first.denominator * second.denominator;
	
		return new Rational(num,den);
	}
	
	public Rational multiply(Rational first,Rational second) {//乘法
		int num = first.numberator * second.numberator;
		int den = first.denominator * second.denominator;

		return new Rational(num,den);
	}
	
	public Rational divide(Rational first,Rational second) {//除法
		int num = first.numberator * second.denominator;
		int den = first.denominator * second.numberator;
		if(num<0&&den<0) {
			num = Math.abs(num);
			den = Math.abs(den);
		}
	
		return new Rational(num,den);
	}
	
	public String toString() {//转换为字符串类型
		if(this.denominator == 1) {
			return this.numberator+"";
		}
		else {
			return this.numberator+"/"+this.denominator;
		}
	}
	
	public boolean equal(Rational first,Rational second) {//比较是否相等
		if((first.numberator == second.numberator)&&(first.denominator == second.denominator)) {
			return true;
		}
		else {
			return false;
		}	
	}
	
	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 this.numberator*1.0/this.denominator;
	} 
}

二. 测试代码

package rationalNumberDesign;

import rationalNumberDesign.Rational;
import java.util.Scanner;
public class rationalTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt(), d = sc.nextInt();
			Rational R1 = new Rational(a,b),R2 = new Rational(c,d);
			System.out.println("加法有理数结果为:"+R1.add(R1, R2));
			System.out.println("减法有理数结果为:"+R1.subtract(R1, R2));
			System.out.println("乘法有理数结果为:"+R1.multiply(R1, R2));
			System.out.println("除法有理数结果为:"+R1.divide(R1, R2));
			System.out.println("二者比较结果:  "+R1.equal(R1, R2));
			System.out.println(R1.intValue());
			System.out.println(R1.longValue());
			System.out.println(R1.floatValue());
			System.out.println(R1.doubleValue());			
		}
		sc.close();
	}

}

运行结果截图

三. Q&A

Q1. 描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
A1. 面向过程的主要思考方向是“我要用它做什么”,而面向对象的主要思考方向是“这个东西能干什么”,而Java可以直接编写出“这个可以干什么”。面向对象的三个基本特征是:封装、继承、多态,Java也都具备,它扩展性强,重用性高,所以更倾向于面向对象。
Q2. 别人如何复用你的代码?
A2. 导入我的代码数据包并在前面使用import调用我的代码数据包。
Q3. 别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
A3. 会。不会,因为我的属性的修饰为private类型。
Q4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
合适。有两种情况下可设置为private:a.当一个方法希望只被本类所使用;b.与本类的内部状态无关。设置成private后对别人相当于隐藏的不可见的,保证数据的安全性。
原文地址:https://www.cnblogs.com/599-/p/13766274.html