Conditionals, Loops, and Other Statements CS-2301 D-term 20091 Conditionals, Loops, and Other Kinds...

Preview:

Citation preview

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 1

Conditionals, Loops, and Other Kinds of Statements

CS-2301 System Programming C-term 2009

(Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel)

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 2

Reading Assignment

• Chapter 3 of Kernighan and Ritchie• Helpful to follow along in class

• Note on §3.8 :– we do not allow goto statements in this course

• There is rarely, if any, situation at WPI where a goto in C would be the right thing

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 3

Review

• Expression – a sequence of operators and operands that return a value

• Assignment – expression with the side effect of changing the value of the left operand

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 4

Definition – Side Effect

• The changing of the value of some data in the course of evaluating or executing something else

• Sometimes unrelated data!

• Examples:–– Explicit assignments

• x = y + 3; i++; --j;– printf()

• Writes to internal buffer; flushes buffer to screen on '\n'

– scanf() – returns values from input• Explicit – assigns data to arguments

• Implicit – keeps track of where it is in internal buffer

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 5

Definition – Statement

• Instruction to “do” something

• Specifies order of execution & evaluation

• §A.9 – a statement in C may be any of:–• labeled-statement

• expression-statement

• compound-statement

• selection-statement

• iteration-statement

• jump-statement

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 6

Expression Statement

• expressionoptional ;

• Note: semicolon is terminator

• Exists primarily for its side effects

• E.g.,• x = y + 3; i++; --j;• printf(“string”, arg1, arg2, arg3);

• The following is perfectly legal in C:–• y + 3;

• Evaluates the expression, then throws the result away!

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 7

Compound Statement

• A sequence of statements surrounded by {}• Example:–

{x = 0;i++;printf("The value of x is %d\n", x);

}

• Reason:– so that we can group together statements in loops, if-else, etc.

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 8

Compound Statement (continued)

• Compound statements may be nested{...;{ x = 0; i++;

} /* no semicolon needed here*/

printf("The value of x is %d\n", x);...;

}

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 9

Compound Statement (continued)

• Compound statements may include declarations inside{double angle;angle = atan2(y, x) * 360/(2*pi);printf(“Angle is %f degrees\n”, angle);

}

• Declarations inside of {} are not known outside of {}

• Book says declarations must be at beginning of {}• Later versions of C relax this rule

• Declaration must always precede first use of declared identifier

Note: declaration-definition

of angle

allocates memory.

This is relinquished at end

of {}.

atan2(y,x) calculates the

arctangent of yx without

zero-divide problems

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 10

Questions?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 11

If-else Statements

if (expr)statement1 /*do this if expr is non-zero*/

else

statement2 /*do this if expr is zero*/

• The else clause is optional!

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 12

If-else Examples

if (j > limit)return j; /* note semicolon*/

elsej += stepValue; /* note semicolon*/

...

if (++k >= 4)k = 0; /* increment k mod 4*/

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 13

If-else Examples (continued)

if (n < maxInput) {

scanf("string", &arg1, &arg2, …);

n++;

printf("string2", arg3, arg4, …);

} else { /* note NO semicolon*/

printf("Summary\n", arg5, …);

return n;

}

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 14

Concatenated If-else Statements

if (expr1)

statement1 /*do this if expr1 is non-zero*/

else if (expr2)

statement2 /*i.e., expr1 == 0, expr2 != 0*/

else if (expr3)

statement3 /expr1 and expr2 are zero, expr3 != 0*/

else if (expr4)

statement4 /expr1, expr2 , expr3 all zero, expr4 != 0*/

else statement5 /*i.e., all expr are zero*/

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 15

Concatenated If-else Statements

• Last else is always attached to last if

• If it should be attached to any other if, use {} to control the flow of execution.

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 16

Switch Statement

• Somewhat like a concatenated if-else• Occasionally easier to read

• Each arm is called a case• Evaluate switch expression, select the

appropriate case (if any)– default case is optional

• Difference from concatenated if-else• Need break statement to exit switch after a case• Otherwise, control falls through to next case

• See §3.4 and p. 59

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 17

Switch Statement Example

int month, daysInMonth, leapYear;…switch (month) {

case 0: printf("January\n");daysInMonth = 31;break;

case 1: printf("February\n");daysInMonth = leapYear ? 29 : 28;break;

case 2: printf("March\n");daysInMonth = 31;break;

case 3: printf("April\n");daysInMonth = 30;break;

…} // switch

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 18

Switch Statement Example

int month, daysInMonth, leapYear;…switch (month) {

case 0: printf("January\n");daysInMonth = 31;break;

case 1: printf("February\n");daysInMonth = leapYear ? 29 : 28;break;

case 2: printf("March\n");daysInMonth = 31;break;

case 3: printf("April\n");daysInMonth = 30;break;

…} // switch

case values m

ust be

constants

break sta

tement needed to

jump over subsequent cases

defaul

t case is optional

(not shown)

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 19

Questions?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 20

Iterative Statement

• while loop• for loop• do-while loop

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 21

while loops

while (expression)statement

• Evaluate expression• If true, execute statement and then repeat• Repeat until expression becomes false

• statement may be executed zero or more times!

Often a compound statement

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 22

int sum = 0;int count = 0;int input;while (scanf("%d", &input) != EOF){

sum += input;count++;printf("Input value of %f recorded.\n", input);...

}if (count > 0)

printf("Average is %f\n", (double)sum/count);else

printf("No inputs recorded\n");

while loop exampleNote initialization of sum

and count

What is this?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 23

while loop examples (continued)

• Study example on p. 59 (§3.4)

• A program to count digits, white space characters, and other characters.

• Includes a while loop with a switch statement inside

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 24

do-while loop

• do statement

while (expression);

• Similar to while loop, but guaranteed to execute statement at least once

• See §3.6

Note: semicolon is

required here

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 25

Breaking out of a Loop

• When it becomes necessary to terminate a loop prematurely– break; /*exits smallest containing

switch or loop*/

• When it becomes necessary to terminate the current iteration and start the next one– continue; /*terminates this iteration only*/

• See p. 65, §3.7

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 26

Questions?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 27

for loop

• A counting loopfor (expr1; expr2; expr3)

statement

• Evaluate expr1 to initialize• Evaluate expr2 to test

• If true, execute statement• If not true, exit for loop

• Evaluate expr3 to prepare for next iteration• Repeat expr2 to test

Remember: zero is false,

non-zero is true

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 28

for loops and while loops

• The for loopfor (expr1; expr2; expr3)

statement

• is exactly equivalent to the followingexpr1; while (expr2) {

statementexpr3;

}

• See p. 60

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 29

The most common kind of for-loop

int i;

for (i = 0; i < limit; i++) {

...;

/* do something with ith entity */

...;

}

Loop “body” is typically

a compound statement

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 30

The most common kind of for-loop

int i;

for (i = 0; i < limit; i++) {

...;

/* do something with ith entity */

...;

}

It is traditional in C that for-

loops start counting at zero

and test that the counter is less

than the upper limit

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 31

The most common kind of for-loop

int i;

for (i = 0; i < limit; i++) {

...;

/* do something with ith entity */

...;

} • This loop iterates limit times.

– Iterations are numbered i = 0, 1, 2, …, limit-1

• Reason:– arrays are indexed this way!

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 32

Nested for-loops

int i, j;for (i = 0; i < limit; i++) {...; /*prepare subgroup i*/for (j=0; j < limit2; j++) {

...;/* do something with item j of

subgroup i*/...;

}...;

}

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 33

An Extension in Modern C Compilers

• The following construct (not in book) is legal in C99:–for (int i = 0; i < limit; i++){expression involving i;...;printf(“Iteration %d completed.\n”, i);...;

}

• The loop counter i is declared in for loop• Not visible outside of loop!

• Common practice• Good programming style

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 34

Notes on Loop Style

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

...; /*prepare for subgroup i*/

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

...;

/* do something with item j of

subgroup i*/

...;

} /* end of loop j */

...;

} /* end of loop i */

Declare loop variables in

for-statements – C99

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 35

Notes on Loop Style

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

...; /*prepare for subgroup i*/

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

...;

/* do something with item j of

subgroup i*/

...;

} /* end of loop j */

...;

} /* end of loop i */

Include a comment at end of

each loop to show which loop

it is

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 36

Questions?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 37

An Example

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {

} // for month

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 38

An An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {

} // for month

This variable is “global” to the loop.

I.e., it is remembered from one

iteration to the next.

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 39

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {

} // for month

At beginning of each iteration, startingDay indicates the day of the week on which that particular month starts.

It is the responsibility of the loop to update startingDay for the next month.

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 40

Definition – Loop Invariant

• Something that is true at a certain point of each iteration of the loop

• Usually at the start

• E.g., a relationship of the variables • Often expressed as a logical statement called an

assertion

• Needs to be preserved from one iteration to the next

• Does not necessarily remain true within the loop, but only at the specific point each time through

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 41

An Example (continued)

int startingDay; /* init from user input*/

for (int month = 0; month <12; month++)

{

const int daysInMonth = …;

/* set # of days */

int dayOfWeek = 0;

printf(…); //month name

printf(…); //days of week

} // for month

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 42

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month++)

{const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

} // for month

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 43

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month++)

{const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

} // for month

Note that dayOfWeek

is global to

this loop.

It is remembered outside this inner

loop.

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 44

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month++)

{const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

} // for month

What is the loop invariant associated

with this loop?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 45

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

for (int date = 1; date <=

daysInMonth; date++){

} // for date

} // for month

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 46

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

for (int date = 1; date <=

daysInMonth; date++){

} // for date

} // for month

What should the loop invariant be for this loop?

Why?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 47

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

for (int date = 1; date <=

daysInMonth; date++){

printf("…", date);

if (++dayOfWeek>=7) {

printf("\n");

dayOfWeek = 0;

};

} // for date

} // for month

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 48

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

for (int date = 1; date <=

daysInMonth; date++){

printf(“…”, date);

if (dayOfWeek++>=7) {

printf(“\n”);

dayOfWeek = 0;

};

} // for date

} // for month

Is loop invariant preserved by this loop? Why?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 49

An Example (continued)

int startingDay; /* init from

user input*/

for (int month = 0; month <12; month+

+) {const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

for (int date = 1; date <=

daysInMonth; date++){

printf(“…”, date);

if (dayOfWeek++>=7) {

printf(“\n”);

dayOfWeek = 0;

};

} // for date

if (dayOfWeek != 0)

printf(“\n”);

} // for month

What about the original loop invariant for this loop?

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 50

An Example (concluded)

int startingDay; /* init from user input*/

for (int month = 0; month <12; month++)

{const int daysInMonth = …;

/* set # of days */int dayOfWeek;

printf(…); //month nameprintf(…); //days of week

for (dayOfWeek = 0; dayOfWeek<startingDay; dayOfWeek++) printf(/*blanks*/);

for (int date = 1; date <=daysInMonth; date+

+) {

printf(“…”, date);if (++dayOfWeek >=

7){ printf(“\n”); dayOfWeek = 0;};

} // for dateif (dayOfWeek !=0)

printf(“\n”);

startingDay = dayOfWeek;

} // for month

Conditionals, Loops, and Other Statements

CS-2301 D-term 2009 51

Questions?

Recommended