Определите класс RealNumber (число без мнимой части) и определите методы в ComplexNumber, которые позволяют все вышеупомянутые операции со смесями RealNumbers и ComplexNumbers. Прокомментируйте и проверьте, как указано выше.
/**
* @author Ivan Zelenkov
* @version 1.0
* @since Feb 11, 2021
*
* A class which defines complex numbers
*/
public class ComplexNumber{
// The instance variables a and b representing the real parts of the complex number
private float a;
private float b;
/**
* Create a complex number by float variables a and b
* @param a real number 1, 12.38, -0.8625, 3/4, sqrt(2), 1998
* @param b imaginary number sqrt(-1)
*/
public ComplexNumber(float a, float b){
this.a = a;
this.b = b;
}
/**
* Addition method
* @param otherNumber object of ComplexNumber, contain two numbers of type float
* @return complex number after adding
*/
public ComplexNumber add(ComplexNumber otherNumber){
ComplexNumber newComplex;
// formula (a + c) + (b + d)
// newA means the first part of the complex number
float newA = a + otherNumber.getA();
// newB means the second part of the complex number
float newB = b + otherNumber.getB();
// assign the result of newA and newB to the newComplex object
newComplex = new ComplexNumber(newA, newB);
// returns the complex number
return newComplex;
}
/**
* Subtraction method
* @param otherNumber object of ComplexNumber, contain two numbers of type float
* @return complex number after subtracting
*/
public ComplexNumber subtract(ComplexNumber otherNumber) {
ComplexNumber newComplex;
// formula to get a complex number (a - c) + (b - d)
float newA = a - otherNumber.getA();
float newB = b - otherNumber.getB();
newComplex = new ComplexNumber(newA, newB);
return newComplex;
}
/**
* Multiplication method
* @param otherNumber object of ComplexNumber, contain two numbers of type float
* @return complex number after multiplication
*/
public ComplexNumber multiply(ComplexNumber otherNumber) {
ComplexNumber newComplex;
// formula to get a complex number (a*c + b*d) + (b*c + a*d)
float newA = (a * otherNumber.getA() - b * otherNumber.getB());
float newB = (b * otherNumber.getA() + a * otherNumber.getB());
newComplex = new ComplexNumber(newA, newB);
return newComplex;
}
/**
* Division method
* @param otherNumber object of ComplexNumber, contain two numbers of type float
* @return complex number after dividing
*/
public ComplexNumber divide(ComplexNumber otherNumber) {
ComplexNumber newComplex;
// formula to get a complex number (a*c + b*d)/(c^2 + d^2) + (b*c + a*d)/(c^2+d^2)
float newA = ((a * otherNumber.getA() + b * otherNumber.getB())/(otherNumber.getA()*otherNumber.getA() + otherNumber.getB()*otherNumber.getB()));
float newB = ((b * otherNumber.getA() - a * otherNumber.getB())/(otherNumber.getA()*otherNumber.getA() + otherNumber.getB()*otherNumber.getB()));
newComplex = new ComplexNumber(newA, newB);
return newComplex;
}
/**
* Return a representation of the float a
* @return a representation of the float a
*/
public float getA() {
return a;
}
/**
* Return a representation of the float b
* @return a representation of the float b
*/
public float getB() {
return b;
}
/**
* Override method, to check if the object is an instance of ComplexNumber class
* {@inheritDoc}
* @return boolean result if the object instance of ComplexNumber class
*/
@Override
public boolean equals(Object o) {
// the object must equals () to itself
if (this == o) return true;
// if object is not instance of ComplexNumber class, method will return false
if (!(o instanceof ComplexNumber)) return false;
ComplexNumber that = (ComplexNumber) o;
// function call to compare two float values
return Float.compare(that.getA(), getA()) == 0 &&
Float.compare(that.getB(), getB()) == 0;
}
/**
* Return a string representing the complex number in formatted style
*
* @return return a string representing the complex number.
*/
@Override
public String toString() {
// return a formatted string and at the end add i to represent complex number
return String.format("%.1f + %.1fi", a, b);
}
Тестер
import static org.junit.Assert.*;
import org.junit.*;
/**
* Class tests addition, subtraction, multiplication, division to get a complex number
*/
public class ComplexNumberTest {
/**
* @param number1-10 objects of ComplexNumber class, which will contain two arguments of type float
* @param sum1-10 objects that will accept the result of a mathematical calculation between two objects
*/
ComplexNumber number1, number2, number3, number4, number5, number6, number7, number8, number9, number10;
ComplexNumber sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8, sum9, sum10;
/**
* Method setup two float numbers as arguments into object of ComplexNumber class
*/
@Before
public void setup() {
number1 = new ComplexNumber(10, 3);
number2 = new ComplexNumber(9, 8);
number3 = new ComplexNumber(5, -7);
number4 = new ComplexNumber(4, -3);
number5 = new ComplexNumber(0, 0);
number6 = new ComplexNumber(1, -10);
number7 = new ComplexNumber(-11, -11);
number8 = new ComplexNumber(2, 7.7f);
number9 = new ComplexNumber(-8, 5);
number10 = new ComplexNumber(0, -5);
}
/**
* Method add arguments of two objects among themselves.
* Each object contains two arguments of type float and assign the result to the sum(1-10) object
* After that, the result of the complex number is checked for validity.
*/
@Test
public void testAdd() {
try {
sum1 = number1.add(number2);
sum2 = number2.add(number3);
sum3 = number3.add(number4);
sum4 = number4.add(number5);
sum5 = number1.add(number5);
sum6 = number5.add(number6);
sum7 = number6.add(number7);
sum8 = number7.add(number8);
sum9 = number8.add(number9);
sum10 = number9.add(number10);
assertEquals("19.0 + 11.0i", sum1.toString());
assertEquals("14.0 + 1.0i", sum2.toString());
assertEquals("9.0 + -10.0i", sum3.toString());
assertEquals("4.0 + -3.0i", sum4.toString());
assertEquals("10.0 + 3.0i", sum5.toString());
assertEquals("1.0 + -10.0i", sum6.toString());
assertEquals("-10.0 + -21.0i", sum7.toString());
assertEquals("-9.0 + -3.3i", sum8.toString());
assertEquals("-6.0 + 12.7i", sum9.toString());
assertEquals("-8.0 + 0.0i", sum10.toString());
} catch (ArithmeticException e) {
System.out.println("Subtracting complex numbers is wrong!");
}
}
/**
* Method subtract arguments of two objects among themselves.
* Each object contains two arguments of type float and assign the result to the sum(1-10) object
* After that, the result of the complex number is checked for validity.
*/
@Test
public void testSubtract() {
try {
sum1 = number1.subtract(number2);
sum2 = number2.subtract(number3);
sum3 = number3.subtract(number4);
sum4 = number4.subtract(number5);
sum5 = number1.subtract(number5);
sum6 = number5.subtract(number6);
sum7 = number6.subtract(number7);
sum8 = number7.subtract(number8);
sum9 = number8.subtract(number9);
sum10 = number9.subtract(number10);
assertEquals("1.0 + -5.0i", sum1.toString());
assertEquals("4.0 + 15.0i", sum2.toString());
assertEquals("1.0 + -4.0i", sum3.toString());
assertEquals("4.0 + -3.0i", sum4.toString());
assertEquals("10.0 + 3.0i", sum5.toString());
assertEquals("-1.0 + 10.0i", sum6.toString());
assertEquals("12.0 + 1.0i", sum7.toString());
assertEquals("-13.0 + -18.7i", sum8.toString());
assertEquals("10.0 + 2.7i", sum9.toString());
assertEquals("-8.0 + 10.0i", sum10.toString());
} catch (ArithmeticException e) {
System.out.println("Adding complex numbers is wrong");
}
}
/**
* Method multiply arguments of two objects among themselves.
* Each object contains two arguments of type float and assign the result to the sum(1-10) object
* After that, the result of the complex number is checked for validity.
*/
@Test
public void testMultiply() {
try {
sum1 = number1.multiply(number2);
sum2 = number2.multiply(number3);
sum3 = number3.multiply(number4);
sum4 = number4.multiply(number5);
sum5 = number1.multiply(number5);
sum6 = number5.multiply(number6);
sum7 = number6.multiply(number7);
sum8 = number7.multiply(number8);
sum9 = number8.multiply(number9);
sum10 = number9.multiply(number10);
assertEquals("66.0 + 107.0i", sum1.toString());
assertEquals("101.0 + -23.0i", sum2.toString());
assertEquals("-1.0 + -43.0i", sum3.toString());
assertEquals("0.0 + 0.0i", sum4.toString());
assertEquals("0.0 + 0.0i", sum5.toString());
assertEquals("0.0 + 0.0i", sum6.toString());
assertEquals("-121.0 + 99.0i", sum7.toString());
assertEquals("62.7 + -106.7i", sum8.toString());
assertEquals("-54.5 + -51.6i", sum9.toString());
assertEquals("25.0 + 40.0i", sum10.toString());
} catch (ArithmeticException e) {
System.out.println("Multiplication of complex numbers is wrong");
}
}
/**
* Method divide arguments of two objects among themselves.
* Each object contains two arguments of type float an assign the result to the sum(1-10) object.
* After that, the result of the complex number is checked for validity.
*
*/
@Test
public void testDivide() {
try {
sum1 = number1.divide(number2);
sum2 = number2.divide(number3);
sum3 = number3.divide(number4);
sum4 = number4.divide(number5);
sum5 = number1.divide(number5);
sum6 = number5.divide(number6);
sum7 = number6.divide(number7);
sum8 = number7.divide(number8);
sum9 = number8.divide(number9);
sum10 = number9.divide(number10);
assertEquals("0.8 + -0.4i", sum1.toString());
assertEquals("-0.1 + 1.4i", sum2.toString());
assertEquals("1.6 + -0.5i", sum3.toString());
assertEquals("NaN + NaNi", sum4.toString());
assertEquals("NaN + NaNi", sum5.toString());
assertEquals("0.0 + 0.0i", sum6.toString());
assertEquals("0.4 + 0.5i", sum7.toString());
assertEquals("-1.7 + 1.0i", sum8.toString());
assertEquals("0.3 + -0.8i", sum9.toString());
assertEquals("-1.0 + -1.6i", sum10.toString());
} catch (ArithmeticException e) {
System.out.println("Division of complex numbers is wrong");
}
}
}