java中并未对有理数(说人话:分数)操作进行封装,而对于入门选手来说自己就能简单封装,建议理解后自己从头写到尾,能够很好的体会到Java中对于各种操作的封装是如何进行的。
说人话:老师让写的,教材上的。
本代码不同于教材,多注释,能让小白快速理解。
包结构如图
Denominator 就是我们要封装的分数类,类中应包含读取操作,加减乘除操作。
public class Denominator {
//分子
private int numerator = 1;
//分母
private int denominator = 1;
public int getNumerator() {
return numerator;
}
//设置分子分母(需要约分)
public void setNum(int numerator,int denominator) {
if(denominator == 0){
System.out.println("分母不能设置为0");
return;
}
if(numerator < 0 || denominator < 0){
System.out.println("分子分母暂不支持为负数");
return ;
}
int maxNum = maxNum(numerator,denominator);
//让分子分母同时除于最大公约数(约分)
numerator /= maxNum ;
denominator /= maxNum;
this.numerator = numerator;
this.denominator = denominator;
}
public int getDenominator() {
return denominator;
}
//求分子分母的最大公约数(约分需要用到)
public int maxNum(int num1,int num2){
//保证两数非负,不然运算不了
if(num1 < 0){
num1 = -num1;
}
if(num2 < 0 ){
num2 = -num2;
}
//保证第一个是大数
if(num1 < num2){
int temp = num1;
num1 = num2 ;
num2 = temp;
}
if(num1 == 0 || num2 == 0){
return 1;
}
int r = num1 % num2 ;
while(r != 0){
num1 = num2;
num2 = r;
r = num1 % num2 ;
}
return num2;
}
//加减乘除(返回一个分数类)
public Denominator yunsuan(Denominator d,int type){
//取出传进来的分子分母
int fenzi = d.numerator;
int fenmu = d.denominator;
//创建一个分数类存放相加后的分数值
Denominator denominator = new Denominator();
if(type == 1){
//传进来的值与本身的值相加(分母不变,分子相加)
//这里要考虑同分母和不同分母
//同分母直接分子相加
if(this.denominator == fenmu){
denominator.setNum(fenzi+this.numerator,this.denominator);
}else if(this.denominator != fenmu){
//不同分母先把分母变成相同的
denominator.setNum(fenzi*this.denominator+this.numerator*fenmu,this.denominator*fenmu);
}
}else if(type == 2){
//传进来的值与本身的值相减(分母不变,分子相减)
//同上
if(this.denominator == fenmu){
denominator.setNum(this.numerator-fenzi,this.denominator);
}else{
denominator.setNum(this.numerator*fenmu-fenzi*this.denominator,this.denominator*fenmu);
}
}else if(type == 3){
//传进来的值与本身的值相乘
denominator.setNum(fenzi*this.numerator,fenmu*this.denominator);
}else if(type == 4){
//传进来的值与本身的值相除(剩他的倒数)
denominator.setNum(this.numerator*fenmu,this.denominator*fenzi);
}
return denominator;
}
//重写输出方法(输出分数)
@Override
public String toString() {
if(this.numerator % this.denominator == 0){
return "该分数为 "+this.numerator / this.denominator;
}else if(this.numerator == 0){
return "该分数为 0";
}
return "该分数为 " +
this.numerator +
" / " + this.denominator;
}
}
再在Main类中使用 该分数类
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
//设置第一个分数
Denominator denominator = new Denominator();
System.out.println("请输入操作数分子 分母:(以空格隔开)");
int nume1 = scanner.nextInt();
int deno1 = scanner.nextInt();
denominator.setNum(nume1,deno1);
System.out.println("我要用这个分数运算了! "+denominator);
//设置第二个分数
Denominator d1 = new Denominator();
System.out.println("请输入被操作数分子 分母:(以空格隔开)");
int nume2 = scanner.nextInt();
int deno2 = scanner.nextInt();
d1.setNum(nume2,deno2);
System.out.println("被操作数为 "+d1);
System.out.println("-----------------------------------");
//相加
System.out.println("相加结果 "+denominator.yunsuan(d1,1));
//相减
System.out.println("相减结果 "+denominator.yunsuan(d1,2));
//相乘
System.out.println("相乘结果 "+denominator.yunsuan(d1,3));
//相除
System.out.println("相除结果 "+denominator.yunsuan(d1,4));
System.out.println("-----------------------------------");
}
}
运行结果:
总结:实际开发中很少涉及到对分数的操作,教材举例只是让刚接触的人员了解java内部是如何封装的,调用相关方法背后的代码逻辑。