View
223
Download
0
Tags:
Embed Size (px)
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?