1 / 42

Loops: Handling Infinite Processes

Loops: Handling Infinite Processes. CS 21a: Introduction to Computing I First Semester, 2013-2014. What’s a Loop?. A way to express a constant number of repetitions A way to express an arbitrary number of repetitions, usually based on some input value or condition. Loops.

isi
Download Presentation

Loops: Handling Infinite Processes

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Loops: Handling Infinite Processes CS 21a: Introduction to Computing I First Semester, 2013-2014

  2. What’s a Loop? • A way to express a constant number of repetitions • A way to express an arbitrary number of repetitions, usually based on some input value or condition

  3. Loops • Java structures for loops: • for statement • while statement • do-while statement

  4. Example: Compound Interest publicclassBankAccount { ... publicvoidyearlyInterest() { double interest = balance*intRate/100; balance += interest; years++; println( "Interest:" + interest + ", balance is now" + balance ); } ... }

  5. Repeatedly Applying Interest • Suppose you want to apply interest on the balance for three years publicvoidapplyThreeYearInterest( ) { double interest; interest = balance*intRate/100; balance += interest; years++; println( "Year 1 - interest:" + interest + ", balance:" + balance ); interest = balance*intRate/100; balance += interest; years++; println( "Year 2 - interest:" + interest + ", balance:" + balance ); interest = balance*intRate/100; balance += interest; years++; println( "Year 3 - interest:" + interest + ", balance:" + balance ); }

  6. Repeated Execution • We want a way to indicate that the following should be executed three times: interest = balance*intRate/100; balance += interest; years++; println( "Yearly-interest:" + interest + ", balance:" + balance ); • Better still, we want the following executed where takes the value 1, 2, 3: interest = balance*intRate/100; balance += interest; years++; print( "Year " + i + "- interest: " + interest ); println( ", balance:" + balance );

  7. The Power of Loops • Allow an arbitrarily long process to be described with a short algorithm

  8. The for Statement • Syntax for ( expr1; expr2; expr3 ) statement • Notes • expr1: initialization or setup (e.g., i = 1) • expr2: condition (e.g., i <= 3) • expr3: increment (e.g., i++) • statement means any valid statement in Java (including blocks)

  9. Applying Yearly Interest 3 Times publicvoidapplyThreeYearInterest( ) { double interest; inti; for( i = 1; i <= 3; i++) { interest = balance*intRate/100; balance += interest; print( "Year " + i + "- interest: " + interest ); println( ", balance:" + balance ); years++; } }

  10. First Use of Loops • Express a repetitive process, where the number of repetitions is constant. • Problem can still be solved without loops, but coding is too tedious without it. • Becomes more useful as the constant grows larger.

  11. Applying Yearly Interest An Arbitrary Number of Times publicvoidapplyYearlyInterest( intnumYears ) { double interest; inti; for( i = 1; i <= numYears; i++) { interest = balance*intRate/100; balance += interest; print( "Year " + i + "- interest: " + interest ); println( ", balance:" + balance ); years++; } }

  12. Second (More Important) Use of Loops • Express a repetitive process whose length is based on some condition. Two possibilities… • Bounded iteration: Simply repeat times, where is given • Conditional iteration: The number of repetitions is not known in advance, but the length will always depend on some condition

  13. Practice Programming Problem • Write a procedure/function that computes given a non-negative integer . Try not to cheat from the next slides! and • Bored? Try an alternate implementation based on this definition:

  14. The while Statement Setup Condition Loop Body Increment /go to next step • Syntaxwhile ( condition ) statement public int factorial( int n ) { int result = 1; int i = 1; while ( i <= n ) { result = result * i; i = i + 1; } return result; }

  15. The do-while Statement Setup Loop Body Increment /go to next step Condition • Syntaxdo statementwhile ( condition ); public int factorial( int n ) { int result = 1; int i = 1; do { result = result * i; i = i + 1; } while ( i <= n ); return result; }

  16. Components of a Loop • Setup/Initialization • Terminating/Continuing condition • Incrementing step • not necessarily an increment, but something that moves the program further on – i.e., to a state possibly closer to a terminating condition • e.g., decrementing, dividing, multiplitying, getting another input, etc. • Loop body

  17. Using a for Loop for Factorial Setup Condition Loop Body Increment /go to next step publicintfactorial( intn ) { intresult = 1; inti; for ( i = 1; i <= n; i++ ) { result = result * i; } return result; }

  18. for Loop (version 2) • You can declare the "counter" variable inside thefor • scope is within the loop's block • good when i is not used outside the loop publicintfactorial( intn ) { intresult; result = 1; for ( int i = 1; i <= n; i++ ) { result = result * i; } return result; }

  19. for Loop (version 3) • You can have multiple statements in the "setup" part of for • separated by commas • need to declare the variables before the for, since we can't have declarations here • also works for the increment part publicintresult( intn ) { inti, result; for ( result = 1, i = 1; i <= n; i++ ) { result = result * i; } return result; } • NOT RECOMMENDED! • generally bad style to put several statements on one line • if possible, choose a single counter variable, and just use that

  20. for Loop (version 3b) Shorthand for: result = result * i; publicintfactorial( intn ) { inti, result; for ( result = 1, i = 1; i <= n; result *= i, i++ ) { } return result; } • This is legal, but BAD! • cryptic • The for loop has no body!

  21. for Loop (version 3w) • ("w" for worse!) • even more cryptic • Some C programmers actually like writing like this! • DON'T! publicintfactorial( intn ) { inti, result; for ( result = 1, i = 1; i <= n; result *= i++ ) { } return result; }

  22. publicintfactorial( intn ) { intresult; result = 1; for ( int i = 1;i <= n;i++ ) { result = result * i; } return result; } publicintfactorial( intn ) { intresult; result = 1; { int i = 1; while ( i <= n ) { result = result * i; i++; } } return result; } for and while are equivalent! Setup Condition Increment Braces here are shown because in Java (not in C), scope of variables declared in setup of for is limited

  23. Deciding which Statement to Use • Using a for statement • most appropriate when the number of iterations is easily known (e.g., factorial) • Difference between while and do-while • loop condition is performed at the top (while) or at the bottom (do-while) of the loop • In do-while, body is executed at least once • in while, we check first before executing

  24. Practice Programming Problem • Write a program that reads numbers from console input and prints them out, one on each line, until a zero is encountered (don’t print out the zero). Identify the setup, condition, and increment. Is this a bounded or a conditional iteration? • Sample Input Sample Output 1 2 3 1 4 5 2 0 3 4 5

  25. Practice Programming Problem • Write a program that reads a positive integer and prints out all the positive integers, separated by spaces, up to an including . Is this a bounded or a conditional iteration? • Sample Input 16 • Sample Output 2 4 6 8 10 12 14 16

  26. What’s Wrong with This Code // assume grandmasFavoriteNumber is a positive integer for(int i = 0; i != grandmasFavoriteNumber; i++) ; println("It took " + i + " iterations to guess grandma's fave number."); // What’s a better way to write this?

  27. What’s Wrong with This Code? intyears = 0; while ( years < 20 ) { double interest = balance * rate / 100; balance = balance + interest; }

  28. What’s Wrong with This Code? intyears = 20; while ( years > 0 ) { years++; double interest = balance * rate / 100; balance = balance + interest; }

  29. What’s Wrong with This Code? float count = 0.0f; while ( count != 1.0f ) { count = count + 0.3333333f; } // How would you fix it?

  30. What’s Wrong with This Code? voidderpNTimes(int n) { for(int i = 1; i < n; i++) println("derp"); }

  31. What’s Wrong with This Code? voidderpNTimes(int n) { for(int i = 0; i <= n; i++) println("derp"); }

  32. Avoiding Pitfalls • Infinite Loop • loop body or increment statement should contain a statement that eventually leads to termination • Real Numbers • Avoid using == or != when using real numbers • Use <= or >= depending on direction of loop

  33. Avoiding Pitfalls • OBOE (Off-By-One-Error) aka "Fencepost error" • To execute the loop body N times … • if counter starts at 0, check for counter < N • if counter starts at 1, check for counter <= N • Remember that after the loop, the counter (if still in scope) will be beyond the limit of your condition • if we started from 0, counter would be N, • if we started from 1, counter would be N+1

  34. Nested Loops • It is possible to have a loop within a loop • Example (What gets printed out?) for ( inti = 0; i < 5; i++ ) { println( i ); for ( intj = 0; j < 5; j++ ) { print(" " + j ); } println(); }

  35. Nested Loops • The condition can vary depending on the outer loop • Example (What gets printed out?) for ( inti = 0; i < 5; i++ ) { println( i ); for ( intj = 0; j < i; j++ ) { print( " " + j ); } println( ); }

  36. Practice Programming Problem • Print out all 16 pairs of numbers from the set • What if the numbers have to be distinct? • What if the the order does not matter (i.e., the pair 1,2 is the same as the pair 2,1)

  37. How to Avoid Confusion with Nested Loops • Focus on one loop at a time. • Abstract away the inner loop.

  38. Printing a Shape • Create a triangle pattern * ** *** • Loop through rows for ( inti = 1; i <= n; i++ ) { // make triangle row }

  39. Printing a Shape (continued) • The following loop creates a row of i stars for ( intj = 1; j <= i; j++ ) r = r + "*"; r = r + "\n"; • Put loops together → Nested loops String r = "" ; for ( inti = 1; i <= n; i++ ) { // make triangle row }

  40. Triangle Class publicclass Triangle { privateintwidth; public Triangle( intaWidth ) { width = aWidth; } public String toString() { String r = ""; for ( inti = 1; i <= width; i++ ) { for ( intj = 1; j <= i; j++ ) r = r + "*"; r = r + "\n"; } return r; } }

  41. TriangleRunner Class publicclassTriangleRunner { publicstaticvoid main(String[] args) { Triangle small = new Triangle(3); System.out.println(small.toString()); Triangle large = new Triangle(15); System.out.println(large); } } By the way, the built-in print methods calls the toString method automatically

  42. Practice Programming Problem • Create classes to print these shapes: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

More Related