# 16.12: Exercises

- Page ID
- 18921

The code for this chapter is in the `ch08`

directory of `ThinkJavaCode`

. See [Section 0.4] for instructions on how to download the repository. Before you start the exercises, we recommend that you compile and run the examples.

Exercise \(\PageIndex{1}\)

*The goal of this exercise is to practice encapsulation with some of the examples in this chapter.*

*Starting with the code in Section 8.6, write a method called*`powArray`

that takes a`double`

array,`a`

, and returns a new array that contains the elements of`a`

squared. Generalize it to take a second argument and raise the elements of`a`

to the given power.*Starting with the code in Section 8.10, write a method called*`histogram`

that takes an`int`

array of scores from 0 to (but not including) 100, and returns a histogram of 100 counters. Generalize it to take the number of counters as an argument.

Exercise \(\PageIndex{2}\)

*The purpose of this exercise is to practice reading code and recognizing the traversal patterns in this chapter. The following methods are hard to read, because instead of using meaningful names for the variables and methods, they use names of fruit.*

*For each method, write one sentence that describes what the method does, without getting into the details of how it works. For each variable, identify the role it plays.*

public static int banana(int[] a) { int kiwi = 1; int i = 0; while (i < a.length) { kiwi = kiwi * a[i]; i++; } return kiwi; } public static int grapefruit(int[] a, int grape) { for (int i = 0; i < a.length; i++) { if (a[i] == grape) { return i; } } return -1; } public static int pineapple(int[] a, int apple) { int pear = 0; for (int pine: a) { if (pine == apple) { pear++; } } return pear; }

Exercise \(\PageIndex{3}\)

*What is the output of the following program? Describe in a few words what mus does. Draw a stack diagram just before mus returns.*

public static int[] make(int n) { int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = i + 1; } return a; } public static void dub(int[] jub) { for (int i = 0; i < jub.length; i++) { jub[i] *= 2; } } public static int mus(int[] zoo) { int fus = 0; for (int i = 0; i < zoo.length; i++) { fus += zoo[i]; } return fus; } public static void main(String[] args) { int[] bob = make(5); dub(bob); System.out.println(mus(bob)); }

Exercise \(\PageIndex{4}\)

*Write a method called indexOfMax that takes an array of integers and returns the index of the largest element. Can you write this method using an enhanced for loop? Why or why not?*

Exercise \(\PageIndex{5}\)

*The Sieve of Eratosthenes is “a simple, ancient algorithm for finding all prime numbers up to any given limit,” which you can read about at **https://en.Wikipedia.org/wiki/Sieve_of_Eratosthenes**.*

*Write a method called sieve that takes an integer parameter, n, and returns a boolean array that indicates, for each number from 0 to n - 1, whether the number is prime.*

Exercise \(\PageIndex{6}\)

*Write a method named areFactors that takes an integer n and an array of integers, and that returns true if the numbers in the array are all factors of n (which is to say that n is divisible by all of them).*

Exercise \(\PageIndex{7}\)

*Write a method named arePrimeFactors that takes an integer n and an array of integers, and that returns true if the numbers in the array are all prime *

*and*their product is n.

Exercise \(\PageIndex{8}\)

*Many of the patterns we have seen for traversing arrays can also be written recursively. It is not common, but it is a useful exercise.*

*If there is more than one element in the range, we can break the array into two pieces, find the maximum in each of the pieces, and then find the maximum of the maxima.**Methods like*`maxInRange`

can be awkward to use. To find the largest element in an array, we have to provide the range for the entire array.double max = maxInRange(a, 0, a.length - 1);

*Write a method called*`max`

that takes an array and uses`maxInRange`

to find and return the largest element.