forked from ChrisMayfield/ThinkJava2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ch05.tex
822 lines (610 loc) · 27 KB
/
ch05.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
\chapter{Conditionals and logic}
\index{boolean}
\index{type!boolean}
The programs we've seen in previous chapters do pretty much the same thing every time, regardless of the input.
For more complex computations, programs usually react to inputs, check for certain conditions, and generate applicable results.
This chapter introduces Java language features for expressing logic and making decisions.
We'll also take a look at the \java{Math} class, which provides methods for common mathematical operations.
\section{Relational operators}
\index{operator!relational}
\index{relational operator}
\index{comparison operator}
Java has six {\bf relational operators} that test the relationship between two values (e.g., whether they are equal, or whether one is greater than the other).
The following expressions show how they are used:
\begin{code}
x == y // x is equal to y
x != y // x is not equal to y
x > y // x is greater than y
x < y // x is less than y
x >= y // x is greater than or equal to y
x <= y // x is less than or equal to y
\end{code}
\index{Boole, George}
The result of a relational operator is one of two special values: \java{true} or \java{false}.
These values belong to the data type \java{boolean}, named after the mathematician George Boole.
He developed an algebraic way of representing logic.
\index{assignment}
\index{operator!assignment}
\index{== equals operator}
You are probably familiar with these operators, but notice how Java is different from mathematical symbols like $=$, $\neq$, and $\geq$.
A common error is to use a single \java{=} instead of a double \java{==} when comparing values.
Remember that \java{=} is the {\em assignment} operator, and \java{==} is a {\em relational} operator.
In addition, the operators \java{=<} and \java{=>} do not exist.
The two sides of a relational operator have to be compatible.
For example, the expression \java{5 < "6"} is invalid because \java{5} is an \java{int} and \java{"6"} is a \java{String}.
When comparing values of different numeric types, Java applies the same conversion rules we saw previously with the assignment operator.
For example, when evaluating the expression \java{5 < 6.0}, Java automatically converts the \java{5} to \java{5.0}.
%Most relational operators don't work with strings.
%But confusingly, \java{==} and \java{!=} \emph{seem} to work with strings -- they just don't do what you expect.
%We'll explain what they do later, but in the meantime, don't use them with strings.
%Instead, you should use the \java{equals} method:
%
%\begin{code}
%String fruit1 = "Apple";
%String fruit2 = "Orange";
%System.out.println(fruit1.equals(fruit2));
%\end{code}
%
%The result of \java{fruit1.equals(fruit2)} is the boolean value \java{false}.
\section{The if-else statement}
\index{conditional statement}
\index{statement!conditional}
\index{if statement}
\index{statement!if}
To write useful programs, we almost always need to check conditions and react accordingly.
{\bf Conditional statements} give us this ability.
The simplest conditional statement in Java is the \java{if} statement:
\begin{code}
if (x > 0) {
System.out.println("x is positive");
}
\end{code}
\index{block}
The expression in parentheses is called the condition.
If it is true, the statements in braces get executed.
If the condition is false, execution skips over that {\bf block} of code.
The condition in parentheses can be any \java{boolean} expression.
\index{branch}
\index{statement!else}
A second form of conditional statement has two possibilities, indicated by \java{if} and \java{else}.
The possibilities are called {\bf branches}, and the condition determines which one gets executed:
\begin{code}
if (x % 2 == 0) {
System.out.println("x is even");
} else {
System.out.println("x is odd");
}
\end{code}
If the remainder when \java{x} is divided by 2 is zero, we know that \java{x} is even, and the program displays a message to that effect.
If the condition is false, the second print statement is executed instead.
Since the condition must be true or false, exactly one of the branches will run.
The braces are optional for branches that have only one statement.
So we could have written the previous example this way:
\begin{code}
if (x % 2 == 0)
System.out.println("x is even");
else
System.out.println("x is odd");
\end{code}
However, it's better to use braces -- even when they are optional -- to avoid making the mistake of adding statements to an \java{if} or \java{else} block and forgetting to add the braces.
This code is misleading because it's not indented correctly:
\begin{code}
if (x > 0)
System.out.println("x is positive");
System.out.println("x is not zero");
\end{code}
Since there are no braces, only the first \java{println} is part of the \java{if} statement.
Here is what the compiler actually sees:
\begin{code}
if (x > 0) {
System.out.println("x is positive");
}
System.out.println("x is not zero");
\end{code}
As a result, the second \java{println} runs no matter what.
Even experienced programmers make this mistake; search the web for Apple's ``goto fail'' bug.
\index{\{\} curly braces}
In all previous examples, notice how there is no semicolon at the end of the \java{if} or \java{else} lines.
Instead, a new block should be defined using curly braces.
Another common mistake is to put a semicolon after the condition, like this:
\begin{code}
int x = 1;
if (x % 2 == 0); { // incorrect semicolon
System.out.println("x is even");
}
\end{code}
This code will compile, but the program will output \java{"x is even"} regardless what value \java{x} is.
Here is the same incorrect code with better formatting:
\begin{code}
int x = 1;
if (x % 2 == 0)
; // empty statement
{
System.out.println("x is even");
}
\end{code}
Because of the semicolon, the \java{if} statement compiles as if there are no braces, and the subsequent block runs independently.
As a general rule, each line of Java code should end with a semicolon or brace -- but not both.
The compiler won't complain if you omit optional braces or write empty statements.
Doing so is allowed by the Java language, but it often results in bugs that are difficult to find.
Development tools like Checkstyle (see Appendix~\ref{checkstyle}) can warn you about these and other kinds of programming mistakes.
\section{Chaining and nesting}
\index{chaining}
Sometimes you want to check related conditions and choose one of several actions.
One way to do this is by {\bf chaining} a series of \java{if} and \java{else} blocks:
\begin{code}
if (x > 0) {
System.out.println("x is positive");
} else if (x < 0) {
System.out.println("x is negative");
} else {
System.out.println("x is zero");
}
\end{code}
These chains can be as long as you want, although they can be difficult to read if they get out of hand.
One way to make them easier to read is to use standard indentation, as demonstrated in these examples.
If you keep all the statements and braces lined up, you are less likely to make syntax errors.
Notice that the last branch is simply \java{else}, not \java{else if (x == 0)}.
At this point in the chain, we know that \java{x} is not positive and \java{x} is not negative.
There is no need to test whether \java{x} is zero, because there is no other possibility.
\index{nesting}
In addition to chaining, you can also make complex decisions by {\bf nesting} one conditional statement inside another.
We could have written the previous example as:
\begin{code}
if (x > 0) {
System.out.println("x is positive");
} else {
if (x < 0) {
System.out.println("x is negative");
} else {
System.out.println("x is zero");
}
}
\end{code}
The outer conditional has two branches.
The first branch contains a \java{print} statement, and the second branch contains another conditional statement, which has two branches of its own.
These two branches are also \java{print} statements, but they could have been conditional statements as well.
\index{nested!conditions}
These kinds of nested structures are common, but they can become difficult to read very quickly.
Good indentation is essential to make the structure (or intended structure) apparent to the reader.
\section{Logical operators}
\index{logical operator}
\index{operator!logical}
\index{and operator}
\index{or operator}
\index{not operator}
In addition to the relational operators, Java also has three {\bf logical operators}: \java{&&}, \java{||}, and \java{!}, which respectively stand for {\em and}, {\em or}, and {\em not}.
The results of these operators are similar to their meanings in English.
For example, \java{x > 0 && x < 10} is true when \java{x} is both greater than zero {\em and} less than 10.
The expression \java{evenFlag || n \% 3 == 0} is true if either condition is true, that is, if \java{evenFlag} is true {\em or} the number \java{n} is divisible by 3.
Finally, the \java{!} operator inverts a boolean expression.
So \java{!evenFlag} is true if \java{evenFlag} is false.
In order for an expression with \java{&&} to be true, both sides of the \java{&&} operator must be true.
And in order for an expression with \java{||} to be false, both sides of the \java{||} operator must be false.
The \java{&&} operator can be used to simplify nested \java{if} statements.
For example, following code can be rewritten with a single condition.
\begin{code}
if (x == 0) {
if (y == 0) {
System.out.println("Both x and y are zero");
}
}
\end{code}
\begin{code}
// combined
if (x == 0 && y == 0) {
System.out.println("Both x and y are zero");
}
\end{code}
Likewise, the \java{||} operator can simplify chained \java{if} statements.
Since the branches are the same, there is no need to duplicate that code.
\begin{code}
if (x == 0) {
System.out.println("Either x or y is zero");
} else if (y == 0) {
System.out.println("Either x or y is zero");
}
\end{code}
\begin{code}
// combined
if (x == 0 || y == 0) {
System.out.println("Either x or y is zero");
}
\end{code}
Of course if the statements in the branches were different, we could not combine them into one block.
But it's useful to explore different ways of representing the same logic, especially when it's complex.
\index{short circuit}
Logical operators evaluate the second expression only when necessary.
For example, \java{true || anything} is always true, so Java does not need to evaluate the expression \java{anything}.
Likewise, \java{false && anything} is always false.
Ignoring the second operand, when possible, is called {\bf short circuit} evaluation, by analogy with an electrical circuit.
Short circuit evaluation can save time, especially if \java{anything} takes a long time to evaluate.
It can also avoid unnecessary errors, if \java{anything} might fail.
\section{De Morgan's laws}
Sometimes you need to negate an expression containing a mix of relational and logical operators.
For example, to test if \java{x} and \java{y} are both nonzero, you could write:
\begin{code}
if (!(x == 0 || y == 0)) {
System.out.println("Neither x nor y is zero");
}
\end{code}
\index{De Morgan's laws}
This condition is difficult to read because of the \java{!} and parentheses.
A better way to negate logic expressions is to apply {\bf De Morgan's laws}:
\begin{itemize}
\item \java{!(A && B)} ~is the same as~ \java{!A || !B}
\item \java{!(A || B)} ~is the same as~ \java{!A && !B}
\end{itemize}
Negating a logical expression is the same as negating each term and changing the operator.
The \java{!} operator takes precedence over \java{&&} and \java{||}, so you don't have to put parentheses around the individual terms \java{!A} and \java{!B}.
De Morgan's laws also apply to the relational operators.
In this case, negating each term means using the ``opposite'' relational operator.
\begin{itemize}
\item \java{!(x < 5 && y == 3)} ~is the same as~ \java{x >= 5 || y != 3}
\item \java{!(x >= 1 || y != 7)} ~is the same as~ \java{x < 1 && y == 7}
\end{itemize}
It may help to read these examples out loud in English.
For instance, ``If I don't want the case where $x$ is less than 5 and $y$ is 3, then I need $x$ to be greater than or equal to 5, or I need $y$ to be anything but 3.''
Returning to the previous example, here is the revised condition.
In English, it reads ``if $x$ is not zero and $y$ is not zero.''
The logic is the same, and the source code is easier to read.
\begin{code}
if (x != 0 && y != 0) {
System.out.println("Neither x nor y is zero");
}
\end{code}
\section{Boolean variables}
\index{expression}
\index{type!boolean}
To store a \java{true} or \java{false} value, you need a \java{boolean} variable.
You can declare and assign them like other variables.
In this example, the first line is a variable declaration, the second is an assignment, and the third is both:
\begin{code}
boolean flag;
flag = true;
boolean testResult = false;
\end{code}
\index{initialize}
\index{statement!initialization}
Since relational and logical operators evaluate to a \java{boolean} value, you can store the result of a comparison in a variable:
\begin{code}
boolean evenFlag = (n % 2 == 0); // true if n is even
boolean positiveFlag = (x > 0); // true if x is positive
\end{code}
\index{flag}
The parentheses are unnecessary, but they make the code easier to understand.
A variable defined in this way is called a {\bf flag}, because it signals or ``flags'' the presence or absence of a condition.
You can use flag variables as part of a conditional statement:
\begin{code}
if (evenFlag) {
System.out.println("n was even when I checked it");
}
\end{code}
Flags may not seem that useful at this point, but they will help simplify complex conditions later on.
Each part of a condition can be stored in a separate flag, and these flags can be combined with logical operators.
Notice that you don't have to write ~\java{if (evenFlag == true)}.
Since \java{evenFlag} is a \java{boolean}, it's already a condition.
Furthermore, to check if a flag is \java{false}:
\begin{code}
if (!evenFlag) {
System.out.println("n was odd when I checked it");
}
\end{code}
\section{Boolean methods}
\label{boolmeth}
\index{boolean}
\index{method!boolean}
Methods can return \java{boolean} values, just like any other type, which is often convenient for hiding tests inside methods.
For example:
\begin{code}
public static boolean isSingleDigit(int x) {
if (x > -10 && x < 10) {
return true;
} else {
return false;
}
}
\end{code}
The name of this method is \java{isSingleDigit}.
It is common to give \java{boolean} methods names that sound like yes/no questions.
Since the return type is \java{boolean}, the return statement has to provide a boolean expression.
The code itself is straightforward, although it is longer than it needs to be.
Remember that the expression \java{x > -10 && x < 10} has type \java{boolean}, so there is nothing wrong with returning it directly (without the \java{if} statement):
\begin{code}
public static boolean isSingleDigit(int x) {
return x > -10 && x < 10;
}
\end{code}
In \java{main}, you can invoke the method in the usual ways:
\begin{code}
System.out.println(isSingleDigit(2));
boolean bigFlag = !isSingleDigit(17);
\end{code}
The first line displays {\tt true} because 2 is a single-digit number.
The second line sets \java{bigFlag} to \java{true}, because 17 is {\em not} a single-digit number.
Conditional statements often invoke \java{boolean} methods and use the result as the condition:
\begin{code}
if (isSingleDigit(z)) {
System.out.println("z is small");
} else {
System.out.println("z is big");
}
\end{code}
Examples like this one almost read like English:
``If is single digit z, print ... else print ...''.
\section{Validating input}
\label{validate}
\index{validate}
\index{hacker}
One of the most important tasks in any computer program is to {\bf validate} input from the user.
People often make mistakes while typing, especially on smartphones, and incorrect inputs may cause your program to fail.
Even worse, someone (i.e., a {\bf hacker}) may intentionally try to break into your system by entering unexpected inputs.
You should never assume that users will input the right kind of data.
Consider this simple program that prompts the user for a number and computes its logarithm:
\begin{code}
Scanner in = new Scanner(System.in);
System.out.print("Enter a number: ");
double x = in.nextDouble();
double y = Math.log(x);
System.out.println("The log is " + y);
\end{code}
In mathematics, the natural logarithm (base $e$) is undefined when $x < 0$.
If you ask for \java{Math.log(-1)}, it will return {\bf NaN} which stands for ``not a number''.
Many users are confused when they see NaN; it often looks like a bug.
We can use an \java{if} statement to make the output more user friendly.
\begin{code}
if (x >= 0) {
double y = Math.log(x);
System.out.println("The log is " + y);
} else {
System.out.println("The log is undefined");
}
\end{code}
The output is better now, but there is another problem.
What if the user doesn't enter a number at all?
What would happen if they typed the word ``hello'', either on accident or on purpose?
\index{InputMismatchException}
\index{exception!InputMismatch}
\begin{small}
\begin{stdout}
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at Logarithm.main(Logarithm.java:8)
\end{stdout}
\end{small}
\index{run-time error}
\index{testing}
If the user inputs a \java{String} when we expect a \java{double}, Java reports an ``input mismatch'' exception.
We can prevent this run-time error from happening by testing the input first.
The \java{Scanner} class provides \java{hasNextDouble}, which checks whether the next input can be interpreted as a \java{double}.
If not, we can display an error message.
\begin{code}
if (!in.hasNextDouble()) {
String word = in.next();
System.err.println(word + "is not a number");
return;
}
\end{code}
\index{next!Scanner}
In contrast to \java{in.nextLine}, which returns an entire line of input, the \java{in.next} method returns only the next token of input.
We can use \java{in.next} to show the user exactly which word they typed was not a number.
\index{System.err}
This example also uses \java{System.err}, which is an \java{OutputStream} for error messages and warnings.
Some development environments display output to \java{System.err} with a different color or in a separate window.
\index{return}
\index{statement!return}
The \java{return} statement allows you to exit a method before you reach the end of it.
Returning from \java{main} terminates the program.
Notice the use of the \java{!} operator before \java{in.hasNextDouble()}, instead of testing the condition \java{in.hasNextDouble() == false}.
Since \java{hasNextDouble} returns a boolean, it is already a condition.
\section{Example program}
In this chapter we have seen relational and logical operators, \java{if} statements, the \java{Math} class, and validating input.
The following program shows how the individual code examples in the last section fit together.
\index{Logarithm.java}
\begin{trinket}{Logarithm.java}
import java.util.Scanner;
/**
* Demonstrates input validation using if statements.
*/
public class Logarithm {
public static void main(String[] args) {
// prompt for input
Scanner in = new Scanner(System.in);
System.out.print("Enter a number: ");
// check the format
if (!in.hasNextDouble()) {
String word = in.next();
System.err.println(word + " is not a number");
return;
}
// check the range
double x = in.nextDouble();
if (x >= 0) {
double y = Math.log(x);
System.out.println("The log is " + y);
} else {
System.out.println("The log is undefined");
}
}
}
\end{trinket}
What started as five lines of code at the beginning of Section~\ref{validate} is now a 30-line program.
Making programs robust (and secure) often requires a lot of additional checking, as shown in this example.
\index{comment}
It's important to write comments every few lines to make your code easier to understand.
Comments not only help other people read your code, they also help you document what you're trying to do.
If there's a mistake the code, it's a lot easier to find when there are good comments.
\section{Vocabulary}
\begin{description}
\term{boolean}
A data type with only two possible values, \java{true} and \java{false}.
\term{relational operator}
An operator that compares two values and produces a \java{boolean} indicating the relationship between them.
\term{conditional statement}
A statement that uses a condition to determine which statements to execute.
\term{block}
A sequence of statements, surrounded by braces, that generally runs as the result of a condition.
\term{branch}
One of the alternative blocks after a conditional statement.
For example, an \java{if}-\java{else} statement has two branches.
\term{chaining}
A way of joining several conditional statements in sequence.
\term{nesting}
Putting a conditional statement inside one or both branches of another conditional statement.
\term{logical operator}
An operator that combines boolean values and produces a boolean value.
\term{short circuit}
A way of evaluating logical operators that only evaluates the second operand if necessary.
\term{De Morgan's laws}
Mathematical rules that show how to negate a logical expression.
\term{flag}
A variable (usually \java{boolean}) that represents a condition or status.
\term{validate}
To confirm that an input value is of the correct type and within the expected range.
\term{hacker}
A programmer who breaks into computer systems.
The term hacker may also apply to someone who enjoys writing code.
\term{NaN}
A special floating-point value that stands for ``not a number''.
\end{description}
\section{Exercises}
The code for this chapter is in the {\tt ch05} directory of {\tt ThinkJavaCode2}.
See page~\pageref{code} for instructions on how to download the repository.
Before you start the exercises, we recommend that you compile and run the examples.
If you have not already read Appendix~\ref{checkstyle}, now might be a good time.
It describes Checkstyle, a tool that analyzes many aspects of your source code.
\begin{exercise} %%V6.5 NEW
Using the following variables, evaluate the logic expressions in the table below.
Write your answers as true, false, or error.
\begin{code}
boolean yes = true;
boolean no = false;
int loVal = -999;
int hiVal = 999;
double grade = 87.5;
double amount = 50.0;
String hello = "world";
\end{code}
\vspace{1ex}
\begin{center}
\begin{tabular}{|l|l|}
\hline
Expression & Result \\
\hline
\hline
\java{yes == no || grade > amount} & \hspace{5em} \\
\hline
\java{amount == 40.0 || 50.0} & \\
\hline
\java{hiVal != loVal || loVal < 0} & \\
\hline
\java{True || hello.length() > 0} & \\
\hline
\java{hello.isEmpty() && yes} & \\
\hline
\java{grade <= 100 && !false} & \\
\hline
\java{!yes || no} & \\
\hline
\java{grade > 75 > amount} & \\
\hline
\java{amount <= hiVal && amount >= loVal} & \\
\hline
\java{no && !no || yes && !yes} & \\
\hline
\end{tabular}
\end{center}
\end{exercise}
\newpage
\begin{exercise} %%V6 Ex6.5
What is the output of the following program?
Determine the answer without using a computer.
\begin{code}
public static void main(String[] args) {
boolean flag1 = isHoopy(202);
boolean flag2 = isFrabjuous(202);
System.out.println(flag1);
System.out.println(flag2);
if (flag1 && flag2) {
System.out.println("ping!");
}
if (flag1 || flag2) {
System.out.println("pong!");
}
}
\end{code}
\begin{code}
public static boolean isHoopy(int x) {
boolean hoopyFlag;
if (x % 2 == 0) {
hoopyFlag = true;
} else {
hoopyFlag = false;
}
return hoopyFlag;
}
\end{code}
\begin{code}
public static boolean isFrabjuous(int x) {
boolean frabjuousFlag;
if (x > 0) {
frabjuousFlag = true;
} else {
frabjuousFlag = false;
}
return frabjuousFlag;
}
\end{code}
The purpose of this exercise is to make sure you understand logical operators and the flow of execution through methods.
\end{exercise}
\newpage
\begin{exercise} %%V6 Ex5.1
Rewrite the following code using a single \java{if} statement.
\begin{code}
if (x > 0) {
if (x < 10) {
System.out.println("positive single digit number.");
}
}
\end{code}
\end{exercise}
\begin{exercise} %%V6 Ex5.4
Fermat's Last Theorem says that there are no integers $a$, $b$, and $c$ such that $a^n + b^n = c^n$, except when $n \leq 2$.
Write a program named \java{Fermat.java} that inputs four integers (\java{a}, \java{b}, \java{c}, and \java{n}) and checks to see if Fermat's theorem holds.
If $n$ is greater than 2 and $a^n + b^n = c^n$, the program should display ``Holy smokes, Fermat was wrong!''
Otherwise the program should display ``No, that doesn't work.''
{\it Hint:} You may want to use \java{Math.pow}.
\end{exercise}
\begin{exercise} %%V6 Ex5.7
Now that we have conditional statements, we can get back to the ``Guess My Number'' game from Exercise~\ref{guess}.
You should already have a program that chooses a random number, prompts the user to guess it, and displays the difference between the guess and the chosen number.
Adding a small amount of code at a time, and testing as you go, modify the program so it tells the user whether the guess is too high or too low, and then prompts the user for another guess.
The program should continue until the user gets it right or guesses incorrectly three times.
If the user guesses the correct number, display a message and terminate the program.
\end{exercise}
\begin{exercise} %%V6.5 NEW
Write a program named \java{Quadratic.java} that finds the roots of $ax^2 + bx + c = 0$ using the quadratic formula:
$$ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$
Prompt the user to input integers for $a$, $b$, and $c$.
Compute the two solutions for $x$, and display the results.
Your program should be able to handle inputs for which there is only one or no solution.
Specifically, it should not divide by zero or take the square root of a negative number.
Be sure to validate all inputs.
The user should never see an input mismatch exception.
Display specific error messages that include the invalid input.
\end{exercise}
\begin{exercise} %%V6 Ex6.3
If you are given three sticks, you may or may not be able to arrange them in a triangle.
For example, if one of the sticks is 12 inches long and the other two are one inch long, you will not be able to get the short sticks to meet in the middle.
For any three lengths, there is a simple test to see if it is possible to form a triangle:
\begin{quotation}
\noindent
If any of the three lengths is greater than the sum of the other two, you cannot form a triangle.
\end{quotation}
Write a program named \java{Triangle.java} that inputs three integers, and then outputs whether you can (or cannot) form a triangle from the given lengths.
%The point of this exercise is to use conditional statements to write a value method.
Reuse your code from the previous exercise to validate the inputs.
Display an error if any of the lengths are negative or zero.
\end{exercise}