Solution: TDD
Completion requirements
At first the developing of the unit test:
@Test void reduceTest() { Fraction f0 = new Fraction(2, 4); f0.reduce(); assertEquals(1, f0.getNumerator()); assertEquals(2, f0.getDenominator()); Fraction f1 = new Fraction(18, 9); f1.reduce(); assertEquals(2, f1.getNumerator()); assertEquals(1, f1.getDenominator()); Fraction f2 = new Fraction(3, -9); f2.reduce(); assertEquals(1, f2.getNumerator()); assertEquals(-3, f2.getDenominator()); Fraction f3 = new Fraction(-3, -8); // irreducible f3.reduce(); assertEquals(-3, f3.getNumerator()); assertEquals(-8, f3.getDenominator()); }
Unit test tests negative and positive fractions with all variations of numerator and denominator
The method itself:
public void reduce() { double maxFactor, factor;
if (Math.abs(numerator) >= Math.abs(denominator)) // get maximum factor maxFactor = Math.abs(denominator); else maxFactor = Math.abs(numerator);
for (factor = 2; factor <= maxFactor; factor++) // reduce
while (numerator % factor == 0 && denominator % factor == 0) { numerator /= factor; // numerator = numerator / factor; denominator /= factor; } }
}
/* public void reduce() // another solution from the web { // http://www.linux-related.de/index.html?/coding/alg_euklid.htm double u = Math.abs(numerator), v = Math.abs(denominator), tmp; while (u > 0) { tmp = u; u = v % u; v = tmp; } numerator /= v; denominator /= v; } */
Two variations of method reduce(). The second variation also works fine with floating point numerator and denominater.
The modified event handler in controller.java
public class Controller { ... private void handleButtonAction(ActionEvent event) { // Event handler referenced in fxml file Double numerator = Double.parseDouble(inputTextFieldNum.getText()); Double denominator = Double.parseDouble(inputTextFieldDenom.getText()); Fraction fraction = new Fraction(numerator, denominator); // Separation of GUI and logic layer outputTextField.setText(Double.toString(fraction.quotient())); fraction.reduce(); inputTextFieldNum.setText(Double.toString(fraction.getNumerator())); inputTextFieldDenom.setText(Double.toString(fraction.getDenominator())); } }
The fraction is reduced after calculation of quotient.
Last modified: Tuesday, 11 June 2019, 12:08 AM