Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Write a class called RationalNumber that represents a fraction with an integer numerator and denominator. A RationalNumber object should have the following methods: public RationalNumber(int

Write a class called RationalNumber that represents a fraction with an integer numerator and denominator. A RationalNumber object should have the following methods:

public RationalNumber(int numerator, int denominator) Constructs a new rational number to represent the ratio (numerator/denominator). The denominator cannot be 0, so throw an IllegalArgumentException if 0 is passed.

public RationalNumber() Constructs a new rational number to represent the ratio (0/1).

public int getDenominator() Returns this rational numbers denominator value; for example, if the ratio is (3/5), returns 5.

public int getNumerator() Returns this rational numbers numerator value; for example, if the ratio is (3/5), returns 3.

public String toString() Returns a String representation of this rational number, such as "3/5". You may wish to omit denominators of 1, returning "4" instead of "4/1".

public boolean equals(Object other) Returns true if this and other are equivalent RationalNumbers

public RationalNumber add(RationalNumber other) Returns rational number that is this + other.

public RationalNumber subtract(RationalNumber other) Returns rational number that is this - other.

public RationalNumber multiply(RationalNumber other) Returns rational number that is this * other.

public RationalNumber divide(RationalNumber other) Returns rational number that is this / other.

Your RationalNumber objects should always be in reduced form, avoiding rational numbers such as 3/6 in favor of 1/2, or avoiding 2/3 in favor of 2/3. This may require the implementation of another method. Consider the Greatest Common Divisor (GCD) definition given in BJP4 Exercise 5.2: The GCD of two integers a and b is the largest integer that is a factor of both a and b. One efficient way to compute the GCD of two numbers is to use Euclids algorithm, which states the following:

GCD (a, b) = GCD (b, a % b) GCD (a, 0) = Absolute value of a

Use RationalNumberTest.java below to test your code. You will likely want to add additional tests.

import org.junit.Before; import org.junit.Test;

import junit.framework.TestCase;

//TODO: Javadoc public class RationalNumberTest extends TestCase {

private RationalNumber quarter; private RationalNumber quarterNeg; private RationalNumber twoOverEight; private RationalNumber third; private RationalNumber half; private RationalNumber three;

@Before public void setUp() { quarter = new RationalNumber(1, 4); quarterNeg = new RationalNumber(1, -4); twoOverEight = new RationalNumber(2, 8); third = new RationalNumber(1, 3); half = new RationalNumber(1, 2); three = new RationalNumber(6, 2); }

@Test public void testConstructor() { RationalNumber def = new RationalNumber(); assertEquals("Default consturctor getter", 0, def.getNumerator()); assertEquals("Default consturctor getter", 1, def.getDenominator()); try { new RationalNumber(3, 0); fail("Didn't throw exception when denominator 0"); } catch (IllegalArgumentException e) { assertEquals("Message for IllegalArgumentException for denominator 0", e.getMessage(), "Denominator is 0"); } }

@Test public void testGetters() {

assertEquals("quarter getNumerator", 1, quarter.getNumerator()); assertEquals("quarter getDenominator", 4, quarter.getDenominator());

assertEquals("twoOverEight getNumerator", 1, twoOverEight.getNumerator()); assertEquals("twoOverEight getDenominator", 4, twoOverEight.getDenominator());

assertEquals("quarterNeg getNumerator", -1, quarterNeg.getNumerator()); assertEquals("quarterNeg getDenominator", 4, quarterNeg.getDenominator());

assertEquals("third getNumerator", 1, third.getNumerator()); assertEquals("third getDenominator", 3, third.getDenominator());

assertEquals("half getNumerator", 1, half.getNumerator()); assertEquals("half getDenominator", 2, half.getDenominator());

assertEquals("three getNumerator", 3, three.getNumerator()); assertEquals("three getDenominator", 1, three.getDenominator()); }

@Test public void testToString() { assertEquals("quarter toString", "1/4", quarter.toString()); assertEquals("quarterNeg toString", "-1/4", quarterNeg.toString()); assertEquals("twoOverEight toString", "1/4", twoOverEight.toString()); assertEquals("third toString", "1/3", third.toString()); assertEquals("half toString", "1/2", half.toString()); assertEquals("three toString", "3", three.toString()); }

@Test public void testAdd() { String desc = "quarter.add(twoOverEight)"; RationalNumber exp = half; RationalNumber act = quarter.add(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.add(twoOverEight)"; exp = new RationalNumber(); act = quarterNeg.add(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.add(third)"; exp = new RationalNumber(7, 12); act = quarter.add(third); assertEquals(desc, exp, act);

desc = "quarter.add(half)"; exp = new RationalNumber(3, 4); act = quarter.add(half); assertEquals(desc, exp, act);

// Running tests twice to make sure not modifying the objects

desc = "quarter.add(twoOverEight)"; exp = half; act = quarter.add(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.add(twoOverEight)"; exp = new RationalNumber(); act = quarterNeg.add(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.add(third)"; exp = new RationalNumber(7, 12); act = quarter.add(third); assertEquals(desc, exp, act);

desc = "quarter.add(half)"; exp = new RationalNumber(3, 4); act = quarter.add(half); assertEquals(desc, exp, act); }

@Test public void testSubtract() {

String desc = "quarter.subtract(twoOverEight)"; RationalNumber exp = new RationalNumber(); RationalNumber act = quarter.subtract(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.subtract(twoOverEight)"; exp = new RationalNumber(1, -2); act = quarterNeg.subtract(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.subtract(third)"; exp = new RationalNumber(-1, 12); act = quarter.subtract(third); assertEquals(desc, exp, act);

desc = "quarter.subtract(half)"; exp = new RationalNumber(-1, 4); act = quarter.subtract(half); assertEquals(desc, exp, act);

// Running tests twice to make sure not modifying the objects

desc = "quarter.subtract(twoOverEight)"; exp = new RationalNumber(); act = quarter.subtract(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.subtract(twoOverEight)"; exp = new RationalNumber(1, -2); act = quarterNeg.subtract(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.subtract(third)"; exp = new RationalNumber(-1, 12); act = quarter.subtract(third); assertEquals(desc, exp, act);

desc = "quarter.subtract(half)"; exp = new RationalNumber(-1, 4); act = quarter.subtract(half); assertEquals(desc, exp, act); }

@Test public void testMultiply() {

String desc = "quarter.multiply(twoOverEight)"; RationalNumber exp = new RationalNumber(1, 16); RationalNumber act = quarter.multiply(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.multiply(twoOverEight)"; exp = new RationalNumber(-1, 16); act = quarterNeg.multiply(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.multiply(third)"; exp = new RationalNumber(1, 12); act = quarter.multiply(third); assertEquals(desc, exp, act);

desc = "quarter.multiply(half)"; exp = new RationalNumber(1, 8); act = quarter.multiply(half); assertEquals(desc, exp, act);

// Running tests twice to make sure not modifying the objects

desc = "quarter.multiply(twoOverEight)"; exp = new RationalNumber(1, 16); act = quarter.multiply(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.multiply(twoOverEight)"; exp = new RationalNumber(-1, 16); act = quarterNeg.multiply(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.multiply(third)"; exp = new RationalNumber(1, 12); act = quarter.multiply(third); assertEquals(desc, exp, act);

desc = "quarter.multiply(half)"; exp = new RationalNumber(1, 8); act = quarter.multiply(half); assertEquals(desc, exp, act); }

@Test public void testDivide() {

String desc = "quarter.divide(twoOverEight)"; RationalNumber exp = new RationalNumber(1, 1); RationalNumber act = quarter.divide(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.divide(twoOverEight)"; exp = new RationalNumber(-1, 1); act = quarterNeg.divide(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.divide(third)"; exp = new RationalNumber(3, 4); act = quarter.divide(third); assertEquals(desc, exp, act);

desc = "quarter.divide(half)"; exp = new RationalNumber(1, 2); act = quarter.divide(half); assertEquals(desc, exp, act);

// Running tests twice to make sure not modifying the objects desc = "quarter.divide(twoOverEight)"; exp = new RationalNumber(1, 1); act = quarter.divide(twoOverEight); assertEquals(desc, exp, act);

desc = "quarterNeg.divide(twoOverEight)"; exp = new RationalNumber(-1, 1); act = quarterNeg.divide(twoOverEight); assertEquals(desc, exp, act);

desc = "quarter.divide(third)"; exp = new RationalNumber(3, 4); act = quarter.divide(third); assertEquals(desc, exp, act);

desc = "quarter.divide(half)"; exp = new RationalNumber(1, 2); act = quarter.divide(half); assertEquals(desc, exp, act);

// Testing divide by zero

try { quarter.divide(new RationalNumber(0, 4)); fail("Didn't throw exception when dividing 0"); } catch (IllegalArgumentException e) { assertEquals("Message for IllegalArgumentException for dividing by 0", e.getMessage(), "Denominator is 0"); } }

@Test public void testEquals() { String desc = "quarter.equals(twoOverEight)"; boolean actB = quarter.equals(twoOverEight); assertTrue(desc, actB);

desc = "quarterNeg.equals(new RationalNumber(-1, 4)"; actB = quarterNeg.equals(new RationalNumber(-1, 4)); assertTrue(desc, actB);

desc = "three.equals(new RationalNumber(-3,-1)"; actB = three.equals(new RationalNumber(-3, -1)); assertTrue(desc, actB);

desc = "quarter.equals(third)"; actB = quarter.equals(third); assertFalse(desc, actB);

desc = "quarter.equals(half)"; actB = quarter.equals(half); assertFalse(desc, actB);

desc = "quarter.equals(String)"; actB = quarter.equals("Hello"); assertFalse(desc, actB);

desc = "third.equals(new RationalNumber(2, 3)"; actB = third.equals(new RationalNumber(2, 3)); assertFalse(desc, actB);

desc = "quarter.equals(null)"; actB = quarter.equals(null); assertFalse(desc, actB); }

}

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Oracle Database 19c DBA By Examples Installation And Administration

Authors: Ravinder Gupta

1st Edition

B09FC7TQJ6, 979-8469226970

More Books

Students also viewed these Databases questions

Question

1. Signs and symbols of the map Briefly by box ?

Answered: 1 week ago

Question

Types of physical Maps?

Answered: 1 week ago

Question

Explain Intermediate term financing in detail.

Answered: 1 week ago

Question

Provide examples of Dimensional Tables.

Answered: 1 week ago