Professional Documents
Culture Documents
Loops
4.1 Introduction
• The braces enclosing a while loop or any other loop can be omitted only if the loop
body contains one or no statement. The while loop flowchart is in Figure (a).
• The loop-continuation-condition, a Boolean expression, must appear inside the
parentheses. It is always evaluated before the loop body is executed.
• If its evaluation is true, the loop body is executed; if its evaluation is false, the entire
loop terminates, and the program control turns to the statement that follows the while
loop.
int count = 0;
while (count < 100) {
System.out.println("Welcome to Java!");
count++;
}
count = 0;
Loop
false false
Continuation (count < 100)?
Condition?
true true
Statement(s) System.out.println("Welcome to Java!");
(loop body) count++;
(A) (B)
FIGURE 4.1 The while loop repeatedly executes the statements in the loop body when
the loop-continuation-condition evaluates to true.
Caution
• Make sure that the loop-continuation-condition eventually becomes false so that the
program will terminate.
• A common programming error involves infinite loops.
• Write a program that randomly generates an integer between 0 and 100, inclusive.
The program prompts the user to enter a number continuously until the number
matches the randomly generated number. For each user input, the program tells the
user whether the input is too low or too high, so the user can choose the next input
intelligently.
if (guess == number)
System.out.println("Yes, the number is " + number);
else if (guess > number)
System.out.println("Your guess is too high");
else
System.out.println("Your guess is too low");
} // End of loop
}
}
• The Math subtraction learning tool program generates just one question for each run.
You can use a loop to generate questions repeatedly. This example gives a program
that generates five questions and reports the number of the correct answers after a
student answers all five questions.
import java.util.Scanner;
What is 9 - 2? 7
Your answer is correct!
What is 3 - 0? 3
Your answer is correct!
What is 3 - 2? 1
Your answer is correct!
What is 7 - 4? 4
Your answer is wrong.
7 - 4 should be 3
What is 7 - 5? 4
Your answer is wrong.
7 - 5 should be 2
Correct count is 3
Test time is 1021 seconds
Ï
9-2=7 correct
3-0=3 correct
3-2=1 correct
7-4=4 wrong
7-5=4 wrong
• Often the number of times a loop is executed is not predetermined. You may use an
input value to signify the end of the loop. Such a value is known as a sentinel value.
• Write a program that reads and calculates the sum of an unspecified number of
integers. The input 0 signifies the end of the input.
• If data is not 0, it is added to the sum and the next input data are read. If data is 0, the
loop body is not executed and the while loop terminates.
• If the first input read is 0, the loop body never executes, and the resulting sum is 0.
• The do-while loop executes the loop body first, and then checks the loop-
continuation condition to determine whether to continue or terminate the loop.
• Don’t use floating-point values for equality checking in a loop control. Since
floating-point values are approximations for some values, using them could result in
imprecise counter values and inaccurate results. Consider the following code for
computing 1 + 0.9 + 0.8 + ... + 0.1:
double item = 1; double sum = 0;
while (item != 0) { // No guarantee item will be 0
sum += item;
item -= 0.1;
}
System.out.println(sum);
• Variable item starts with 1 and is reduced by 0.1 every time the loop body is
executed. The loop should terminate when item becomes 0. However, there is no
guarantee that item will be exactly 0, because the floating-point arithmetic is
approximated. This loop seems OK on the surface, but it is actually an infinite loop.
• If you have a large number of data to enter, it would be cumbersome to type from the
key board. You may store the data separated by whitespaces in a text file, say
input.txt, and run the program using the following command:
• This command is called input redirection. The program takes the input from the file
input.txt rather thatn having the user to type the data from the keyboard at runtime.
• There is output redirection which sends the output to a file rather than displaying it
on the console. The command for output redirection is:
• Input and output redirection can be used in the same command. For example, the
following command gets input from input.txt and sends output to output.txt:
do {
// Loop body
Statement(s);
} while (continue-condition); // Do not forget “;”
Statement(s)
(loop body)
true Loop
Continuation
Condition?
false
FIGURE 4.2 The do-while loop executes the loop body first, then checks the loop-
continuation-condition to determine whether to continue or terminate the loop.
// Create a Scanner
Scanner input = new Scanner(System.in);
sum += data;
} while (data != 0);
• The for loop statement starts with the keyword for, followed by a pair of parentheses
enclosing initial-action, loop-continuation-condition, and action-after-each-iteration,
and the loop body, enclosed inside braces.
• initial-action, loop-continuation-condition, and action-after-each-iteration are
separated by semicolons;
• A for loop generally uses a variable to control how many times the loop body is
executed and when the loop terminates.
• This variable is referred to as a control variable. The initial-action often initializes a
control variable, the action-after-each-iteration usually increments or decrements
the control variable, and the loop-continuation-condition tests whether the control
variable has reached a termination value.
• Example: The following for loop prints Welcome to Java! 100 times.
int i;
for (i = 0; i < 100; i++) {
System.out.println("Welcome to Java! ”);
}
Initial-Action i=0
Loop
false false
Continuation (i < 100)?
Condition?
true true
Statement(s) System.out.println(
(loop body) "Welcome to Java");
Action-After-Each-Iteration i++
(A) (B)
FIGURE 4.3 A for loop performs an initial action one, then repeatedly executes the
statements in the loop body, and performs an action after an iteration when the loop-
continuation-condition evaluates as true
Note
Note
• The three forms of loop statements, while, do, and for, are expressively equivalent;
that is, you can write a loop in any of these three forms.
• For example, a while loop in (a) in the following figure can always be converted into
the following for loop in (b):
• A for loop in (a) in the following figure can generally be converted into the following
while loop in (b) except in certain special cases.
Recommendations
• The author recommends that you use the one that is most intuitive and comfortable
for you.
• In general, a for loop may be used if the number of repetitions is known, as, for
example, when you need to print a message 100 times.
• A while loop may be used if the number of repetitions is not known, as in the case
of reading the numbers until the input is 0.
• A do-while loop can be used to replace a while loop if the loop body has to be
executed before testing the continuation condition.
• Adding a semicolon at the end of the for clause before the loop body is a common
mistake, as shown below:
int i=0;
while (i<10); // Logic Error (‘;’)
{
System.out.println("i is " + i);
i++;
}
• In the case of the do loop, the following semicolon is needed to end the loop.
int i=0;
do {
System.out.println("i is " + i);
i++;
} while (i<10); // Correct, The semicolon is needed
• Nested loops consist of an outer loop and one or more inner loops. Each time the
outer loop is repeated, the inner loops are reentered, and all the required iterations
are performed.
• Problem: Write a program that uses nested for loops to print a multiplication table.
System.out.println("\n-----------------------------------------");
Ï Multiplication Table
Ï 1 2 3 4 5 6 7 8 9
Ï-----------------------------------------
Ï1 | 1 2 3 4 5 6 7 8 9
Ï2 | 2 4 6 8 10 12 14 16 18
Ï3 | 3 6 9 12 15 18 21 24 27
Ï4 | 4 8 12 16 20 24 28 32 36
Ï5 | 5 10 15 20 25 30 35 40 45
Ï6 | 6 12 18 24 30 36 42 48 54
Ï7 | 7 14 21 28 35 42 49 56 63
Ï8 | 8 16 24 32 40 48 56 64 72
Ï9 | 9 18 27 36 45 54 63 72 81
• Write a program that sums a series that starts with 0.01 and ends with 1.0. The
numbers in the series will increment by 0.01, as follows 0.01 + 0.02 + 0.03 and so on.
• LISTING 4.7 TestSum.java (Page 130)
public class TestSum {
public static void main(String[] args) {
// Initialize sum
float sum = 0;
// Display result
System.out.println("The sum is " + sum);
}
}
o The for loop repeatedly adds the control variable i to the sum. This variable,
which begins with 0.01, is incremented by 0.01 after each iteration. The loop
terminates when i exceeds 1.0.
o The exact sum should be 50.50, but the answer is 50.499985. The result is not
precise because computers use a fixed number of bits to represent floating-point
numbers, and thus cannot represent some floating-point number exactly.
• If you change float in the program to double as follows, you should see a slight
improvement in precision because a double variable takes 64 bits, whereas a float
variable takes 32 bits.
public class TestSum {
public static void main(String[] args) {
// Initialize sum
double sum = 0;
// Display result
System.out.println("The sum is " + sum);
}
}
// Display result
System.out.println("The sum is " + sum);
}
}
• Problem: Write a program that prompts the user to enter two positive integers and
finds their greatest common divisor.
• LISTING 4.8 GreatestCommonDivisor.java (Page 132)
• Solution: Suppose you enter two integers 4 and 2, their greatest common divisor is 2.
Suppose you enter two integers 16 and 24, their greatest common divisor is 8. So,
how do you find the greatest common divisor? Let the two input integers be n1 and
n2. You know number 1 is a common divisor, but it may not be the greatest commons
divisor. So you can check whether k (for k = 2, 3, 4, and so on) is a common divisor
for n1 and n2, until k is greater than n1 or n2.
import java.util.Scanner;
int gcd = 1;
int k = 2;
while (k <= n1 && k <= n2) {
if (n1 % k == 0 && n2 % k == 0)
gcd = k;
k++;
}
• Problem: Suppose that the tuition for a university is $10,000 this year and tuition
increases 7% every year. In how many years will the tuition be doubled?
• The break control immediately ends the innermost loop that contains it. It is
generally used with an if statement.
• The continue control only ends the current iteration. Program control goes to the
end of the loop body. This keyword is generally used with an if statement.
• The break statement forces its containing loop to exit.
false
Continuation
condition?
true
Statement(s)
break
Statement(s)
Next
Statement
• The continue statement forces the current iteration of the loop to end.
false
Continue
condition?
true
Statement(s)
continue
Statement(s)
Next
Statement
o Without the if statement, the program calculates the sum of the numbers from 1 to
20.
Output:
The number is 20
The sum is 210
The number is 14
The sum is 105
Output:
The sum is 189
o Without the if statement in the program, all of the numbers are added to sum,
even when number is 10 or 11.
Output:
The sum is 210
• Every Statement in Java can have an optional label as an identifier. Labels are often
used with break and continue statements.
• You can use a break statement with a label to break out of the labeled loop, and a
continue statement with a label to break out of the current iteration of the labeled
loop.
• The break statement given below, for example, breaks out of the outer loop if (i *
j) > 50 and transfers control to the statement immediately following the outer loop.
outer:
for (int i = 1; i < 10; i++) {
inner:
for (int j = 1; j < 10; j++) {
if (i * j > 50)
break outer;
System.out.println(i * j);
}
}
• If you replace break outer with break in the preceding statement, the break statement
would break out of the inner loop and continue to stay inside the outer loop.
• The following continue statement breaks out of the inner loop if (i * j > 50) and starts
a new iteration of the outer loop if i < 10 is true after i us incremented by 1:
outer:
for (int i = 1; i < 10; i++) {
inner:
for (int j = 1; j < 10; j++) {
if (i * j > 50)
continue outer;
System.out.println(i * j);
}
}
• If you replace continue outer with continue in the preceding statement, the continue
statement would break out of the current iteration of the inner loop if (i * j > 50)
and continue the next iteration of the inner loop if j < 10 is true after j is incremented
by 1.
int option = 0;
while (option == JOptionPane.YES_OPTION) {
System.out.println("continue loop");
option = JOptionPane.showConfirmDialog(null, "Continue?");
}
• The value is
o JOptionPane.YES_OPTION (0) for Yes button,
o JOptionPane.NO_OPTION (1) for the No button, and
o JOptionPane.CANCEL_OPTION (2) for Cancel button.
import javax.swing.JOptionPane;
sum += data;
(a) (b)
(c) (d)
(e)
FIGURE 4.4 The user enters 3 in (a), clicks Yes in (b), enters 5 in (c), clicks No in (d),
and the result is shown in (e).