You are on page 1of 6

Nested for loops

Topic 6

A for loop can contain any kind of statement in its body,
Nested for Loops including another for loop.
– The inner loop must have a different name for its loop counter
"Complexity has and will maintain a strong fascination for many people. It variable
i bl so th
thatt it will
ill nott conflict
fli t with
ith th
the outer
t lloop.
is true that we live in a complex world and strive to solve inherently
nested loop: Loops placed inside one another, creating a
complex problems, which often do require complex mechanisms. loop of loops.
H
However, thi
this should
h ld nott di
diminish
i i h our d
desire
i ffor elegant
l t solutions,
l ti which
hi h for (int i = 1; i <= 3; i++) {
convince by their clarity and effectiveness. Simple, elegant solutions are for (int j = 1; j <= 2; j++) {
more effective, but they are harder to find than complex ones, and they System.out.println("six");
require more time,
time which we too often believe to be unaffordable " }
-Niklaus Wirth }
Output:
six
six
six
six
Based on slides for Building Java Programs by Reges/Stepp, found at
six
http://faculty.washington.edu/stepp/book/
p y g pp
six

CS305j Introduction to Computing Nested For Loops 1 CS305j Introduction to Computing Nested For Loops 2

More nested for loops Nested for loop exercise

All
All of the statements in the outer loop's
loop s body are
Whatt iis th

Wh the output
t t off th
the ffollowing
ll i nested
t d
executed 5 times. for loop?
– The inner loop runs 10 times for each of those 5 times,
for a total of 50 numbers printed.
for (int i = 1; i <= 4; i++) {
for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) {
for (int j = 1; j <= 10; j++) { S
System.out.print("*");
i ("*")
System.out.print((i * j) + " "); }
} System.out.println();
S t
System.out.println();
t i tl () // to
t endd the
th }
line
}

Output?
Output?
Output:
1 2 3 4 5 6 7 8 9 10
Do you really need a nested
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
for loop in this case?
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
CS305j Introduction to Computing Nested For Loops 3 CS305j Introduction to Computing Nested For Loops 4
Nested for loop exercise Nested for loop exercise

What is the output of the following nested for


Whatt iis th

Wh the output
t t off th
the ffollowing
ll i nested
t d
loop? for loop?
for (int i = 1; i <= 6; i++) {
for (int j = 1; j <= i; j++) { for (int i = 1; i <= 6; i++) {
System.out.print("*"); for (int j = 1; j <= i; j++) {
} S
System.out.print(i);
i (i)
System.out.println(); }
} System.out.println();
}

Output:
*
**
***
Output?
Output?
****
*****
******

CS305j Introduction to Computing Nested For Loops 5 CS305j Introduction to Computing Nested For Loops 6

Nested for loop exercise Nested for loop exercise

Create a nested for


f loops produce the
A for loop can have more than one loop nested in itit.

What is the output of the following nested for loops?
following output. for (int i = 1; i <= 5; i++) {
f
for (i
(int
t j = 1
1; j <= (5 - i);
i) jj++)
) {
System.out.print(" ");
....1 }
...22 for (int k = 1; k <= i; k++) {
S t
System.out.print(i);
t i t(i)
..333 }
.4444 System.out.println();
55555 }

Answer:
1
22
333
4444
55555

CS305j Introduction to Computing Nested For Loops 7 CS305j Introduction to Computing Nested For Loops 8
Common nested loop bugs How to comment: for loops

It is a common bug to accidentally type the wrong loop


Place a comment on complex loops explaining what they do from a
counter variable, which can lead to incorrect behavior. conceptual standpoint, not the mechanics of the syntax.
– What is the output of the following nested loops? – Bad:
for (int i = 1 1; i < <= 1010; i++) { // This loop repeats 10 times
times, with i from 1 to 10
10.
for (int j = 1; i <= 5; j++) { for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 5; j++) { // loop goes 5 times
System.out.print(j); System.out.print(j); // print the j
} }
System.out.println(); System.out.println();
} }
– Better:
– Wh
Whatt iis th
the output
t t off th
the ffollowing
ll i nested
t d lloops?
? // Prints 12345 ten times on ten separate lines.
for (int i = 1; i <= 10; i++) { for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 5; i++) { for (int j = 1; j <= 5; j++) {
System out print(j);
System.out.print(j); System.out.print(j);
}
} System.out.println(); // end the line of output
System.out.println(); }
}

CS305j Introduction to Computing Nested For Loops 9 CS305j Introduction to Computing Nested For Loops 10

Variable scope

scope:
scope: The portion of a program where a given
variable exists.
– A variable's scope is from its declaration to the end of the
block (pair of { } braces) in which it was declared.
• If a variable is declared in a for loop (including the
<initialization> or the loop's <statement(s)>, it exists until the
Variable Scope end of that for loop.
• If a variable is declared in a method, it exists only in that method,
until the end of the method.

public static void main(String[] args) {


int x = 3;
for (int i = 1; i <= 10; i++) {
System.out.print(x);
}
// i no longer exists here
} // x ceases to exist here
CS305j Introduction to Computing Nested For Loops 11 CS305j Introduction to Computing Nested For Loops 12
Scope and using variables Overlapping scope

It is a syntax error to try to use a variable outside of its


It is syntactically legal to declare variables with the same
scope. name, as long as their scopes do not overlap:
public static void main(String[] args) {
public static void main(String[]
p ( g[] args)
g ) { int x = 2;
example();
System.out.println(x); // syntax error for (int i = 1; i <= 5; i++) {
int y = 5;
System.out.println(y);
for (int i = 1; i <
<= 10; i++) { }
int y = 5; for (int i = 3; i <= 5; i++) {
System.out.println(y); int y = 2;
int x = 4; // illegal
} System.out.println(y);
System.out.println(y); // syntax error }
} }
public static void anotherMethod() {
public static void example() { int i = 6
6;
int x = 3; int y = 3;
System.out.println(x); System.out.println(i + ", " + y);
}
}

CS305j Introduction to Computing Nested For Loops 13 CS305j Introduction to Computing Nested For Loops 14

Problem: redundant values Global constants

Often in our programs we will have certain values


global (class) constant: A special kind of variable that can
(sometimes called magic numbers) that are used throughout be seen throughout the program.
the program:
– The value of a constant can only be set once.
public static void main(String[]
p ( g[] args)
g ) {
printTop(); It can not be changed while
hile the program is rrunning.
nning
printBottom();
}
public static void p
p printTop()
p() {
Global constant syntax:
for (int i = 1; i <= 3; i++) { public static final <type> <name> = <value> ;
for (int j = 1; j <= i; j++) {
System.out.print(j);
} – Constants' names are usually written in ALL_UPPER_CASE.
System out println();
System.out.println();
}
} – Examples:
public static void printBottom() { public static final int DAYS_IN_WEEK = 7;
for (int i = 3; i >=
> 1; i--)
i ) { public static final double INTEREST
INTEREST_RATE
RATE = 3
3.5;
5;
for (int j = i; j >= 1; j--) {
System.out.print(3); public static final int SSN = 658234569;
}
System.out.println();
}
}
CS305j Introduction to Computing Nested For Loops 15 CS305j Introduction to Computing Nested For Loops 16
Global constant example Another example: figure

Making
g the 3 a g
global constant removes the redundancy:
y
– the global constant is declared outside methods, but inside the program,
Consider the task of drawing the following figure:
public class PrintFigure{ +/\/\/\/\/\+
public static final int MAX_VALUE = 3; | |
public static void main(String[] args) { +/\/\/\/\/\+
printTop();
printBottom();
} +/\/\/\/\/\+
public static void printTop() { | |
for (int i = 1; i <= MAX_VALUE; i++) {
for (int j = 1; j <= i; j++) { | |
System.out.print(j); | |
}
System.out.println(); | |
} | |
}
+/\/\/\/\/\+
public static void printBottom() {
for (int i = MAX_VALUE; i >= 1; i--) {
for (int j = i; j >= 1; j--) {

}
System.out.print(MAX_VALUE);
Each figure is strongly tied to the number 5 (or a
}
System.out.println();
multiple such as 10 ...)
}
}

S code

See d ffor drawing
d i ththese fi
figures.
CS305j Introduction to Computing Nested For Loops 17 CS305j Introduction to Computing Nested For Loops 18

Some repetitive code A failed attempt to fix it

Note the repetition of numbers based on 5 in the code:


A
A normal variable cannot be used to fix the
public static void drawFigure1() {
drawPlusLine(); problem, because it is out of scope:
drawBarLine();
drawPlusLine(); public static void main(String[]
p ( g[] args)
g ) {
}
int width = 5;
public static void drawPlusLine() { drawFigure1();
System.out.print("+"); Output: }
for (int i = 1; i <= 5; i++) {
System.out.print("/\\");
/\\
} +/\/\/\/\/\+ public static void drawFigure1() {
System.out.println("+"); drawPlusLine();
} | |
+/\/\/\/\/\+ drawBarLine();
public static void drawBarLine() { drawPlusLine();
System.out.print("|"); }
for (int i = 1; i <= 10; i++) {
System.out.print(" ");
} public static void drawPlusLine() {
System.out.println("|");
i System.out.print("+");
i
} for (int i = 1; i <= width; i++) { // ERROR
– It would be cumbersome to resize the figure such as by changing all System.out.print("/\\");
}
the 5s into 8s
8s. System.out.println("+");
CS305j Introduction to Computing Nested For Loops
}
CS305j Introduction to Computing Nested For Loops
19 20
Fixing our code with constant

A global constant will fix the "magic


magic number"
number problem:
public static final int FIGURE_WIDTH = 5;

public static void main(String[] args) {


drawFigure1();
}

public static void drawFigure1() {


drawPlusLine();

System.out.print("|");
S t t i t("|")
for (int i = 1; i <= 2 * FIGURE_WIDTH; i++) {
System.out.print(" ");
}
System.out.println("|");

drawPlusLine();
}
CS305j Introduction to Computing Nested For Loops 21

You might also like