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 varia ble so tha t it will no t con flic t w ith the ou ter loop. 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. However, this s hou ld no t dim in is h our des ire for e legan t so lu tions, w hic 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 , which we too often believe to be unaffordable " } -Niklaus Wirth }
Output: six six six six six Based on slides for Building Java Programs by Reges/Stepp, found at six httppyg://faculty.washington.edu/ste pp/book/
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 of the statements in the outer loop' s body are Wha t is the ou tpu t o f the foll owi ng nes ted 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++) { System.out.pr int ("*"); System.out.print((i * j) + " "); } } System.out.println(); Sys tem.ou t.pr in tln() ; // t o end th e } line } 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 Wha t is the ou tpu t o f the foll owi ng nes ted 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++) { } Si(i)System.out.print(i); System.out.println(); } } System.out.println(); } 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 loops produce the A for loop can have more than one loop nested in it. What is the output of the following nested for loops? following output. for (int i = 1; i <= 5; i++) { for (itj(int j = 1; j <= (5 - i)j){i); j++) { System.out.print(" "); ....1 } ...22 for (int k = 1; k <= i; k++) { Sys tem.ou t.pr in 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; i <= 10; i++) { // This loop repeats 10 times, with i from 1 to 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: – WhtiWhat is the ou tpu t o fthf the fo llow ing nes te dld loops ? // 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.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: 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
public static void main(String[] args) { int x = 3; for(inti=1;i<=10;i++){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 (Strin g[] ar gs ) { intx=2;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; 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 the program: be seen throughout the program. – The value of a constant can only be set once. public static void main (Strin g[] ar gs ) { printTop(); It can not be changed w hile the program is ru nning. printBottom(); } public static void printTo p() { Global constant syntax: for (int i = 1; i <= 3; i++) { public static final
Some repetitive code A failed attempt to fix it Note the repetition of numbers based on 5 in the code: 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 (Strin g[] ar gs ) { } 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("|"); System.out.print("+"); } 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. System.out.println("+"); } CS305j Introduction to Computing Nested For Loops 19 CS305j Introduction to Computing Nested For Loops 20 Fixing our code with constant A global constant will fix the "magic number" problem: public static final int FIGURE_WIDTH = 5;
public static void main(String[] args) { drawFigure1(); }
public static void drawFigure1() { drawPlusLine();
Sys tem.ou t.pr in 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