64
Chapter 7 - Chapter 7 - Iteration Iteration

Chapter 7 - Iteration

  • Upload
    stormy

  • View
    39

  • Download
    0

Embed Size (px)

DESCRIPTION

Chapter 7 - Iteration. Chapter Goals. Program repitiation statements – or loops – with the for, while, and do-while statements Learn potential pitfalls of infinite loops and off by one errors Understand nested loops Process input. Chapter 7. Control statements - PowerPoint PPT Presentation

Citation preview

Chapter 7 - Chapter 7 - IterationIteration

Chapter GoalsChapter Goals Program repitiation statements – or loops Program repitiation statements – or loops

– with the for, while, and do-while – with the for, while, and do-while statementsstatements

Learn potential pitfalls of infinite loops Learn potential pitfalls of infinite loops and off by one errorsand off by one errors

Understand nested loopsUnderstand nested loops

Process inputProcess input

Chapter 7Chapter 7

Control statementsControl statements Already learned about selection Already learned about selection

statementsstatements Now learn about Now learn about repetition repetition

statements, statements, oror loop statements loop statements Repetition statementsRepetition statements – repeat a – repeat a

block of code for a fixed number of block of code for a fixed number of times, or until some condition is mettimes, or until some condition is met

3 types: 3 types: whilewhile, , do-whiledo-while, and , and forfor

While statementWhile statement

WhileWhile statements/loops, repeat a body statements/loops, repeat a body of code until some condition is metof code until some condition is met

This is helpful for certain problems This is helpful for certain problems such as:such as: Feed cat until it is fullFeed cat until it is full Drink beer until pitcher is doneDrink beer until pitcher is done Get user input until they hit the Esc keyGet user input until they hit the Esc key Play a game until someone winsPlay a game until someone wins

While statementWhile statementSyntax:Syntax:

while ( <boolean expression> )while ( <boolean expression> )<statement> <statement> //AKA //AKA loop bodyloop body

Similar to Similar to if statementsif statements – if the – if the <statement> block is a <statement> block is a singlesingle statement, curly braces are not indeedstatement, curly braces are not indeed

Normally, it is a block statementNormally, it is a block statement Keeps executing the <statement> Keeps executing the <statement>

block as long as block as long as <boolean expression><boolean expression> is is truetrue

ExampleExample

Add integers 1 through 100 (1+2+…Add integers 1 through 100 (1+2+…+100)+100)

int sum = 0, number = 1;int sum = 0, number = 1; //Important to //Important to //// intializeintialize

while ( number <= 100 ){while ( number <= 100 ){ //boolean //boolean expressionexpression

sum = sum + number;sum = sum + number;

number++;number++; // what does this do?// what does this do?

}}

ifif Flow Diagram Flow Diagram

condition

bodyfalse

true

while while Flow DiagramFlow Diagram

condition

bodyfalse

true

ExampleExampleint bottlesOfBeer = 99int bottlesOfBeer = 99

while (bottlesOfBeer > 0){while (bottlesOfBeer > 0){

System.out.println(bottlesOfBeer+” on the wall”);System.out.println(bottlesOfBeer+” on the wall”);

System.out.println(bottlesOfBeer+” on the wall”);System.out.println(bottlesOfBeer+” on the wall”);

bottlesOfBeer--;bottlesOfBeer--;

System.out.println(“Take one down, pass it around);System.out.println(“Take one down, pass it around);

System.out.println(bottlesOfBeer+” on the wall”);System.out.println(bottlesOfBeer+” on the wall”);

}}

Compound BalanceCompound Balance

Problem: Want to calculate how Problem: Want to calculate how many years my balance will take to many years my balance will take to appreciate to $20,000 given I start appreciate to $20,000 given I start $10,000 and have a 5% interest rate$10,000 and have a 5% interest rate

int years = 0;int years = 0;

Scanner in = new Scanner(System.in);Scanner in = new Scanner(System.in);

System.out.print (“Enter target balance: “);System.out.print (“Enter target balance: “);

int targetBalance = in.nextInt();int targetBalance = in.nextInt();

while (balance < targetBalance)while (balance < targetBalance)

{{year++;year++;double interest = balance * rate / 100;double interest = balance * rate / 100;balance = balance + interest;balance = balance + interest;

}}

System.out.println(“Your target will be achieved System.out.println(“Your target will be achieved in “+ years + “ years.”);in “+ years + “ years.”);

while (true){while (true){

<statement><statement>

}}

How long will this loop run?How long will this loop run?

Why would we want to do thisWhy would we want to do this

Can we stop it?Can we stop it?

Common Error 7.1Common Error 7.1 Most common mistake – loop is never Most common mistake – loop is never

terminatedterminated <boolean expression> is always true<boolean expression> is always true Infinite loop –Infinite loop – have to close program have to close program

(Ctrl+c)(Ctrl+c)int count = 1;int count = 1;

while (count != 10){while (count != 10){

count += 2;count += 2;

}}

int product = 0;int product = 0;

while (product < 500000){while (product < 500000){

product *= 5;product *= 5;

}}

Infinite loopInfinite loop

Common cause – not advancing variableCommon cause – not advancing variableint years = 0;int years = 0;while (years < 20){while (years < 20){

double interest = balance * rate / 100;double interest = balance * rate / 100;balance = balance + interest;balance = balance + interest;

}}

Common cause – increment vs. Common cause – increment vs. decrementdecrement

int years = 20;int years = 20;while (years > 0){while (years > 0){

years++;years++;double interest = balance * rate / 100;double interest = balance * rate / 100;balance = balance + interest;balance = balance + interest;

}}

OverflowOverflow

Value of a variable exceeds precisionValue of a variable exceeds precision

short s;short s;

while (s < 3000){while (s < 3000){

s++;s++;

}}

double count = 0;double count = 0;

while (count != 1.0){while (count != 1.0){

count = count + .333333333333333count = count + .333333333333333

}}

UnderflowUnderflow

Real numbers are not always stored Real numbers are not always stored exactly, sometimes an approximation exactly, sometimes an approximation is neededis needed

double count = 0;double count = 0;

while (count != 1.0){while (count != 1.0){

count = count + 1.0/3.0;count = count + 1.0/3.0;

}//May not work!}//May not work!

Off by oneOff by one Another common error is to be off by Another common error is to be off by

oneoneint count = 1;int count = 1;

while (count < 10){while (count < 10){

……

count++;count++;

}}

How many executions?How many executions?int count = 0;int count = 0;

while (count <= 10){while (count <= 10){

……

count++;count++;

}}

How many executions?How many executions?

Off by oneOff by one

Be careful when countingBe careful when counting

Analogous to logic problemsAnalogous to logic problems

If I place a post every ten feet, how If I place a post every ten feet, how many posts do I need for a 100 ft many posts do I need for a 100 ft fence?fence?

do-while statementdo-while statement

The second repetition statement: The second repetition statement: do-do-while loop/statementwhile loop/statement

whilewhile loops are use loops are use pretest pretest format, format, where we test the boolean where we test the boolean expression before executing anythingexpression before executing anything

do-whiledo-while is a is a posttestposttest loop – we test loop – we test the boolean after executing the loopthe boolean after executing the loop

SyntaxSyntax

dodo

<single statement><single statement>

whilewhile (( <boolean expression> <boolean expression> ))

OROR

dodo{{

<statements><statements>

}}whilewhile (( <boolean expression> <boolean expression> ))

Do-while vs whileDo-while vs while

What does this posttest vs. pretest What does this posttest vs. pretest meanmean

A while loop A while loop bodybody is not guaranteed to is not guaranteed to executeexecutewhile (false){…}while (false){…}

do-while body is guaranteed to execute do-while body is guaranteed to execute at leastat least once once

while while Flow DiagramFlow Diagram

condition

bodyfalse

true

dodo--while while Flow DiagramFlow Diagram

condition

body

true

false

ExampleExample

int sum = 0, number = 1;int sum = 0, number = 1;

do{do{

sum += number;sum += number;

number++;number++;

} while (sum <=1000000);} while (sum <=1000000);

//Sums all numbers 1 through 1,000,000//Sums all numbers 1 through 1,000,000

intint count = count = 1111;;

dodo {{System.out.println(count);System.out.println(count);count = count + 1;count = count + 1;

}} whilewhile ((count < 5count < 5););

InputInput

double value;double value;

dodo{{

System.out.println(“Enter a positive number: “);System.out.println(“Enter a positive number: “);value = in.nextInt();value = in.nextInt();

}}while (value <= 0);while (value <= 0);

While versionWhile version

Could use a flag – boolean control variableCould use a flag – boolean control variable

double value;double value;

boolean done = false;boolean done = false;

while (!done)while (!done)

{{

System.out.println(“Enter a positive number: “);System.out.println(“Enter a positive number: “);

value = in.nextInt();value = in.nextInt();

if(value > 0) done = true;if(value > 0) done = true;

}}

Avoid Repeat CodeAvoid Repeat Codecount = 0;count = 0;

do{do{

System.out.print(“Enter score: “);System.out.print(“Enter score: “);

score = in.nextInt();score = in.nextInt();

count++;count++;

if (if (count >= 20count >= 20){){

System.out.println(“Can’t take more scores”);System.out.println(“Can’t take more scores”);

} else if (} else if (score < 0score < 0){){

System.out.println(“Invalid score”);System.out.println(“Invalid score”);

} else if (} else if (score == 0score == 0){){

System.out.println(“User chooses to exit”);System.out.println(“User chooses to exit”);

}}

} while ( } while ( !(count >= 20 || score == 0 || score < 0 !(count >= 20 || score == 0 || score < 0 ))

count = 0;count = 0;

boolean repeat = true;boolean repeat = true;

do{do{

System.out.print(“Enter score: “);System.out.print(“Enter score: “);

score = in.nextInt();score = in.nextInt();

count++;count++;

if (if (count >= 20count >= 20){){

System.out.println(“Can’t take any more System.out.println(“Can’t take any more scores”);scores”);

repeat = false;repeat = false;

} else if (} else if (score < 0score < 0){){

System.out.println(“Invalid score”);System.out.println(“Invalid score”);

repeat = false;repeat = false;

} else if (} else if (score == 0score == 0){){

System.out.println(“User chooses to exit”);System.out.println(“User chooses to exit”);

repeat = false;repeat = false;

}}

} while ( } while ( repeatrepeat )//Easier to understand)//Easier to understand

7.2 for loop7.2 for loop

Most common loop, mainly for Most common loop, mainly for count-controlledcount-controlled loops loops

for(i = for(i = start; start; i <= i <= endend; i++); i++)

{{

......

}}

SyntaxSyntax

for (for (<initialization><initialization>; ; <boolean exp><boolean exp>; ; <update><update>))

<single statement><single statement>

OROR

for (for (<initialization><initialization>;<;<boolean expboolean exp>; >; <update><update>){){

<statements><statements>

}}

Initialization occurs Initialization occurs onlyonly the first time the loop the first time the loop is executed, is executed,

boolean expression is tested boolean expression is tested beforebefore everyevery loop loop The increment operator is applied at the The increment operator is applied at the end end

of each loopof each loop

forfor Flow DiagramFlow Diagram

test condition

body

true

false

increment

initialization

Sum problemSum problem

Saw it in Saw it in whilewhile and and do-while, do-while, here here it is in it is in forfor

intint i, sum = 0; i, sum = 0;

for (for (i = 1i = 1; ; i <=100i <=100; ; i++i++){){

sum += i; //equivalent to sum = sum + 1;sum += i; //equivalent to sum = sum + 1;

}}

i i is a is a control variablecontrol variable, keeps track , keeps track of number of repititionsof number of repititions

Interest ProblemInterest Problem

for(int i = 1;for(int i = 1; i <= n; i++)i <= n; i++)

{{

double interest = balance * rate/100;double interest = balance * rate/100;

balance = balance + interest;balance = balance + interest;

}}

Sum problemSum problem

int i, sum = 0;int i, sum = 0;

for (for (i = 1i = 1; ; i <=100i <=100; ; i++i++){){

sum += i; //equivalent to sum = sum + 1;sum += i; //equivalent to sum = sum + 1;

}}

i is set to 1 the first time the loop is i is set to 1 the first time the loop is executedexecuted

Before executing each time, check to Before executing each time, check to see that i<=100 (like in while loop)see that i<=100 (like in while loop)

Add 1 to i at the end of each cycleAdd 1 to i at the end of each cycle

InitializationInitialization

int int sum = 0;sum = 0;

for (for (int i = 1int i = 1; i <=100; i++){; i <=100; i++){

sum += i; //equivalent to sum = sum + 1;sum += i; //equivalent to sum = sum + 1;

}}

We can also declare We can also declare ii in the in the initialization, but initialization, but ii will be local to the will be local to the for loop and not available outsidefor loop and not available outside Usually not an issueUsually not an issue

Can also leave initialization blankCan also leave initialization blank

Boolean ExpressionBoolean Expression

int int sum = 0;sum = 0;

for (for (int i = 1; int i = 1; i <=100 && sum < 1111i <=100 && sum < 1111; i++){; i++){

sum += i; //equivalent to sum = sum + 1;sum += i; //equivalent to sum = sum + 1;

}}

Can test multiple Can test multiple conditionsconditions in in boolean expressionboolean expression Is this still count controlled?Is this still count controlled?

UpdateUpdate

int int sum = 0;sum = 0;

for (for (int i = 1; i <=100 && sum < 1111; int i = 1; i <=100 && sum < 1111; i += 2i += 2){){sum += i; //equivalent to sum = sum + 1;sum += i; //equivalent to sum = sum + 1;

}}

Can have any formula for Can have any formula for incrementingincrementing Add only odd integersAdd only odd integers Decrease by 1, i--Decrease by 1, i--

int sum = 0, number = 1;int sum = 0, number = 1;do{do{

sum += number;sum += number;number++;number++;

}while ( number <= 100)}while ( number <= 100)

int sum = 0, number = 1;int sum = 0, number = 1;while ( number <= 100 ){while ( number <= 100 ){

sum = sum + number;sum = sum + number;number++;number++;

}}

int i, sum = 0;int i, sum = 0;for (i = 1; i <=100; i++){for (i = 1; i <=100; i++){

sum += i; sum += i; }}

Legal for loopsLegal for loops

For loops can have many formats For loops can have many formats that are legalthat are legal

for(int i =0; i <= 100; sum += i++);for(int i =0; i <= 100; sum += i++);

for(;;i++){for(;;i++){

……

}}

for(System.out.println(“Inputs: “); (x = for(System.out.println(“Inputs: “); (x = in.nextDouble()) > 0; sum += x)in.nextDouble()) > 0; sum += x)

count++;count++;

ScopeScope

Is this legal?Is this legal?

for(int i = 0; i < 100; i++){for(int i = 0; i < 100; i++){

……

}}

System.out.println(i);System.out.println(i);

What if you want to know the value of What if you want to know the value of i after loop is donei after loop is done

Is this legal?Is this legal?

for(int i = 0; i <= 10; i++)for(int i = 0; i <= 10; i++)

System.out.println(i * i);System.out.println(i * i);

for(int i = 0; i <= 10; i++)for(int i = 0; i <= 10; i++)

System.out.println(i * i * i);System.out.println(i * i * i);

------------------------------------

for(int i = 0, j = 10; i <= 10; i++, j--)for(int i = 0, j = 10; i <= 10; i++, j--)

System.out.println(i * i * i);System.out.println(i * i * i);

7.4 Nested loops7.4 Nested loops

Recall from Recall from if-statementsif-statements, any type of , any type of statement can be placed in the blocks statement can be placed in the blocks or bodyor body

In In forfor loops, we can put an if loops, we can put an if statement, while loop, do-while loop, statement, while loop, do-while loop, etc. inside the bodyetc. inside the body

Very common to have another for loop Very common to have another for loop inside – a inside – a nested-for statementnested-for statement

Mult. TableMult. Table

for (int i = 0; i <= 10; i++){for (int i = 0; i <= 10; i++){

for (int j = 0; j <= 10; j++){for (int j = 0; j <= 10; j++){

result = i * j;result = i * j;

System.out.print(“ “ + result);System.out.print(“ “ + result);

}}

System.out.println(“”);System.out.println(“”);

}} What will this output?What will this output? What order will output in?What order will output in? How many times does each loop execute?How many times does each loop execute?

PracticePractice

Write a loop to output the following Write a loop to output the following patternpattern**

* ** *

* * ** * *

* * * ** * * *

……

n rowsn rows

PracticePractice

Do more code for the followingDo more code for the following

**

* ** *

* * ** * *

* ** *

**

Given h, where h=3 aboveGiven h, where h=3 above

PracticePractice

Given NGiven N

Calculate ½ + 2/3 + ¾ +…+N-1/NCalculate ½ + 2/3 + ¾ +…+N-1/N

7.4 Sentinel Values7.4 Sentinel Values

Add integers 1 through 100 (1+2+…Add integers 1 through 100 (1+2+…+100)+100)

int sum = 0, number = 1;int sum = 0, number = 1; //Important to //Important to //// intializeintialize

while ( number <= 100 ){while ( number <= 100 ){ //boolean expression//boolean expression

sum = sum + number;sum = sum + number;

number++;number++; // what does this do?// what does this do?

}}

Count controlled Count controlled – the body is executed – the body is executed a fixed number of timesa fixed number of times

Sentinel-controlled loopSentinel-controlled loop – – executed repeatedly until a executed repeatedly until a sentinelsentinel(designated value) is (designated value) is encounteredencountered

Sentinel valueSentinel value: Can be used for : Can be used for indicating the end of a data set indicating the end of a data set

0 or -1 make poor sentinels; better 0 or -1 make poor sentinels; better use a meaningful value (‘Q’ for quit)use a meaningful value (‘Q’ for quit)

System.out.print("Enter value, Q to quit: ");System.out.print("Enter value, Q to quit: ");String input = in.next();String input = in.next();

if (input.equalsIgnoreCase("Q"))if (input.equalsIgnoreCase("Q"))We are doneWe are done

else { else { double x = Double.parseDouble(input); double x = Double.parseDouble(input); . . . . . .

}}

How do we make this a loop?How do we make this a loop?

Loop and a halfLoop and a half

boolean done = false;boolean done = false;

while(!done){while(!done){

System.out.print("Enter value, Q to quit: ");System.out.print("Enter value, Q to quit: ");

String input = in.next();String input = in.next();

if (input.equalsIgnoreCase("Q")){if (input.equalsIgnoreCase("Q")){done = true;done = true;

} else { } else {

double x = Double.parseDouble(input); double x = Double.parseDouble(input);

. . . . . .

}}

}}

TipsTips

Symmetric vs. AsymmetricSymmetric vs. Asymmetricfor(int i = 1; i <= n; i++)for(int i = 1; i <= n; i++)

for(int i = 0; i < str.length(); i++)for(int i = 0; i < str.length(); i++)

Counting iterationsCounting iterationsfor(int i = a; i <= b; i++)for(int i = a; i <= b; i++)

How many executions?How many executions?

Alternatives to loop and Alternatives to loop and a halfa half

Can be confusing to readCan be confusing to read 2 alternatives: test input in 2 alternatives: test input in

condition, or use breakcondition, or use break

while(!(input = while(!(input = in.next()).equalsIgnoreCase(“Q”)){in.next()).equalsIgnoreCase(“Q”)){

Process dataProcess data

}}

breakbreak

boolean done = false;boolean done = false;while(!done){while(!done){

System.out.print("Enter value, Q to quit: ");System.out.print("Enter value, Q to quit: ");String input = in.next();String input = in.next();

if (input.equalsIgnoreCase("Q")){if (input.equalsIgnoreCase("Q")){break;break;

} else { } else { double x = Double.parseDouble(input); double x = Double.parseDouble(input); . . . . . .

}}}}

Code jumpsCode jumps

breakbreak – exits loop – exits loop Will immediately exit, just like for Will immediately exit, just like for

switchswitch

continuecontinue – will skip the rest of the – will skip the rest of the statements in the loop and start next statements in the loop and start next iteration of the loopiteration of the loop

Spaghetti CodeSpaghetti Code

Many programmers avoid using Many programmers avoid using these various jump statementsthese various jump statements break, continue, gotobreak, continue, goto

Can cause confusing code that often Can cause confusing code that often leads to harmful bugsleads to harmful bugs

Which to choose?Which to choose?

Count controlledCount controlled for loops usually bestfor loops usually best

Sentinel based loopsSentinel based loops while loops usually besetwhile loops usually beset

What about do-while?What about do-while? Priming reads, although can use a flag Priming reads, although can use a flag

instead withinstead with while while

7.5 Random Numbers7.5 Random Numbers

In a simulation, you repeatedly generate In a simulation, you repeatedly generate random numbers and use them to simulate random numbers and use them to simulate an activity an activity

Random number generatorRandom number generatorRandom generator = new Random();Random generator = new Random();int n = generator.nextInt(a); // 0 <= n < aint n = generator.nextInt(a); // 0 <= n < adouble x = generator.nextDouble(); // 0 <= x < 1double x = generator.nextDouble(); // 0 <= x < 1

Throw die (random number between 1 and Throw die (random number between 1 and 6)6)int d = 1 + generator.nextInt(6);int d = 1 + generator.nextInt(6);

SequenceSequence

If producing a random sequence, the If producing a random sequence, the sequence will be different every timesequence will be different every time

Note: Not truly random Note: Not truly random (psuedorandom)(psuedorandom) Formula used, but uses complicated Formula used, but uses complicated

factors to make it seem Randomfactors to make it seem Random

How do you use a random number How do you use a random number generator to simulate the toss of a generator to simulate the toss of a coin? coin?

How do we get a double between 0.0 How do we get a double between 0.0 and 5.0? 0.5 and 2.0?and 5.0? 0.5 and 2.0?

How do we choose a random How do we choose a random coordinate on a grid?coordinate on a grid?

Loop InvariantLoop Invariant Loop invariant – a condition that is Loop invariant – a condition that is

always true (beginning, after each always true (beginning, after each iteration, and at the end)iteration, and at the end)

Ex. Loop invariant: Ex. Loop invariant: r*br*bi i = a= ann

double r = 1, b = a;double r = 1, b = a;

int i = n;int i = n;

while(i > 0){while(i > 0){

if(i%2 == 0){if(i%2 == 0){

b = b*b;b = b*b;

i = i-2;i = i-2;

} else {} else {

r = r*b;r = r*b;

i--;i--;

}}

}}