Tải bản đầy đủ (.pdf) (111 trang)

Java Concepts 5th Edition and 6th phần 3 potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.02 MB, 111 trang )

Java Concepts, 5th Edition
14. Assuming the String variable river holds the value
“Mississippi”, what is the value of river.substring(1,
2)? Of river.substring(2, river.length() - 3)?
PRODUCTIVITY HINT 4.2: Reading Exception Reports
You will often have programs that terminate and display an error message, such as
Exception in thread "main"
java.lang.StringIndexOutOfBoundsException:
String index out of range: -4
at java.lang.String.substring
(String.java:1444)
at Homework1.main(Homework1.java:16)
An amazing number of students simply give up at that point, saying “it didn't
work”, or “my program died”, without ever reading the error message. Admittedly,
the format of the exception report is not very friendly. But it is actually easy to
decipher it.
When you have a close look at the error message, you will notice two pieces of
useful information:
1. The name of the exception, such as
StringIndexOutOfBoundsException
2. The line number of the code that contained the statement that caused the
exception, such as Homework1.java:16
The name of the exception is always in the first line of the report, and it ends in
Exception. If you get a StringIndexOutOfBoundsException, then
there was a problem with accessing an invalid position in a string. That is useful
information.
The line number of the offending code is a little harder to determine. The
exception report contains the entire stack trace—that is, the names of all methods
that were pending when the exception hit. The first line of the stack trace is the
method that actually generated the exception. The last line of the stack trace is a
line in main. Often, the exception was thrown by a method that is in the standard


160
161
Chapter 4 Fundamental Data Types Page 39 of 69
Java Concepts, 5th Edition
library. Look for the first line in your code that appears in the exception report. For
example, skip the line that refers to
java.lang.String.substring(String.java:1444)
The next line in our example mentions a line number in your code,
Homework1.java. Once you have the line number in your code, open up the
file, go to that line, and look at it! In the great majority of cases, knowing the name
of the exception and the line that caused it make it completely obvious what went
wrong, and you can easily fix your error.
ADVANCED TOPIC 4.4: Escape Sequences
Suppose you want to display a string containing quotation marks, such as
Hello, "World"!
You can't use
System.out.println("Hello, "World"!");
As soon as the compiler reads “Hello, ”, it thinks the string is finished, and
then it gets all confused about World followed by two quotation marks. A human
would probably realize that the second and third quotation marks were supposed to
be part of the string, but a compiler has a one-track mind. If a simple analysis of
the input doesn't make sense to it, it just refuses to go on, and reports an error.
Well, how do you then display quotation marks on the screen? You precede the
quotation marks inside the string with a backslash character. Inside a string, the
sequence \” denotes a literal quote, not the end of a string. The correct display
statement is, therefore
System.out.println("Hello, \"World\"!");
The backslash character is used as an escape character; the character sequence \” is
called an escape sequence. The backslash does not denote itself; instead, it is used
to encode other characters that would otherwise be difficult to include in a string.

Now, what do you do if you actually want to print a backslash (for example, to
specify a Windows file name)? You must enter two \ in a row, like this:
Chapter 4 Fundamental Data Types Page 40 of 69
Java Concepts, 5th Edition
System.out.println("The secret message is in
C:\\Temp\\Secret.txt");
This statement prints
The secret message is in C:\Temp\Secret.txt
Another escape sequence occasionally used is \n, which denotes a newline or line
feed character. Printing a newline character causes the start of a new line on the
display. For example, the statement
System.out.print("*n**n***n");
prints the characters
*
**
***
on three separate lines. Of course, you could have achieved the same effect with
three separate calls to println.
Finally, escape sequences are useful for including international characters in a
string. For example, suppose you want to print “All the way to San José!”, with an
accented letter (é). If you use a U.S. keyboard, you may not have a key to generate
that letter. Java uses the Unicode encoding scheme to denote international
characters. For example, the é character has Unicode encoding 00E9. You can
include that character inside a string by writing \u, followed by its Unicode
encoding:
System.out.println("All the way to San
Jos\u00E9!");
You can look up the codes for the U.S. English and Western European characters
in Appendix B, and codes for thousands of characters in reference [1].
ADVANCED TOPIC 4.5: Strings and the Char Type

Strings are sequences of Unicode characters (see Random Fact 4.2). Character
constants look like string constants, except that character constants are delimited
by single quotes: ‘H’ is a character, “H” is a string containing a single character.
161
162
Chapter 4 Fundamental Data Types Page 41 of 69
Java Concepts, 5th Edition
You can use escape sequences (see Advanced Topic 4.4) inside character
constants. For example, ‘\n’ is the newline character, and ‘\u00E9’ is the
character é. You can find the values of the character constants that are used in
Western European languages in Appendix B.
Characters have numeric values. For example, if you look at Appendix B, you can
see that the character ‘H’ is actually encoded as the number 72.
When Java was first designed, each Unicode character was encoded as a two-byte
quantity. The char type was intended to hold the code of a Unicode character.
However, as of 2003, Unicode had grown so large that some characters needed to
be encoded as pairs of char values. Thus, you can no longer think of a char value
as a character. Technically speaking, a char value is a code unit in the UTF-16
encoding of Unicode. That encoding represents the most common characters as a
single char value, and less common or supplementary characters as a pair of char
values.
The charAt method of the String class returns a code unit from a string. As
with the sub-string method, the positions in the string are counted starting at
0. For example, the statement
String greeting = "Hello";
char ch = greeting.charAt(0);
sets ch to the value ‘H’.
However, if you use char variables, your programs may fail with some strings
that contain international or symbolic characters. For example, the single character
» (the mathematical symbol for the set of integers) is encoded by the two code

units ‘\uD835’ and ‘\uDD6B’.
If you call charAt(0) on the string containing the single character » (that is, the
string “\uD835\uDD6B”), you only get the first half of a supplementary
character.
Therefore, you should only use char values if you are absolutely sure that you
won't need to encode supplementary characters.
162
Chapter 4 Fundamental Data Types Page 42 of 69
Java Concepts, 5th Edition
RANDOM FACT 4.2: International Alphabets
The English alphabet is pretty simple: upper- and lowercase a to z. Other European
languages have accent marks and special characters. For example, German has
three umlaut characters (ä, ö, ü) and a double-s character (ß). These are not
optional frills; you couldn't write a page of German text without using these
characters. German computer keyboards have keys for these characters (see A
German Keyboard).
This poses a problem for computer users and designers. The American standard
character encoding (called ASCII, for American Standard Code for Information
Interchange) specifies 128 codes: 52 upper- and lowercase characters, 10 digits, 32
typographical symbols, and 34 control characters (such as space, newline, and 32
others for controlling printers and other devices). The umlaut and double-s are not
among them. Some German data processing systems replace seldom-used ASCII
characters with German letters: [ \ ] { | } ∼ are replaced with Ä Ö Ü ä ö ü
ß. Most people can live without those ASCII characters, but programmers using
Java definitely cannot. Other encoding schemes take advantage of the fact that one
byte can encode 256 different characters, but only 128 are standardized by ASCII.
Unfortunately, there are multiple incompatible standards for using the remaining
128 characters, resulting in a certain amount of aggravation among e-mail
correspondents in different European countries.
Many countries don't use the Roman script at all. Russian, Greek, Hebrew, Arabic,

and Thai letters, to name just a few, have completely different shapes (see The
Thai Alphabet). To complicate matters, scripts like Hebrew and Arabic are written
from right to left instead of from left to right, and many of these scripts have
characters that stack above or below other characters, as those marked with a
dotted circle in The Thai Alphabet do in Thai. Each of these alphabets has between
30 and 100 letters, and the countries using them have established encoding
standards for them.
The situation is much more dramatic in languages that use Chinese script: the
Chinese dialects, Japanese, and Korean. The Chinese script is not alphabetic but
ideographic—a character represents an idea or thing rather than a single sound.
(See A Menu with Chinese Characters; can you identify the characters for soup,
162
163
Chapter 4 Fundamental Data Types Page 43 of 69
Java Concepts, 5th Edition
chicken, and wonton?) Most words are made up of one, two, or three of these
ideographic characters. Tens of thousands of ideographs are in active use, and
China, Taiwan, Hong Kong, Japan, and Korea developed incompatible encoding
standards for them.
A German Keyboard
The Thai Alphabet
The inconsistencies among character encodings have been a major nuisance for
international electronic communication and for software manufacturers vying for a
global market. Between 1988 and 1991 a consortium of hardware and software
manufacturers developed a uniform encoding scheme called Unicode that is
expressly designed to encode text in all written languages of the world (see
reference [1]). In the first version of Unicode, about 39,000 characters were given
codes, including 21,000 Chinese ideographs. A 2-byte code (which can encode
163
164

Chapter 4 Fundamental Data Types Page 44 of 69
Java Concepts, 5th Edition
over 65,000 characters) was chosen. It was thought to leave ample space for
expansion for esoteric scripts, such as Egyptian hieroglyphs and the ancient script
used on the island of Java.
Java was one of the first programming languages to embrace Unicode. The
primitive type char denotes a 2-byte Unicode character. (All Unicode characters
can be stored in Java strings, but which ones can actually be displayed depends on
your computer system.)
A Menu with Chinese Characters
Unfortunately, in 2003, the inevitable happened. Another large batch of Chinese
ideographs had to be added to Unicode, pushing it beyond the 16-bit limit. Now,
some characters need to be encoded with a pair of char values.
4.7 Reading Input
The Java programs that you have made so far have constructed objects, called
methods, printed results, and exited. They were not interactive and took no user input.
In this section, you will learn one method for reading user input.
Use the Scanner class to read keyboard input in a console window.
Because output is sent to System.out, you might think that you use System.in
for input. Unfortunately, it isn't quite that simple. When Java was first designed, not
164
165
Chapter 4 Fundamental Data Types Page 45 of 69
Java Concepts, 5th Edition
much attention was given to reading keyboard input. It was assumed that all
programmers would produce graphical user interfaces with text fields and menus.
System.in was given a minimal set of features—it can only read one byte at a
time. Finally, in Java version 5, a Scanner class was added that lets you read
keyboard input in a convenient manner.
To construct a Scanner object, simply pass the System.in object to the

Scanner constructor:
Scanner in = new Scanner(System.in);
You can create a scanner out of any input stream (such as a file), but you will usually
want to use a scanner to read keyboard input from System.in.
Once you have a scanner, you use the nextInt or nextDouble methods to read
the next integer or floating-point number.
System.out.print("Enter quantity: ");
int quantity = in.nextInt();
System.out.print("Enter price: ");
double price = in.nextDouble();
When the nextInt or nextDouble method is called, the program waits until the
user types a number and hits the Enter key. You should always provide instructions
for the user (such as “Enter quantity:”) before calling a Scanner method.
Such an instruction is called a prompt.
The nextLine method returns the next line of input (until the user hits the Enter
key) as a String object. The next method returns the next word, terminated by any
white space, that is, a space, the end of a line, or a tab.
System.out.print("Enter city: ");
String city = in.nextLine();
System.out.print("Enter state code: ");
String state = in.next();
Here, we use the nextLine method to read a city name that may consist of multiple
words, such as San Francisco. We use the next method to read the state code
(such as CA), which consists of a single word.
165
Chapter 4 Fundamental Data Types Page 46 of 69
Java Concepts, 5th Edition
Here is an example of a class that takes user input. This class uses the
CashRegister class and simulates a transaction in which a user purchases an item,
pays for it, and receives change.

We call this class CashRegisterSimulator, not CashRegisterTester. We
reserve the Tester suffix for classes whose sole purpose is to test other classes.
ch04/cashregister/CashRegisterSimulator.java
1 import java.util.Scanner;
2
3 /**
4 This program simulates a transaction in
which a user pays for an item
5 and receives change.
6 */
7 public class CashRegisterSimulator
8 {
9 public static void main(String[]
args)
10 {
11 Scanner in = new
Scanner(System.in);
12
13 CashRegister register = new
CashRegister();
14
15 System.out.print(“Enter
price: ”);
16 double price =
in.nextDouble();
17 register.recordPurchase(price);
18
19 System.out.print(“Enter
dollars: ”);
20 int dollars = in.nextInt();

21 System.out.print(“Enter
quarters: ”);
22 int quarters = in.nextInt();
23 System.out.print(“Enter
dimes: ”);
24 int dimes = in.nextInt();
165
166
Chapter 4 Fundamental Data Types Page 47 of 69
Java Concepts, 5th Edition
25 System.out.print(“Enter
nickels: ”);
26 int nickels = in.nextInt();
27 System.out.print(“Enter
pennies: ”);
28 int pennies = in.nextInt();
29 register.enterPayment(dollars,
quarters, dimes, nickels, pennies);
30
31 System.out.print(“Your
change: ”);
32 System.out.println(register.
giveChange
33 }
34 }
Output
Enter price: 7.55
Enter dollars: 10
Enter quarters: 2
Enter dimes: 1

Enter nickels: 0
Enter pennies: 0
Your change: 3.05
SELF CHECK
15. Why can't input be read directly from System.in?
16. Suppose in is a Scanner object that reads from System.in, and your
program calls
String name = in.next();
What is the value of name if the user enters John Q. Public?
ADVANCED TOPIC 4.6: Formatting Numbers
The default format for printing numbers is not always what you would like. For
example, consider the following code segment:
double total = 3.50;
final double TAX_RATE = 8.5; // Tax rate in percent
166
167
Chapter 4 Fundamental Data Types Page 48 of 69
Java Concepts, 5th Edition
double tax = total * TAX_RATE / 100; // tax is 0.2975
System.out.println("Total: " + total);
System.out.println("Tax: " + tax);
The output is
Total: 3.5
Tax: 0.2975
You may prefer the numbers to be printed with two digits after the decimal point,
like this:
Total: 3.50
Tax: 0.30
You can achieve this with the printf method of the PrintStream class.
(Recall that System.out is an instance of PrintStream.) The first parameter

of the printf method is a format string that shows how the output should be
formatted. The format string contains characters that are simply printed, and
format specifiers: codes that start with a % character and end with a letter that
indicates the format type. There are quite a few formats—Table 3 shows the most
important ones. The remaining parameters of printf are the values to be
formatted. For example,
System.out.printf("Total:%5.2f", total);
prints the string Total:, followed by a floating-point number with a width of 5
and a precision of 2. The width is the total number of characters to be printed: in
our case, a space, the digit 3, a period, and two digits. If you increase the width,
more spaces are added. The precision is the number of digits after the decimal
point.
This simple use of printf is sufficient for most formatting needs. Once in a while,
you may see a more complex example, such as this one:
System.out.printf("%-6s%5.2f%n", "Tax:", total);
Here, we have three format specifiers. The first one is %-6s. The s indicates a
string. The hyphen is a flag, modifying the format. (See Table 4 for the most
common format flags. The flags immediately follow the % character.) The hyphen
indicates left alignment. If the string to be formatted is shorter than the width, it is
167
168
Chapter 4 Fundamental Data Types Page 49 of 69
Java Concepts, 5th Edition
placed to the left, and spaces are added to the right. (The default is right alignment,
with spaces added to the left.) Thus, %-6s denotes a left-aligned string of width 6.
Table 3 Format Types
Code Type Example
d
Decimal integer
123

x
Hexadecimal integer
7B
o
Octal integer
173
f
Fixed floating-point
12.30
e
Exponential floating-point
1.23e+1
g
General floating-point (exponential
notation used for very large or very
small values)
12.3
s
String
Tax:
n
Platform-independent line end
You have already seen %5.2f: a floating-point number of width 5 and precision
2. The final specifier is %n, indicating a platform-independent line end. In
Windows, lines need to be terminated by two characters: a carriage return ‘\r’
and a newline ‘\n’. In other operating systems, a ‘\n’ suffices. The %n format
emits the appropriate line terminators.
Moreover, this call to printf has two parameters. You can supply any number of
parameter values to the printf method. Of course, they must match the format
specifiers in the format string.

Table 4 Format Flags
Flag Meaning Example
-
Left alignment 1.23 followed by spaces
0
Show leading zeroes
001.23
+
Show a plus sign for positive
numbers
+1.23
(
Enclose negative numbers in
parentheses
(1.23)
,
Show decimal separators
12,300

Convert letters to uppercase
1.23E+1
The format method of the String class is similar to the printf method.
However, it returns a string instead of producing output. For example, the call
168
169
Chapter 4 Fundamental Data Types Page 50 of 69
Java Concepts, 5th Edition
String message = String.format("Total:%5.2f",
total);
sets the message variable to the string “Total: 3.50”.

ADVANCED TOPIC 4.7: Using Dialog Boxes for Input and
Output
Most program users find the console window rather old-fashioned. The easiest
alternative is to create a separate pop-up window for each input (see An Input
Dialog Box).
Call the static showInputDialog method of the JOptionPane class, and
supply the string that prompts the input from the user. For example,
String input = JOptionPane.showInputDialog("Enter
price:");
That method returns a String object. Of course, often you need the input as a
number. Use the Integer.parseInt and Double.parseDouble methods
to convert the string to a number:
double price = Double.parseDouble(input);
You can also display output in a dialog box:
JOptionPane.showMessageDialog(null, "Price: " +
price);
Finally, whenever you call the showInputDialog or showMessageDialog
method in a program that does not show any other frame windows, you need to
add a line
System.exit(0);
to the end of your main method. The showInputDialog method starts a user
interface thread to handle user input. When the main method reaches the end, that
thread is still running, and your program won't exit automatically. To force the
program to exit, you need to call the exit method of the System class. The
parameter of the exit method is the status code of the program. A code of 0
Chapter 4 Fundamental Data Types Page 51 of 69
Java Concepts, 5th Edition
denotes successful completion; you can use nonzero status codes to denote various
error conditions.
An Input Dialog Box

CHAPTER SUMMARY
1. Java has eight primitive types, including four integer types and two floating
point types.
2. A numeric computation overflows if the result falls outside the range for the
number type.
3. Rounding errors occur when an exact conversion between numbers is not
possible.
4. You use a cast (typeName) to convert a value to a different type.
5. Use the Math.round method to round a floating-point number to the nearest
integer.
6. A final variable is a constant. Once its value has been set, it cannot be
changed.
7. Use named constants to make your programs easier to read and maintain.
8. Assignment to a variable is not the same as mathematical equality.
9. The ++ and operators increment and decrement a variable.
10. If both arguments of the / operator are integers, the result is an integer and the
remainder is discarded.
11. The % operator computes the remainder of a division.
169
170
Chapter 4 Fundamental Data Types Page 52 of 69
Java Concepts, 5th Edition
12. The Math class contains methods sqrt and pow to compute square roots and
powers.
13. A static method does not operate on an object.
14. A string is a sequence of characters. Strings are objects of the String class.
15. Strings can be concatenated, that is, put end to end to yield a new longer string.
String concatenation is denoted by the + operator.
16. Whenever one of the arguments of the + operator is a string, the other argument
is converted to a string.

17. If a string contains the digits of a number, you use the Integer.parseInt
or Double.parseDouble method to obtain the number value.
18. Use the substring method to extract a part of a string.
19. String positions are counted starting with 0.
20. Use the Scanner class to read keyboard input in a console window.
FURTHER READING
1. The web site of the Unicode consortium. It
contains character tables that show the Unicode values of characters from
many scripts.
CLASSES, OBJECTS, AND METHODS INTRODUCED IN THIS
CHAPTER
java.io.PrintStream
printf
java.lang.Double
parseDouble
java.lang.Integer
parseInt
toString
MAX_VALUE
MIN_VALUE
170
171
Chapter 4 Fundamental Data Types Page 53 of 69
Java Concepts, 5th Edition
java.lang.Math
E
PI
abs
acos
asin

atan
atan2
ceil
cos
exp
floor
log
max
min
pow
round
sin
sqrt
tan
toDegrees
toRadians
java.lang.String
format
substring
java.lang.System
in
java.math.BigDecimal
add
multiply
subtract
java.math.BigInteger
add
multiply
subtract
java.util.Scanner

next
nextDouble
nextInt
nextLine
javax.swing.JOptionPane
showInputDialog
showMessageDialog
Chapter 4 Fundamental Data Types Page 54 of 69
Java Concepts, 5th Edition
REVIEW EXERCISES
★★ Exercise R4.1. Write the following mathematical expressions in Java.
s = + t +s
0
v
0
1
2
gt
2
G = 4π
2
a
3
+p
2
(
m
1
m
2

)
FV = PV · 1 +
(
INT
100
)
YRS
c = + − 2 ab cos γa
2
b
2
★★ Exercise R4.2. Write the following Java expressions in mathematical
notation.
a. dm = m * (Math.sqrt(1 + v / c) / (Math.sqrt(1
- v / c) - 1));
b. volume = Math.PI * r * r * h;
c. volume = 4 * Math.PI * Math.pow(r, 3) / 3;
d. p = Math.atan2(z, Math.sqrt(x * x + y * y));
★★★ Exercise R4.3. What is wrong with this version of the quadratic formula?
x1 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 * a;
x2 = (-b + Math.sqrt(b * b - 4 * a * c)) / 2 * a;
★★ Exercise R4.4. Give an example of integer overflow. Would the same
example work correctly if you used floating-point?
★★ Exercise R4.5. Give an example of a floating-point roundoff error. Would
the same example work correctly if you used integers and switched to a
sufficiently small unit, such as cents instead of dollars, so that the values
don't have a fractional part?
★★ Exercise R4.6. Consider the following code:
171
172

Chapter 4 Fundamental Data Types Page 55 of 69
Java Concepts, 5th Edition
CashRegister register = new CashRegister();
register.recordPurchase(19.93);
register.enterPayment(20, 0, 0, 0, 0);
System.out.print("Change: ");
System.out.println(register.giveChange());
The code segment prints the total as 0.07000000000000028. Explain
why. Give a recommendation to improve the code so that users will not be
confused.
★ Exercise R4.7. Let n be an integer and x a floating-point number. Explain
the difference between
n = (int) x;
and
n = (int) Math.round(x);
★★★ Exercise R4.8. Let n be an integer and x a floating-point number.
Explain the difference between
n = (int) (x + 0.5);
and
n = (int) Math.round(x);
For what values of x do they give the same result? For what values of x
do they give different results?
★ Exercise R4.9. Explain the differences between 2, 2.0, ‘2’, “2”, and “2.0”.
★ Exercise R4.10. Explain what each of the following two program segments
computes:
int x = 2;
int y = x + x;
and
String s = "2";
String t = s + s;

172
Chapter 4 Fundamental Data Types Page 56 of 69
Java Concepts, 5th Edition
★★ Exercise R4.11. True or false? (x is an int and s is a String)
a. Integer.parseInt(“” + x) is the same as x
b. “” + Integer.parseInt(s) is the same as s
c. s.substring(0, s.length()) is the same as s
★★ Exercise R4.12. How do you get the first character of a string? The last
character? How do you remove the first character? The last character?
★★★ Exercise R4.13. How do you get the last digit of an integer? The first
digit? That is, if n is 23456, how do you find out that the first digit is 2
and the last digit is 6? Do not convert the number to a string. Hint: %,
Math.log.
★★ Exercise R4.14. This chapter contains several recommendations regarding
variables and constants that make programs easier to read and maintain.
Summarize these recommendations.
★★★ Exercise R4.15. What is a final variable? Can you define a final
variable without supplying its value? (Try it out.)
★ Exercise R4.16. What are the values of the following expressions? In each
line, assume that
double x = 2.5;
double y = -1.5;
int m = 18;
int n = 4;
String s = "Hello";
String t = "World";
a. x + n * y - (x + n) * y
b. m / n + m % n
c. 5 * x - n / 5
d. Math.sqrt(Math.sqrt(n))

e. (int) Math.round(x)
172
173
Chapter 4 Fundamental Data Types Page 57 of 69
Java Concepts, 5th Edition
f. (int) Math.round(x) + (int) Math.round(y)
g. s + t
h. s + n
i. 1 - (1 - (1 - (1 - (1 - n))))
j. s.substring(1, 3)
k. s.length() + t.length()
Additional review exercises are available in WileyPLUS.
PROGRAMMING EXERCISES
★ Exercise P4.1. Enhance the CashRegister class by adding separate
methods enterDollars, enterQuarters, enterDimes,
enterNickels, and enterPennies.
Use this tester class:
public class CashRegisterTester
{
public static void main (String[] args)
{
CashRegister register = new
CashRegister();
register.recordPurchase(20.37);
register.enterDollars(20);
register.enterQuarters(2);
System.out.println("Change: " +
register.giveChange());
System.out.println("Expected: 0.13");
}

}
★ Exercise P4.2. Enhance the CashRegister class so that it keeps track of
the total number of items in a sale. Count all recorded purchases and supply
a method
int getItemCount()
173
174
Chapter 4 Fundamental Data Types Page 58 of 69
Java Concepts, 5th Edition
that returns the number of items of the current purchase. Remember to reset
the count at the end of the purchase.
★★ Exercise P4.3. Implement a class IceCreamCone with methods
getSurfaceArea() and getVolume(). In the constructor, supply
the height and radius of the cone. Be careful when looking up the formula
for the surface area—you should only include the outside area along the
side of the cone since the cone has an opening on the top to hold the ice
cream.
★★ Exercise P4.4. Write a program that prompts the user for two numbers,
then prints
• The sum
• The difference
• The product
• The average
• The distance (absolute value of the difference)
• The maximum (the larger of the two)
• The minimum (the smaller of the two)
To do so, implement a class
public class Pair
{
/**

Constructs a pair.
@param aFirst the first value of the pair
@param aSecond the second value of the pair
*/
public Pair(double aFirst, double aSecond)
{ . . . }
/**
Computes the sum of the values of this pair.
@return the sum of the first and second values
174
175
Chapter 4 Fundamental Data Types Page 59 of 69
Java Concepts, 5th Edition
*/
public double getSum() { . . . }
. . .
}
Then implement a class PairTester that constructs a Pair object,
invokes its methods, and prints the results.
★ Exercise P4.5. Define a class DataSet that computes the sum and
average of a sequence of integers. Supply methods
• void addValue(int x)
• int getSum()
• double getAverage()
Hint: Keep track of the sum and the count of the values.
Then write a test program DataSetTester that calls addValue four
times and prints the expected and actual results.
★★ Exercise P4.6. Write a class DataSet that computes the largest and
smallest values in a sequence of numbers. Supply methods
• void addValue(int x)

• int getLargest()
• int getSmallest()
Keep track of the smallest and largest values that you've seen so far. Then
use the Math.min and Math.max methods to update them in the
addValue method. What should you use as initial values? Hint:
Integer.MIN_VALUE, Integer.MAX_VALUE.
Write a test program DataSetTester that calls addValue four times
and prints the expected and actual results.
★ Exercise P4.7. Write a program that prompts the user for a measurement in
meters and then converts it into miles, feet, and inches. Use a class
public class Converter
Chapter 4 Fundamental Data Types Page 60 of 69
Java Concepts, 5th Edition
{
/**
Constructs a converter that can
convert between two units.
@param aConversionFactor the factor by
which to multiply
to convert to the target unit
*/
public Converter(double aConversionFactor) {
. . . }
/**
Converts from a source measurement to
a target measurement.
@param fromMeasurement the measurement
@return the input value converted to
the target unit
*/

public double convertTo(double
fromMeasurement) { . . . }
/**
Converts from a target measurement to
a source measurement.
@param toMeasurement the target
measurement
@return the value whose conversion is
the target measurement
*/
public double convertFrom(double
toMeasurement) { . . . }
}
In your ConverterTester class, construct and test the following
Converter object:
final double MILE_TO_KM = 1.609;
Converter milesToMeters = new Converter(1000 *
MILE_TO_KM);
★ Exercise P4.8. Write a class Square whose constructor receives the
length of the sides. Then supply methods to compute
• The area and perimeter of the square
• The length of the diagonal (use the Pythagorean theorem)
175
176
Chapter 4 Fundamental Data Types Page 61 of 69
Java Concepts, 5th Edition
★★ Exercise P4.9. Implement a class SodaCan whose constructor receives
the height and diameter of the soda can. Supply methods getVolume and
getSurfaceArea. Supply a SodaCanTester class that tests your
class.

★★★ Exercise P4.10. Implement a class Balloon that models a spherical
balloon that is being filled with air. The constructor constructs an empty
balloon. Supply these methods:
• void addAir(double amount) adds the given amount of
air
• double getVolume() gets the current volume
• double getSurfaceArea() gets the current surface area
• double getRadius() gets the current radius
Supply a BalloonTester class that constructs a balloon, adds 100 
cm
3
of air, tests the three accessor methods, adds another 100 cm
3
of air,
and tests the accessor methods again.
★★ Exercise P4.11. Giving change. Enhance the CashRegister class so
that it directs a cashier how to give change. The cash register computes the
amount to be returned to the customer, in pennies.
Add the following methods to the CashRegister class:
• int giveDollars()
• int giveQuarters()
• int giveDimes()
• int giveNickels()
• int givePennies()
Chapter 4 Fundamental Data Types Page 62 of 69
Java Concepts, 5th Edition
Each method computes the number of dollar bills or coins to return to the
customer, and reduces the change due by the returned amount. You may
assume that the methods are called in this order. Here is a test class:
public class CashRegisterTester

{
public static void main(String[] args)
{
CashRegister register = new
CashRegister();
register.recordPurchase(8.37);
register.enterPayment(10, 0, 0, 0, 0);
System.out.println("Dollars: " +
register.giveDollars());
System.out.println("Expected: 1");
System.out.println("Quarters: " +
register.giveQuarters());
System.out.println("Expected: 2");
System.out.println("Dimes: " +
register.giveDimes());
System.out.println("Expected: 1");
System.out.println("Nickels: " +
register.giveNickels());
System.out.println("Expected: 0");
System.out.println("Pennies: " +
register.givePennies());
System.out.println("Expected: 3");
}
}
★★★ Exercise P4.12. Write a program that reads in an integer and breaks it
into a sequence of individual digits in reverse order. For example, the
input 16384 is displayed as
4
8
3

6
1
You may assume that the input has no more than five digits and is not
negative.
176
177
Chapter 4 Fundamental Data Types Page 63 of 69

×