Download Review Exercises

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
1
Review Exercises
R8.1

unit test: A form of test whereby a procedure or function is compiled outside the
program it will be used.

test harness: A program that feeds arguments to a procedure during testing.
R8.3

Regression testing: Regression testing involves repeating previously run tests to
ensure that known failures
of prior versions do not appear in new versions of the software.

Test suite: A test suite is a set of tests for repeated testing..
R8.5

positive test cases:
-0.5 returns -Math.PI / 6
-Math.sqrt(2) / 2 returns -Math.PI / 4
Math.sqrt(3) / 2 returns Math.PI / 3

boundary case:
1 returns Math.PI / 2

negative test cases:
-2 returns error
1.00000001 returns error.
R8.7

Stepping into a method means entering the first line of that method. This is used
to check whether the method carries out its job correctly.

Stepping over a method means going to the next program line. This is used
when one knows a method works correctly.
R8.9
The procedure depends on the debugger. Most debuggers know about the String class
and display its contents immediately when you ask to inspect or watch a string. However,
you can also display the instance variables and inspect the value instance variable.
R8.11
The "divide-and-conquer" strategy involves stepping over the methods in main to
pinpoint the location of the failure. When a failure occurs just after a particular method
(say f), then restart main, set a breakpoint before f, step into f, and now apply the same
strategy to f. Keep going until the error is found.
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
Programming Exercises
P8.1
ArcSinApproximator1.java
/**
This class provides methods to compute the
arcsin of a number
*/
public class ArcSinApproximator
{
/**
Constructs an ArcSinApproximator object
@param anX the number to compute
the arcsin
*/
public ArcSinApproximator(double anX)
{
x = anX;
term = x;
total = x;
i = 3;
}
/**
Determine the next closest guess to the arcsin
@return total the next closest approximation
to the arcsin
*/
public double nextGuess()
{
term = term * x * x * (i - 2) * (i - 2) / ((i - 1) * i);
total = total + term;
i = i + 2;
return total;
}
/**
Get the arcsin of a number
@return total the arcsin
*/
public double getArcSin()
{
while (Math.abs(term) > EPS)
nextGuess();
return total;
}
public static final double EPS = 0.000001;
private
private
private
private
}
double x;
double term;
double total;
int i;
2
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
ExP8_1.java
import javax.swing.JOptionPane;
/**
This class tests the ArcSinApproximator class
*/
public class ExP8_1
{
public static void main(String[] args)
{
String input = JOptionPane.showInputDialog(
"x:");
double x = Double.parseDouble(input);
ArcSinApproximator as = new ArcSinApproximator(x);
System.out.println("arcsin: " + as.getArcSin());
System.exit(0);
}
}
P8.3
ArcSinApproximator.java
/**
This class provides methods to compute the
arcsin of a number
*/
public class ArcSinApproximator
{
/**
Constructs an ArcSinApproximator object
@param anX the number to compute
the arcsin
*/
public ArcSinApproximator(double anX)
{
x = anX;
term = x;
total = x;
i = 3;
}
/**
Determine the next closest guess to the arcsin
@return total the next closest approximation
to the arcsin
*/
public double nextGuess()
{
term = term * x * x * (i - 2) * (i - 2) / ((i - 1) * i);
total = total + term;
i = i + 2;
return total;
3
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
}
/**
Get the arcsin of a number
@return total the arcsin
*/
public double getArcSin()
{
while (Math.abs(term) > EPS)
nextGuess();
return total;
}
public static final double EPS = 0.000001;
private
private
private
private
double x;
double term;
double total;
int i;
}
ExP8_3.java
/**
This test class automatically generates test cases for
the ArcSinApproximator class.
*/
public class ExP8_3
{
public static void main(String[] args)
{
double x;
for (x = -1; x <= 1; x = x + 0.1)
{
ArcSinApproximator as = new ArcSinApproximator(x);
double y = as.getArcSin();
System.out.println("arc sine of " + x + " = " + y);
}
}
}
P8.5
ArcSinApproximator.java
/**
This class provides methods to compute the
arcsin of a number
*/
public class ArcSinApproximator
{
/**
Constructs an ArcSinApproximator object
@param anX the number to compute
the arcsin
*/
public ArcSinApproximator(double anX)
{
x = anX;
4
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
term = x;
total = x;
i = 3;
}
/**
Determine the next closest guess to the arcsin
@return total the next closest approximation
to the arcsin
*/
public double nextGuess()
{
term = term * x * x * (i - 2) * (i - 2) / ((i - 1) * i);
total = total + term;
i = i + 2;
return total;
}
/**
Get the arcsin of a number
@return total the arcsin
*/
public double getArcSin()
{
while (Math.abs(term) > EPS)
nextGuess();
return total;
}
public static final double EPS = 0.000001;
private
private
private
private
double x;
double term;
double total;
int i;
}
ExP8_5.java
import java.util.Random;
/**
This class tests the ArcSinApproximator class by verifying
Math.sin(new ArcSinApproximator(x).getArcSin())
is approximately equal to x
*/
public class ExP8_5
{
public static void main(String[] args)
{
int i;
Random generator = new Random();
for (i = 1; i < 100; i++)
{
final double EPS = 0.000001;
double x = -1 + 2 * generator.nextDouble();
5
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
ArcSinApproximator as = new ArcSinApproximator(x);
double y = as.getArcSin();
double z = Math.sin(y);
if (Math.abs(x - z) <= EPS) /* this is too tight--it will fail
for some inputs */
System.out.print("Test passed. ");
else System.out.print("Test failed. ");
System.out.println("arc sine of " + x + " = " + y + ", sine is
" + z);
}
}
}
P8.7
ArcSinApproximator.java
/**
This class provides methods to compute the
arcsin of a number
*/
public class ArcSinApproximator
{
/**
Constructs an ArcSinApproximator object
@param anX the number to compute
the arcsin
*/
public ArcSinApproximator(double anX)
{
x = anX;
term = x;
total = x;
i = 3;
}
/**
Determine the next closest guess to the arcsin
@return total the next closest approximation
to the arcsin
*/
public double nextGuess()
{
term = term * x * x * (i - 2) * (i - 2) / ((i - 1) * i);
total = total + term;
i = i + 2;
return total;
}
/**
Get the arcsin of a number
@return total the arcsin
*/
public double getArcSin()
{
6
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
7
while (Math.abs(term) > EPS)
nextGuess();
return total;
}
public static final double EPS = 0.000001;
private
private
private
private
double x;
double term;
double total;
int i;
}
ExP8_7.java
import javax.swing.JOptionPane;
/**
This class test the ArcSinApproximator class
If the input x is (x < -1 || x > 1), the test fails.
(x < -1 || x > 1) is the domain of the arc sine function
*/
public class ExP8_7
{
public static void main(String[] args)
{
String input = JOptionPane.showInputDialog(
"x:");
double x = Double.parseDouble(input);
ArcSinApproximator as = new ArcSinApproximator(x);
System.out.println("arcsin: " + as.getArcSin());
System.exit(0);
}
}
P8.9
Word.java
import java.util.logging.Logger;
/**
This class describes words in a document.
Similar to using the debugger, adding logging messages to the program
can help find bugs. By logging the info of the variables i, j,
text,
end, and ch, one can find 2 errors. The messages are informative
enough to spot the bugs. For example, when the user inputs
"hello",
the logging messages state that the variables text = "hell" and
ch = "l" when the user knows that the text variable is suppose to
contain the string "hello" and ch = "o", the last character in the
string. The user can thus understand why "hello" returns only 1
syllable.
*/
*/
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
public class Word
{
/**
Constructs a word by removing leading and trailing nonletter characters, such as punctuation marks.
@param s the input string
*/
public Word(String s)
{
logger = Logger.getLogger("global");
int i = 0;
logger.info("i:" + i);
while (i < s.length()
&& !Character.isLetter(s.charAt(i)))
i++;
logger.info("i++:" + i);
int j = s.length() - 1;
logger.info("j:" + j);
while (j > i
&& !Character.isLetter(s.charAt(j)))
j--;
logger.info("j--:" + j);
text = s.substring(i, j);
logger.info("text:" + text);
}
/**
Returns the text of the word, after removal of the
leading and trailing non-letter characters.
@return the text of the word
*/
public String getText()
{
return text;
}
/**
Counts the syllables in the word.
@return the syllable count
*/
public int countSyllables()
{
int count = 0;
int end = text.length() - 1;
logger.info("end:" + end);
if (end < 0) return 0; // the empty string has no syllables
// an e at the end of the word doesn't count as a vowel
char ch = Character.toLowerCase(text.charAt(end));
logger.info("ch:" + ch);
if (ch == 'e') end--;
logger.info("end:" + end);
boolean insideVowelGroup = false;
for (int i = 0; i <= end; i++)
8
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
{
ch = Character.toLowerCase(text.charAt(i));
String vowels = "aeiouy";
if (vowels.indexOf(ch) >= 0)
{
// ch is a vowel
if (!insideVowelGroup)
{
// start of new vowel group
count++;
insideVowelGroup = true;
}
}
}
// every word has at least one syllable
if (count == 0)
count = 1;
return count;
}
private String text;
}
WordTest.java
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
/**
This program tests the countSyllables method of the Word class.
*/
public class WordTest
{
public static void main(String[] args)
{
String input
= JOptionPane.showInputDialog("Enter a sentence");
StringTokenizer tokenizer = new StringTokenizer(input);
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
Word w = new Word(token);
int syllables = w.countSyllables();
System.out.println("Syllables in " + token + ": "
+ syllables);
}
System.exit(0);
}
}
P8.11
ArcSinApproximator.java
/**
This class provides methods to compute the
arcsin of a number
*/
9
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
public class ArcSinApproximator
{
/**
Constructs an ArcSinApproximator object
@param anX the number to compute
the arcsin
*/
public ArcSinApproximator(double anX)
{
x = anX;
term = x;
total = x;
i = 3;
}
/**
Determine the next closest guess to the arcsin
@return total the next closest approximation
to the arcsin
*/
public double nextGuess()
{
term = term * x * x * (i - 2) * (i - 2) / ((i - 1) * i);
total = total + term;
i = i + 2;
/**
At this point, i == 17,
*/
return total;
}
/**
Get the arcsin of a number
@return total the arcsin
*/
public double getArcSin()
{
while (Math.abs(term) > EPS)
nextGuess();
return total;
}
public static final double EPS = 0.000001;
private
private
private
private
double x;
double term;
double total;
int i;
}
ExP8_11.java
import javax.swing.JOptionPane;
/**
10
Solutions Manual: Chapter 8
Big Java, by Cay Horstmann
This class test the ArcSinApproximator class
*/
public class ExP8_11
{
public static void main(String[] args)
{
String input = JOptionPane.showInputDialog(
"x:");
double x = Double.parseDouble(input);
ArcSinApproximator as = new ArcSinApproximator(x);
System.out.println("arcsin: " + as.getArcSin());
System.exit(0);
}
}
11