Question 4. A grayscale image is represented by a 2-dimensional rectangular array of pixels (picture elements). A pixel is an integer value that represents a shade of gray. In this question, pixel values can be in the range from 0 through 255, inclusive. A black pixel is represented by 0, and a white pixel is represented by 255. The declaration of the GrayImage class is shown below.
public class GrayImage
{
public static final int BLACK = 0;
public static final int WHITE = 255;
/**
* The 2-dimensional representation of this image. Guaranteed not to be null.
* All values in the array are within the range [BLACK, WHITE], inclusive.
*/
private int[][] pixelValues;
/**
* @return the total number of white pixels in this image. Postcondition: this
* image has not been changed.
*/
public int countWhitePixels()
{
/* to be implemented in part (a) */
}
}
Part a. Write the method countWhitePixels that returns the number of pixels in the image that contain the value WHITE. For example, assume that pixelValues contains the following image.
Figure4.51.1.Example 2D array
A call to countWhitePixels method would return 5 because there are 5 entries (shown in boldface) that have the value WHITE.
public class GrayImage
{
public static final int BLACK = 0;
public static final int WHITE = 255;
/**
* The 2-dimensional representation of this image. Guaranteed not to be null.
* All values in the array are within the range [BLACK, WHITE], inclusive.
*/
private int[][] pixelValues;
/**
* @return the total number of white pixels in this image. Postcondition: this
* image has not been changed.
*/
public int countWhitePixels()
{
/* to be implemented in part (a) */
}
}
Subsection4.51.1How to solve this problem
To solve this problem, we will need to loop through the entire 2D array, looking for instances of a WHITE pixel, keeping track of our count during the loop.
Activity4.51.1.
What kind of loop could you use to solve this problem?
single for each loop
This is a two-dimensional array so you would need a nested for-each loop.
nested for loop
Correct!
nested while loop
You could use a nested while loop, but since you know the numbers of rows and columns a nested for loop is usually better since with a while loop you could forget to increment the row or column index.
Activity4.51.2.
What is another kind of loop you could use to solve this problem?
nested for each loop
Correct!
single for loop
For a two-dimensional array you would need to use a nested for loop.
nested switch statement
Nested switch statements would not work in this situation and are generally convoluted and difficult to read.
Looping through a 2D array is more complicated than the simple arrays we usually see, requiring nested for loops. Check out the questions and code below, which displays how nested for loops work to display a block of numbers.
Subsection4.51.2Algorithm
When approaching this problem, it can be helpful to look for keywords or hints that maybe be in the problem statement. This section contains a plain English explanation of one way to solve this problem as well as problems that test your understanding of how to write the code to do those things.
Activity4.51.3.
Explain in plain English what your code will have to do to answer this question. Use the variable names given above.
Activity4.51.4.
Which class is countWhitePixels a method in?
pixelValues
Pixel values is a private member variable of the overall class, it is not the class that contains countWhitePixels
greyimage
Capitalization and spelling are important! Check the class name again carefully.
countWhitePixels
This is the name of the method you are writing! Since it is not a constructor, the overall Class name cannot be countWhitePixels
GrayImage
Correct!
Activity4.51.5.
What array will you be modifying in this method?
pixelValues
Correct!
You need to initialize your own
This method iterates through an already existing image, which can be found in the GreyImage class initialization.
countWhitePixels
This is the name of the method you are writing, not an array.
This method is called using the dot operation so you can just write "this"
Although this method is called with the dot operator, you still need to specify the name of the array and cannot only write "this"
There are many ways to solve this question, but we will only cover two in this section. Although it is a good exercise to be able to write the solution in multiple ways, you do not need to write both for the AP exam and you can just look at the problems below which relate to the method that is more intuitive to you.
If you want to solve this problem using nested for loops, complete the three questions below.
Activity4.51.6.
What could you write for the outer for loop so that it iterates through the rows of the array?