有理数类的设计

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);
	}
    public String toString() {
		return elememt+"/"+denominator;
	}
}

测试代码:

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();
	}
 
 
}
  1. 尝试回答与c语言的有理数代码相比较,为什么你设计的类更加面向对象?

​ 面向对象的方法让java的有理数类更加系统,不同的功能被不同的模块分割清楚,需要使用时,只需调用相应的类即可。而C语言则不需要每个功能之间有联系,只有完成所需的功能即可。

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

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

​ 拷贝代码时,需要将我的代码命名为RationalNum类,然后才可以使用。

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

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

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

​ public是公共的大家都可以访问,难免会有一些非法访问的出现,用private的方法就只能这个类的本身访问,有效避免非法访问篡改数据的现象发生。

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

在寻找最大公约数时,用到了static方法,这个最大公约数在后序有其他用处,所以设为全局变量,以免频繁调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道了。以下是有理数的实现代码: ```c++ #include <iostream> #include <cmath> using namespace std; class Rational { private: int numerator; // 分子 int denominator; // 分母 public: // 构造函数 Rational(int num = 0, int den = 1) { if (den == 0) { cout << "分母不能为0!" << endl; exit(-1); } if (den < 0) { num = -num; den = -den; } int gcd_num_den = gcd(abs(num), den); numerator = num / gcd_num_den; denominator = den / gcd_num_den; } // 加法运算符重载 Rational operator+(const Rational& r) { int num = numerator * r.denominator + r.numerator * denominator; int den = denominator * r.denominator; return Rational(num, den); } // 减法运算符重载 Rational operator-(const Rational& r) { int num = numerator * r.denominator - r.numerator * denominator; int den = denominator * r.denominator; return Rational(num, den); } // 乘法运算符重载 Rational operator*(const Rational& r) { int num = numerator * r.numerator; int den = denominator * r.denominator; return Rational(num, den); } // 除法运算符重载 Rational operator/(const Rational& r) { int num = numerator * r.denominator; int den = denominator * r.numerator; return Rational(num, den); } // 输出运算符重载 friend ostream& operator<<(ostream& os, const Rational& r) { if (r.denominator == 1) { os << r.numerator; } else { os << r.numerator << "/" << r.denominator; } return os; } // 获取分子 int getNumerator() const { return numerator; } // 获取分母 int getDenominator() const { return denominator; } private: // 辗转相除法求最大公约数 int gcd(int m, int n) { int r; while (n != 0) { r = m % n; m = n; n = r; } return m; } }; int main() { int num1, den1, num2, den2; cin >> num1 >> den1 >> num2 >> den2; Rational r1(num1, den1); Rational r2(num2, den2); cout << r1 << endl; cout << r2 << endl; cout << r1 + r2 << "\t" << r1 - r2 << "\t" << r1 * r2 << "\t" << r1 / r2 << endl; return 0; } ``` 输入格式为:两对分子和分母,分别代表两个有理数。 输出格式为:先输出两个有理数,然后输出它们的和、差、积、商,用制表符 `\t` 分隔开。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值