Lecture Slides on While Loops - Introduction to Computing Using Java | CS 1110, Study notes of Computer Science

Material Type: Notes; Professor: Gries; Class: Introduction to Computing Using Java; Subject: Computer Science; University: Cornell University; Term: Spring 2009;

Typology: Study notes

Pre 2010

Uploaded on 08/30/2009

koofers-user-x01
koofers-user-x01 🇺🇸

10 documents

1 / 2

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
1!
1!
CS1110 10 March 2009!
While loops"
Reading: today: Ch. 7 and ProgramLive sections.!
For next time: Ch. 8.1-8.3!
Prelim in two days: Th 7:30-9pm Uris Aud. (G01)!
A5 due in one day: Wed 11:59pm !
Two handouts for today; keep them both out.!
2!
Beyond ranges of integers: the while loop!
while (<condition>) {!
sequence of declarations!
and statements!
}!
<condition>: a boolean expression.!
<repetend>: sequence of statements.!
In comparison to for-loops: we get a broader notion of “there’s still
stuff to do” (not tied to integer ranges), but we must ensure that
“condition” stops holding (since there’s no explicit increment).!
condition!repetend!
false!
true!
3!
Canonical while loops!
// simulate for (int k= b; k <= c; k= k+1) !
int k= b;!
while (k <= c) {!
Process k;!
k= k+1;!
}!
// process a sequence of input not of fixed size!
<initialization>;!
while (<still input left>) {!
Process next piece of input;!
make ready for the next piece of input;!
}!
4!
Interesting while loops (why are the invariants missing?) !
// open q. in mathematics!
public static boolean collatz(int n) {!
"while (n != 1) {"
" "if (n%2 == 0) {"
" " "n= n/2;!
" "}"
" "else {"
" " "n= 3*n +1;!
" "}"
"}"
return true; "
}!
// Von Neumann’s “fair coin” from!
// unfair coin!
// heads/tails is true/false!
public static boolean fairFlip() {!
"while (true) {!
! !f1= new unfair flip;!
! !f2= new unfair flip;!
! ! if (f1 && !f2) {!
! ! !return true;!
! ! }!
" " if (!f1 && f2) {!
! ! !return false;!
! ! }!
!}!
}!
5!
A weighted die - extremely useful for scientific simulations!
double r= Math.random() draws r uniformly at random from [0,1). !
Problem: use this to produce an int in 0..n-1 given (non-zero, correct) probs
Pr(i) for i in 0..n-1.!
Idea: the Pr(i) divide [0,1) into segments proportional to Pr(i).!
So, loop through the segments to find the one containing r.!
6!
// Set c to the number of ‘e’s in String s.!
int n= s.length();! ! !!
c= 0; k= 0; !!!! !
// inv: c = #. of ‘e’s in s[0..k-1] !!
while (k < n) { !!
if (s.charAt(k) == ‘e’) ! ! !!
! c= c + 1; ! ! !!
k= k+ 1; !!!!!
}!!
// c = number of ‘e’s in s[0..n-1]!
The while loop: 4 loopy questions. Allows us to focus on one
thing at a time and thus separate our concerns.!
1. How does it start? (what is
the initialization?)!
2. When does it stop? (From
the invariant and the falsity of
loop condition, deduce that
result holds.) !
3. (How) does it make
progress toward termination?!
4. How does repetend keep
invariant true?!
pf2

Partial preview of the text

Download Lecture Slides on While Loops - Introduction to Computing Using Java | CS 1110 and more Study notes Computer Science in PDF only on Docsity!

1

CS1110 10 March 2009

While loops

Reading: today: Ch. 7 and ProgramLive sections.

For next time: Ch. 8.1-8.

Prelim in two days: Th 7:30-9pm Uris Aud. (G01)

A5 due in one day: Wed 11:59pm

Two handouts for today; keep them both out.

2

Beyond ranges of integers: the while loop

while (< condition >) { sequence of declarations and statements } < condition >: a boolean expression. < repetend >: sequence of statements.

In comparison to for-loops: we get a broader notion of “there’s still

stuff to do” (not tied to integer ranges), but we must ensure that

“condition” stops holding (since there’s no explicit increment).

condition repetend false true 3 Canonical while loops // simulate for ( int k= b; k <= c; k= k+1) int k= b; while (k <= c) { Process k; k= k+1; } // process a sequence of input not of fixed size ; while () { Process next piece of input; make ready for the next piece of input; } 4 Interesting while loops (why are the invariants missing?) // open q. in mathematics public static boolean collatz(int n) { while (n != 1) { if ( n%2 == 0 ) { n= n/2; } else { n= 3*n +1; } } return true; } // Von Neumann’s “fair coin” from // unfair coin // heads/tails is true/false public static boolean fairFlip() { while (true) { f1= new unfair flip; f2= new unfair flip; if (f1 && !f2) { return true; } if (!f1 && f2) { return false; } } } 5 A weighted die - extremely useful for scientific simulations double r= Math.random() draws r uniformly at random from [0,1). Problem Pr(i) for i in 0..n-1.: use this to produce an int in 0..n-1 given (non-zero, correct) probs Idea : the Pr(i) divide [0,1) into segments proportional to Pr(i). So, loop through the segments to find the one containing r. 6 // Set c to the number of ‘e’s in String s. int n= s.length(); c= 0; k= 0; // inv: c = #. of ‘e’s in s[0..k-1] while (k < n) { if (s.charAt(k) == ‘e’) c= c + 1; k= k+ 1; } // c = number of ‘e’s in s[0..n-1]

The while loop: 4 loopy questions. Allows us to focus on one

thing at a time and thus separate our concerns.

  1. How does it start? (what is the initialization?)
    1. When does it stop? (From the invariant and the falsity of loop condition, deduce that result holds.)
    2. (How) does it make progress toward termination?
    3. How does repetend keep invariant true?

7 We add the postcondition and also show where the invariant must be true: initialization; // invariant: P while ( B ) { // { P and B} repetend // { P } } // { P and !B } // { Result R }

Suppose we are thinking of The four loopy questions

this while loop: initialization; while ( B ) { repetend } Second box helps us develop four loopy questions for developing or understanding a loop:

1. How does loop start? Initialization must truthify inv P. 2. When does loop stop? At end, P and !B are true, and these must imply R. Find !B that satisfies P && !B => R. 3. Make progress toward termination? Put something in repetend to ensure this. 4. How to keep invariant true? Put something in repetend to ensure this. 8

Understanding assertions about lists

This is an assertion about v and k. It is true because chars of v[0..3] are greater than ‘C’ and chars of v[6..8] are ‘Z’s.

v X Y Z X A C Z Z Z This is a list of Characters v ≥ C? all Z’s k 6 0 3 k 8 v ≥ C? all Z’s k 5 0 3 k 8 v ≥ C all Z’s k 6 0 k 8 v ≥ W A C all Z’s k 4 0 k 8

Indicate

whether

each of

these 3

assertions

is true or

false.

9 Appendix examples: Develop loop to store in x the sum of 1..100.

1. How should the loop start? Make range 1..k–1 empty: k= 1; x= 0;

We’ll keep this definition of x and k true: 

x = sum of 1..k–

2. When can loop stop? What condition lets us  know that x has desired result? When **k == 101

  1. How can repetend make progress toward termination? k= k+1;
  2. How do we keep def of x and k true? x= x + k;** Four loopy questions k= 1; x= 0; // invariant: x = sum of 1..(k–1) while ( k != 101) { x= x + k; k= k + 1; } // { x = sum of 1..100 } (^10)

Roach infestation

/** = number of weeks it takes roaches to fill the apartment --see p 244 of text/ public static int roaches() { double roachVol= .001; // Space one roach takes double aptVol= 20208; // Apartment volume double growthRate= 1.25; // Population growth rate per week int w= 0; // number of weeks int pop= 100; // roach population after w weeks // inv: pop = roach population after w weeks AND // before week w, volume of the roaches < aptVol while (aptVol > pop * roachVol ) { pop= ( int ) (pop * growthRate); w= w + 1; } return w; } 11 Iterative version of logarithmic algorithm to calculate bc (we’ve seen a recursive version before). /* set z to bc, given c ≥ 0 / int x= b; int y= c; int z= 1; // invariant: z * xy = bc and 0 ≤ y ≤ c while (y != 0) { if (y % 2 == 0) { x= x * x; y= y/2; } else { z= z * x; y= y – 1; } } // { z = b*c } 12

Calculate quotient and remainder when dividing x by y

x/y = q + r/y 21/4= 4 + 3/

Property: x = q * y + r and 0 ≤ r < y

/** Set q to quotient and r to remainder.

Note: x >= 0 and y > 0 */

int q= 0; int r= x;

// invariant: x = q * y + r and 0 ≤ r

while (r >= y) {

r= r – y;

q= q + 1;

// { x = q * y + r and 0 ≤ r < y }