1.有理数类的代码


//凡是可以写成numerator/denominator(分子,分母为整数且分子≠0)形式的数,都是有理数
public class Rational {
	private long numerator;//分子
	private long denominator;//分母
	
	//求最大公约数,简化有理数,方便计算
	public static long gcd(long n,long d){
		if(d==0)
		{
			return 0;
		}
		
		return gcd(d,n%d);
	}

	public Rational(long n, long d) {
		numerator=n;
		denominator=d;
		long Gcd=gcd(numerator,denominator);
		
		if(Gcd>=1)
		{
			numerator/=Gcd;
			denominator/=Gcd;
		}
	}
	
	//加法
	public Rational add(Rational num){
		long n=numerator*num.denominator+denominator*num.numerator;
		long d=denominator*num.denominator;
		return new Rational(n,d);
	}
	
	//减法
	public Rational subtract(Rational num){
		long n=numerator*num.denominator-denominator*num.numerator;
		long d=denominator*num.denominator;
		return new Rational(n,d);
	}
	
	//乘法
	public Rational multiply(Rational num){
		long n=numerator*num.numerator;
		long d=denominator*num.denominator;
		return new Rational(n,d);
	}
	
	//除法
	public Rational divide(Rational num){
		long n=numerator*num.denominator;
		long d=denominator*num.numerator;
		return new Rational(n,d);
	}
	
	//转化为字符串
	public String toString(){
		if(denominator==1)//分母为1,直接表示分子即可
		{
			return "" + numerator;
		}
		
		return numerator + "/" + denominator;
	}
}

2.测试代码


import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		
		while(sc.hasNext()) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			int c=sc.nextInt();
			int d=sc.nextInt();
			
			Rational firstNum = new Rational(a,b);//第一个有理数
			Rational secondNum = new Rational(c,d);//第二个有理数

			Rational Add = firstNum.add(secondNum);//加法
			Rational Subtract = firstNum.subtract(secondNum);//减法
			Rational Multiply = firstNum.multiply(secondNum);//乘法
			Rational Divide = firstNum.divide(secondNum);//除法
			
			//输出
			System.out.println(firstNum + "+" + secondNum + "=" + Add);
			System.out.println(firstNum + "-" + secondNum + "=" + Subtract);
			System.out.println(firstNum + "×" + secondNum + "=" + Multiply);
			System.out.println(firstNum + "÷" + secondNum + "=" + Divide);
		}
	}
}

3.测试结果

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

c语言和Java的部分功能是类似的,但是Java更加面向对象,C语言更面向过程。因为Java在类里把类的属性方法都写清楚了,在同一个包里的另一个class中就可以直接用。

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

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

导入包中的有理数类,如:import java.util.Rational;

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

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

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

合适;因为public是公有的,private是私有的,有的方法设置成private,别的类就不能通过该private方法访问该变量,只限于自己使用,这样可以防止使用者不小心对数据修改造成程序错误。

posted on 2020-10-10 12:39    阅读(171)  评论(0编辑  收藏  举报

/*
*/