Methods and Arrays
COMP167
due Thursday, October 20, 2022
The Java standard class library provides a variety of classes. Some of these
classes, such as the Math and Arrays class, provide various class methods which
perform common tasks. Your task for this assignment will consist of writing
classes that provide methods which are similar to those provided by the Math
and Arrays classes, therefore allowing you to gain some insight on how these
two classes work.
1 Note the following:
1. You do NOT have to write a main() method in any of the classes you are
required to write for this assignment; instead, you can test your methods
using the provided test programs.
2. In addition, NONE of the methods that you are required to write for this
assignment read input from the keyboard or display output to the screen.
3. The methods you are required to write for this assignment MUST call
the other methods you are required to write for this assignment whenever
doing so is useful. , you MUST NOT call any method defined in the
Math or Arrays classes to complete this assignment.
2 Re-implementing the Math class
The Math class, which is part of the Java standard class library, provides var-
ious class methods that perform common calculations, such as trigonometric
functions.
Write a public class called yourusername MyMath, which provides some
of the functionality which is also provided by the Math class. This class should
define the public and static methods described below:
1. A method called toDegrees(), which takes as its only parameter a value of
type double, and returns a value of type double. The parameter represents
an angle expressed in radians, and the value returned by the method
1
represents the same angle, but expressed in degrees (360 degrees = 2⇡
radians). For example, suppose the following method call is executed:
double degrees = yourusername MyMath.toDegrees(3.141592653589793);
After the execution of the above method call, the value stored in variable
degrees will be (approximately) 180.0, as 3.141592653589793 radians is
equivalent to 180 degrees. You MUST use 3.141592653589793 as a value
for ⇡.
2. A method called toRadians(), which takes as its only parameter a value of
type double, and returns a value of type double. The parameter represents
an angle expressed in degrees, and the value returned by the method
represents the same angle, but expressed in radians (again, 360 degrees =
Radians to degree 2⇡ radians). For example, suppose the following method call is executed:
vice versa double radians = yourusername MyMath.toRadians(180.0);
After the execution of the above method call, the value stored in vari-
able radians will be (approximately) 3.141592653589793, as 180 degrees is
equivalent to 3.141592653589793 radians. Again, you MUST use 3.141592653589793
as a value for ⇡.
3. A method called absoluteValue(), which takes as its only parameter a
value of type double, and returns a value of type double. The parameter
Absolute value = represents an arbitrary number, and the value returned by the method
distance from0 represents the absolute value of this arbitrary number. The absolute value
of a number x, denoted |x|, is x if x is greater than or equal to 0, and x if x
is less than 0. For example, suppose the following method call is executed:
double value = yourusername MyMath.absoluteValue(-42.0);
After the execution of the above method call, the value stored in variable
value will be 42.0, as the absolute value of 42 is 42.
4. A method called minimum(), which takes as parameters two values of
type double, and returns a value of type double. The parameters represent
two arbitrary numbers, and the value returned by this method represents
the smaller of these two arbitrary numbers; if the two numbers are equal,
then the method may return either of the two. For example, suppose the
following method call is executed:
double min = yourusername MyMath.minimum(1.0, 2.0);
After the execution of the above method call, the value stored in variable
min will be 1.0, as 1 is less than 2.
2
5. A method called maximum(), which takes as parameters two values of
type double, and returns a value of type double. The parameters represent
two arbitrary numbers, and the value returned by this method represents
the larger of these two arbitrary numbers; if the two numbers are equal,
then the method may return either of the two. For example, suppose the
following method call is executed:
double max = yourusername MyMath.maximum(1.0, 2.0);
After the execution of the above method call, the value stored in variable
min will be 2.0, as 2 is greater than 1.
6. A method called power(), which takes as parameters a value of type dou-
ble followed by a value of type int, and returns a value of type double. The
double parameter represents an arbitrary base a, the int parameter rep-
resents a non-negative exponent b, and the value returned by the method
represents ab . For example, suppose the following method call is executed:
double x = yourusername MyMath.power(1.5, 4);
After the execution of the above method call, the value stored in variable
x will be 5.0625, as 1.54 = 5.0625. You MAY assume that the value of
the int parameter is greater than or equal to 0; in other words, you do not
have to handle cases where the value of the int parameter is negative.
7. A method called root(), which takes as parameters a value of type double
followed by a value of type int, and returns a value of type double. The
double parameter represents an arbitrary number n, the int parameter
represents a positive root r, and p
the value returned by the method repre-
sents the rth root of n, denoted r n. For example, suppose the following
method call is executed:
double x = yourusername MyMath.root(5.0625, 4);
After the execution
p of the above method call, the value stored in variable
x will be 1.5, as 5.0625 = 1.5 (1.54 = 5.0625).
4
To calculate the rth root of n, where r is an integer and n is a real number,
you can use the following algorithm:
• Start with a guess g of 1
• Calculate g0 using the following formula:
gr n
g0 = g
rg r 1
p
If |g0 g| < 10 10 then g0 ⇡ r n. Otherwise, set the new value of g
to be the current value of g0 and repeat this step.
3 approximate
You MAY assume that the value of the int parameter is greater than
or equal to 1, and that the double parameter is greater than or equal to
0.0; in other words, you do not have to handle cases where the value of
the int parameter is negative or 0, or cases where the value of the double
parameter is negative.
8. A method called gcd(), which takes as parameters two values of type int,
and returns a value of type int. The int parameters represent arbitrary
positive integers, and the value returned by the method represents the
greatest common divisor of the two int parameters (that is, the largest
positive integer which is a divisor of both int parameters). For example,
suppose the following method call is executed:
double divisor =yourusername MyMath.gcd(24, 18);
After the execution of the above method call, the value stored in variable
divisor will be 6, as 6 is the largest positive integer which divides both 24
and 18 without remainder. The greatest common divisor of two positive
integers a and b, denoted gcd(a, b), can be computed using the following
algorithm:
• If b = 0, then gcd(a, b) = a; conversely, if a = 0, then gcd(a, b) = b.
• Otherwise, gcd(a, b) = gcd(b, a mod b)
You MAY assume that the values of both int parameters are positive; in
other words, you do not have to handle cases where the value either int
parameter is negative.
9. A method called lcm(), which takes as parameters two values of type int,
and returns a value of type int. The int parameters represent arbitrary
positive integers, and the value returned by the method represents the
least common multiple of the two int parameters (that is, the smallest
positive integer which is a multiple of both int parameters). For example,
suppose the following method call is executed:
double multiple = yourusername MyMath.lcm(4, 6);
After the execution of the above method call, the value stored in variable
multiple will be 12, as 12 is the smallest positive integer which is a multiple
of both 4 and 6. The least common multiple of two positive integers a and
b, denoted lcm(a, b), can be calculated using the following formula:
ab
lcm(a, b) =
gcd(a, b)
You MAY assume that the values of both int parameters are positive; in
other words, you do not have to handle cases where the value either int
parameter is negative.
4
10. A method called sine(), which takes as its only parameter a value of type
double, and returns a value of type double. The parameter represents
an angle expressed in radians, and the value returned by the method
represents the trigonometric sine of this angle. For example, suppose the
following method call is executed:
double sin = yourusername MyMath.sine(1.047197551);
After the execution of the above method call, the value stored in variable
sin will be (approximately) 0.866025404, as the sine of 1.047197551 radians
is approximately 0.866025404.
The sine of an angle x, denoted sin x, can be calculated using the following
algorithm:
• If x < -⇡, repeatedly add 2⇡ to x until -⇡ x ⇡. Conversely, if x
> ⇡, repeatedly subtract 2⇡ from x until -⇡ x ⇡. You MUST
use 3.141592653589793 as a value for ⇡.
• Calculate sin x using the following formula:
n
X
sinx = ti = t0+t1 +t2 +...+tn
i=0
where t0 = x. To calculate the other terms in the sum, we use the following
formula:
x2
ti+1 = ti ⇥
(2i + 3)(2i + 2)
where ti isanarbitraryterm, andti+1 isthenextterm.F orexample :
x2
t1 = t 0 ⇥
(2 ⇥ 0 + 3)(2 ⇥ 0 + 2)
x2
t2 = t 1 ⇥
(2 ⇥ 1 + 3)(2 ⇥ 1 + 2)
x2
t3 = t 2 ⇥
(2 ⇥ 2 + 3)(2 ⇥ 2 + 2)
and so on. The last term in this sum, tn , will be the first term whose absolute
value is less than 10 10 .
5
11. A method called cosine(), which takes as its only parameter a value of
type double, and returns a value of type double. The parameter represents an
angle expressed in radians, and the value returned by the method represents the
trigonometric cosine of this angle. For example, suppose the following method
call is executed:
double cos = yourusername MyMath.cosine(1.047197551);
After the execution of the above method call, the value stored in variable cos will
be (approximately) 0.5, as the cosine of 1.047197551 radians is approximately
0.5. The cosine of an angle x, denoted cos x, can be calculated using the same
algorithm as the one used to calculate the sine of an angle x, except that when
calculating the cos x, t0 = 1 and the formula to calculate the next term from
the current term is:
x2
ti+1 = ti ⇥
(2i + 2)(2i + 1)
12. A method called tangent(), which takes as its only parameter a value of
type double, and returns a value of type double. The parameter represents an
angle expressed in radians, and the value returned by the method represents the
trigonometric tangent of this angle. For example, suppose the following method
call is executed:
double tan = yourusername MyMath.tangent(1.047197551);
After the execution of the above method call, the value stored in variable tan
will be (approximately) 1.732050807, as the tangent of 1.047197551 radians is
approximately 1.732050807. The tangent of an angle x, denoted tan x, can be
calculated using the following formula:
tanx = sinx/cosx
A test program is provided so that you can verify that your methods work
properly. This test program consists of a single class called MyMathTest, and
is saved in a file called MyMathTest.java. Save your class in a file called My-
Math.java, and submit this file to myCourses. You MUST NOT submit the
MyMathTest.java file.
3 Re-implementing the Array class
The Arrays class, which is also part of the Java standard class library, provides
various class methods that perform common tasks on arrays, such as searching
and sorting.
Write a public class called yourusername MyArrays, which provides some of
the functionality which is also provided by the Arrays class. This class should
define the public and static methods described below:
6
1. A method called linearSearch(), which takes as parameters an array of
int followed by three values of type int, and returns a value of type int. The
first int parameter represents a key, the second int parameter represents a
starting position, and the third int parameter represents an end position.
If the key occurs in the array between the start position (inclusive) and
the end position (exclusive), the method returns the position of the first
occurrence of the key in that range; otherwise, the method returns -1. For
example, suppose the following method call is executed:
int[] myArray = 4, 5, 6, 5, 7, 1, 5, 9;
yourusername MyArrays.linearSearch(myArray, 5, 2, 7);
After the execution of the above method call, the value stored in variable
position will be 3, as the first occurrence of 5 in myArray between positions
2 (inclusive) and 7 (exclusive) is at position 3.
The values stored in the array can appear in any order. You MAY assume
that the parameter values satisfy all of the following preconditions:
• The value of the starting position is greater than or equal to 0, and
less than the size of the array.
• The value of the end position is greater than or equal to 0, and less
than or equal to the size of the array.
• The value of the start position is less than or equal to the value of
the end position
.
• The array parameter is not a null reference.
In other words, your method does not have to handle cases where one or
more of the above conditions are not satisfied.
2. A method called linearSearch(), which takes as parameters an array of
2 linear search = int followed by a single value of type int, and returns a value of type int.
overloading The single int parameter represents a key; if this key occurs anywhere in
the array, the method returns the position of the first occurrence of the
key in the array; otherwise, the method returns -1. For example, suppose
the following method call is executed:
int[] myArray = 4, 5, 6, 5, 7, 1, 5, 9;
int position = yourusername MyArrays.linearSearch(myArray, 5);
After the execution of the above method call, the value stored in variable
position will be 1, as the first occurrence of 5 in the array myArray is at
position 1.
7
The values stored in the array can appear in any order. You MAY as-
sume that the array parameter is not a null reference; in other words,
your method does not have to handle cases where the above condition is
not satisfied.
3. A method called equals(), which takes as parameters two arrays of int
and returns a value of type boolean. This boolean value is true if the
two parameter arrays are equal, false otherwise. Two arrays are equal if
Check length and only if they contain the same elements in the same order; that is, in
order for two arrays to be equal, they must contain the same number of
rst elements, and for every valid position i in these arrays, the value stored at
• if yes then position i in the first array must be equal to the value stored at position i
iterate and in the second array. Note that if both arrays are null references, they are
compare each also considered equal. For example, suppose the following method call is
executed:
element
int[] left = 1, 3, 3;
int[] right = 1, 3, 3;
boolean same = yourusername MyArrays.equals(left, right);
After the execution of the above method call, the value stored in variable
same will be true, as arrays left and right contain the same values in the
same order. Your method MUST correctly handle the case where one of
the two parameter arrays is a null reference, but not the other.
4. A method called fill(), which takes as parameters an array of int followed
by three values of type int, and returns nothing. The first parameter rep-
resents an arbitrary value, the second int parameter represents a starting
position, and the third int parameter represents an end position. The
method then assigns a value equal to the first int parameter to each ele-
Fills array based ment of the array whose position is between the starting position (inclu-
on index and sive) and the end position (exclusive). For example, suppose the following
another that lls method call is executed:
the array int[] myArray = 2, 3, 5, 7, 11, 13, 17, 19;
yourusername MyArrays.fill(myArray, 0, 2, 6);
After the execution of the above method call, the contents of the array
whose address is stored in variable myArray will be 2, 3, 0, 0, 0, 0, 17, 19,
as every element whose position is between 2 (inclusive) and 6 (exclusive)
is replaced with a 0. Note that if the starting position is equal to the
end position, then none of the values stored in the array are changed.
You MAY assume that the parameter values satisfy all of the following
preconditions:
• The value of the starting position is greater than or equal to 0, and
less than the size of the array.
8
• The value of the end position is greater than or equal to 0, and less
than or equal to the size of the array.
• The value of the start position is less than or equal to the value of
the end position.
• The array parameter is not a null reference.
In other words, your method does not have to handle cases where one or
more of the above conditions are not satisfied.
5. A method called fill(), which takes as parameters an array of int followed
by a single value of type int, and returns nothing. The method then assigns
a value equal to the first int parameter to each element in the array. For
example, suppose the following method call is executed:
int[] myArray = 2, 3, 5, 7, 11, 13, 17, 19;
yourusername MyArrays.fill(myArray, 0);
After the execution of the above method call, the contents of the array
whose address is stored in variable myArray will be 0, 0, 0, 0, 0, 0, 0, 0,
as every element in the array is replaced with a 0.
You MAY assume that the array parameter is not a null reference; in
other words, your method does not have to handle cases where the above
condition is not satisfied.
6. A method called copyOf (), which takes as parameters an array of int
followed by two values of type int, and returns an array of int. The first
int parameter represents a starting position, and the third int parameter
represents an end position. This method creates a new array, and copies all
elements of the parameter array whose positions are between the starting
index (inclusive) and the end index (exclusive) so that the order in which
the values appear in the new array is the same as the order in which
they appear in the parameter array. For example, suppose the following
method call is executed:
int[] myArray = 2, 3, 5, 7, 11, 13, 17, 19;
int[] copy = yourusername MyArrays.copyOf(myArray, 2, 6);
After the execution of the above method call, the contents of the array
whose address is stored in variable copy will be 5, 7, 11, 13, as every ele-
ment in myArray whose position is between 2 (inclusive) and 6 (exclusive)
is copied to the new array.
If the starting position is equal to the end position, then none of the values
stored in the parameter array are copied. The size of the array returned
by this method is exactly equal to the number of elements copied from
the parameter array.
9
You MAY assume that the parameter values satisfy all of the following
preconditions:
• The value of the starting position is greater than or equal to 0, and
less than the size of the array.
• The value of the end position is greater than or equal to 0, and less
than or equal to the size of the array.
• The value of the start position is less than or equal to the value of
the end position.
• The array parameter is not a null reference.
In other words, your method does not have to handle cases where one or
more of the above conditions are not satisfied.
7. A method called copyOf (), which takes as its only parameter an array of
int, and returns an array of int. This method creates a new array whose
length is the same as the parameter array, and copies all elements of the
parameter array into the new array, so that the order in which the values
appear in the new array is the same as the order in which they appear in
the parameter array.
For example, suppose the following method call is executed:
int[] myArray = 2, 3, 5, 7, 11, 13, 17, 19;
int[] copy = yourusername MyArrays.copyOf(myArray);
After the execution of the above method call, the contents of the array
whose address is stored in variable copy will be 2, 3, 5, 7, 11, 13, 15, 19,
as every element of the original array is copied to the new array.
Subsequent changes to the elements stored in the array returned by this
method MUST NOT a↵ect the parameter array; conversely, subsequent
changes to the elements stored in the parameter array MUST NOT af-
fect the array returned by this method.
You MAY assume that the array parameter is not a null reference; in
other words, your method does not have to handle cases where the above
condition is not satisfied.
8. A method called sort(), which takes as parameters an array of int followed
by two values of type int, and returns nothing. The first int parameter
represents a starting position, and the third int parameter represents an
end position. The method modifies the array so that the values occurring
between the start position (inclusive) and the end position (exclusive)
appear in increasing order. There are multiple ways to sort the elements
of an array. However, for the purposes of this assignment, you MUST
implement the following simple sorting algorithm:
10
• Set i to be the starting position
• Find the minimum element occurring at a position between i (inclu-
sive) and the end position (exclusive), and swap this element with
the one at position i.
• If i is equal to the end position minus 1, then stop; otherwise, incre-
ment i and go back to the previous step.
For example, suppose the following method call is executed:
int[] myArray = 6, 2, 5, 7, 1, 8, 4, 3;
yourusername MyArrays.sort(myArray, 2, 6);
After the execution of the above method call, the contents of the array
whose address is stored in variable myArray will be 6, 2, 1, 5, 7, 8, 4,
3, as every element in myArray whose position is between 2 (inclusive)
and 6 (exclusive) is sorted in increasing order. You MAY assume that the
parameter values satisfy all of the following preconditions:
• The value of the starting position is greater than or equal to 0, and
less than the size of the array.
• The value of the end position is greater than or equal to 0, and less
than or equal to the size of the array.
• The value of the start position is less than or equal to the value of
the end position.
• The array parameter is not a null reference.
In other words, your method does not have to handle cases where one or
more of the above conditions are not satisfied.
9. A method called sort(), which takes as its only parameter an array of int,
and returns nothing. The method modifies the array so that all the values
it contains appear in increasing order. This method MUST implement the
same sorting algorithm as the one implemented by the other sort() method
you wrote. For example, suppose the following method call is executed:
int[] myArray = 6, 2, 5, 7, 1, 8, 4, 3;
yourusername MyArrays.sort(myArray);
After the execution of the above method call, the contents of the array
whose address is stored in variable myArray will be 1, 2, 3, 4, 5, 6, 7, 8,
as every element in myArray is sorted in increasing order.
You MAY assume that the array parameter is not a null reference; in
other words, your method does not have to handle cases where the above
condition is not satisfied.
11
10. A method called toString(), which takes as its only parameter an array of
int, and returns a single String. This method produces a textual represen-
tation of the contents of the parameter array. This textual representation
consists of the concatenation of the following elements:
• The String ”[”
• The text representation of each element in the parameter array; each
pair of adjacent elements is separated by the String ”, ”
• The String ”]”
In the textual representation of the parameter array, the array elements
occur in the same order as in the parameter array.
For example, suppose the following method call is executed:
int[] myArray = 6, 2, 5, 7, 1, 8, 4, 3;
String text = yourusername MyArrays.toString(myArray);
After the execution of the above method call, the String stored in in vari-
able text will be ”[6,2, 5, 7, 1, 8, 4, 3]”. If the array parameter is a null
reference, your method MUST return the String ”null”. A test program
is provided so that you can verify that your methods work properly. This
test program consists of a single class called MyArraysTest, and is saved
in a file called MyArraysTest.java.
Save your class in a file called yourusername MyArrays.java, and submit
this file to Blackboard . You MUST NOT submit the MyArraysTest.java
file.
4 What to turn in
yourusername MyMath.java;
yourusername MyArrays.java;
12
can call
internal
methods
do a file wth
multiple
methods
method for each
equation