Chapter 4 Review Exercise Solutions
R4.1
•	s = s0 + v0t + 1/2 gt2 
s = s0 + v0 * t + 0.5 * g * t * t;
•	G = 4 π 2a3 / (P2(m1 + m2)) 
G = 4 * Math.pow(Math.PI, 2) * Math.pow(a, 3) / (Math.pow(P, 2) * (m1 + m2));
•	FV = PV . (1 + INT / 100)YRS 
FV = PV * Math.pow((1 + INT / 100), YRS);
•	c = (a2 + b2 - 2abcosγ)1/2 
c = Math.sqrt(a * a + b * b - 2 * a * b * Math.cos(gamma));
R4.2
•	dm = m * ((Math.sqrt(1 + v / c) / Math.sqrt(1 - v / c)) - 1);

 
•	volume = Math.PI * r * r * h;

volume = π r 2h 

•	volume = 4 * Math.PI * Math.pow(r,3) / 3;
volume = 4 π r3 / 3 

•	p = Math.atan2(z, Math.sqrt(x * x + y * y));

R4.3
The numerator is divided by 2, then multiplied by a, rather than divided by (2 * a). Parentheses in the denominator fix the problem: 
x1 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
x2 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
R4.4
Give an example of integer overflow. 
int i = 987654321 * 1000; results in i being set to -18857080
Would the same example work correctly if you used floating-point ?
Yes. The statement 
double x = 987654321.0 * 1000.0;
correctly sets x to 9.87654321E11.
R4.5
Give an example of floating-point roundoff error.
4.35 * 100 becomes 434.99999999999994
Would the same example work correctly if you used integers and switched to a smaller unit, such as cents instead of dollars, so that the values don’t have a fractional part?
The example would work correctly. The computation 435 * 100 yields 43500 
R4.6
It is a rounding error. Rounding errors can occur when you convert between binary and decimal numbers, or between integers and floating-point numbers. When a value cannot be converted exactly, it is rounded to the nearest match. This problem is caused because computers represent numbers in the binary number system. In the binary number system, there is no exact representation of the fraction 1/10, just as there is no exact representation of the fraction 1/3 = 0.33333 in the decimal number system.
To solve this problem, you can use the class BigDecimal, or you can simply use pennies internally in the CashRegister class. 
R4.7
The statement
n = (int) x;
discards the fractional part of x. The statement
n = (int) Math.round(x);
rounds x to the nearest integer. 
For example, if x is 0.99, then the first assignment sets n to 0, and the second assignment sets n to 1.
R4.8
In the first assignment, 
n = (int) (x + 0.5) 
0.5 is added to x before being converted to an integer. 
In the second assignment, 
n = (int) Math.round(x);
x will either be rounded up or down. 
The difference between the two is that the first assignment will not work for x < 0. 
For example, if x = -0.99, then x + 0.5 is -0.49 which gets rounded to 0 instead of -1. 
R4.9
The vending machine will give out as many penny stamps as the initial input. It will not dispense any first class stamps. If $1.00 is input and givePennyStamps method is invoked first, it will return 100 penny stamps. If giveFirstClassStamps is called next, no stamps will be returned.
R4.10
2 and 2.0 are numbers, whereas "2" and "2.0" are strings containing the characters that represent them. 2 is an integer and 2.0 is a floating-point value. "2" is a string of length 1, "2.0" is a string of length 3. Finally, '2' is a char value representing the character 2. It has the numerical value 50. 
R4.11
   x = 2;
   y = x + x;
Computes   y = 2 + 2 = 4
   s = "2";
   t = s + s;
Computes   t = "2" + "2" = "22"
R4.12
(a) Integer.parseInt("" + x) is the same as x.
True. x is converted to a string, then concatenated to the empty string. parseInt converts that string back to an integer, which is the same as the original value of x.
(b) "" + Integer.parseInt(s) is the same as s.
False. If s doesn't contain an integer, then parseInt will fail. Even if s contains an integer, the resulting string can be different. e.g. s = "007" yields the integer 7, which turns into the string "7", which is a different string 
(c) s.substring(0, s.length()) is the same as s.
True. We are extracting all characters of s.
R4.13
How do you get the first character of a string?
String firstChar = s.substring(0,1);
How do you get the last character of a string?
String lastChar = s.substring(s.length() - 1, s.length());
How do you remove the first character of a string?
String noFirstChar = s.substring(1, s.length());
s = noFirstChar; 
How do you remove the last character of a string ?
String noLastChar = s.substring(0, s.length() - 1); 
s = noLastChar; 
R4.14
int last = n % 10;
The idea to get the first number is to compute 10 raised to the log(n) power, then divide. However, Math.log computes the natural log ln, so we must get the decimal log as ln(x)/ln(10).
double logn = Math.log(n) / Math.log(10);
int ndigits = (int) logn;
int pow10 = (int) Math.pow(10, ndigits); 
int first = n / pow10;
R4.15
Give variables and constants meaningful names, something that describes their purpose or use. Initialize variables when declaring them. Use constants instead of magic numbers.
R4.16
A final variable is a variable whose contents cannot be changed once it is initialized. That is, the value is constant.
You can actually declare a final variable without supplying its value.
final int N; 
// other statements . . .
N = 5; // after this initialization, N cannot change again
But this is not good practice. Just supply the initialization value when you declare the final variable.
R4.17
(a) x + n * y - (x + n) * y
    6.25

(b) m / n + m % n
    6

(c) 5 * x - n / 5
    12.5

(d) Math.sqrt(Math.sqrt(n));
    1.414

(e) (int) Math.round(x)
    3

(f) (int) Math.round(x) + (int) Math.round(y)
    2;

(g) 1 - (1 - (1 - (1 - (1 - n))))
    -3
R4.18
(a) s + t;
    "HelloWorld"

(b) s + n;
    "Hello4"

(c) s.substring(1, 3)
    "el"

(d) s.length() + t.length()
    10