Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
FIT1002 2006 Objectives By the end of this lecture, students should: • understand iteration statements • understand the differences of for and while • understand nested iteration • be able to write simple code with iterations Reading: Savitch, Sec. 3.3 1 FIT1002 2006 The while Statement Implements the repetition in an algorithm Repeatedly executes a block of statements Tests a condition (Boolean expression) at the start of each iteration Terminates when condition becomes false (zero) 2 FIT1002 2006 Example: averaging numbers Read in numbers, add them, and return their average max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count 3 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } Iteration Control Initialize Check condition Update return sum/count 4 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 5 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 6 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 7 FIT1002 2006 Aside: Keyboard Input Java 5 provides a convenient way for simple keyboard input, the Scanner class. • you must “import java.util.Scanner;” This makes the Scanner class known to your program. More about this later… • You create a new scanner object for a particular input stream (“channel”): Scanner console = new Scanner(System.in); • new values can then be read from the Scanner object using – – – – console.nextInt (Integer) console. nextFloat (Float) console. nextLine (String) etc (see Java API doc at Sun’s web site) 8 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; return sum/count } } Same as: count = count + 1; Decrement: count --; (Savitch, p 30-33) 9 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; return sum/count } } Other contracted forms: +=, -=, etc we could write: sum += console.nextInt(); 10 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } The whole block to be repeated is marked by braces { … } unless it is a single statement. 11 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max is number of numbers to read set sum to 0 set count to 0 Don’t forget a cast is required to obtain a while (count < max) float division and result. What would { happen without it? input nextNum console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; add nextNum to sum add 1 to count } return sum/count } } 12 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); max count newInt 2 0 ???? sum 0 public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 13 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max count newInt sum 2 0 ???? 0 2 0 3 0 console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 14 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max count newInt sum 2 0 ???? 0 2 0 3 0 2 0 3 3 console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 15 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); max count newInt sum 2 0 ???? 0 2 0 3 0 2 0 3 3 2 1 3 3 sum = sum + newInt; count ++; } return sum/(float)count; } } 16 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); max count newInt 2 1 3 sum 3 public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 17 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = max count newInt sum 2 1 3 3 2 1 6 3 console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } } 18 FIT1002 2006 Example: averaging import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); max count newInt 2 1 3 3 2 1 6 3 2 1 6 9 console.nextInt(); 2 2 6 9 sum = sum + newInt; count ++; 2 2 6 9 public float avg(int max) { int count=0; int sum=0; while (count < max) { int newInt = } return sum/(float)count; } } sum The loop now terminates as the condition is false and the next statement after the loop is executed (here: return). 19 FIT1002 2006 Common Mistakes in while – “one liners” while (num < minimum) num = console.nextInt(); System.out.println(“Number must be greater than “ + minimum); System.out.println(“Please try again.”); while (num < minimum) { num = console.nextInt(); } System.out.println(“Number must be greater than “ + minimum); System.out.println(“Please try again.”); 20 FIT1002 2006 Common Mistakes in while – “one liners” while (num < minimum) num = console.nextInt(); System.out.println(“Number must be greater than “ + minimum); System.out.println(“Please try again.”); while (num < minimum) { num = console.nextInt(); System.out.println(“Number must be greater than “ + minimum); System.out.println(“Please try again.”); } 21 FIT1002 2006 Common Mistakes in while extra semi-colon; while (num < minimum) ; { num = console.nextInt(); System.out.println(“Number must be greater than “ + minimum); System.out.println(“Please try again.”); } Marks the end of the while-block -- usual cause of infinite loops 22 FIT1002 2006 The for Statement Form of loop which allows for initialization and iteration control Syntax: for ( initialization; condition; update ) { instruction block Careful! A semi-colon } here marks the end of the instruction block! 23 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } public float averageWithFor(int max) { int count; int sum=0; for (count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } return sum/count 24 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average Initialize max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } public float averageWithFor(int max) { int count; int sum=0; for (count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } return sum/count 25 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count Test public float averageWithFor(int max) { int count; int sum=0; for (count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } Test is performed before the body 26 FIT1002 2006 Example: averaging Read in numbers, add them, and return their average Update max is number of numbers to read set sum to 0 set count to 0 while (count < max) { input nextNum add nextNum to sum add 1 to count } return sum/count public float averageWithFor(int max) { int count; int sum=0; for (count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } Update is performed after the body 27 FIT1002 2006 while and for import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); public float averageWhile(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } public float averageFor(int max) { int count; int sum=0; for ( count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } } 28 FIT1002 2006 while and for import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); Initialize public float averageWhile(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } Initialize public float averageFor(int max) { int count; int sum=0; for ( count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } } 29 FIT1002 2006 while and for import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); Test public float averageWhile(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } Test public float averageFor(int max) { int count; int sum=0; for ( count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } } 30 FIT1002 2006 while and for import java.util.Scanner; public class Test { Scanner console = new Scanner(System.in); Update public float averageWhile(int max) { int count=0; int sum=0; while (count < max) { int newInt = console.nextInt(); sum = sum + newInt; count ++; } return sum/(float)count; } Update public float averageFor(int max) { int count; int sum=0; for ( count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } } 31 FIT1002 2006 For / While Equivalence Every For loop can always be rewritten as a while loop …and vice versa For loops are typically preferred for any form of “counting” (I.e. where the number of iterations is known) 32 FIT1002 2006 Local Loop Variables You can declare a new counter variable locally for the loop body. Thjs is done in the for initalization (good style!) public float averageWithFor(int max) { int count; int sum=0; for (count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)count; } public float averageWithFor(int max) { int sum=0; for (int count=0; count < max; count++) { int newInt = console.nextInt(); sum = sum + newInt; } return sum/(float)max; } 33 FIT1002 2006 do-while There is a variant of the while statement, the do-while statement do { int newInt = console.nextInt(); sum = sum + newInt; count ++; } while (count < max) The only difference to the normal while is, when the test is executed while: before loop body do-while: after loop body A do-while body will always be executed at least once. 34 FIT1002 2006 The break / continue Statements Implements the "exit loop" primitive. Break causes flow of control to leave a loop block (while or for) immediately and continue after the loop. Continue ends only the current loop iteration and transfers the control back to the update expression (potentially entering the next iteration of the loop). Style In almost all cases using break and continue is in bad style. They should only be used to terminate a loop in abnormal situations. 35 FIT1002 2006 Example reciprocal Print out the reciprocals of numbers entered. Quit when 0 is entered loop { input nextNum if (nextNum is 0) { exit loop } else { output 1/nextNum } } public void reciprocal() { while (true) { float newFloat = console.nextFloat(); if (newFloat==0) break; else System.out.println( 1/newFloat); } System.out.println("You entered Zero!"); } 36 FIT1002 2006 Example reciprocal Print out the reciprocals of numbers entered. Quit when 0 is entered loop { input nextNum if (nextNum is 0) { exit loop } else { output 1/nextNum } } “while (True)” infinite loop public void reciprocal() { while (true) { float newFloat = console.nextFloat(); if (newFloat==0) break; else System.out.println( 1/newFloat); } System.out.println("You entered Zero!"); } 37 FIT1002 2006 Infinite Loops while ( true ) { ...etc...etc...etc... } for ( ; true ; ) { ...etc...etc...etc... } Use an: if ( condition ) { break; } statement to break the loop for ( ; ; ) { ...etc...etc...etc... } 38 FIT1002 2006 Example Factorization Write a program which prints out the prime factorization of a number (treat 2 as the first prime) For example, on input 6, desired output is: 2 3 " " 24, " " : 2223 " " 14, " " : 27 " " 23, " " : 23 (23 is prime) 39 FIT1002 2006 Algorithm input n set factor to 2 40 FIT1002 2006 Algorithm (cont) input n set factor to 2 while(some factor yet to try) { } 41 FIT1002 2006 Algorithm (cont) input n set factor to 2 while(some factor yet to try) { if (n is divisible by factor) { output factor set n to n / factor } } 42 FIT1002 2006 Algorithm (cont) input n set factor to 2 while(some factor yet to try) { if (n is divisible by factor) { output factor set n to n / factor } else { increment factor } } 43 FIT1002 2006 Example: factorize input n set factor to 2 while(some factor yet to try) { if (n is divisible by factor) { output factor set n to n / factor } else { increment factor } } public void factorize(int number) { int factor=2; while (number > 1) { if (number % factor == 0) { System.out.println(factor); number = number / factor; } else factor++; } } 44 FIT1002 2006 Iterating over a String (For) Many string algorithms require iteration over the characters in a string. The for loop is ideally suited to do this. The characters in a string can be accessed by position index using the charAt method. Indices run from 0 to length -1! char charAt(int index) The length of the string can be obtained with the length method int length() 45 FIT1002 2006 Example: CountConsonantsAndVowels Count the number of consonants and the number of vowels in a file Non-alphabetic characters should not be counted 46 FIT1002 2006 Algorithm: count consonants and vowels input String set consonantCount to 0 set vowelCount to 0 loop over all characters in the string { set ch as next character in string if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount } } output consonantCount, vowelCount 47 FIT1002 2006 input String set consonantCount to 0 set vowelCount to 0 public void stringCount() { String s = console.nextLine(); int vowels=0; int consonants=0; loop over all characters in the string { for (int i=0; i< s.length(); i++) { char c = s.charAt(i)); c = Character.toLowerCase( c ); if (Character.isLetter( c )) if (c=='a' || c=='e' || c=='i' || c =='o' || c=='u') vowels ++; else consonants++; }// for loop ends here set ch as next character in string if (ch is a vowel) { increment vowelCount } else if (ch is a consonant) { increment consonantCount } System.out.println(s+" has”+ vowels+" Vowels and "+ consonants+" Consonants."); } output consonantCount, vowelCount } Note the use of the service functions in the Character class. Try to find these in the API definition on the web! 48 FIT1002 2006 Iterating over a String (While) Re-write the stringCount Method with a while loop instead of a for loop 49 FIT1002 2006 Nested Loops Loops can be placed inside other loops The break statement applies to the innermost enclosing while or for statement 50 FIT1002 2006 Example: rectangle Print an m by n rectangle of asterisks input width and height for each row { for each column in the current row { print an asterisk } start next row } public void rectangle(int width, int height) { for (int row=1; row <= height; row++) { for (int column=1; column <= width; column++) System.out.print("*"); System.out.println(); } } 51 FIT1002 2006 Nested Loops: Loop Dependencies An inner loop can depend on an outer (enclosing) loop. How would you modify “rectangle” into a method to print a triangle? * ** Modify this to print a triangle of asterisks *** **** input width and height ***** for each row ****** { ******* for each column in the current row { ******** print an asterisk } ********* start next row ********** } 52 FIT1002 2006 Example: triangle Print an m row triangle of asterisks input height for each row { for each column in the current row { print as many asterisk as the number of the row } start next row } 53 FIT1002 2006 Example: triangle Print an m row triangle of asterisks input height for each row { for each column in the current row { print as many asterisk as the number of the row } start next row } public void triangle(int height) { for (int row=1; row <= height; row++) { for (int column=1; column <= row; column++) System.out.print("*"); System.out.println(); } } 54