Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
ECE 103 Engineering Programming
Chapter 18
Iteration
Herbert G. Mayer, PSU CS
Status 7/19/2015
Initial content copied verbatim from
ECE 103 material developed by
Professor Phillip Wong @ PSU ECE
Syllabus
Basic Loops
while
do-while
for
break, continue
Examples
Basic Loops
Loops are another method of changing the execution
sequence of a program, by iterating
A loop is a section of code that is executed
repeatedly as long as a condition remains true
Once the expression becomes false (fails), the
program ends the loop
In C one can “hand-manufacture” loops via Goto
Statements, viewed as sinfully evil; that is how a
computer executes loops, by so-called “branch” or
“jump” instructions
2
Typical loops require
these operations:
pre-code
• Setup
Setup
• Test expression
evaluation
• Update
Stay in loop
TRUE
expression
Statements
FALSE
Update
Each single pass
through a loop is
called an iteration
Exit loop
post-code
3
A loop consists of several parts:
Setup
Before entering the loop, any values referenced by the
test expression should be initialized.
Test expression evaluation
An expression is tested to see if it is true or false.
true : Repeat the body of the loop
false : Exit the loop
Body
The body contains the code that is to be repeated. It can
be a single statement or a statement block.
Update
Within the loop, there should be a way to update the test
expression so that it will fail eventually.
4
Test expression must evaluate to either
true (non-zero) or false (zero)
Test expression is evaluated every iteration – either
at the start or end of the loop
The test is also called the termination condition
An infinite loop occurs if the termination condition is
never satisfied
5
Loop Statements in C
General loop types:
Conditional loops
Statements are repeated for as long as a test
expression remains true.
→ while, do-while
Counted loops
Statements are repeated a specified number of times.
→ for
6
while
pre-code;
while (expression)
Statement;
post-code;
Execution Sequence
a) Execute pre-code
b) At start of loop, evaluate expression
c) If expression is true
Execute Statement
Goto Step (b)
else
Exit the loop and goto Step (d)
d) Execute post-code
Use if the number of iterations is not known ahead of time
Variables in expression must be initialized before entering the loop
Loop body may be executed 0 or more times
Note that the Statement may be a compound statement { }
7
Example:
k = 0;
while( k < 5 )
k = k + 1;
// not recommended style of while
k = 0;
while( k < 5 ) {
k = k + 1;
printf( "k = %d\n", k );
} //end while
num = 0;
while( num < 5 ) {
printf( "num = %d\n", num++ );
} //end while
z = 5;
while( z-- )
printf( "z = %d\n", z );
// not recommended style, no { }
#include <stdio.h>
int main (void)
{ // main
int num; /* Input from user */
int sum = 0; /* Running sum */
int Done = 0; /* Flag */
/* This adds up numbers > 0 */
while( !Done ) {
printf( "Enter next number: ”
);
scanf("%d", &num);
if ( num < 1 )
Done = 1;
else
sum += num;
// not recommended style of if
} //end while
printf( "sum = %d\n", sum );
return 0;
} //end main
8
Example:
// Echo an input stream ( capitalized, 'S' replaced by '$’ )
#include <stdio.h>
#include <ctype.h>
int main( void )
{ // main
int ch; /* Holds input character */
/* Read input stream until end-of-line is detected */
while( ( ch = getchar() ) != '\n' ) {
ch = toupper( ch );
if( ch == 'S' )
My sister is funny!
ch = '$';
MY $I$TER I$ FUNNY!
printf( "%c", ch );
} //end while
printf( "\n” );
return 0;
} //end main
9
do-while
pre-code;
do
Statement;
while (expression);
post-code;
Execution Sequence
a)
b)
c)
d)
Execute pre-code
Enter the loop and execute Statement
At end of loop, evaluate expression
If expression is true
Goto Step (b)
else
Exit the loop and goto Step (e)
e) Execute post-code
The do-while loop tests the expression at the end
Hence will be done at least once!
Note semicolon after ending parenthesis, as that is the end of the dowhile statement
10
Example:
k = 0;
do
k = k + 1;
while( k < 5 );
k = 0;
do {
k = k + 1;
printf( "k = %d\n", k );
} while( k < 5 );
#include <stdio.h>
int main( void )
{ // main
int num;
/* Input from user */
int sum = 0; /* Running sum */
int Done = 0; /* Flag */
/* This adds up numbers > 0 */
do {
printf( "Enter next number: ” );
scanf( "%d", &num );
if( num < 1 ) // not recommended!
Done = 1;
else
sum += num;
} while( !Done );
printf( "sum = %d\n", sum );
return 0;
} //end main
11
for
pre-code;
for (expr1; expr2; expr3)
Statement;
post-code;
Execution Sequence
expr1 → setup expression
expr2 → test expression
expr3 → update expression
a)Execute pre-code
b)At start of loop, evaluate expr1
c)If expr2 is true
Execute Statement
Evaluate expr3
Goto Step (c)
else
Exit the loop and goto Step (d)
d)Execute post-code
Often used if the number of iterations is known ahead of time.
Loop body may be executed zero or more times
12
Mapping between simple for and while loops:
for( expr1; expr2; expr3)
{
Statements;
}
expr1; /* Setup */
while( expr2 ) /* Test */
{
Statements;
expr3; /* Update */
}
13
Example:
for( k=0; k<=3; k++ ) ...
→ 4 iterations, values of k : 0, 1, 2, 3
for( t=1; t<11; t+=2 ) ...
→ 5 iterations, values of t : 1, 3, 5, 7, 9
for( x=1.0; x<=2.0; x+=0.5 ) ...
→ 3 iterations, values of x : 1.0, 1.5, 2.0 // careful “float”
for( cnt = 2; cnt >= -1; cnt-- ) ...
→ 4 iterations, values of cnt : 2, 1, 0, -1
for( ;; )
→ Infinite loop: expr2 is never false!
14
Be careful counting iterations, especially when
starting at 0, or using < versus <= in expressions!
Example:
for( k=1; k<=5; k++ ) ...
→ 5 iterations, values of k : 1, 2, 3, 4, 5
for( k=1; k<5; k++ ) ...
→ 4 iterations, values of k : 1, 2, 3, 4
for( k=0; k<=5; k++ ) ...
→ 6 iterations, values of k : 0, 1, 2, 3, 4, 5
for( k=0; k<5; k++ ) .. .
→ 5 iterations, values of k : 0, 1, 2, 3, 4
15
Example:
for( n = 1; n < 5; n++ )
printf( "n = %d\n", n );
for( n = 1; n < 5; ++n )
printf( "n = %d\n", n );
for( n = 1; n < 5; )
printf( "n = %d\n", n++ );
s_idx = 2;
e_idx = 4;
for( n = s_idx; n <= e_idx; n++ )
{
x = exp( n );
printf( "%d %f\n", n, x );
} //end for
for( T = 10; T >= 0; T-- )
x = sin( T*pi / 180.0 );
prod = 1;
for( a = 1; a <= 3; a++ )
prod = prod * a;
#1 : a → 1
prod = 1 * 1 → 1
#2 : a → 2
prod = 1 * 2 → 2
#3 : a → 3
prod = 2 * 3 → 6
for( ch='A'; ch<='Z'; ch++ )
printf( "%c", ch );
/* infinite loop */
for( ;; )
printf( "Hello\n” );
16
C99
Variable Declarations in for Loops
Variable declarations are allowed in the first expression of the for
loop header. Typically used to declare the iteration variable
Note: NOT in old versions of C!
The scope of the variable extends only to the body of the loop
/* C90 version */
#include <stdio.h>
// C99 version
#include <stdio.h>
int main( void )
{ // main
int k;
int main( void )
{ // main
// This is legal in C99
for( int k = 0; k < 3; k++ )
printf("%d\n", k);
// end for
// Compiler fails on this k
printf( "%d\n", k );
for( k = 0; k < 3; k++ )
printf("%d\n", k);
// end for
printf( "%d\n", k ); /* Works
*/
return 0;
} //end main
return 0;
} //end main
17
break Statement
break causes an immediate exit from the loop that
contains it; note: innermost loop!
Once a break is encountered, execution goes to the
first statement following the loop body
break statements work with for, while, and
do-while loops
18
Example:
/* Use a state variable */
/* Use a break statement */
done = 0; /* State */
sum = 0;
#define TRUE 1
sum = 0;
while( !done ) {
printf( "x? ” );
scanf( "%d", &x );
sum = sum + x;
while( TRUE ) {
printf( "x? ” );
scanf( "%d", &x );
sum = sum + x;
if( sum > 1000 )
done = 1;
} //end while
if( sum > 1000 )
break;
} //end while
19
continue Statement
The continue statement restarts a loop
Once a continue is encountered, execution
proceeds to the start of the loop
continue statements work with for, while, and
do-while loops.
If continue is used in a for statement, the setup
expression is not executed again
20
Example:
#include <stdio.h>
#define TRUE 1
int main (void)
{ // main
float x; /* Input value */
float sum = 0.0; /* Accumulates partial sums */
while( TRUE ) {
scanf( "%f\n", &x );
if( x < 10.0 || x > 95.0 ) // Check for outside range
continue;
sum += x;
if( sum > 250.0 ) /* Check if sum limit is reached */
break;
} //end while
printf( "sum = %f\n", sum );
return 0;
} //end main
21