540 likes | 694 Views
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. The while Statement.
E N D
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
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)
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
Example:averaging Iteration Control • 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 Initialize Check condition Update
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • Read in numbers, add them, and • return their average • 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
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • 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
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • 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
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)
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • 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 Same as: count = count + 1; Decrement: count--; (Savitch, p 30-33)
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • 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 Other contracted forms: +=, -=, etc we could write: sum += console.nextInt();
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • 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 The whole block to be repeated is marked by braces { … } unless it is a single statement.
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } • 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 Don’t forget a cast is required to obtain a float division and result. What would happen without it?
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(); sum = sum + newInt; count ++; } return sum/(float)count; } }
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(); sum = sum + newInt; count ++; } return sum/(float)count; } }
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(); sum = sum + newInt; count ++; } return sum/(float)count; } }
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(); sum = sum + newInt; count ++; } return sum/(float)count; } }
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(); sum = sum + newInt; count ++; } return sum/(float)count; } }
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(); sum = sum + newInt; count ++; } return sum/(float)count; } }
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(); sum = sum + newInt; count ++; } return sum/(float)count; } } The loop now terminates as the condition is false and the next statement after the loop is executed (here: return).
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.”);
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.”); }
Common Mistakes in whileextra 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
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!
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 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; }
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 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; } Initialize
Example:averaging Test • 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 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
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 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 Update is performed after the body
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; }
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; } Initialize Initialize
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; } Test Test
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; } Update Update
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)
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; }
do-while • There is a variant of the while statement, the do-while statement • 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. do { int newInt = console.nextInt(); sum = sum + newInt; count ++; } while (count < max)
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.
Example reciprocal 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!"); } • 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 • } • }
Example reciprocal 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!"); } “while (True)” infinite loop • 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 • } • }
Infinite Loops while ( true ) { ...etc...etc...etc... } Use an: if ( condition ) { break; } statement to break the loop for ( ; true ; ) { ...etc...etc...etc... } for ( ; ; ) { ...etc...etc...etc... }
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, " " : 2 2 2 3 • " " 14, " " : 2 7 • " " 23, " " : 23 (23 is prime)
Algorithm input n set factor to 2
Algorithm (cont) input n set factor to 2 while(some factor yet to try) { }
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 } }
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 } }
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++; } }
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()
Example: CountConsonantsAndVowels • Count the number of consonants and the number of vowels in a file • Non-alphabetic characters should notbe counted
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
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 public void stringCount() { String s = console.nextLine(); int vowels=0; int consonants=0; 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 System.out.println(s+" has”+ vowels+" Vowels and "+ consonants+" Consonants."); } Note the use of the service functions in the Character class. Try to find these in the API definition on the web!
Iterating over a String (While) • Re-write the stringCount Method with a while loop instead of a for loop
Nested Loops • Loops can be placed inside other loops • The break statement applies to the innermost enclosing while or for statement