Java分数类add/simplify方法、GCD计算问题排查与实现咨询
代码问题排查与修正
现存问题
- 类名不匹配:你定义的分数类名为
lab4Fraction,但测试代码中实例化的是Fraction类,会直接触发编译错误,统一类名即可解决。 add方法不符合需求:实验要求相加后返回新的Fraction对象作为结果,当前实现为void返回值,直接修改调用方法的对象本身的分数值,逻辑不符合要求。- 化简逻辑未生效:虽然实现了
simplify方法和GCD计算,但分数运算完成后从未调用该方法,无法自动约分为最简形式;同时原有GCD逻辑未处理负数场景,可能出现分母带负号的不规范输出。 - 输入校验不完善:输入分母为0时仅打印错误提示,没有做兜底处理,后续运算会触发除0异常。
- 测试逻辑错误:现有测试循环只会反复覆盖同一个分数对象的属性,从未调用
add方法执行累加操作,最终输出的只是最后一次输入的合法分数,完全没有验证加法功能。
关于构造函数的疑问
完全可以不手动编写构造函数实现所有功能。Java的类如果没有手动定义任何构造方法,编译器会自动生成一个无参的默认构造方法,你代码中写的new Fraction()就是调用这个默认构造。只要你不主动定义带参数的构造方法覆盖默认实现,不需要手动写构造函数。
修正后代码
Fraction分数类
import java.util.Scanner; public class Fraction { private int numerator; private int denominator; public void setNumerator(int num){ numerator = num; } public void setDenominator(int denominator) { if (denominator == 0) { System.out.println("Invalid denominator! Set to 1 by default."); this.denominator = 1; return; } this.denominator = denominator; } public void inputValues(){ Scanner keyboard = new Scanner(System.in); System.out.println("Enter numerator : "); numerator = keyboard.nextInt(); System.out.println("Enter denominator : "); denominator = keyboard.nextInt(); if(denominator == 0) { System.out.println("Invalid denominator! Set to 1 by default."); denominator = 1; } // 统一将负号放置在分子位 if (denominator < 0) { numerator = -numerator; denominator = -denominator; } } public void outputValues(){ System.out.print(this); } public int getNumerator(){ return numerator; } public int getDenominator(){ return denominator; } public Fraction add(Fraction fracNum){ Fraction res = new Fraction(); int newDenominator = this.denominator * fracNum.getDenominator(); int newNumerator = this.numerator * fracNum.getDenominator() + fracNum.getNumerator() * this.denominator; res.setNumerator(newNumerator); res.setDenominator(newDenominator); res.simplify(); return res; } public String toString() { return numerator + "/" + denominator; } private void simplify(){ int commonDivisor = GCD(numerator, denominator); numerator = numerator / commonDivisor; denominator = denominator / commonDivisor; if (denominator < 0) { numerator = -numerator; denominator = -denominator; } } private int GCD(int a, int b) { // 辗转相除法求最大公约数,取绝对值消除负数影响 a = Math.abs(a); b = Math.abs(b); int c; while (a != 0 && b != 0){ c = b; b = a % b; a = c; } return a + b; } }
测试类
public class lab4TestFraction { public static void main(String[] args) { // 初始化累加结果为0/1 Fraction result = new Fraction(); result.setNumerator(0); result.setDenominator(1); while(true){ Fraction inputFrac = new Fraction(); inputFrac.inputValues(); if(inputFrac.getNumerator() < 0){ break; } result = result.add(inputFrac); System.out.println("Current accumulated result: " + result); } System.out.print("Final result: "); result.outputValues(); } }
内容的提问来源于stack exchange,提问作者Sheng Yao
相关产品推荐
相关产品推荐

