Solutions Manual for Data Structures with Java John R. Hubbard Anita Huray University of Richmond Chapter 1 Object-Oriented Programming Exercises 1.1 The requirements stage would generate a user manual like that shown here: User Manual Enter the string: java CelsiusToFahrenheit <first> <last> <incr> at the command line, where <first> is the first Celsius temperature to be converted, <first> is the last Celsius temperature, and <incr> is the Celsius increment for the table. The output will be a conversion table with that range and increment. Example: Input: java Convert 0 40 10 Output: 032 1050 2068 3086 40104 The design stage could adapt the same class as shown in Listing 1.1. The implementation stage could adapt the same class as shown in Listing 1.2. The testing stage could run a test driver like this: public class CelsiusToFahrenheit { public static void main(String[] args) { if (args.length!=3) exit(); double first = Double.parseDouble(args[0]); double last = Double.parseDouble(args[1]); double incr = Double.parseDouble(args[2]); for (double i=first; i<=last; i += incr) System.out.println(i + “\t” + new MyTemperature(value,'F') ); } 1 2 Chapter 1 Binary Trees private static void exit() { System.out.println( "Usage: java CelsiusToFahrenheit <first> <last> <incr>" + "\nwhere:" + "\t<first> is the first celsius temperature to be listed" + "\t<last> is the last celsius temperature to be listed" + "\t<incr> is the increment" + "\nExample:" + "\tjava CelsiusToFahrenheit 0 40 4" Design ); System.exit(0); } Implementation } 1.2 Another likely cycle is shown in here. This is the common Debug Cycle, consisting of repeated two-part test-and-correct step. Testing 1.3 CombinationLock -n1:int -n2:int -n3:int -open:boolean +changeComb(int,int,int,int,int,int):boolean +close() +isOpen():boolean +open(int,int,int):boolean 1.4 If d is a divisor of n that is greater than n, then m = n/d must be a whole number (i.e., an integer), and therefore another divisor of n. But since d > n, we have m=n/d<n/ n = n. So by checking for divisors only among those integers that are less than n, the existence of the divisor d > n will be found indirectly from m = n/d < n. 1.5 Course Section Instructor Student Person Solutions 3 1.6 Department Course Chair Section Instructor Student Person 1.7 Course Section Undergraduate Instructor Graduate Person Student 1.8 Vehicle Car Bus Driver Owner Person 4 Chapter 1 Binary Trees 1.9 Bank Manager Person BankBranch Customer CheckingAccount Account SavingsAccount Credit Transaction Debit 1.10 Media BroadcastMedia PrintMedia Website RadioProgram TVProgram Periodical Book Journal Magazine Newspaper Programming Problems 1.1 /** * An interface for representing temperatures, with functionality * for converting their values between Celsius and Fahrenheit. * @author John R. Hubbard * @see MyTemperature */ Solutions 5 public interface Temperature { /** @return the Celsius value for this temperature. */ public double getCelsius(); /** @return the Fahrenheit value for this temperature. */ public double getFahrenheit(); /** @return the Kelvin value for this temperature. */ public double getKelvin(); /** @param celsius the Celsius value for this temperature. */ public void setCelsius(double celsius); /** @param fahrenheit the Fahrenheit value for this temp. */ public void setFahrenheit(double fahrenheit); /** @param kelvin the Kelvin value for this temperature.*/ public void setKelvin(double kelvin); } public class MyTemperature implements Temperature { private double celsius; // stores temperature as a Celsius value public MyTemperature(double value, char scale) { if (scale=='C') setCelsius(value); if (scale=='F') setFahrenheit(value); else setKelvin(value); } public double getCelsius() { return celsius; } public double getFahrenheit() { return 9*celsius/5 + 32.0; } public double getKelvin() { return celsius + 273.16; } public void setCelsius(double celsius) { this.celsius = celsius; } public void setFahrenheit(double fahrenheit) { this.celsius = 5*(fahrenheit - 32)/9; } public void setKelvin(double kelvin) { this.celsius = kelvin - 273.16; } public String toString() { // Example: "25.0 C = 77.0 F" 6 Chapter 1 Binary Trees return round(getCelsius())+ " C = " + round(getFahrenheit())+ " F = " + round(getKelvin())+ " K"; } private static double round(double x) { // returns x, rounded to one digit on the right of the decimal: return Math.round(10*x)/10.0; } } 1.2 public class MyTemperature implements Temperature { private double celsius; // stores temperature as a Celsius value private int digits; // number of digits to right of decimal public MyTemperature(double value, char scale, int digits) { if (scale=='C') setCelsius(value); else setFahrenheit(value); this.digits = digits; } public double getCelsius() { return celsius; } public double getFahrenheit() { return 9*celsius/5 + 32.0; } public void setCelsius(double celsius) { this.celsius = celsius; } public void setDigits(int digits) { this.digits = digits; } public void setFahrenheit(double fahrenheit) { this.celsius = 5*(fahrenheit - 32)/9; } public String toString() { // Example: "25.0 C = 77.0 F" return round(getCelsius())+" C = "+round(getFahrenheit())+" F"; } private double round(double x) { // returns x, rounded to one digit on the right of the decimal: double p = Math.pow(10,digits); return Math.round(p*x)/p; } } Solutions 7 public class Convert { public static void main(String[] args) { if (args.length!=3) exit(); double value = Double.parseDouble(args[0]); // convert string char scale = Character.toUpperCase(args[1].charAt(0)); int digits = Integer.parseInt(args[2]); if (scale!='C' && scale!='F') exit(); Temperature temperature= new MyTemperature(value, scale, digits); System.out.println(temperature); } private static void exit() { // prints usage message and then terminates the program: System.out.println( "Usage: java Convert <temperature> <scale> <digits>" + "\nwhere:" + "\t<temperature> is the temperature that you want to convert" + "\n\t<scale> is either \"C\" or \"F\"." + "\n\t<digits> is the number of digits to use right of decimal." + "\nExample: java Convert 67 F 2" ); System.exit(0); } } 1.3 public class MyTemperature implements Temperature { private static final String s = "###,###,###,###.################"; private double celsius; // stores temperature as a Celsius value private int digits; // number of digits to right of decimal private DecimalFormat formatter; // used for formatted output public MyTemperature(double value, char scale, int digits) { if (scale=='C') setCelsius(value); else setFahrenheit(value); this.digits = digits; setFormatter(); } private void setFormatter() { String pattern = new String(s.toCharArray(), 0, 16 + digits); this.formatter = new DecimalFormat(pattern); } public double getCelsius() { return celsius; } 8 Chapter 1 Binary Trees public double getFahrenheit() { return 9*celsius/5 + 32.0; } public void setCelsius(double celsius) { this.celsius = celsius; } public void setDigits(int digits) { this.digits = digits; setFormatter(); } public void setFahrenheit(double fahrenheit) { this.celsius = 5*(fahrenheit - 32)/9; } public String toString() { // Example: "25.0 C = 77.0 F" return formatter.format(getCelsius()) + " C = " + formatter.format(getFahrenheit()) + " F"; } } public class Convert { public static void main(String[] args) { if (args.length!=3) exit(); double value = Double.parseDouble(args[0]); // convert string char scale = Character.toUpperCase(args[1].charAt(0)); int digits = Integer.parseInt(args[2]); if (scale!='C' && scale!='F') exit(); Temperature temperature= new MyTemperature(value, scale, digits); System.out.println(temperature); } private static void exit() { // prints usage message and then terminates the program: System.out.println( "Usage: java Convert <temperature> <scale> <digits>" + "\nwhere:" + "\t<temperature> is the temperature that you want to convert" + "\n\t<scale> is either \"C\" or \"F\"." + "\n\t<digits> is the number of digits to use right of decimal." + "\nExample: java Convert 67 F 2" ); System.exit(0); } }