Download if statement

Document related concepts
no text concepts found
Transcript
Conditionals and
Loops
5
1
Conditionals and Loops
• Now we will examine programming statements that allow
us to:
– make decisions
– repeat processing steps in a loop
• Chapter 5 focuses on:
–
–
–
–
–
–
–
boolean expressions
conditional statements
comparing data
repetition statements
iterators
more drawing techniques
more GUI components (skip)
2
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 8
Other Repetition Statements – Nov. 8, 13
Decisions and Graphics – Nov. 13
More Components (skip)
3
Flow of Control
• Unless specified otherwise, the order of statement
execution through a method is linear: one statement
after another in sequence
• Some programming statements allow us to:
– decide whether or not to execute a particular
statement
– execute a statement over and over, repetitively
• These decisions are controlled by boolean expressions
(or conditions) that evaluate to true or false
• The order of statement execution is called the flow of
control
4
Conditional Statements
• A conditional statement lets us choose which
statement will be executed next
• Therefore they are sometimes called selection
statements
• Conditional statements give us the power to make
basic decisions
• The Java conditional statements are the:
– if statement
– if-else statement
– switch statement
5
Examples of if statements
Double hoursWorked;
// Scan in a value of hoursWorked.
if (hoursWorked > 40.0 )
grossPay = 40 * payRate + 1.5 * payRate * (hoursWorked
– 40);
int heightInInches;
// Scan in a value of heightInInches
if (heightInInches < 48 )
system.out.println(“Customer too small,” +
“ do not let on ride.”);
6
The if Statement
• The if statement has the following syntax:
if is a Java
reserved word
The condition must be a
boolean expression. It must
evaluate to either true or false.
if ( condition )
statement;
If the condition is true, the statement is executed.
If it is false, the statement is skipped.
7
Logic of an if statement
condition
evaluated
true
false
statement
8
Boolean Expressions
• A condition often uses one of Java's equality
operators or relational operators, which all return
boolean results:
==
!=
<
>
<=
>=
equal to
not equal to
less than
greater than
less than or equal to
greater than or equal to
• Note the difference between the equality operator
(==) and the assignment operator (=)
9
The if Statement
• An example of an if statement:
if (sum > MAX)
delta = sum - MAX;
System.out.println ("The sum is " + sum);
• First the condition is evaluated -- the value of sum is
either greater than the value of MAX, or it is not
• If the condition is true, the assignment statement is
executed -- if it isn’t, it is skipped.
• Either way, the call to println is executed next
• See Age.java (page 216)
10
Age.java (page 216)
import java.util.Scanner;
public class Age
{
// Reads the user's age and prints comments accordingly.
public static void main (String[] args)
{
final int MINOR = 21;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter your age: ");
int age = scan.nextInt();
System.out.println ("You entered: " + age);
if (age < MINOR)
System.out.println ("Youth is a wonderful thing. Enjoy.");
System.out.println ("Age is a state of mind."); } }
11
Age.java (page 216) output
• Enter your age: 19
You entered: 19
Youth is a wonderful thing. Enjoy.
Age is a state of mind.
• Enter your age: 57
You entered: 57
Age is a state of mind.
12
Indentation
• The statement controlled by the if statement is
indented to indicate that relationship
• The use of a consistent indentation style makes
a program easier to read and understand
• Although it makes no difference to the compiler,
proper indentation is crucial to understanding
the flow of the program.
"Always code as if the person who ends up
maintaining your code will be a violent
psychopath who knows where you live."
-- Martin Golding
13
The if Statement
• What do the following statements do?
if (top >= MAXIMUM)
top = 0;
Sets top to zero if the current value of top is greater
than or equal to the value of MAXIMUM
if (total != stock + warehouse)
inventoryError = true;
Sets a flag to true if the value of total is not equal to
the sum of stock and warehouse
• The precedence of the arithmetic operators is
higher than the precedence of the equality and
relational operators
14
Logical Operators
• Boolean expressions can also use the following logical
operators:
!
&&
||
Logical NOT
Logical AND
Logical OR
• They all take boolean operands and produce boolean
results
• Logical NOT is a unary operator (it operates on one
operand)
• Logical AND and logical OR are binary operators
(each operates on two operands)
15
Logical NOT
• The logical NOT operation is also called
logical negation or logical complement
• If some boolean condition a is true, then
!a is false; if a is false, then !a is true
• Logical expressions can be shown using
a truth table
a
!a
true
false
false
true
16
Logical AND and Logical OR
• The logical AND expression
a && b
is true if both a and b are true, and false
otherwise
• The logical OR expression
a || b
is true if either a or b or both are true, and false
otherwise
17
Logical Operators
• Expressions that use logical operators
can form complex conditions
if (total < MAX+5 && !found)
System.out.println ("Processing…");
• All logical operators have lower
precedence than the relational
operators
• Logical NOT has higher precedence
than logical AND and logical OR
18
Logical Operators
• A truth table shows all possible true-false
combinations of the terms
• Since && and || each have two
operands, there are four possible
combinations of conditions a and b
a
b
true
true
false
false
true
false
true
false
a && b a || b
true
false
false
false
true
true
true
false
19
Boolean Expressions
• Specific expressions can be evaluated
using truth tables
total <
MAX
false
false
true
true
found !found
false
true
false
true
true
false
true
false
total < MAX &&
!found
false
false
true
false
20
Short-Circuited Operators
• The processing of logical AND and logical OR is
“short-circuited”
• If the left operand is sufficient to determine the
result, the right operand is not evaluated
if (count != 0 && total/count > MAX)
System.out.println ("Testing…");
• This type of processing must be used carefully
• Usually short circuiting has no effect on your
code and can be ignored.
21
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 8
Other Repetition Statements – Nov. 8, 13
Decisions and Graphics – Nov. 13
More Components (skip)
22
The if-else Statement
• An else clause can be added to an if statement
to make an if-else statement
if ( condition )
statement1;
else
statement2;
• If the condition is true, statement1 is
executed; if the condition is false,
statement2 is executed
• One or the other will be executed, but not both
• See Wages.java (page 219)
23
public class Wages
{
// Reads the number of hours worked and calculates wages.
public static void main (String[] args)
{
final double RATE = 8.25; // regular pay rate
final int STANDARD = 40; // standard hours in a work week
Scanner scan = new Scanner (System.in);
double pay = 0.0;
System.out.print ("Enter the number of hours worked: ");
int hours = scan.nextInt();
System.out.println ();
// Pay overtime at "time and a half"
if (hours > STANDARD)
pay = STANDARD * RATE + (hours-STANDARD) * (RATE *
1.5);
else
pay = hours * RATE;
NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println ("Gross earnings: " + fmt.format(pay)); } }
24
Wages.java (page 219) output
• Enter the number of hours worked: 40
Gross earnings: $330.00
• Enter the number of hours worked: 50
Gross earnings: $453.75
25
Logic of an if-else statement
condition
evaluated
true
false
statement1
statement2
26
The Coin Class
• Let's examine a class that represents a
coin that can be flipped
• Instance data is used to indicate which
face (heads or tails) is currently showing
• See CoinFlip.java (page 220)
• See Coin.java (page 221)
27
// CoinFlip.java
Author: Lewis/Loftus
//
// Demonstrates the use of an if-else statement.
public class CoinFlip
{
// Creates a Coin object, flips it, and prints the results.
public static void main (String[] args)
{
Coin myCoin = new Coin();
myCoin.flip();
System.out.println (myCoin);
if (myCoin.isHeads())
System.out.println ("You win.");
else
System.out.println ("Better luck next time.");
}
}
28
CoinFlip.java (page 220) output
• Tails
Better luck next time.
• Heads
You win.
29
Coin API
Constructor
public Coin () Sets up the coin by flipping it initially
Methods
public void flip () - Flips the coin by randomly choosing
a face value.
.
public boolean isHeads () - Returns true if the current
face of the coin is heads.
public String toString() - Returns the current face of the
coin as a string, “Heads” or
“Tails”
30
public class Coin {
private final int HEADS = 0;
private final int TAILS = 1;
private int face;
// Constructor Sets up the coin by flipping it initially.
public Coin ()
{
flip(); }
// Flips the coin by randomly choosing a face value.
public void flip ()
{
face = (int) (Math.random() * 2); }
// Returns true if the current face of the coin is heads.
public boolean isHeads ()
{ return (face == HEADS); } // Check this out
// Returns the current face of the coin as a string.
public String toString() // Can you reduce this by 1 stment?
{ String faceName;
if (face == HEADS)
faceName = "Heads";
else
faceName = "Tails";
return faceName; }}
31
Indentation Revisited
• Remember that indentation is for the
human reader, and is ignored by the
computer
if (total > MAX)
System.out.println ("Error!!");
errorCount++;
Despite what is implied by the indentation, the
increment will occur whether the condition is
true or not
32
Block Statements
• Several statements can be grouped
together into a block statement delimited
by braces
• A block statement can be used wherever a
statement is called for in the Java syntax
rules
if (total > MAX)
{
System.out.println ("Error!!");
errorCount++;
}
33
Block Statements
• In an if-else statement, the if portion, or the else
portion, or both, could be block statements
if (total > MAX)
{
System.out.println ("Error!!");
errorCount++;
}
else
{
System.out.println ("Total: “
+ total);
current = total*2;
}
• See Guessing.java (page 223)
34
public class Guessing
{
// Plays a simple guessing game with the user.
public static void main (String[] args)
{
final int MAX = 10;
int answer, guess;
Scanner scan = new Scanner (System.in);
Random generator = new Random();
answer = generator.nextInt(MAX) + 1;
System.out.print ("I'm thinking of a number between 1 and "
+ MAX + ". Guess what it is: ");
guess = scan.nextInt();
if (guess == answer)
System.out.println ("You got it! Good guessing!");
else
{
System.out.println ("That is not correct, sorry.");
System.out.println ("The number was " + answer);
} }}
35
Guessing.java (page 223) output
• I'm thinking of a number between 1 and
10. Guess what it is: 7
That is not correct, sorry.
The number was 2
• I'm thinking of a number between 1 and
10. Guess what it is: 1
You got it! Good guessing!
36
The Conditional Operator
• Java has a conditional operator that uses a
boolean condition to determine which of two
expressions is evaluated
• Its syntax is:
condition ? expression1 : expression2
• If the condition is true, expression1 is
evaluated; if it is false, expression2 is
evaluated
• The value of the entire conditional operator is
the value of the selected expression
37
The Conditional Operator
• The conditional operator is similar to an if-else
statement, except that it is an expression that returns a
value
• For example:
larger = ((num1 > num2) ? num1 : num2);
• If num1 is greater than num2, then num1 is assigned to
larger; otherwise, num2 is assigned to larger
• The conditional operator is ternary because it requires
three operands
38
The Conditional Operator
int num1 = 5, num2 = 3;
larger = ((num1 > num2) ? num1 : num2);
Evaluate
this
expression
Return this value
if expression is
true
Return this value
if expression is
false
What is the value of larger when this is done?
Answer: 5
39
The Conditional Operator
• Another example:
System.out.println ("Your change is "
+ count +((count == 1) ? "Dime" :
"Dimes"));
• If count equals 1, then "Dime" is printed
• If count is anything other than 1, then
"Dimes" is printed
40
Nested if Statements
• The statement executed as a result of an if
statement or else clause could be another if
statement
• These are called nested if statements
• See MinOfThree.java (page 227)
• An else clause is matched to the last
unmatched if (no matter what the indentation
implies)
• Braces can be used to specify the if statement
to which an else clause belongs
41
MinOfThree.java (page 227) bad example
int num1, num2, num3, min = 0;
Scanner scan = new Scanner (System.in);
System.out.println ("Enter three integers: ");
num1 = scan.nextInt();
num2 = scan.nextInt();
num3 = scan.nextInt();
if (num1 < num2) // more confusing than it needs to be
if (num1 < num3)
min = num1;
else
min = num3;
else
if (num2 < num3)
min = num2;
else
min = num3;
System.out.println ("Minimum value: " + min);
42
MinOfThree.java (page 227) output
• Enter three integers:
513
Minimum value: 1
• Enter three integers:
135
Minimum value: 1
• Enter three integers:
351
Minimum value: 1
43
MinOfThree.java (page 227) improved
(but no longer demonstrates nested if else)
int num1, num2, num3, min = 0;
Scanner scan = new Scanner (System.in);
System.out.println ("Enter three integers: ");
num1 = scan.nextInt();
num2 = scan.nextInt();
num3 = scan.nextInt();
min = num1;
if (num2 < min)
min = num2;
if (num3 < min)
min = num3;
System.out.println ("Minimum value: " + min);
44
Tax Rate Problem
• Let’s say that there are 4 income tax rates in
some country.
• The rates are:
0 <= income < 10,000: tax rate = 0%
10,000 <= income < 30,000: tax rate = 5%
30,000 <= income < 60,000: tax rate = 10%
income >= 60,000: tax rate = 15%
• Write a program that inputs a person’s income
and prints out their maximum tax rate.
45
Tax Program design
What do we need to do? Let’s set up some steps.
1.
Ask the user to input their amount of income, can be dollars and
cents.
2.
Read the income
3.
Based on income, figure out tax rate:
A person making less than $10,000 has 0% tax
A person making $10,000 but less than $30,000
has 5% tax
A person making $30,000 but less than $60,000
has 10% tax
A person making more than $60,000 has 15% tax.
4. Print out the maximum tax rate.
46
Tax rate program, first try, no if else
double income, maxTax = 0.0;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter the annual income: ");
income = scan.nextDouble();
if (income < 10000.0) // This test can be eliminated, why?
maxTax = 0.0;
if (income >= 10000.0 && income < 30000.0 )
maxTax = 0.05;
if (income >= 30000.0 && income <60000.0 )
maxTax = 0.10;
if (income >= 60000.0)
maxTax = 0.15;
System.out.println ("Maximum tax rate: " +
NumberFormat.getPercentInstance().format(maxTax));
47
Tax rate program, cleaner version
double income, maxTax = 0.0;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter the annual income: ");
income = scan.nextDouble();
if (income < 10000)
maxTax = 0.0;
else if (income < 30000 )
maxTax = 0.05;
else if (income < 60000 )
maxTax = 0.10;
else
maxTax = 0.15;
System.out.println ("Maximum tax rate: " +
NumberFormat.getPercentInstance().format(maxTax));
48
Logic of an if-else statement
condition
evaluated
true
false
statement1
statement2
Statement2
consists of
several if else’s
but the entire
thing is skipped
if the condition is
true.
49
The switch Statement
• The switch statement provides another way to
decide which statement to execute next
• The switch statement evaluates an expression,
then attempts to match the result to one of
several possible cases
• Each case contains a value and a list of
statements
• The flow of control transfers to statement
associated with the first case value that matches
50
The switch Statement
• An example of a switch statement:
// char option has a value at this point
switch (option)
{
case 'A':
aCount++;
break;
case 'B':
bCount++;
break;
case 'C':
cCount++;
break;
}
51
The switch Statement
• The general syntax of a switch
statement is:
switch
and
case
are
reserved
words
switch ( expression )
{
case value1 :
statement-list1
case value2 :
statement-list2
case value3 :
statement-list3
case ...
}
If expression
matches value2,
control jumps
to here
If the expression matches value2, statement-list2 is executed and all the
statement lists following this one are executed. Put a break statement in so only
statement-list2 is executed.
52
The switch Statement, usual form
• Break placed after each statement-list
Break
causes
control to
transfer to
the next
statement,
the one
directly
following
the switch
switch ( expression )
{
case value1 :
statement-list1
break;
case value2 :
statement-list2
break;
case value3 :
statement-list3
break;
case ...
If expression
matches value2,
control jumps
to here
}
next-statement
53
The switch Statement
• The actions in the switch are usually mutually
exclusive. Only one of the options is executed.
• If a break statement is not used, the flow of
control will continue into the next case.
Sometimes this may be appropriate, but usually
we want to execute only the statements
associated with one case
54
The switch Statement with default
// char option has a value at this point
switch (option)
{ case 'A':
aCount++;
break;
case 'B':
bCount++;
break;
case 'C':
cCount++;
break;
case ‘D’: case ‘F’:
dfCount++;
break;
default:
System.out.println(“Input must “ +
“be A,B,C, D, F.\n<” + option +
“> was entered.”);
55
default clause
• A switch statement can have an optional
default case
• Control will transfer to it if no other case
value matches
• If there is no default case, and no other value
matches, control falls through to the
statement after the switch
56
The switch Statement
• The expression of a switch statement must result in
an integral type, meaning an integer (byte, short,
int, long) or a char
• It cannot be a boolean value (use an if instead) or a
floating point value (float or double)
• The implicit boolean condition in a switch statement
is equality, you cannot perform relational checks with a
switch statement
• See GradeReport.java (page 233)
57
int grade, category;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter a numeric grade (0 to 100): ");
grade = scan.nextInt();
category = grade / 10;
System.out.print ("That grade is ");
switch (category)
{ case 10:
System.out.println ("a perfect score. Well done.");
break;
case 9:
System.out.println ("well above average. Excellent.");
break;
case 8:
System.out.println ("above average. Nice job.");
break;
case 7:
System.out.println ("average.");
break;
case 6:
System.out.println ("below average. You should see the");
System.out.println ("instructor to clarify the material "
+ "presented in class.");
break;
default:
System.out.println ("not passing."); }
58
Question
• What if a student got 110 as the numeric
grade?
59
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 8
Other Repetition Statements – Nov. 8, 13
Decisions and Graphics – Nov. 13
More Components (skip)
60
Comparing Data
• When comparing data using boolean
expressions, it's important to understand
the nuances of certain data types
• Let's examine some key situations:
– Comparing floating point values for equality
– Comparing characters
– Comparing strings (alphabetical order)
– Comparing object vs. comparing object
references
61
Comparing Float Values
• You should rarely use the equality operator (==) when
comparing two floating point values (float or double)
• Two floating point values are equal only if their
underlying binary representations match exactly
• Floating point computations often result in slight
differences that may be irrelevant to you but not to the
computer
• In many situations, you might consider two floating point
numbers to be "close enough" even if they aren't exactly
equal
• Often use relation tests (e.g. <, <=, >, >=) with floating
point values.
62
Comparing Float Values
• To determine the equality of two floats, you
may want to use the following technique:
if (Math.abs(f1 - f2) < TOLERANCE)
System.out.println ("Essentially equal");
• If the difference between the two floating
point values is less than the tolerance, they
are considered to be equal
• The tolerance could be set to any
appropriate level, such as 0.000001
63
Comparing Characters
• As we've discussed, Java character data is
based on the Unicode character set
• Unicode establishes a particular numeric value
for each character, and therefore an ordering
• We can use relational operators on character
data based on this ordering
• For example, the character '+' is less than the
character 'J' because it comes before it in the
Unicode character set
• Appendix C provides an overview of Unicode
64
Comparing Characters
• In Unicode, the digit characters (0-9) are
contiguous and in order
• Likewise, the uppercase letters (A-Z) and
lowercase letters (a-z) are contiguous and in
order
Characters
0–9
A–Z
a–z
Unicode
Values
48 through 57
65 through 90
97 through 122
65
Comparing Strings
• Remember that in Java a character string is an object
• Using the test if (name1 == name2) will return
true if name1 and name2 have the same address in
memory, i.e. if they are the same String object.
• The equals method can be called with strings to
determine if two strings contain exactly the same
characters in the same order
• The equals method returns a boolean result
if (name1.equals(name2))
System.out.println ("Same name");
66
Comparing Strings
• We cannot use the relational operators to compare
strings
• The String class contains a method called compareTo
to determine if one string comes before another
• A call to name1.compareTo(name2)
– returns zero if name1 and name2 are equal (contain
the same characters)
– returns a negative value if name1 is less than name2
– returns a positive value if name1 is greater than
name2
67
Comparing Strings
name1 < name2: returns a
negative value
name1.compareTo(name2)
name1 = name2: returns zero
(name1 and name2 contain
the same characters but are
not necessarily the same
object)
name1 > name2: returns a
positive value
68
Comparing Strings
if (name1.compareTo(name2) < 0)
System.out.println (name1 + "comes first");
else
if (name1.compareTo(name2) == 0)
System.out.println ("Same name");
else
System.out.println (name2 + "comes first");
• The above results in comparing strings in the
same way as they are compared (and
sequenced) in a dictionary. Another word for
“dictionary” is “lexicon”. This sequencing is
traditionally called lexicographic ordering
69
Lexicographic Ordering
• Lexicographic ordering is not strictly alphabetical
when uppercase and lowercase characters are
mixed
• For example, the string "Great" comes before
the string "fantastic" because all of the
uppercase letters come before all of the
lowercase letters in Unicode
• Also, short strings come before longer strings with
the same prefix (lexicographically)
• Therefore "book" comes before "bookcase"
70
Lexicographic Ordering continued
• When ordering strings it is often useful to change them
all to upper or lower case letters then order them. There
is no problem with mixing of cases then.
String strng1 = “Great”;
String strng2 = “fantastic”;
strng1Upper = strng1.toUpperCase();
strng2Upper = strng2.toUpperCase();
if(strng1Upper.compareTo(strng2Upper)>0)
/* this will be true because
“GREAT” comes after “FANTASTIC” */
71
Comparing Objects
• The == operator can be applied to objects – it
returns true if the two references are aliases of
each other. This just means that they are the
same object, works just like comparing strings
with ==
• The equals method is defined for all objects, but
unless we redefine it when we write a class, it has
the same semantics as the == operator
• It has been redefined in the String class to
compare the characters in the two strings
• When you write a class, you can redefine the
equals method to return true under whatever
conditions are appropriate
72
Adding an equal method to the circle class.
private int diameter, x, y;
private Color color;
public boolean equals(Circle par)
{ return x == par.x && y == par.y
&& diameter == par.diameter
&& color == par.color;
}
Notice that we can refer to the private data of the
Circle object par directly. This is a shortcut
allowed for methods in a class that refer to
objects in the same class. We do not have to
say par.getDiameter(), though this would
certainly work.
73
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 8
Other Repetition Statements – Nov. 8, 13
Decisions and Graphics – Nov. 13
More Components (skip)
74
Repetition Statements
• Repetition statements allow us to execute a
statement multiple times
• Often they are referred to as loops
• Like conditional statements, they are controlled by
boolean expressions
• Java has three kinds of repetition statements:
– the while loop
– the do loop
– the for loop
• The programmer should choose the right kind of
loop for the situation
75
The while Statement
• A while statement has the following syntax:
while ( condition )
statement;
• If the condition is true, the statement is
executed and the condition evaluated
again
• If condition is still true, the statement is
executed again
• The statement is executed repeatedly until the
condition becomes false
76
Logic of a while Loop
condition
evaluated
true
false
statement
77
The while Statement
• An example of a while statement:
int count = 1;
while (count <= 5)
{
System.out.println (count);
count++;
}
• If the condition of a while loop is false initially,
the statement is never executed
• Therefore, the body of a while loop will
execute zero or more times
• The above will print the values 1 2 3 4 5 on
separate lines.
78
The while Statement
• Let's look at some examples of loop processing
• A loop can be used to maintain a running sum
• A sentinel value is a special input value that
represents the end of input
• See Average.java (page 237)
79
int sum = 0, value, count = 0;
double average;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter an integer (0 to quit): ");
value = scan.nextInt();
while (value != 0) // sentinel value of 0 to terminate loop
{ count++;
sum += value;
System.out.println ("The sum so far is " + sum);
System.out.print ("Enter an integer (0 to quit): ");
value = scan.nextInt();
}
System.out.println ();
if (count == 0)
System.out.println ("No values were entered.");
else
{ average = (double)sum / count;
DecimalFormat fmt = new DecimalFormat ("0.###");
System.out.println ("The average is " + fmt.format(average)); }80
• Enter an integer (0 to quit): 89
The sum so far is 89
Enter an integer (0 to quit): 68
The sum so far is 157
Enter an integer (0 to quit): 97
The sum so far is 254
Enter an integer (0 to quit): 73
The sum so far is 327
Enter an integer (0 to quit): 82
The sum so far is 409
Enter an integer (0 to quit): 77
The sum so far is 486
Enter an integer (0 to quit): 0
The average is 81
81
General form of input loops that use a
sentinel to stop
Read first value
condition
evaluated
The last value
(sentinel) is read and
tested immediately.
Thus the loop is
exited without
processing the
sentinel value. This
is the desired
behavior.
true
false
Statement
Read next value
82
The while Statement
• A loop can also be used for input validation,
making a program more robust
• See WinPercentage.java (page 239)
83
final int NUM_GAMES = 12;
int won;
double ratio;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter the number of games won (0 to "
+ NUM_GAMES + "): ");
won = scan.nextInt();
while (won < 0 || won > NUM_GAMES)
{ System.out.print ("Invalid input. Please reenter: ");
won = scan.nextInt();
}
ratio = (double)won / NUM_GAMES;
NumberFormat fmt = NumberFormat.getPercentInstance();
System.out.println ();
System.out.println ("Winning percentage: " + fmt.format(ratio));
84
WinPercentage.java (page 239) output
Enter the number of games won (0 to 12):13
Invalid input. Please reenter: -2
Invalid input. Please reenter: 8
Winning percentage: 67%
85
WinPercentageBetter.java
• The following displays the incorrect input to the
user.
while (won < 0 || won > NUM_GAMES)
{
System.out.print ("Invalid input, < " + won +
" >. Please reenter: ");
won = scan.nextInt();
}
Enter the number of games won (0 to 12): -1
Invalid input, < -1 >. Please reenter: 13
Invalid input, < 13 >. Please reenter: 8
Winning percentage: 67%
86
Infinite Loops
• The body of a while loop must eventually
execute a statement that makes the condition
false
• If not, it is called an infinite loop, which will
execute until the user interrupts the program
• This is a common logical error
• You should always double check the logic of
a program to ensure that your loops will
terminate normally
87
Infinite Loops
• An example of an infinite loop:
int count = 1;
while (count <= 25)
{
System.out.println (count);
}
• Count is never incremented so it will
remain 1 which is always less than 25
• This loop will continue executing until
interrupted (Control-C).
88
Nested Loops
• Similar to nested if statements, loops can
be nested as well
• That is, the body of a loop can contain
another loop
• For each iteration of the outer loop, the
inner loop iterates completely
• See PalindromeTester.java (page 243)
89
String str, another = "y";
int left, right;
Scanner scan = new Scanner (System.in);
while (another.equalsIgnoreCase("y")) // allows y or Y
{
System.out.println ("Enter a potential palindrome:");
str = scan.nextLine();
left = 0;
right = str.length() - 1;
while (str.charAt(left) == str.charAt(right) && left < right)
{ left++;
right--;
}
System.out.println();
if (left < right)
System.out.println ("That string is NOT a palindrome.");
else
System.out.println ("That string IS a palindrome.");
System.out.println();
System.out.print ("Test another palindrome (y/n)? ");
another = scan.nextLine(); }
90
PalindromeTester.java (page 243) output
Enter a potential palindrome: toot
That string IS a palindrome.
Test another palindrome (y/n)? y
Enter a potential palindrome: tool
That string is NOT a palindrome.
Test another palindrome (y/n)? y
Enter a potential palindrome: a toyota
That string is NOT a palindrome.
Test another palindrome (y/n)? n
91
PalindromeTester.java (page 243)
• How does the program work? Use “toot” as an example.
• while (str.charAt(left) == str.charAt(right) && left < right)
toot left = 0, right = 3, ‘t’ ==‘t’ && 0 < 3: true
toot left = 1, right = 2, ‘o’ ==‘o’ && 1 < 2: true
toot left = 2, right = 1, ‘o’ ==‘o’ && 2 < 1: false
// exit loop
• if (left < right)
2 < 1: false
// execute the else part of the if else
System.out.println ("That string IS a palindrome.");
• What happens if the input string is “atoyota”?
Ans: atoyota eventually left = 3, right = 3: left < right: false
exit loop
92
Nested Loops
• How many times will the string "Here" be
printed?
count1 = 1;
while (count1 <= 10)
{
count2 = 1;
while (count2 <= 20)
{
System.out.println ("Here");
count2++;
}
count1++;
}
Ans: 10 * 20 = 200
93
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 13
Other Repetition Statements – Nov. 13
Decisions and Graphics – Nov. 13
More Components (skip) – Nov. 13
94
Iterators
• An iterator is an object that allows you to
process a collection of items one at a time
• It lets you step through each item in turn and
process it as needed
• An iterator object has a hasNext method that
returns true if there is at least one more item to
process
• The next method returns the next item
• Iterator objects are defined using the Iterator
interface, which is discussed further in Chapter 695
Iterators
• Several classes in the Java standard class library are
iterators
• The Scanner class is an iterator
– the hasNext method returns true if there is more
data to be scanned
– the next method returns the next scanned token as a
string
• The Scanner class also has variations on the hasNext
method for specific data types (such as hasNextInt)
96
Iterators
• The fact that a Scanner is an iterator is
particularly helpful when reading input from a file
• Suppose we wanted to read and process a list of
URLs stored in a file
• One scanner can be set up to read each line of
the input until the end of the file is encountered
• Another scanner can be set up for each URL to
process each part of the path
• See URLDissector.java (page 247)
97
File input
We can input information from a file by importing java.io.*
The following program refers to a file named urls.inp. It associates this with a
scanner.
The program associates a new scanner with each line in the input file. (Note:
Much the same thing could be cone with the String methods but scanner
works quite well.)
URL: java.sun.com/j2se/1.5
java.sun.com
j2se
1.5
URL: www.linux.org/info/gnu.html
www.linux.org
info
gnu.html
URL: duke.csc.villanova.edu/lewis/
duke.csc.villanova.edu
lewis
Errors can occur in handling
files and scanning. Because
the program might run into an
error it contains a throws
clause. This says that some
other module above this one
should handle the error. In our
case there is no other module
so an execution tike error
occurs.
98
public static void main (String[] args) throws IOException
{
String url;
Scanner fileScan, urlScan;
fileScan = new Scanner (new File("urls.inp"));
// Read and process each line of the file
while (fileScan.hasNext())
{
url = fileScan.nextLine();
System.out.println ("URL: " + url);
urlScan = new Scanner (url);
urlScan.useDelimiter("/");
// Print each part of the url
while (urlScan.hasNext())
System.out.println (" " + urlScan.next());
System.out.println();
}
}
99
No file named url.inp in the directory
•
----jGRASP exec: java URLDissector
Exception in thread "main"
java.io.FileNotFoundException: urls.inp (The system
cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at
java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.util.Scanner.<init>(Scanner.java:621)
at URLDissector.main(URLDissector.java:21)
----jGRASP wedge2: exit code for process is 1.
100
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 8
Other Repetition Statements – Nov. 8, 13
Decisions and Graphics – Nov. 13
More Components (skip)
101
The do Statement
• A do statement has the following syntax:
do
{
statement;
}
while ( condition )
• The statement is executed once initially, and
then the condition is evaluated
• The statement is executed repeatedly until the
condition becomes false
102
Logic of a do Loop
statement
true
condition
evaluated
false
103
The do Statement
• An example of a do loop:
int count = 0;
do
{
count++;
System.out.println (count);
} while (count < 5);
Output: 1 2 3 4 5
0n separate lines
• The body of a do loop executes at least
once
• See ReverseNumber.java (page 251)
Welty used to give this on tests.
104
ReverseNumber.java (page 251)
•
public static void main (String[] args)
{
int number, lastDigit, reverse = 0;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter a positive integer: ");
number = scan.nextInt();
do
{
lastDigit = number % 10;
reverse = (reverse * 10) + lastDigit;
number = number / 10;
}
while (number > 0);
System.out.println ("That number reversed is " + reverse);
}
105
Assume:
number = 4852, reverse = 0
do
{
lastDigit = number % 10;
reverse = (reverse * 10) + lastDigit;
number = number / 10;
}
while (number > 0);
lastDigit = 2
reverse = 2
number = 485
lastDigit = 5
reverse = 25
number = 48
lastDigit = 8
reverse = 258
number = 4
lastDigit = 4
reverse = 2584
number = 0
Exit loop
106
Comparing while and do
The while Loop (pretest)
statement
condition
evaluated
true
statement
The do Loop
(post test)
true
false
condition
evaluated
false
107
The for Statement
• A for statement has the following syntax:
The initialization
is executed once
before the loop begins
The statement is
executed until the
condition becomes false
for ( initialization ; condition ; increment )
statement;
The increment portion is executed at
the end of each iteration
108
Logic of a for loop
initialization
condition
evaluated
true
false
statement
increment
109
The for Statement
• A for loop is functionally equivalent to the
following while loop structure:
initialization;
while ( condition )
{
statement;
increment;
}
110
The for Statement
• An example of a for loop:
for (int count=1; count <= 5; count++)
System.out.println (count);
• The initialization section can be used to
declare a variable
• Like a while loop, the condition of a for
loop is tested prior to executing the loop
body. It is a pretest loop.
• Therefore, the body of a for loop will
execute zero or more times
111
The for Statement
• The increment section can perform any
calculation
for (int num=20; num > 0; num -= 5)
System.out.println (num);
Q: How many times will this loop execute? Ans: 5
• A for loop is well suited for executing
statements a specific number of times that
can be calculated or determined in advance
• See Multiples.java (page 255)
• See Stars.java (page 257)
112
public static void main (String[] args)
{ final int PER_LINE = 5;
int value, limit, mult, count = 0;
Scanner scan = new Scanner (System.in);
System.out.print ("Enter a positive value: ");
value = scan.nextInt();
System.out.print ("Enter an upper limit: ");
limit = scan.nextInt();
System.out.println ();
System.out.println ("The multiples of " + value + " between "
+ value + " and " + limit + " (inclusive) are:");
for (mult = value; mult <= limit; mult += value)
{ System.out.print (mult + "\t");
// Print a specific number of values per line of output
count++;
if (count % PER_LINE == 0)
System.out.println();
} }
113
Multiples.java (page 255) output
• Enter a positive value: 4
Enter an upper limit: 90
The multiples of 4 between 4 and 90
(inclusive) are:
4
8
12 16 20
24 28 32 36 40
44 48 52 56 60
64 68 72 76 80
114
Stars.java (page 257)
public class Stars
{
// Prints a triangle shape using asterisks (stars)
public static void main (String[] args)
{
final int MAX_ROWS = 10;
for (int row = 1; row <= MAX_ROWS; row++)
{
for (int star = 1; star <= row; star++)
System.out.print ("*");
System.out.println();
} }}
115
Stars.java (page 257) output
*
**
***
****
*****
******
*******
********
*********
**********
row = 1
row = 2
row = 3
row = 4
row = 5
row = 6
row = 7
row = 8
row = 9
row = 10
116
The for Statement
• The following are rarely used in beginning programs
and even in advanced programs. Can be useful but
only occasionally.
• Each expression in the header of a for loop is
optional
• If the initialization is left out, no initialization is
performed
• If the condition is left out, it is always considered to
be true, and therefore creates an infinite loop
• If the increment is left out, no increment operation is
performed
117
Iterators and for Loops
This seems to be too advanced an idea at this time.
• Recall that an iterator is an object that allows
you to process each item in a collection
• A variant of the for loop simplifies the repetitive
processing the items
• For example, if BookList is an iterator that
manages Book objects, the following loop will
print each book:
for (Book myBook : BookList)
System.out.println (myBook);
118
Iterators and for Loops
This seems to be too advanced an idea at this time.
• This style of for loop can be read "for each
Book in BookList, …"
• Therefore the iterator version of the for loop is
sometimes referred to as the foreach loop
• It eliminates the need to call the hasNext and
next methods explicitly
• It also will be helpful when processing arrays,
which are discussed in Chapter 7
119
Outline
The if Statement and Conditions – Oct. 25
Other Conditional Statements – Oct. 25
Comparing Data – Oct. 30
The while Statement – Nov. 8
Iterators – Nov. 8
Other Repetition Statements – Nov. 8, 13
Decisions and Graphics – Nov. 13
More Components (skip)
120
Drawing Techniques
• Conditionals and loops enhance our ability
to generate interesting graphics
• See Bullseye.java (page 259) (I will not
bother showing this. It is the usual.)
• See BullseyePanel.java (page 290)
• See Boxes.java (page 262) (I will not
bother showing this. It is the usual.)
• See BoxesPanel.java (page 263)
121
BullseyePanel.java (page 290)
import javax.swing.JPanel;
import java.awt.*;
public class BullseyePanel extends JPanel
{
private final int MAX_WIDTH = 300, NUM_RINGS = 5,
RING_WIDTH = 25;
//----------------------------------------------------------------// Sets up the bullseye panel.
//----------------------------------------------------------------public BullseyePanel ()
{
setBackground (Color.cyan);
setPreferredSize (new Dimension(300,300));
}
122
// Paints a bullseye target.
public void paintComponent (Graphics page)
{ super.paintComponent (page);
int x = 0, y = 0, diameter = MAX_WIDTH;
page.setColor (Color.white);
for (int count = 0; count < NUM_RINGS; count++)
{ if (page.getColor() == Color.black) // alternate colors
page.setColor (Color.white);
else
page.setColor (Color.black);
page.fillOval (x, y, diameter, diameter);
diameter -= (2 * RING_WIDTH);
x += RING_WIDTH;
y += RING_WIDTH;
}
// Draw the red bullseye in the center
page.setColor (Color.red);
page.fillOval (x, y, diameter, diameter); } }
123
BullseyePanel.java (page 290) output
124
BoxesPanel.java (page 263)
import javax.swing.JPanel;
import java.awt.*;
import java.util.Random;
public class BoxesPanel extends JPanel
{
private final int NUM_BOXES = 50, THICKNESS = 5,
MAX_SIDE = 50;
private final int MAX_X = 350, MAX_Y = 250;
private Random generator;
// Set up the drawing panel.
public BoxesPanel ()
{
generator = new Random();
setBackground (Color.black);
setPreferredSize (new Dimension(400, 300));
}
125
public void paintComponent(Graphics page)
{ super.paintComponent (page);
int x, y, width, height;
for (int count = 0; count < NUM_BOXES; count++)
{
x = generator.nextInt(MAX_X) + 1;
y = generator.nextInt(MAX_Y) + 1;
width = generator.nextInt(MAX_SIDE) + 1;
height = generator.nextInt(MAX_SIDE) + 1;
if (width <= THICKNESS) // check for narrow box
{
page.setColor (Color.yellow);
page.fillRect (x, y, width, height);
}
else
if (height <= THICKNESS) // check for short box
{ page.setColor (Color.green);
page.fillRect (x, y, width, height);
}
else
{ page.setColor (Color.white);
page.drawRect (x, y, width, height);
}
} }}
126
Boxes.java (page 262) output
127