Which are the most commonly used number types in Java?
Answer:int and double
.
Self Check 4.2
Suppose you want to write a program that works with population data from
various countries. Which Java data type should you use?
Answer:
The world’s most populous country, China, has about 1.2 x 10^{9} inhabitants. Therefore, individual population counts could be held in an int. However, the world population is over 6 × 10^{9}. If you compute totals or averages of multiple countries, you can exceed the largest int value. Therefore, double is a better choice. You could also
use long, but there is no benefit because the exact population of a country is not known at any point in time.
Self Check 4.3
Which of the following initializations are incorrect, and why?
int dollars = 100.0;
double balance = 100;
Answer:
The first initialization is incorrect. The right hand side is a value of type double, and it is not legal to initialize an int variable with a double value. The second initialization is correct — an int value can always be converted to a double.
Self Check 4.4
What is the difference between the following two statements?
final double CM_PER_INCH = 2.54;
and
public static final double CM_PER_INCH = 2.54;
Answer:
The first declaration is used inside a method, the second inside a class.
Self Check 4.5
What is wrong with the following statement sequence?
You should use a named constant, not the magic number 3.14
3.14 is not an accurate representation of π.
Arithmetic Operators
Four basic operators:
addition: +
subtraction: -
multiplication: *
division: /
Expression: combination of variables, literals, operators, and/or method calls
(a + b) / 2
Parentheses control the order of the computation
(a + b) / 2
Multiplication and division have a higher precedence than addition and subtraction
a + b / 2
Mixing integers and
floating-point values
in an arithmetic
expression yields a
floating-point value
7 + 4.0 is the floating-point value 11.0
Increment and Decrement
The ++ operator adds 1 to a variable (increments)
counter++; // Adds 1 to the variable counter
The -- operator subtracts 1 from the variable (decrements)
counter--; // Subtracts 1 from counter
Figure 1 Incrementing a Variable
Integer Division and Remainder
Division works as you would expect, as long as at least one of the numbers is a floating-point number.
Example: all of the following evaluate to 1.75
7.0 / 4.0
7 / 4.0
7.0 / 4
If both numbers are integers, the result is an integer. The remainder is
discarded
7 / 4 evaluates to 1
Use % operator to get the remainder with (pronounced "modulus", "modulo", or "mod")
7 % 4 is 3
Integer Division and Remainder
To determine the value in dollars and cents of 1729 pennies
Obtain the dollars through an integer division by 100
int dollars = pennies / 100; // Sets dollars to 17
To obtain the remainder, use the %
operator
int cents = pennies % 100; // Sets cents to 29
Integer division and the %
operator yield the dollar and
cent values of a piggybank
full of pennies.
Integer Division and Remainder
Powers and Roots
Math class contains methods sqrt and pow to compute square roots and powers
To take the square root of a number, use Math.sqrt; for example, Math.sqrt(x)
To compute x^{n}, you write Math.pow(x, n)
To compute x^{2} it is significantly more efficient
simply to compute x * x
In Java,
can be represented as
b * Math.pow(1 + r / 100, n)
Analyzing an Expression
Mathematical Methods
Converting Floating-Point Numbers to Integers - Cast
The compiler disallows the assignment of a double to an int because it is potentially dangerous
The fractional part is lost
The magnitude may be too large
This is an error
double balance = total + tax;
int dollars = balance; // Error: Cannot assign double to int
Use the cast operator (int) to convert a convert floating-point value to an integer.
double balance = total + tax;
int dollars = (int) balance;
Cast discards fractional part
You use a cast
(typeName) to
convert a value to
a different type.
Converting Floating-Point Numbers to Integers - Rounding
Math.round converts a floating-point number to nearest integer:
long rounded = Math.round(balance);
If balance is 13.75, then rounded is set to 14.
Syntax 4.2 Cast
Arithmetic Expressions
Self Check 4.6
A bank account earns interest once per year. In Java, how do you compute the interest earned in the first year? Assume variables percent and balance of type double have already been declared.
Answer:double interest = balance * percent / 100;
Self Check 4.7
In Java, how do you compute the side length of a square whose area is stored in the variable area?
Answer:
double sideLength = Math.sqrt(area);
Self Check 4.8
The volume of a sphere is given by
If the radius is given by a variable radius of type double, write a Java expression for the volume.
Answer: 4 * PI * Math.pow(radius, 3) / 3
or (4.0 / 3) * PI * Math.pow(radius, 3),
but not (4 / 3) * PI * Math.pow(radius, 3)
Self Check 4.9
What are the values of 1729 / 100 and 1729 % 100?
Answer:
17 and 29
Self Check 4.10
If n is a positive number, what is (n / 10) % 10?
Answer: It is the second-to-last digit of n. For example,
if n is 1729, then n / 10 is 172, and (n / 10) % 10
is 2.
Calling Static Methods
Can not call a method on a number type
double root = 2.sqrt(); // Error
Use a static method instead.
A static method does not operate on an object:
double root = Math.sqrt(2); // Correct
Static methods are declared inside classes
Calling a static method:
Reading Input
When a program asks for user input
It should first print a message that tells the
user which input is expected
System.out.print("Please enter the number of bottles: "); // Display prompt
This message is called a prompt
Use the print method, not println, to display the prompt
Leave a space after the colon
System.in has minimal set of features
Must be combined with other classes to be useful
Use a class called Scanner to read keyboard input.
Reading Input - Scanner
To obtain a Scanner object:
Scanner in = new Scanner(System.in);
Use the Scanner's nextInt method to read an integer value:
System.out.print("Please enter the number of bottles: ");
int bottles = in.nextInt();
When the nextInt method is called,
The program waits until the user types a number
and presses the Enter key;
After the user supplies the input, the number is placed into
the bottles variable;
The program continues.
Use the nextDouble method to read a floating-point number:
Please enter the price for a six-pack: 2.95
Please enter the price for a two-liter bottle: 2.85
Pack price per liter: 1.38
Bottle price per liter: 1.43
Self Check 4.11
Write statements to prompt for and read the user’s age using a Scanner variable
named in.
Answer:
System.out.print("How old are you? ");
int age = in.nextInt();
Self Check 4.12
What is wrong with the following statement sequence?
System.out.print("Please enter the unit price: ");
double unitPrice = in.nextDouble();
int quantity = in.nextInt();
Answer: There is no prompt that alerts the program
user to enter the quantity.
Self Check 4.13
What is problematic about the following statement sequence?
System.out.print("Please enter the unit price: ");
double unitPrice = in.nextInt();
Answer: The second statement calls nextInt, not nextDouble. If the user were to enter a price such as
1.95, the program would be terminated with an
“input mismatch exception”.
Self Check 4.14
What is problematic about the following statement sequence?
System.out.print("Please enter the number of cans");
int cans = in.nextInt();
Answer: There is no colon and space at the end of the
prompt. A dialog would look like this:
Please enter the number of cans6
Self Check 4.15
What is the output of the following statement sequence?
int volume = 10;
System.out.printf("The volume is %5d", volume);
Answer: The total volume is 10
There are four spaces between is and 10. One
space originates from the format string (the space between s and %), and three spaces are
added before 10 to achieve a field width of 5.
Self Check 4.16
Using the printf method, print the values of the integer variables bottles and cans
so that the output looks like this:
Bottles: 8
Cans: 24
The numbers to the right should line up. (You may assume that the numbers
have at most 8 digits.)
Pick concrete values
for a typical situation
to use in a hand
calculation.
Problem: A row of black and white tiles needs to be placed along a wall. First and last are black.
Compute the number of tiles needed and the gap at each end, given the space available and the width of each tile.
Use numbers
Total width: 100 inches
Tile width: 5 inches
The first tile must always be black,
and then we add some number of white/black pairs:
Problem Solving: First Do It By Hand
The first tile takes up 5 inches, leaving 95 inches to be covered by pairs.
Each pair is
10 inches wide.
The number of pairs needed is 95 / 10 = 9.5.
Discard the fractional part.
We need 9 tile pairs or 18 tiles, plus the initial black tile => 19 tiles.
Tiles span 19 × 5 = 95 inches
Gap is 100 – 19 × 5 = 5 inches
Distribute the gap at both ends
gap is (100 – 19 × 5) / 2 = 2.5 inches
Problem Solving: First Do It By Hand
Devise an algorithm with arbitrary
values for the total width and tile width.
The pseudocode
number of pairs = integer part of (total width - tile width) / (2 x tile width)
number of tiles = 1 + 2 x number of pairs
gap at each end = (total width - number of tiles x tile width) / 2
Self Check 4.17
Translate the pseudocode for computing the number of tiles and the gap width
into Java.
Answer:
int pairs = (totalWidth - tileWidth) / (2 * tileWidth);
int tiles = 1 + 2 * pairs;
double gap = (totalWidth - tiles * tileWidth) / 2.0;
Be sure that pairs is declared as an int.
Self Check 4.18
Suppose the architect specifies a pattern with black, gray, and white tiles, like
this:
Again, the first and last tile should be black. How do you need to modify the
algorithm?
Answer:
Now there are groups of four tiles (gray/
white/gray/black) following the initial black
tile. Therefore, the algorithm is now
number of groups = integer part of (total width - tile width) /(4 x tile width)
number of tiles = 1 + 4 x number of groups
The formula for the gap is not changed.
Self Check 4.19
A robot needs to tile a floor with alternating black and white tiles. Develop
an algorithm that yields the color (0 for black, 1 for white), given the row and
column number. Start with specific values for the row and column, and then
generalize.
Answer: The answer depends only on whether the row
and column numbers are even or odd, so let’s
first take the remainder after dividing by 2.
Then we can enumerate all expected answers:
Rows%2
Columns%2
Color
0
0
0
0
1
1
1
0
1
1
1
0
In the first three entries of the table, the color
is simply the sum of the remainders. In the
fourth entry, the sum would be 2, but we want
a zero. We can achieve that by taking another
remainder operation:
color = ((row % 2) + (column % 2)) % 2
Self Check 4.20
For a particular car, repair and maintenance costs in year 1 are estimated at $100;
in year 10, at $1,500. Assuming that the repair cost increases by the same amount
every year, develop pseudocode to compute
the repair cost in year 3 and then
generalize to year n.
Answer: In nine years, the repair costs increased by
$1,400. Therefore, the increase per year is
$1,400 / 9 ≈ $156. The repair cost in year 3
would be $100 + 2 x $156 = $412. The repair
cost in year n is $100 + n x $156. To avoid
accumulation of roundoff errors, it is actually a good idea to use the original expression that
yielded $156, that is,
Repair cost in year n = 100 + n x 1400 / 9
Self Check 4.21
The shape of a bottle is approximated by two cylinders of radius r_{1} and r_{2} and
heights h_{1} and h_{2}, joined by a cone section of height h_{3}.
Using the formulas for the volume of a cylinder, V = π r² h, and a cone section
develop pseudocode to compute the volume of the bottle. Using an actual bottle
with known volume as a sample, make a hand calculation of your pseudocode.
Answer: The pseudocode follows from the equations:
Measuring a typical wine bottle yields r_{1} = 3.6, r_{2} = 1.2, h_{1} = 15, h_{2} = 7, h_{3} = 6 (all in centimeters).
Therefore,
bottom volume = 610.73
top volume = 31.67
middle volume = 135.72
total volume = 778.12
The actual volume is 750 ml, which is close
enough to our computation to give confidence
that it is correct.
String Type
A string is a sequence of characters.
You can declare variables that hold strings
String name = "Harry";
A string variable is a variable that can hold a string
String literals are character sequences enclosed in quotes
A string literal denotes a particular string
"Harry"
String length is the number of characters in the
string
The length of "Harry" is 5
The length method
yields the number
of characters in
a string
int n = name.length();
A string of length 0 is called the empty string
Contains no characters
Is written as ""
Concatenation
Concatenating strings means to put them together to form a longer string