Data Structures and Problem Solving Using Java 4th Edition Solution Manual
Data Structures and Problem Solving Using Java 4th Edition Solution Manual
Students who have had Java already can skip this chapter. I teach the material in the order presented. There is
little tricky material here (this is part of the appeal of Java). Although the text does not mention C or C++, here
are some differences:
1. Primitive types have precise ranges. There is no unsigned type. A char is 16 bits.
2. Order of evaluation is guaranteed (generally left to right). In particular, the sequence point rule from
C++ is not needed. Thus nonsense such as x++ + x++ has a precise behavior in Java.
3. Only the C‐style type conversion is allowed.
4. boolean is a primitive type, thus removing many of the common errors in C++, such as if(x=y) ... .
5. There is no comma operator, except in for loop expressions.
6. Java provides a labeled break statement.
7. 7. All functions must be class methods.
1.2 //, which extends to the end of the line and /* and /**, both of which extend to a */. Comments do
not nest.
1.3 boolean , byte , short , char , int , long , float , and double.
1.4 * multiplies two primitive values, returning the result and not changing its two arguments. *=
changes the left‐hand argument to the product of the left‐hand argument and the right‐hand
argument. The right‐hand argument is unchanged.
1.5 Both the prefix and postfix increment operators add one to the target variable. The prefix operator
uses the new value of the variable in a larger expression; the postfix operator uses the prior value.
1.6 The while loop is the most general loop and performs a test at the top of the loop. The body is
executed zero or more times. The do loop is similar, but the test is performed at the bottom of the
loop; thus the body is executed at least once. The for loop is used primarily for counting‐like
iteration and consists of an initialization, test, and update along with the body.
1.7 break is used to exit a loop. A labeled break exits the loop that is marked with a label. break is
also used to exit a switch statement, rather than stepping through to the next case.
1.8 The continue statement is used to advance to the next iteration of the loop.
1.9 Method overloading allows the reuse of a method name in the same scope as long as the signatures
(parameter list types) of the methods differ.
Page 1 of 1
1.10 In call‐by‐value, the actual arguments are copied into the method’s formal parameters. Thus, changes
to the values of the formal parameters do not affect the values of the actual arguments.
IN THEORY
1.11 After line 1, b is 6, c is 9, and a is 13. After line 2, b is 7, c is 10, and a is 16. After line 3, b is 8, c is 11,
and a is 18. After line 4, b is 9, c is 12, and a is 21.
1.12 The result is true. Note that the precedence rules imply that the expression is evaluated as (true
&& false) || true.
1.14 Because of call‐by‐value, x must be 0 after the call to method f. Thus the only possible output is 0.
IN PRACTICE
1.15 An equivalent statement is:
while( true )
statement
1.16 This question is harder than it looks because I/O facilities are limited, making it difficult to align
columns.
1.17 The methods are shown below (without a supporting class); we assume that this is placed in a class
that already provides the max method for two parameters.
Page 2 of 2
{
return max( max( a, b ), c );
}
return result;
}
Page 3 of 3
c. b || d
d. c && d
e. All the operations evaluate d
1.4 Which of the following loop constructs guarantee that the body is executed at least once?
a. do loop
b. for loop
c. while loop
d. two of the constructs
e. all three of the constructs
1.5 In the method below, which statement about the possible outputs is most correct?
public static void what( )
{
int x = 5;
f( x );
System.out.println( x );
}
a. 0 is a possible output
b. 5 is the only possible output
c. any positive integer can be output
d. any integer can be output
e. none of the above are true
1.6. If two methods in the same class have the same name, which is true:
a. They must have a different number of parameters
b. They must have different return types
c. They must have different parameter type lists
d. The compiler must generate an error message
e. none of the above
Page 4 of 4
Answers to Exam Questions
1. C
2. C
3. B
4. A
5. B
6. C
7. C
8. C
Page 5 of 5
Chapter 2 – Reference Types
2.1 Key Concepts and How To Teach Them
This chapter introduces several concepts:
• references
• strings
• arrays
• exceptions
• I/O
Depending on the students’ background, some or even this entire chapter could be skipped, but I recommend
at least a quick review of the chapter in all circumstances. Students who have not had Java should go through
the entire chapter slowly because there are fundamental differences between Java objects and objects in
other languages.
2.1.1 References
Explain the general idea of a reference in the context of a pointer. This is important to do because pointers are
fundamental in most other languages. Then discuss the basic operations. Most important is to explain that
objects must be created via new, what = and == means for references, and parameter passing for reference
types. Students that have used other languages may be confused with the distinction between call‐by‐
reference in a language such as Pascal, C++, or Ada and call‐by‐value applied to reference types in Java.
Emphasize that the state of the referenced object can change, but the object being referenced by the actual
argument prior to the method call will still be referenced after the method call.
2.1.2 Strings
Explain the basics of the String; especially that it is not an array of characters. The tricky parts are mixing
up == and equals, and remembering that the second parameter to subString is the first non‐included
position.
2.1.3 Arrays
The tricky part about arrays are that typically the array must be created via new and if the array is an array of
Object, then each Object in the array must also be created by new. Also, array copies are shallow.
2.1.5 Exceptions
Designing inheritance hierarchies is deferred to Chapter 4 when inheritance is discussed. This section simply
discusses the try, catch, finally blocks, the throw clause and the throws list. Students do not seem to
have difficulty with this material.
2.2 The basic operations that can be applied to a reference type are assignment via =, comparison via ==
and !=, the dot operator, type conversion, and instanceof.
Page 6 of 6
2.3 An array has its size associated with it. An ArrayList has a capacity in addition to size. Adding an
element to an ArrayList will automatically expand the capacity of the array if needed.
2.4 Exceptions are thrown by a method. The exception immediately propagates back through the calling
sequence until it is handled by a matching catch clause, at which point the exception is considered
handled.
2.5 Basic string operations include equals and compareTo to compare, = to copy, + and += to perform
concatenation, length, charAt, and substring.
2.6 The next method returns the next token from the Scanner object, while the hasNext method
returns a true value if there exists a token available to be read on the Scanner’s stream.
IN THEORY
2.7 The second statement outputs 5 7, as expected. The first outputs 44, because it used the ASCII value
of ‘ ‘, which is 32.
2.8 The source code in Figure 2.21 fails to compile as shown. In the foo method, the compiler does not
permit the multiple return statements (additionally the method is void). If you execute a call to the
bar method, a java.lang.ArithmeticException is thrown.
IN PRACTICE
2.9 One possible solution to accomplish this is:
import java.io.*;
import java.util.*;
while (fileScanner.hasNextLine())
{
String line = fileScanner.nextLine();
for (int i=0; i < line.length(); i++)
checksum += line.charAt(i);
}
System.out.println("File checksum = " + checksum);
}
}
import java.util.Scanner;
Page 7 of 7
import java.io.FileReader;
import java.io.IOException;
Page 8 of 8
for( int i = 0; i < str1.length( ) ; i++ )
if( str1.charAt( str1.length() ) !=
str2.charAt( str2.length() ) )
return false;
return true;
}
2.13 The elements in the original array are not copied before it is reinitialized.
int modeCounter = 1;
int maxMode = 1;
double modeValue = arr[0];
Page 9 of 9
modeCounter = 1;
}
}
return modeValue;
}
java.util.Arrays.sort(newArr);
int modeCounter = 1;
int maxMode = 1;
double modeValue = newArr[0];
Page 10 of 10
2.16 Methods to accomplish this are below:
Page 11 of 11
public static String min( ArrayList<String> arr )
{
String currentMin = arr.get(0);
for (String value : arr)
if (value.compareTo(currentMin) < 0)
currentMin = value;
return currentMin;
}
java.util.Arrays.sort(newArr);
Page 12 of 12
result = true;
return result;
}
Page 13 of 13
return counter;
}
Page 14 of 14
for (int col = 0; col < arr[row].length-1; col++)
if (arr[row][col] > arr[row][col+1])
increasing = false;
return increasing;
}
import java.util.Scanner;
import java.util.NoSuchElementException;
class MaxTestA
{
public static void main( String [ ] args )
{
Scanner in = new Scanner( System.in );
int x, y;
x = new Integer(inputs[0]).intValue();
y = new Integer(inputs[1]).intValue();
System.out.println( "Max: " + Math.max( x, y ) );
return;
}
}
2.27 Here is one possible solution. For whatever reason, reading directly from the input stream
(System.in) and using the specified delimiter would not work (tried on multiple platforms). Was
forced to read the input line as a String and then use a second scanner on the String to break it
into tokens using the delimiter.
Page 15 of 15
public static void MaxTestA( )
{
Scanner in = new Scanner( System.in );
int x, y;
a. 0 is a possible output
b. 5 is the only possible output
c. any positive integer can be output
d. any integer can be output
e. none of the above are true
2.2 In the method below, which statement about the possible outputs is most correct?
public static void what( )
{
Integer x;
f( x );
System.out.println( x );
}
a. 0 is a possible output
b. 5 is the only possible output
c. any positive integer can be output
d. any integer can be output
e. none of the above are true
Page 16 of 16
c. InputStreamReader
d. StringTokenizer
e. none of the above
Page 17 of 17
Chapter 3 – Objects and Classes
3.1 Key Concepts and How To Teach Them
Students who have not had Java, with a description of class design, will need to go through this chapter
in its entirety. Students who have had Java with class design may want to quickly review the chapter.
This chapter introduces the general concept of encapsulation and information hiding, but is geared
towards practical use of Java with emphasis on designing classes and syntax. You may want to have the
students bring a copy of the code to class so you can avoid rewriting the classes. This chapter is by far
much simpler than its C++ counterpart.
Topics include:
• the class construct
• public and private sections
• specification (javadoc) vs. implementation
• constructors
• accessors and mutators
• toString
• equals
• packages
• this
• instanceof operator
• static class members
3.1.4 Constructors
Explain that in addition to particular member functions, every class has constructors. Show how a constructor
matches a declaration. Remark about the default behavior: If no constructor is provided, a default zero‐
parameter constructor is generated.
3.1.6 toString
This is a simple topic to cover.
3.1.7 equals
The tricky part is that the parameter is always of type Object and must be converted to the class type.
Mention that if equals is not implemented, then it typically defaults to returning false (actually it is
inherited from its superclass).
3.1.8 Packages
Mention why we use packages and the special visibility rules. Also discuss the import directive briefly. This
is a reasonable time to discuss compilation issues and the CLASSPATH variable.
Page 18 of 18
3.1.9 this
this is used in two main places: aliasing tests (in which it is important to have a reference to the current
object), and as a shorthand for calling other constructors. Both uses are easy to discuss.
3.2 Members in the public section of a class are visible to non‐class routines and can be accessed via the
dot member operator. Private members are not visible outside of the class.
3.4 The default constructor is a member‐by‐member application of a default constructor, meaning that
primitive members are initialized to zero and reference members are initialized to null.
3.5 this is a reference to the current object. This reference to the current object can be used to compare
it with other objects or to pass the current object to some other unit.
3.6 The constructor would be viewed as a method, and would not be treated as a constructor.
3.7 Packages are used to organize similar classes. Members with no visibility modifier are package
visible: that is, they are visible to other classes within the same package (it is not visible outside the
package).
3.8 Output is typically performed by providing a toString method that generates a String. This
String can be passed to println. However, a nonstatic field, which is part of each instance of the
class, can be accessed by a static class method only if a controlling object is provided.
import weiss.nonstandard.*;
import weiss.nonstandard.Exiting;
3.10 An instance field is associated with a particular instance (or object) of a class. A static field is
associated with the class itself and can be accessed from any instance of the class.
3.11 A static method can be invoked without any instance (and therefore any instance data) existing.
Even if several instances did exist, there'd be no way of knowing which object's instance data was
being referenced.
3.12 A design pattern describes a commonly occurring problem in many contexts and a generic solution
that can be applied in a wide variety of these contexts.
Page 19 of 19
3.13 (a) Line 17 is illegal because p is a non‐static field and therefore needs an object reference in order to
be reference in the main method (which is a static method). Line 18 is legal as q is created within the
main method. (b) Line 20 and 23 are legal as NO_ SSN is a public static field that can be accessed via
an object reference or a class name. Line 22 is legal because by default, name is visible. Line 21 and
24 are illegal because SSN is private. Also, Person.SSN is illegal as SSN is nonstatic.
IN THEORY
3.14 By defining a single private constructor for a class A, we can disallow any other object to create an
instance of A. For example, we may use A to hold only static data.
3.15 (a) Yes; main works anywhere. (b) Yes; if main was part of class IntCell, then storedValue
would no longer be considered private to main.
3.16 No, only one wildcard symbol (*) can be used in an import statement and only to specify all classes
within a specified package (i.e. java.util.*).
3.17 A run time error will occur stating that the zero‐parameter constructor could not be found.
IN PRACTICE
3.18 One possible solution is:
Page 20 of 20