栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

OO设计-有理数类的设计

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OO设计-有理数类的设计

仿照BigDecimal类以面向对象的方式设计有理数类。
  1.  给出你的完整的有理数类的代码。

  2.  给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。

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

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

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

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

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

    4.  你的类里面有static属性或方法吗?如果有,为什么要设置为static的?

1.完整的有理类代码
package BigDecimal;

public class RationalNum {
	private int elememt;//分子
	private int denominator;//分母
	public int GetElememt() {return elememt;}
	public int GetDenominator() {return denominator;}
	public static int Gcd(int elememt,int denominator) {//找到最大公约数
		int m = Math.abs(elememt);
		int n = Math.abs(denominator);
		int temp = 1;
		while(n!=0) {
			temp = m % n;
			m=n;
			n=temp;
		}
		return m;
	}
	public RationalNum(int elememt,int denominator) {//约分
		int gcd = Gcd(elememt,denominator);
		if(elememt>0)this.elememt = elememt / gcd;
		else this.elememt = elememt * (-1) / gcd;
		this.denominator = Math.abs(denominator) / gcd;
	}
	public RationalNum add(RationalNum number1,RationalNum number2) {//加法
		int n = number1.GetElememt()*number2.GetDenominator()+number1.GetDenominator()*number2.GetElememt(); 
		int m = number1.GetDenominator()*number2.GetDenominator();
		return new RationalNum(n,m);
	}
	public RationalNum subtract(RationalNum number1,RationalNum number2) {//减法
		int a = number1.GetElememt()*number2.GetDenominator()-number1.GetDenominator()*number2.GetElememt(); 
		int b = number1.GetDenominator()*number2.GetDenominator();
		return new RationalNum(a,b);
	}
	public RationalNum multiply(RationalNum number1,RationalNum number2) {//乘法
		int c = number1.GetElememt()*number2.GetElememt();
		int d = number1.GetDenominator()*number2.GetDenominator();
		return new RationalNum(c,d);
	}
	public RationalNum division(RationalNum number1,RationalNum number2) {//除法
		int e = number1.GetElememt()*number2.GetDenominator();
		int f = number1.GetDenominator()*number2.GetElememt();
		return new RationalNum(e,f);
	}
}
2.测试代码
package Test;

import java.util.Scanner;

import BigDecimal.RationalNum;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入第一个数的分子和分母");
		int a = sc.nextInt(),b = sc.nextInt();
		System.out.println("请输入第二个数的分子和分母");
		int c = sc.nextInt(),d = sc.nextInt();
		RationalNum num1 = new RationalNum(a,b);
		RationalNum num2 = new RationalNum(c,d);
		System.out.println("第一个有理数是"+num1.GetElememt()+"/"+num1.GetDenominator());
		System.out.println("第二个有理数是"+num2.GetElememt()+"/"+num2.GetDenominator());
		System.out.println("1.相加;2.相减;3.相乘;4.相除;请输入你的选择:");
		int n = sc.nextInt();
		if(n==1) {
			System.out.println("相加得:");
		    System.out.println(num1.add(num1, num2));
		    }
		if(n==2) {
			System.out.println("相减得:");
		    System.out.println(num1.subtract(num1, num2));
		    }
		if(n==3) {
			System.out.println("相乘得:");
		    System.out.println(num1.multiply(num1, num2));
		    }
		if(n==4) {
			System.out.println("相除得:");
		    System.out.println(num1.division(num1, num2));
		    }
		sc.close();
	}


}
3.尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象

这个Java的有理数类更加系统,不同的功能被不同的模块,不同的类分割清楚,要求不同功能之间有联系,需要使用时,只需要使用我们所需要的类即可。而C语言则不需要每个功能之间有联系,只有完成所需的功能即可。

4.尝试从代码复用的角度来描述你设计的有理数类

4.1别人如何拷贝你的代码?

拷贝我的代码并命名为RationalNum的类,然后就可以使用,或者更改类名,在后续调用时,也需要更改名字。

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

依赖,当我修改时,会对其他人的使用产生影响。

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

public是公共的,大家都可以访问,而private有限制,只能这个类本身访问。

4.4 你的类里面有static属性或方法吗?如果有,为什么要设置为static的?

有使用到static,找最大公约数时,使用了。即那个最大公约数就可以在后序中使用。即为全局变量。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270316.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号