Solution Manual for Data Structures and Problem Solving Using Java, 4th Edition
- Information Technology
- 166 pages
- Shared May 2025
Solution Manual for Data Structures and Problem Solving Using Java, 4th Edition offers the best solutions to textbook problems, helping you prepare for exams and assignments.
Preview 16 of 166 pages
See the first 16 pages exactly as they appear in the document.
Page 1 Read page 1 as text
Page 1 of 1 Weiss 4 th Edition Solutions to Exercises (US Version) Chapter 1 – Primitive Java 1.1 Key Concepts and How To Teach Them This chapter introduces primitive features of Java found in all languages such as Pascal and C: • basic lexical elements • primitive types • basic operators • control flow • functions (known as methods in Java) 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 Solutions to Exercises IN SHORT 1.1 Java source files end in .java . Compiled files (containing j‐code or byte‐codes) end in .class . 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 2 Page 3 Read page 3 as text
Page 2 of 2 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.13 The behavior is different if statements contains a continue statement. 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. public static void addition() { for( int i = 0; i < 10; i++ ) { for( int j = 0; j < 10; j++ ) { if( i + j < 10 ) System.out.print( " " ); System.out.print( i + j + " " ); } System.out.println( ); } } public static void multiplication() { for( int i = 1; i < 10; i++ ) { for( int j = 1; j < 10; j++ ) { if( i * j < 10 ) System.out.print( " " ); System.out.print( j * i + " " ); } System.out.println( ); } } 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. public static int max( int a, int b, int c )
Page 4 Read page 4 as text
Page 3 of 3 { return max( max( a, b ), c ); } public static int max( int a, int b, int c, int d ) { return max( max( a, b ), max( c, d ) ); } 1.18 The method is below: public static boolean isLeap( int year ) { boolean result = year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ); return result; } 1.3 Exam Questions 1.1 Consider the following statements: int a = 4; int b = 7; b *= a; What are the resulting values of a and b ? a. a is 4, b is 7 b. a is 28, b is 7 c. a is 4, b is 28 d. a is 28, b is 28 e. the statement is illegal 1.2 Consider the following statements: int a = 4; int b = 7 int c = ++a + b—; What is the resulting value of c ? a. 10 b. 11 c. 12 d. 13 e. none of the above 1.3 Consider the following statements: boolean a = false; boolean b = true; boolean c = false; boolean d; In which of the following is d evaluated? a. a && d b. b && d
Page 5 Read page 5 as text
Page 4 of 4 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 1.7 Consider the following statements: int a = 5; int b = 7; int c, d; c = (b - a)/2*a; d = b + 7/a; What are the resulting values of c a. c is 0 and d is 2 b. c is 0 and d is 2.4 c. c is 5 and d is 8 d. c is 5 and d is 2 e. none of the above 1.8 Which of the following is true and d ? a. A variable must be declared immediately before its first use. b. An identifier may start with any letter or any digit. c. _33a is a valid identifier. d. both (a) and (c) are true e. all of the above are true
Page 6 Read page 6 as text
Page 5 of 5 Answers to Exam Questions 1. C 2. C 3. B 4. A 5. B 6. C 7. C 8. C
Page 7 Read page 7 as text
Page 6 of 6 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.4 Dynamic Expansion Explain why we double instead of simply add an extra position. Discuss ArrayList as a type that maintains the size as well as capacity of an array and automatically increases capacity when needed. 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.1.6 Input and Output This section gives a brief description of I/O (mostly I), and the StringTokenizer . The I/O uses Java 1.1 constructs. This accounts for almost all of the updating from Java 1.0. The StringTokenizer is extremely important for simplifying the parsing of input lines. Without it, life will be difficult. 2.2 Solutions To Exercises IN SHORT 2.1 Reference values (logically) store the address where an object resides; a primitive value stores the value of a primitive variable. As a result, operations such as == have seemingly different meanings for reference types and primitive types. 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 8 Read page 8 as text
Page 7 of 7 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.*; public class Checksum { public static void main(String[] args) { int checksum = 0; System.out.print("Enter the name of the file: "); String filename = (new Scanner(System.in)).nextLine(); Scanner fileScanner = null; try { fileScanner = new Scanner(new File(filename)); } catch (IOException ioe) { System.err.println("IO Exception thrown."); } 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); } } 2.10 One possible solution to do this is: import java.util.Scanner;
Page 9 Read page 9 as text
Page 8 of 8 import java.io.FileReader; import java.io.IOException; public class ListFiles { public static void main( String [ ] args ) { Scanner scanIn = null; if( args.length != 0 ) { for( String fileName : args ) { System.out.println( "FILE: " + fileName ); try { scanIn = new Scanner (new FileReader ( fileName )); listFile( scanIn ); } catch( IOException e ) { System.out.println( e ); } finally { // Close the stream if( scanIn != null ) scanIn.close( ); } } } else { scanIn = new Scanner (System.in); listFile( scanIn ); // Close the stream if( scanIn != null ) scanIn.close( ); } } public static void listFile( Scanner fileIn ) { while( fileIn.hasNextLine( ) ) { String oneLine = fileIn.nextLine( ); System.out.println( oneLine ); } } } 2.11 A method to do this is below: public static boolean isPrefix( String str1, String str2 ) { if( str1.length( ) > str2.length( ) ) return false;
Page 10 Read page 10 as text
Page 9 of 9 for( int i = 0; i < str1.length( ) ; i++ ) if( str1.charAt( str1.length() ) != str2.charAt( str2.length() ) ) return false; return true; } 2.12 A method to do this is below: public static int getTotalStrLength(String [] theStrings ) { int total = 0; for( String s : theStrings ) total += s.length( ); return total; } 2.13 The elements in the original array are not copied before it is reinitialized. 2.14 Methods to accomplish this are below: public static double sum( double [ ] arr ) { double sum = 0.0d; for (int i = 0; i < arr.length; i++ ) sum += arr[i]; return sum; } public static double average( double [ ] arr ) { double sum = 0.0d; for (int i = 0; i < arr.length; i++ ) sum += arr[i]; return sum / arr.length; } public static double mode( double [ ] arr ) { java.util.Arrays.sort(arr); int modeCounter = 1; int maxMode = 1; double modeValue = arr[0]; for (int i = 0; i < arr.length-1; i++ ) { if (arr[i] == arr[i+1]) modeCounter++; if (modeCounter > maxMode) { maxMode = modeCounter; modeValue = arr[i+1];
Page 11 Read page 11 as text
Page 10 of 10 modeCounter = 1; } } return modeValue; } 2.15 Methods to accomplish this are below: public static double sum( double [ ][ ] arr ) { double sum = 0.0d; for (int row = 0; row < arr.length; row++ ) for (int col = 0; col < arr[row].length; col++ ) sum += arr[row][col]; return sum; } public static double average( double [ ][ ] arr ) { double sum = 0.0d; int row = 0, col = 0; for (row = 0; row < arr.length; row++ ) for (col = 0; col < arr[row].length; col++ ) sum += arr[row][col]; return sum / (row*col); } public static double mode( double [ ][] arr ) { double [] newArr = new double[arr.length * arr[0].length]; int counter = 0; for (int row = 0; row < arr.length; row++ ) for (int col = 0; col < arr[row].length; col++ ) newArr[counter++] = arr[row][col]; java.util.Arrays.sort(newArr); int modeCounter = 1; int maxMode = 1; double modeValue = newArr[0]; for (int i = 0; i < newArr.length-1; i++ ) { if (newArr[i] == newArr[i+1]) modeCounter++; if (modeCounter > maxMode) { maxMode = modeCounter; modeValue = newArr[i+1]; modeCounter = 1; } } return modeValue; }
Page 12 Read page 12 as text
Page 11 of 11 2.16 Methods to accomplish this are below: public static void reverse( String [ ] arr ) { for (int i=0; i < arr.length / 2; i++) { String temp = arr[arr.length-i-1]; arr[arr.length-i-1] = arr[i]; arr[i] = temp; } } public static void reverse( ArrayList<String> arr ) { for (int i=0; i < arr.size() / 2; i++) { String temp = arr.get(arr.size()-i-1); arr.set(arr.size()-i-1, arr.get(i)); arr.set(i, temp); } } 2.17 Methods to accomplish this are below: public static int min( int [ ] arr ) { int currentMin = arr[0]; for (int value : arr) if (value < currentMin) currentMin = value; return currentMin; } public static int min( int [ ][ ] arr ) { int currentMin = arr[0][0]; for (int row = 0; row < arr.length; row++) for (int col = 0; col < arr[row].length; col++) if (arr[row][col] < currentMin) currentMin = arr[row][col]; return currentMin; } public static String min( String [ ] arr ) { String currentMin = arr[0]; for (String value : arr) if (value.compareTo(currentMin) < 0) currentMin = value; return currentMin; }
Page 13 Read page 13 as text
Page 12 of 12 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; } 2.18 A method to do this is below: public static int rowWithMostZeros( int [ ] [ ] arr ) { int result = 0, maxCount = 0; for (int row = 0; row < arr.length; row++) { int rowCounter = 0; for (int col = 0; col < arr[row].length; col++) if (arr[row][col] == 0) rowCounter++; if (rowCounter > maxCount) { maxCount = rowCounter; result = row; } } return result; } 2.19 Methods to accomplish this are below: public static boolean hasDuplicates( int [ ] arr ) { boolean result = false; for (int i=0; i < arr.length-1; i++) for (int j=i+1; j < arr.length; j++) if (arr[i] == arr[j]) result = true; return result; } public static boolean hasDuplicates( int [ ][ ] arr ) { double [] newArr = new double[arr.length * arr[0].length]; int counter = 0; for (int row = 0; row < arr.length; row++ ) for (int col = 0; col < arr[row].length; col++ ) newArr[counter++] = arr[row][col]; java.util.Arrays.sort(newArr); boolean result = false; for (int i=0; i < newArr.length-1; i++) for (int j=i+1; j < newArr.length; j++) if (newArr[i] == newArr[j])
Page 14 Read page 14 as text
Page 13 of 13 result = true; return result; } public static boolean hasDuplicates( String [ ] arr ) { boolean result = false; for (int i=0; i < arr.length-1; i++) for (int j=i+1; j < arr.length; j++) if (arr[i].compareTo(arr[j]) == 0) result = true; return result; } public static boolean hasDuplicates( ArrayList<String> arr ) { boolean result = false; for (int i=0; i < arr.size()-1; i++) for (int j=i+1; j < arr.size(); j++) if (arr.get(i).compareTo(arr.get(j)) == 0) result = true; return result; } 2.20 Methods to accomplish this are below: public static int howMany( int [ ] arr, int val ) { int result = 0; for (int i = 0; i < arr.length; i++) if (arr[i] == val) result++; return result; } public static int howMany( int [ ][ ] arr, int val ) { int result = 0; for (int i = 0; i < arr.length; i++) for (int j = 0; j < arr.length; j++) if (arr[i][j] == val) result++; return result; } 2.21 Methods to accomplish this are below: public static int countChars( String str, char ch ) { int counter = 0; for (int i = 0; i < str.length(); i++) if (str.charAt(i) == ch) counter++;
Page 15 Read page 15 as text
Page 14 of 14 return counter; } public static int countChars( String [ ] str, char ch ) { int counter = 0; for (int stringNum = 0; stringNum < str.length; stringNum++) for (int i = 0; i < str[stringNum].length(); i++) if (str[stringNum].charAt(i) == ch) counter++; return counter; } 2.22 Methods to accomplish this include: public static String [ ] getLowerCase( String [ ] arr ) { String [] results = new String[arr.length]; int index = 0; for (String value : arr) results[index++] = value.toLowerCase(); return results; } public static void makeLowerCase( String [ ] arr ) { int index = 0; for (String value : arr) arr[index++] = value.toLowerCase(); } public static ArrayList<String> getLowerCase( ArrayList<String> arr ) { ArrayList<String> results = new ArrayList<String>(); for (String value : arr) results.add(value.toLowerCase()); return results; } public static void makeLowerCase( ArrayList<String> arr ) { int index = 0; for (String value : arr) arr.set(index++, value.toLowerCase()); } 2.23 One solution is: public static boolean isIncreasing( int [ ] [ ] arr ) { boolean increasing = true; for (int row = 0; row < arr.length; row++)
Page 16 Read page 16 as text
Page 15 of 15 for (int col = 0; col < arr[row].length-1; col++) if (arr[row][col] > arr[row][col+1]) increasing = false; return increasing; } 2.24 One possible solution is: public ArrayList<String> startsWith( String [ ] arr, char ch ) { ArrayList<String> results = new ArrayList<String>(); for (String value : arr) if (value.charAt(0) == ch) results.add(value); return results; } 2.25 One possible solution is: public String [ ] split( String str ) { ArrayList<String> list = new ArrayList<String>(); Scanner scan = new Scanner(str); while (scan.hasNext()) list.add(scan.next()); return ((String []) list.toArray()); } 2.26 One possible solution includes: 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; System.out.println( "Enter 2 ints: " ); String inputLine = in.nextLine(); String [] inputs = inputLine.split("\\s"); 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.
150 more pages in the full document
Unlock it once and it stays in your library, ready to chat with or turn into flashcards.
Unlock the full documentMore Information Technology study materials
See all
Exam GuidesTest Bank for Managing and Using Information Systems: A Strategic Approach, 7th Edition (Chapters 1-13)
Information Technology
452 pages149downloadsFeb 2025
Exam GuidesTest Bank for Essentials of MIS, 12th Edition
Information Technology
342 pages146downloadsFeb 2025
Exam GuidesA+ Guide to Hardware, 9th Edition Test Bank
Information Technology
116 pages142downloadsFeb 2025
Textbook GuidesSolution Manual for Essentials of System Analysis and Design, 4th Edition
Information Technology
282 pages140downloadsFeb 2025
Textbook GuidesGuide To Networking Essentials, 7th Edition Solution Manual
Information Technology
48 pages139downloadsFeb 2025
Past Exams2023-2024 SOPHOS FIREWALL V19.5 Practice Exam with Answers (75 Solved Questions)
Information Technology
7 pages134downloadsFeb 2025
Class NotesLecture Notes for CCNP Enterprise: Core Networking (ENCOR) v8 Lab Manual, 2nd Edition
Information Technology
1089 pages123downloadsFeb 2025
Class NotesLecture Notes for Adobe XD Classroom in a Book (2020 release)
Information Technology
66 pages118downloadsFeb 2025
Study this document with CramX
Once it is in your library, every tool can work from it.

