We have seen the
advantages of using various methods of iteration, or looping.
Now
let's take a look at what happens when we combine looping
procedures.
The placing of one loop inside the body of another loop is
called nesting. When you "nest"
two loops, the outer loop
takes control of the number of complete repetitions of the inner
loop. While all
types of loops may be nested, the most
commonly nested loops are for
loops. |
nested
loops
|
|
Let's look at an
example of nested loops at work.
We have all seen web page counters
that resemble the one shown below ( well, OK, maybe not quite this
spastic!!). Your car's odometer works in a similar manner.
This counter (if it
worked properly) and your car's odometer are little more than seven
or eight nested for
loops, each going from 0 to 9. The far-right number iterates the
fastest, visibly moving from 0 to 9 as you drive your car or increasing by one
as people visit a web site. A for
loop which imitates the movement of the far-right number is shown below:
|
for(num1 = 0; num1
<= 9; num1++)
{
cout << num1 << endl;
} |
The far-right number,
however, is not the
only number that is moving. All of the other numbers are moving also, but at a much slower
pace. For every 10 numbers that move in the column on the right, the adjacent
column is incremented by one. The two nested loops shown below may be
used to imitate the movement of the two far-right numbers of a web counter or an odometer:
The number of digits in the web
page counter or the odometer determine the number of
nested loops needed to imitate the process.
When
working with nested loops, the outer loop changes
only after the inner loop is completely finished (or is interrupted.). |
Let's take a look at a trace of two
nested loops. In order to keep the trace manageable, the
number of iterations have been
shortened.
for(num2 = 0; num2 <=
3; num2++)
{
for(num1 = 0; num1 <= 2; num1++)
{
cout<< num2<< " " << num1<<
endl;
}
} |
Memory |
Screen |
int
num2 |
int
num1 |
|
0 |
|
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3
end loop |
|
1 |
|
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3
end loop |
|
2 |
|
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3
end loop |
|
3 |
|
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3
end loop |
|
4
end loop |
|
|
Remember,
in the memory, for
loops will register a value one beyond (or the step beyond)
the requested ending value in order to disengage the loop. |
0
0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
3 0
3 1
3 2 |
Are
we getting a little loopy?
|
|
|