Some Practice Problems For The Java Exam and Solutions For The Problems
Some Practice Problems For The Java Exam and Solutions For The Problems
In all these problems, we’ll assume that the following has been done in the appropriate places:
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
1. What is the exact output of the program below. Indicate a blank line in the output by writing blank
line .
public static void main(String[] args)
{
int n = 4, k = 2;
System.out.println(++n );
System.out.println( n );
System.out.println( n++ );
System.out.println( n );
System.out.println( ‐n );
System.out.println( n ); ...
System.out.println( ‐‐n );
System.out.println( n );
System.out.println( n + k ); ...
System.out.println( n );
System.out.println( k ); ...
System.out.println("" + n + " " + k ); ...
System.out.println( n ); ...
System.out.println( " " + n ); ...
System.out.println( " n" ); ...
System.out.println( "\n" ); ...
System.out.println( n );
while (n < 4)
System.out.println( ++n );
System.out.println( n );
while (n >= 0)
System.out.println( (n /= 2) );
System.out.println( (n = 4) );
System.out.println( (n == 4) );
System.out.println( (n > 3) );
System.out.println( (n < 4) );
System.out.println( (n = 0) );
System.out.println( (n == 0) );
System.out.println( (n > 0) );
System.out.println( (n == 0 && true) );
System.out.println( (n == 0 || true) );
System.out.println( (!(n == 2) ));
}
4. What is the output of the following program?
shirt = colorType.red;
pants = colorType.blue;
int i = 5, j = 6, k = 7, n = 3;
System.out.println( i + j * k ‐ k % n );
System.out.println( i / n );
ch = title[1];
title[3] = ch;
System.out.println( title );
System.out.println( ch );
8. Suppose that the following code fragment is executed.
String message;
System.out.println( message );
a. Suppose that in response to the prompt, the interactive user types the following line and presses Enter:
Please go away.
What will the output of the code fragment look like?
b. Suppose that we modify the program and use scan.nextLine() instead of scan.next(), and that
in response to the prompt, the interactive user types the following line and presses Enter:
Please stop bothering me.
What will the output of the code fragment look like?
9. Write a for loop that outputs all the even numbers between 0 and 20 in reverse order, from the largest
to the smallest.
10. Write a for loop that outputs all the odd numbers between 0 and 20 in reverse order, from the largest
to the smallest.
11. The nested conditional statement shown below has been written by an inexperienced Java
programmer. The behavior of the statement is not correctly represented by the formatting.
if (n < 10)
if (n > 0)
System.out.println("The number is positive.");
else
System.out.println("The number is ______________.");
a. What is the output of the statement if the variable n has the value 7 ? If n has the value 15 ?
If n has the value -3 ?
b. Correct the syntax of the statement so that the logic of the corrected statement corresponds to the
formatting of the original statement. Also, replace the blank with an appropriate word or phrase.
c. Correct the formatting of the (original) statement so that the new format reflects the logical behavior
of the original statement. Also, replace the blank with an appropriate word or phrase.
12. The loop shown below has been written by an inexperienced Java programmer. The behavior of the
loop is not correctly represented by the formatting.
int n = 10;
while (n > 0)
n /= 2;
System.out.println(n * n);
13. Remove all the unnecessary tests from the nested conditional statement below.
float income;
14. Answer the questions below concerning the following fragment of code.
int n;
System.out.println("Enter an integer: ";
n = scan.nextInt();
if (n < 10)
System.out.println("less than 10");
else if (n > 5)
System.out.println("greater than 5");
else
System.out.println("not interesting");
a. What will be the output of the fragment above if the interactive user enters the integer value 0 ?
b. What will be the output of the fragment above if the interactive user enters the integer value 15 ?
c. What will be the output of the fragment above if the interactive user enters the integer value 7 ?
d. What values for n will cause the output of the fragment above to be "not interesting"?
15. Rewrite the following code fragment so that it uses a "do ‐ while" loop to accomplish the same
task.
int n;
while (n < 0)
{
System.out.println("The integer you entered is negative.");
System.out.println("Enter a non‐negative integer: ";
n = scan.nextInt();
}
16. In the code fragment below, the programmer has almost certainly made an error in the first line of the
conditional statement.
a. What is the output of this code fragment as it is written?
int n = 5;
if (n == 0)
System.out.println("n is zero.");
else
System.out.println("n is not zero.");
17. What is the output when the following code fragment is executed?
int n, k = 5;
n = (100 % k == 0 ? k + 1 : k ‐ 1);
System.out.println("n = " + n + " k = " + k);
18. What is the output when the following code fragment is executed?
int n;
float x = 3.8;
n = (int) x;
System.out.println("n = " + n);
19. What is the output when the following code fragment is executed? Rewrite the fragment to obtain an
equivalent code fragment in which the body of the loop is a simple statement instead of a compound
statement.
int i = 5;
while (i > 0)
{
‐‐i;
System.out.println(i);
}
20. The following loop is an endless loop: when executed it will never terminate. What modification
can be made in the code to produce the desired output?
21. Write a function named "sumFromTo" that takes two integer arguments, call them "first" and
"last", and returns as its value the sum of all the integers between first and last inclusive. Thus,
for example,
22. Write a function named "enough" that takes one integer argument, call it "goal" and returns as its
value the smallest positive integer n for which 1+2+3+. . . +n is at least equal to goal . Thus, for
example,
23. Write a function named "gcd" that takes two positive integer arguments and returns as its value the
greatest common divisor of those two integers. If the function is passed an argument that is not positive
(i.e., greater than zero), then the function should return the value 0 as a sentinel value to indicate that an
error occurred. Thus, for example,
24. A positive integer n is said to be prime (or, "a prime") if and only if n is greater than 1 and is
divisible only by 1 and n . For example, the integers 17 and 29 are prime, but 1 and 38 are not
prime. Write a function named "isPrime" that takes a positive integer argument and returns as its value
the integer 1 if the argument is prime and returns the integer 0 otherwise. Thus, for example,
25. Write a function named "digitName" that takes an integer argument in the range from 1 to 9 ,
inclusive, and prints the English name for that integer on the computer screen. No newline character
should be sent to the screen following the digit name. The function should not return a value. The cursor
should remain on the same line as the name that has been printed. If the argument is not in the required
range, then the function should print "digit error" without the quotation marks but followed by the newline
character. Thus, for example,
the statement digitName(7); should print seven on the screen;
the statement digitName(0); should print digit error on the screen and place
the cursor at the beginning of the next line.
26. Write a function named "reduce" that take one argument that is an array containing two positive
integer values, and treats them as the numerator and denominator of a fraction, and reduces the fraction.
That is to say, each of the two elements will be modified by dividing it by the greatest common divisor of
the two integers. The function should return the value false (to indicate failure to reduce) if either of
the two arguments is zero or negative, and should return the value true otherwise. Thus, for example,
if m and n have been declared to be integer variables in a program, then
Note that the values of the fraction were modified by the function call. Similarly,
The function reduce is allowed to make calls to other functions that you have written.
27. Write a function named "swapFloats" that takes three arguments: a float array, and two indexes
in this array. The function should interchange the values that are stored in the array at those indexes. The
function should return no value. To take an example, if the following code fragment is executed
28. Write a function named "sort3" that takes an array containing three floating point arguments, call
them "x" , "y" , and "z" , and modifies their values, if necessary, in such a way as to make true the
following inequalities: x ≤ y ≤ z . The function should return no value. To take an example, if the
following code fragment is executed
The function sort3 is allowed to make calls to other functions that you have written.
29. Write a function named "reverse" that takes as argument an array of floating point values. The
function must reverse the order of the values in the array. Thus, for example, if the array that's passed to
the function looks like this:
0 1 2 3 4
5.8 | 2.6 | 9.0 | 3.4 | 7.1
then when the function returns, the array will have been modified so that it looks like this:
0 1 2 3 4
7.1 | 3.4 | 9.0 | 2.6 | 5.8
30. Write a function named "sum" that takes as argument an array of floating point values. The function
should return as its value the sum of the floating point values in the array. Thus, for example, if the array
that's passed to the function looks like this:
0 1 2 3 4
5.8 | 2.6 | 9.0 | 3.4 | 7.1
then the function should return the value 27.9 as its value.
31. Write a function named "locationOfLargest" that takes as argument an array of integer values.
The function should return as its value the subscript of the cell containing the largest of the values in the
array. Thus, for example, if the array that's passed to the function looks like this:
0 1 2 3 4
58 | 26 | 90 | 34 | 71
then the function should return the integer 2 as its value. If there is more than one cell containing the
largest of the values in the array, then the function should return the smallest of the subscripts of the cells
containing the largest values. For example, if the array that's passed to the function is
0 1 2 3 4 5 6
58 | 26 | 91 | 34 | 70 | 91 | 88
then the largest value occurs in cells 2 and 5 , so the function should return the integer value 2 .
32. Write a function named "locationOfTarget" that takes as its arguments the following:
(1) an array of integer values;
(2) an integer "target value".
The function should determine whether the given target value occurs in any of the cells of the array, and
if it does, the function should return the subscript of the cell containing the target value. If more than one
of the cells contains the target value, then the function should return the largest subscript of the cells that
contain the target value. If the target value does not occur in any of the cells, then the function should
return the sentinel value -1 . Thus, for example, if the target value that's passed to the function is 34 and
the array that's passed to the function looks like this:
0 1 2 3 4 5 6
58 | 26 | 91 | 34 | 70 | 34 | 88
then the target value occurs in cells 3 and 5 , so the function should return the integer value 5 .
33. Write a function named "rotateRight" that takes as argument an array of floating point values.
The function should shift the contents of each cell one place to the right, except for the contents of the last
cell, which should be moved into the cell with subscript 0 . Thus, for example, if the array passed to the
function looks like this:
0 1 2 3 4
5.8 | 2.6 | 9.1 | 3.4 | 7.0
then when the function returns, the array will have been changed so that it looks like this:
0 1 2 3 4
7.0 | 5.8 | 2.6 | 9.1 | 3.4
34. Write a function named "shiftRight" that takes as its arguments the following:
(1) an array of floating point values;
(2) an integer, call it "left", that tells the leftmost cell of the part of the array to be shifted;
(3) an integer, call it "right", that tells the rightmost cell of the part of the array to be shifted;
(4) a positive integer, call it "distance" that tells how many cells to shift by.
The function should make sure that left is less than or equal to right, and that distance is greater than
zero. If either of these conditions fails, the function should return the value false to indicate an error.
Otherwise it should shift by distance cells the contents of the array cells with subscripts running from
left to right . Thus, for example, if the array passed to the function looks like this:
0 1 2 3 4 5 6 7 8 9 10 ....
5.8 | 2.6 | 9.1 | 3.4 | 7.0 | 5.1 | 8.8 | 0.3 | ‐4.1 | 8.0 | 2.7 | etc.
and if left has the value 3 , right has the value 7 , and distance has the value 2 , then the function
should shift the contents of cells 3 , 4 , 5 , 6 , and 7 to the right by 2 cells, so that when the function
returns, the array will have been changed so that it looks like this:
0 1 2 3 4 5 6 7 8 9 10 ....
5.8 | 2.6 | 9.1 | ??? | ??? | 3.4 | 7.0 | 5.1 | 8.8 | 0.3 | 2.7 | etc.
The question marks in cells 3 and 4 indicate that we don't care what numbers are in those cells when
the function returns. Note that the contents of cells 8 and 9 have changed, but the contents of cell 10
is unchanged. The function need not take any precautions against the possibility that the cells will be
shifted beyond the end of the array (the calling function should be careful not to let that happen).
35. Write a function named "subtotal" takes as argument an array of floating point values. The function
should replace the contents of each cell with the sum of the contents of all the cells in the original array
from the left end to the cell in question. Thus, for example, if the array passed to the function looks like
this:
0 1 2 3 4
5.8 | 2.6 | 9.1 | 3.4 | 7.0
then when the function returns, the array will have been changed so that it looks like this:
0 1 2 3 4
5.8 | 8.4 | 17.5 | 20.9 | 27.9
because 5.8 + 2.6 = 8.4 and 5.8 + 2.6 + 9.1 = 17.5 and so on. Note that the contents of cell 0 are not
changed. The function should not return a value.
36. Write a function named "concatenate" that copies the cells of one array into a larger array, and
then copies the cells of another array into the larger array just beyond the contents of the first array. The
contents of the cells will be integers. The arguments will be as follows:
(1) the first array that will be copied;
(2) the second array that will be copied;
(3) the large array into which all copying will be performed;
If the function discovers that the number of cells in the large array is not large enough to hold all the
numbers to be copied into it, then the function should return false to indicate failure. Otherwise it should
return true . The function should not alter the contents of the first two arrays. To take an example, if the
first two arrays passed to the function look like this:
0 1 2 3 4 5 6 0 1 2 3
58 | 26 | 91 | 34 | 70 | 34 | 88 and 29 | 41 | 10 | 66
then, provided the size of the large array is at least 11, the large array should look like this when the
function returns:
0 1 2 3 4 5 6 7 8 9 10
58 | 26 | 91 | 34 | 70 | 34 | 88 | 29 | 41 | 10 | 66
37. Write a function named "numberOfMatches" that compares the initial parts of two character arrays
to see how many pairs of cells match before a difference occurs. For example, the call
System.out.println(numberOfMatches("Bookclub", "Bookcase"));
38. Write a function named "eliminateDuplicates" that takes an array of integers in random order
and eliminates all the duplicate integers in the array. The function should take as argument an array of
integers. The function should return a value indicating how many unique values were found in the array.
Here is an example. Suppose the array passed to the function is as shown below, of size 11.
0 1 2 3 4 5 6 7 8 9 10
58 | 26 | 91 | 26 | 70 | 70 | 91 | 58 | 58 | 58 | 66
Then the function should alter the array so that it looks like this:
0 1 2 3 4 5 6 7 8 9 10
58 | 26 | 91 | 70 | 66 | ?? | ?? | ?? | ?? | ?? | ??
and it should return the value 5. The question marks in the cells after the 5th cell indicate that it does not
matter what numbers are in those cells when the function returns.
39. Write a function called “isOrdered” that takes one parameter representing an array of float values
and returns true if the values of the array are in ascending order, and false otherwise. For example, if the
array contains the values
3 4 12 18 19 20 20 24 27
then the function should return true. Note that duplicate values are allowed.
However, if the array contains the values
42 13 27 84 2 12 42 95
40. Write an entire Java program that reads a positive integer entered by an interactive user and then prints
out all the positive divisors of that integer in a column and in decreasing order. The program should allow
the user to repeat this process as many times as the user likes. Initially, the program should inform the
user about how the program will behave. Then the program should prompt the user for each integer that
the user wishes to enter.
The program may be terminated in any of two ways. One way is to have the program halt if the
user enters an integer that is negative or zero. In this case the user should be reminded with each prompt
that the program can be terminated in that way. Alternatively, after an integer has been entered and the
divisors have been printed, the program can ask the user whether he/she wishes to enter another integer.
In this case, when the user accidentally enters a zero or negative integer to have its divisors calculated, the
program should inform the user that the input is unacceptable and should allow the user to try again (and
again!).
Here is an illustration of how the program and the interactive user might interact. The user's
responses to the program are shown in bold italics.
This program is designed to exhibit the positive divisors of
positive integers supplied by you. The program will repeatedly
prompt you to enter a positive integer. Each time you enter a
positive integer, the program will print all the divisors of your
integer in a column and in decreasing order.
Please respond with Y (or y) for yes and N (or n) for no.
Would you like to see the divisors of another integer (Y/N)? n
Answers
5
5
5
6
‐6
6
5
5
5
4
6
4
2
4 2
4
4
n
blank line
blank line
n * n = 16
n
2. The output would be as shown below. The program contains an endless loop.
9
4
1
0
‐1
0
1
2
3
4
4
2
1
0
0 [endlessly]
3. The output would be as shown below.
4
true
true
false
0
true
false
true
true
true
red blue
46
1
6. The output would be as shown below, because when it is discovered that "!found" is true, the second
half of the OR expression is not evaluated, and thus count is not decremented.
danger
count = 5
7. The output would be as shown below. The 'a' in "Titanic" has been changed to an 'i'.
Titinic
i
8. a. The output would be as shown below. The line in italics would be typed by the interactive user.
b. The output would be as shown below. The line in italics would be typed by the interactive user.
Enter a sentence on the line below.
Please stop bothering me.
Please stop bothering me.
11 a. The original statement is formatted in such a way that it appears that the "else" clause of the
statement is the alternative to the "if (n < 10)" case, but in fact, the C or Java compiler will treat the
"else" clause as the alternative to the "if (n > 0)" clause. If n has the value 7 , the output will be
"The number is positive". If n has the value 15 , then there will be no output. If n has the value
-3 then the output will be "The number is ____________".
b. If we want the statement to behave according the logic that's suggested by the formatting of the
original statement, we can write
if (n < 10)
{
if (n > 0)
System.out.println("The number is positive.");
}
else
System.out.println("The number is greater than 10.");
c. If we want the statement to be formatted so as to reflect the actual logic of the original statement, we
can write
if (n < 10)
if (n > 0)
System.out.println("The number is positive.");
else
System.out.println("The number is negative.");
12 a. Since there are no braces surrounding the last two lines of the code, the compiler treats only the
statement "n /= 2;" as the body of the loop. Thus n will successively assume the values 5, 2, 1, and
0, at which point the loop will exit and the output statement will print 0 . The values 5, 2, and 1 will not
be printed.
b. If we want the statement to behave according the logic that's suggested by the formatting of the original
statement, we can put braces around the last two lines of code to make a compound statement as the body
of the loop:
int n = 10;
while (n > 0)
{
n /= 2;
System.out.println(n * n);
}
c. If we want the statement to be formatted so as to reflect the actual logic of the original statement, we
can write
int n = 10;
while (n > 0)
n /= 2;
System.out.println(n * n);
int n;
do
{
System.out.println("Enter a non‐negative integer: ";
n= scan.nextInt();
if (n < 0)
System.out.println("The integer you entered is negative.");
}
while (n < 0);
n is not zero.
The square of n is 25.
The reason for this is that the "if" part assigns the value 0 to n , and the value returned by that assignment
statement is 0 , so this is treated as "false", which causes the alternative statement to be executed. But
even though the program prints "n is not zero.", in fact, n does have the value zero after the
conditional statement is finished.
n = 4 k = 5
21.
/******************* S U M F R O M T O ***********************
PARAMETERS:
*******************************************************************/
else
for (i = first; i >= last; ‐‐i)
partialSum += i;
return partialSum;
}
22.
/************************** E N O U G H **************************
PARAMETER:
*******************************************************************/
return n;
}
23. There is a well-known algorithm called "Euclid's Algorithm" for computing the g.c.d. of two positive
integers. The second of the two solutions below employs that algorithm. The first solution employs a
somewhat more straightforward search process, in which we simply try one integer after another, starting
with the smaller of the two arguments, until we find an integer that divides both. For the purposes of the
Java exam, the first solution is acceptable (even though it is far less efficient than the solution that uses
Euclid's Algorithm).
PARAMETERS:
*******************************************************************/
int trialDivisor;
trialDivisor = ( a <= b ? a : b ); // set it to the smaller
return trialDivisor;
}
A version of the previous algorithm that uses the Euclidean algorithm is
shown below.
PARAMETERS:
AUTHOR: W. Knight
*******************************************************************/
while (remainder != 0)
{
a = b;
b = remainder;
remainder = a % b;
}
/************************* I S P R I M E ***********************
PARAMETER:
*******************************************************************/
int trialDivisor = 2;
/********************** D I G I T N A M E ***********************
PARAMETER:
*******************************************************************/
/************************** R E D U C E ************************
PARAMETERS:
*******************************************************************/
else
{
int common = gcd (fraction[0], fraction[1]);
fraction[0] /= common;
fraction[1] /= common;
return true;
}
}
27.
/********************* S W A P F L O A T S *********************
PARAMETERS:
x, a, b The first is a float array, and the other two the indexes
of the elements to be interchanged.
*******************************************************************/
/************************** S O R T 3 ****************************
DESCRIPTION: Sorts an array containing three values passed to it into
increasing order.
PARAMETERS:
x The array containing the three floating point numbers to be
sorted.
ALGORITHM: First x[0], x[1], and x[2] are compared to see if they are
already in increasing order. If they are, no changes are
made.
If x[0] <= x[1] but x[1] > x[2], then x[1] and x[2] are
swapped, and then x[0] and the new value of x[1] are
compared and put in correct order.
If x[0] > x[1], then x[0] and x[1] are swapped.
Next it is necessary to discover where x[2] belongs in
relation to x[0] and x[1]. If x[1] <= x[2], nothing more
needs doing.
If, instead, x[2] < x[1], then x[1] and x[2] are swapped
and then x[0] and the new x[1] are compared and put in
order.
if (x[0] <= x[1] && x[1] <= x[2]) // the values are already in
return; // order; do nothing
if (x[0] <= x[1]) // then x[1] > x[2] (or we'd have stopped above)
{
swapFloats (x, 1, 2); // After this call, x[1] < x[2] and
// x[0] <= x[2] are true but we don't know
if (x[0] > x[1]) // how x[0] and x[1] compare.
swapFloats (x, 0, 1); // Now x[0] < x[1] <= x[2] must be
} // true.
else // If neither of the above is true, then x[1] < x[0] is true
{
swapFloats (x, 0, 1); // After this call, x[0] < x[1] is true.
/************************* R E V E R S E **************************
PARAMETERS:
ALGORITHM: One array index starts at the left end of the array and
moves to the right, while another starts at the right
end and moves to the left. Objects in the cells
indicated by these two indexes are swapped. The
process ends when the two indexes meet or cross each
other.
*******************************************************************/
while (i < j)
swapFloats (a, i++, j‐‐);
}
30.
/****************************** S U M ****************************
PARAMETERS:
*******************************************************************/
return sum;
}
31. Here is the simplest solution.
/************* L O C A T I O N O F L A R G E S T *************
PARAMETERS:
*******************************************************************/
return best;
}
32. Here is the simplest solution. It searches from right to left and quits when (if) if finds the target.
/************** L O C A T I O N O F T A R G E T **************
DESCRIPTION: Finds the index of the cell (if any) where a "target"
integer is stored.
PARAMETERS:
ALGORITHM: The length of the array "n" is used to scan backward across
the array, looking for a cell containing a copy of
"target". If a copy is found, the search is halted and
the index of that cell is returned. If no such cell is
found, "n" will run off the left end of the array and
wind up with value ‐1.
*******************************************************************/
/******************* R O T A T E R I G H T *********************
PARAMETERS:
*******************************************************************/
a[0] = temp;
}
34.
/********************** S H I F T R I G H T *********************
PARAMETERS:
RETURNS: true provided left <= right and distance > 0; returns
false if either of these conditions is violated.
*******************************************************************/
static boolean shiftRight (float a[], int left, int right, int distance)
{
if (left > right || distance <= 0)
return false;
/************************* S U B T O T A L ***********************
PARAMETERS:
*******************************************************************/
/*********************** C O N C A T E N A T E ********************
DESCRIPTION: Copies numbers from two arrays into a third array. The
numbers from the second array are placed to the right
of the numbers copied from the first array.
PARAMETERS:
*******************************************************************/
if (m + n > p)
return false;
int i, j;
return true;
}
37.
/**************** N U M B E R O F M A T C H E S ***************
PARAMETERS:
*******************************************************************/
return i;
}
38.
/*********** E L I M I N A T E D U P L I C A T E S **************
PARAMETERS:
*******************************************************************/
/********************** I S O R D E R E D ***********************
PARAMETERS:
ALGORITHM: The algorithm scans the array from left to right and
compares each element with the one to the right of it. If
the element is larger than the next one, then it returns
false. If it reaches the end of the array without having to
return false, then it returns true.
*******************************************************************/
}
40.
/********************************************************************
********************************************************************/
import java.util.Scanner;
class Main()
{
/************************ M A I N ****************************/
printInitialExplanation();
do
{
usersInteger = getNumberFromUser ();
printDivisors (usersInteger);
}
while (userWishesToRepeat());
}
/******* P R I N T I N I T I A L E X P L A N A T I O N ********
PARAMETERS: None.
********************************************************************/
PARAMETER:
n The positive integer supplied by the user. This is a
reference parameter. It is intended that the argument
passed through this parameter will receive a new
value.
PARAMETER:
********************************************************************/
int trialDivisor;
System.out.println();
}
/********** U S E R W I S H E S T O R E P E A T *************
PARAMETERS: None.
********************************************************************/