Top Banner
Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * * * * * • Corresponding program: printf(“*\n”); printf(“*\n”); printf(“*\n”); printf(“*\n”); printf(“*\n”);
48

Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Dec 22, 2015

Download

Documents

Dinah Fisher
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Repetition (Loops)

• Want to do some repetitive sequence of actions:

• print vertical line of *s*

*

*

*

*

• Corresponding program:printf(“*\n”);

printf(“*\n”);

printf(“*\n”);

printf(“*\n”);

printf(“*\n”);

Page 2: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Outline

II. Program BasicsH. Statements

6. LoopsPretest: While

Posttest: Do-While

Pretest: For

Parts: termination condition, initialization, body

Pretest vs Posttest

Counter-controlled vs Event-controlled

Infinite Loops

Nested Loops

Page 3: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Repetitions with Loops

Done 5times?

Yes

printf

No

Page 4: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Types of Loops

• Pretest - a logical condition is checked before each repetition to determine if the loop should terminate– while loop– for loop

• Posttest - a logical condition is checked after each repetition for termination– do-while loop

Page 5: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

PreTest vs. PostTest Loops

Pretest Loop

Condition

Action orActions

true

false

Posttest Loop

Condition

Action orActions

true

false

Page 6: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Terminating Loops

• Counter-controlled loops - a loop controlled by a counter variable, generally where the number of times the loop will execute is known ahead of time

• Event-controlled loops - loops where termination depends on an event rather than executing a fixed number of times

Page 7: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Counter-Controlled Loops

• Generally with for loops

• Can generally infer number of repetitions from code

• Examples:– read 5 numbers– print 7 items– sort n items

Page 8: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Event-Controlled Loops

• Generally with while, do-while loops

• Can’t infer number of repetitions from program

• Examples:– read until input ends– read until a number encountered– search through data until item found

Page 9: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Parts of Loop

• Initialization - commands to set up loop (set counter to initial value, etc.)

• Terminating condition - logical condition that is checked to terminate loop

• Body of loop - commands repeated– action(s) - statements to repeat – update(s) - statements to update values

associated with loop (counters, etc.)

Page 10: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Parts of Loop Example

Init: set counter to 0

Termination: counter < 5

Body:

Action: print *

Update: add 1 to counter

counter = 0;

(counter < 5)

printf("*\n");counter++;

truefalse

Page 11: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Importance of Update

What if command

counter++;

left out?

Counter never becomes >= 5.

Termination Condition never met.

counter = 0;

(counter < 5)

printf("*\n");

truefalse

Page 12: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Infinite Loops

• Loop starts but termination condition never met:– you forget to increase counter– user never enters terminating data item– etc.

• Results– program may stop (doing nothing repeatedly)– computer may repeatedly print some data out

Page 13: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Termination Conditions in C

• Loops in C always continue when the termination condition is true and end when the condition is false

• Conditions can be rephrased if needed (positive termination conditions can be negated)

• Condition only checked at fixed points (does not have to hold true during body)

Page 14: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Pretest Loop: While

Syntax:while (condition)

statement;

Corresponds to:if (!condition) DONE

statement

if (!condition) DONE

statement

...

Condition

Statement

true

false

Page 15: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Example of While

int counter = 0;

while (counter < 5) {

printf(“*\n”);

counter++;

}

single statement is compound

counter < 5

printf("*\n");counter++;

true

false

counter = 0;

Page 16: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Executing More Than One Stmt

• In C, loops repeat one statement• Generally we always use a compound

statement as that statement:while (condition) {

/* body */

}

• Useful even when body has one or no statements

Page 17: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Empty Statements and Loops

• What’s wrong with this?counter = 0;while (counter < 5);{ printf(“*\n”); counter++;}

• Note the ; after the condition in the while, its an empty statement (which is the body of the while), so the while is an infinite loop

Page 18: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Event-Controlled While

• While loops are often used to test for the occurrence of events that terminate loops

• Example:– read in a set of numbers until a particular value is

encountered– along the way count the set of numbers and the total

of the numbers– print out the average of the numbers– does not terminate after a fixed point

Page 19: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Calculate Average Loop

number != 999

total += number;counter++;

GetNextNumber

true

false

total = 0;counter = 0;

GetFirstNumber

print average

Page 20: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Calculate Average Code

total = 0;count = 0;printf(“Please enter first number: “);scanf(“%d”,&number);while (number != -999) { total += number; count++; printf(“Please enter next number: “); scanf(“%d”,&number);}printf(“Average is %.3f\n”,(float) total / count);

Page 21: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Using a Sentinel

• The value -999 is sometimes referred to as a sentinel value

• The value serves as the “guardian” for the termination of the loop

• Often a good idea to make the sentinel a constant:#define STOPNUMBER -999

while (number != STOPNUMBER) ...

Page 22: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Compound Conditions

• Often the termination condition is compound:ans = ‘N’;

while (!((ans == ‘Y’) || (ans == ‘y’))) {

printf(“Enter id# and salary: “);

scanf(“%d %f”,&id,&salary);

printf(“You entered id#%1d and salary $%.2f, Is this correct? (Y/N) “,id,salary);

scanf(“ %c”,&ans);

}

Page 23: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Making Sure Loop is Entered

• Note in previous loop, we had to set variable ans to an initial value, ‘N’

• This is because a while loop tests its condition before entering the loop, and if the condition is already false, the loop never executes

• Sometimes it is useful to have a loop that always executes at least once

Page 24: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Posttest Loop: Do-While

Syntax:do {

statement(s)

} while (condition);

Corresponds to:statement

if (!condition) DONE

statement

if (!condition) DONE

...

condition

statement(s)

true

false

Page 25: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Using the Do-While

do {

printf(“Enter id# and salary: “);

scanf(“%d %f”,&id,&salary);

printf(“You entered id#%1d and salary $%.2f, Is this correct? (Y/N) “ ,id,salary);

scanf(“ %c”,&ans);

} while (!((ans == ‘Y’) || (ans == ‘y’)));

• Loop always executes at least once

Page 26: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Programs with Menus

A)dd part to catalogR)emove part from catalogF)ind part in catalogQ)uitSelect option: A<interaction to add a part>A)dd part to catalogR)emove part from catalogF)ind part in catalogQ)uitSelect option: <next option>

Page 27: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Menu Loop

do {

showOptions();

printf(“Select

option:“);

scanf(“ %c”,&optn);

execOption(optn);

while (!(

(optn == ‘Q’) || (optn == ‘q’)));

NOT quitselected

true

false

ShowOptions

ReadOption

ExecuteOption

Page 28: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Menu Options

void showOptions() {

printf(“A)dd part to catalog\n”); printf(“R)emove part from catalog\n”); printf(“F)ind part in catalog\n”); printf(“Q)uit\n”);}

Page 29: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Executing Options

void execOption( char option ) {

switch (option) {

case ‘A’: case ‘a’: addPart(); break;

case ‘R’: case ‘r’: delPart(); break;

case ‘F’: case ‘f’: fndPart(); break;

case ‘Q’: case ‘q’: break;

default: printf(“Unknown option

%c\n”,option); break;

}

}

Page 30: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

While vs Do-While

• Differences– where condition tested:

• while (first) - may execute 0 times

• do-while (last) - must execute at least one time

• Similarities– one statement executed– initialization before loop– update during loop

Page 31: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Pretest Loop: For

• Initialization included in loop header

• Update included in loop header

• Header also includes update

• Syntax:for ( init ; condition ; update )

statement;

• Generally for loops expected to execute fixed number of times (counter-controlled)

Page 32: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

For Loop

• Syntax:for ( init ;

condition ;

update )

statement;

• Init: assignments to counter variables

• Update: changes to counter variables

Condition

Statement

true

false

Init

Update

Page 33: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

For Example

• Printing vertical line of stars:for (counter = 0;

counter < 5;

counter++)

printf(“*\n”);

counter < 5

printf("*\n");

true

false

counter = 0;

counter++;

Page 34: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

For Example - Sum of 1 to N

printf(“Number to sum to: “);

scanf(“%d”,&N);

total = 0;

for (I = 1; I <= N; I++)

total += I;

/* total is now 1 + 2 + … + N */

Page 35: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

For Example - Max of N Scores

printf(“Number of students: “);

scanf(“%d”,&NumStudents);

for (I = 0; I < NumStudents; I++) {

printf(“Enter student score %d: “);

scanf(“%d”,&score);

if (score > max)

max = score;

}

/* max is highest score entered */

Page 36: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

The Comma Form

• Possible to evaluate more than one expression (assignment) in initialization or update by separating each by commas

• Syntax: expression , expression , …printf(“Number to sum to: “);scanf(“%d”,&N);for (total = 0, I = 1; I <= N; total += I, I++);/* total is now 1 + 2 + … + N */

Page 37: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Directions of Counting

for (I = 10; I >= 1; I--) printf(“%d…\n”,I);printf(“0 BLASTOFF!\n”);

printf(“Enter start, end, inc values: “);scanf(“%d%d%d”,&lstart,&lend,&linc);for (I = lstart; ((linc < 0) && (I < lend)) || ((linc > 0) && (I > lend)); I += linc) printf(“%d\n”,I);

Page 38: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Nesting Loops

• It is often useful to have a loop within a loop (called nested loops)

• For example:printf(“Max N! to print: “);scanf(“%d”,&N); /* 1 */for (I = 1; I <= N; I++) { /* 2 */ fact = 1; /* 3 */ for (J = 2; J <= I; J++) /* 4 */ fact *= J; /* 5 */ printf(“%d! = %d\n”,I,fact); /* 6 */}

Page 39: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Tracing Nested LoopsStmt N I J fact output 1 4 2 1 3 1 4 2 6 1! = 1 2 2 3 1 4 2 5 2 4 3 6 2! = 2 2 3 3 1 4 2 5 2

Stmt N I J fact output 4 3 5 6 4 4 6 3! = 6 2 4 3 1 4 2 5 2 4 3 5 6 4 4 5 24 4 5 6 4! = 24 2 5

Page 40: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

More Efficient Implementation

printf(“Max N! to print: “);scanf(“%d”,&N);fact = 1;for (I = 1; I <= N; I++) { fact *= I; printf(“%d! = %d\n”,I,fact);}

• But why does this work?

Page 41: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Another Nesting Example

• How to print:

******

*****

****

***

**

*

for (I = 6; I >= 1; I--) {

for (J = 1; J <= I; J++)

printf(“*”);

printf(“\n”);

}

• Could have 6 be a variable

Page 42: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

More Complex Nesting

• How to print:

***********

*********

*******

*****

***

*

for (I = 0; I <= 5; I++) {

for (J = 0; J < I; J++)

printf(“ “);

for (J = 0;

J < (11 - 2 * I);

J++)

printf(“*”);

printf(“\n”);

}

• Note 2 (sequential) inner loops

Page 43: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Another Nesting Example

Size: 5***************

Size: 3******

Size: 0

do {

printf(“Size: “);

scanf(“%d”,&Size);

if (Size > 0) {

for (I = Size; I >= 1; I--) {

for (J = 1; J <= I; J++)

printf(“*”);

printf(“\n”);

}

}

} while (Size > 0);

Page 44: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Nesting and Functions

• With deep nesting its often a good idea to have inner loops in separate functions

do {

printf(“Size: “);

scanf(“%d”,&Size);

drawTri(Size);

} while (Size > 0);

void drawTri (int N){ int I; int J;

if (N > 0) { for (I = N; I >= 1; I--) { for (J = 1; J <= I; J++) printf(“*”); printf(“\n”); } }}

Page 45: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

break statement

• The break statement can be used to halt a loop, though it is generally better to use a flag to signal loop should endtotal = 0;

do {

scanf(“%d”,&num);

if (num < 0) break; /* Loop ends */

} while (num != 0);

Page 46: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Flags

• Better to use a flag variable - a variable that is set to a value when a condition occurstotal = 0;

done = 0; /* done is set to 0 state */

do {

scanf(“%d”,&num);

if (num < 0) done = 1; /* done 1 */

} while ((num != 0) && (!done));

Page 47: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

continue statement

• A continue statement says jump to the next end of the statement list

• Example:for (I = 0; I < 100; I++) {

if ((I % 2) == 1) continue;

printf(“%d is even”,I);

}

• Again, stylistically, better not to use

Page 48: Repetition (Loops) Want to do some repetitive sequence of actions: print vertical line of *s * Corresponding program: printf(“*\n”);

Avoiding continue

• Can generally use an if to avoid a continue:for (I = 0; I < 100; I++) { if ((I % 2) == 1) continue; printf(“%d is even”,I);}becomesfor (I = 0; I < 100; I++) { if (!((I % 2) == 1)) printf(“%d is even”,I);}