Chapter 2 Chapter 10: Control Structures 1
Chapter 10
Control Structures
Chapter 10 Flow of Control 2
Flow of Control
Sequence
Selection
Repetition
condition
YesNo
action-1
action-2
condition
No
action
Yes
Selection structure
Repetition structure
Chapter 10 Selection: ‘if’ construct 3
Selection: ‘if’ construct
Syntax: if (expression)statement ;
expression is the condition for the ‘if’ construct.
If expression is evaluated to non-zero (true), statement is executed.
If expression is evaluated to zero (false), statement is skipped.
Chapter 10 'if’ construct 4
‘if’ construct
Syntax: if (expression)statement ;
fine = 20; if (speed > 50) fine += 10; printf("Fine is %d\n", fine);
Chapter 10 Compound-statement Action 5
Compound-statement Action
Syntax: if (expression) { compound-statement ;}
if (a > b) max = a; if (a > b) printf("%d is larger than %d\n", a, b);
if (a > b) { max = a; printf("%d is larger than %d\n", a, b); }
Chapter 10 Flags 6
Flags
Flag: an integer variable that simulates a Boolean variable. Contains 0 (false) or 1 (true).
if (attended == 1) attendance++;
if (attended) attendance++;
if (attended == 0) { absentees++; printf("One more absentee.\n"); }
if !(attended) { absentees++; printf("One more absentee.\n"); }
or
or
Chapter 10 Naming a Flag 7
Naming a Flag
Appropriate naming is desirable.
Example: a flag ‘attended’ implies ‘attended’ if it contains 1 (true)
‘did not attend’ if it contains 0 (false)
Chapter 10 Nested ‘if’ statement 8
Nested ‘if’ statement
Example:
if (exam >= 80) if (project >= 90) grade = 'A';
Above could be rewritten as:
if (exam >= 80 && project >= 90) grade = 'A';
Chapter 10 Short-circuit evaluation 9
Short-circuit evaluation
Evaluation stops as soon as value of expression is known. Evaluation is from left to right.
For logical AND (&&), if the partial expression is false, the whole expression is false.
For logical OR (||), if the partial expression is true, the whole expression is true.
Chapter 10 Short-circuit evaluation 10
Short-circuit evaluation
Example:
if (bank_bal < 0.0 || expenses > 100.0) printf("Red alert!\n");
Chapter 10 Complementing a Condition 11
Complementing a Condition
Comlementing or negating a logical expression means changing the polarity.
Examples:
!(a == 30) is equivalent to (a != 30)
!(a > b) is equivalent to (a <= b)
Chapter 10 DeMorgan’s Theorem 12
DeMorgan’s Theorem
NOT(a AND b) same as NOT(a) OR NOT (b)
NOT(a OR b) same as NOT(a) AND NOT(b)
In C:
!(expr1 && expr2) same as !(expr1) || !(expr2)
!(expr1 || expr2) same as !(expr1) && !(expr2)
Chapter 10 DeMorgan’s Theorem 13
DeMorgan’s Theorem
Example:
!(age > 25 && (status == 'S' || status == 'D'))
(age <= 25) || (status != 'S' && status != 'D'))
Chapter 10 Common Mistakes 14
Common Mistakes
Do not use == and != on floating-point numbers.
Mixing up == with =.
Wrong placament of semi-colon, resulting in empty statement:
printf() is outside ‘if’ construct.
if (a > b); printf("a is larger than b\n");
Chapter 10 Common Mistakes 15
Common Mistakes
Translating condition in English to C:
Let lower be 10, and upper be 30.If x is 20, (lower <= x) is true, so it is evaluated to 1. Since (1 <= upper) is also true, condition is true!
if (lower <= x <= upper) ...
Chapter 10 Common Mistakes 16
Common Mistakes
Wrong condition:
Correct method:
if (lower <= x <= upper) ...
which is equivalent to this (since <= has a higher precedence than &&):
if ((lower <= x) && (x <= upper))
if (lower <= x && x <= upper)
Chapter 10 Common Mistakes 17
Common Mistakes
Wrong condition:
Correct method:
if (x && y > z)
if (x > z && y > z)
Chapter 10 Common Mistakes 18
Common Mistakes
Forgetting the braces for compound statements:
Correct method:
if (a > b) max = a; printf("%d is larger than %d\n", a, b);
if (a > b) { max = a; printf("%d is larger than %d\n", a, b); }
Chapter 10 ‘if-else’ construct 19
‘if-else’ construct
Syntax:
if (expression)statement1 ;
elsestatement2 ;
if (expression) { compound-statement1 ;}else { compound- statement2 ;}
Chapter 10 ‘if-else’ construct 20
‘if-else’ construct
May be used to avoid redundant code:
Use ‘if-else’ construct:
if (count == 0) ave = 0.0; if (count != 0) ave = (float) total/count;
if (count == 0) ave = 0.0; else ave = (float) total/count;
Chapter 10 ‘if-else’ construct 21
‘if-else’ construct
Another example: if (score1 < score2) { better_score = score2; printf("score2 is better\n"); } else { better_score = score1; printf("score1 is better\n"); }
Chapter 10 Style 22
Style
Two common styles:
if (expression) { compound-statement1 ;}else { compound- statement2 ;}
if (expression) { compound-statement1 ;}else { compound- statement2 ;}
Chapter 10 Removing common statements 23
Removing common statements
Common statements in the ‘then’ and ‘else’ parts should be moved out of the ‘if’ construct, if appropriate:
if (a < 0) { count++; neg++; printf("Enter an integer: "); scanf("%d", &k); } else { count++; pos++; printf("Enter an integer: "); scanf("%d", &k); }
Chapter 10 Removing common statements 24
Removing common statements
After moving common statements out of ‘if’ construct:
count++; if (a < 0) neg++; else pos++; printf("Enter an integer: "); scanf("%d", &k);
Chapter 10 Logical assignment for Flags 25
Logical assignment for Flags
Example:
if (age >= 65) snr_citizen = 1; else snr_citizen = 0;
‘if-else’ statement may be replaced by an assignment statement.
snr_citizen = (age >= 65);
Chapter 10 Logical assignment for Flags 26
Logical assignment for Flags
Another example:
if (n % 2 == 0) even = 1; else even = 0;
even = (n % 2 == 0);
even = !(n % 2);
Chapter 10 Nested ‘if-else’ statements 27
Nested ‘if-else’ statements
Example:
if (marks < 50) grade = 'F'; else if (marks < 70) grade = 'B'; else grade = 'A’;
Chapter 10 Nested ‘if-else’ statements 28
Nested ‘if-else’ statements
Which ‘if’ is the ‘else’ associated with? if (a == 1) if (b == 2) printf("***\n"); else printf("###\n");
‘else’ is associated with nearest ‘if’. if (a == 1) if (b == 2) printf("***\n"); else printf("###\n");
Chapter 10 Nested ‘if-else’ statements 29
Nested ‘if-else’ statements
To override default association, use braces to mark out block.
if (a == 1) { if (b == 2) printf("***\n"); } else printf("###\n");
Chapter 10 Nested ‘if-else’ statements 30
Nested ‘if-else’ statements
Example:
if (a == 0) if (b == 0) printf("Both a and b are zeros.\n"); else c = b/a;
if (a == 0) { if (b == 0) printf("Both a and b are zeros.\n"); } else c = b/a;
Chapter 10 Nested ‘if-else’ statements 31
Nested ‘if-else’ statements
Example: if (marks < 50) grade = 'F'; else if (marks < 60) grade = 'D'; else if (marks < 70) grade = 'C’; else if (marks < 80) grade = 'B'; else grade = 'A';
if (marks < 50) grade = 'F'; else if (marks < 60) grade = 'D'; else if (marks < 70) grade = 'C’; else if (marks < 80) grade = 'B'; else grade = 'A';
Chapter 10 Common Mistakes 32
Common Mistakes
Wrong matching of ‘else’ with ‘if’.
Wrong placement of semi-colon.
if (a == b) { a++; b--; }; else a = b;
Chapter 10 Conditional Operator (?:) 33
Conditional Operator (?:)
Ternary operator:
condition ? expr1 : expr2
First operand is condition.
If condition is true, take value of expr1; otherwise, take value of expr2.
Chapter 10 Conditional Operator (?:) 34
Conditional Operator (?:)
Example:
max = (a > b ? a : b);
equivalent to:
if (a > b) max = a; else max = b;
Chapter 10 Conditional Operator (?:) 35
Conditional Operator (?:)
Example:
equivalent to:
printf("%s\n", grade < 50 ? "Failed" : "Passed");
if (marks < 50) printf("Failed\n"); else printf("Passed\n");
Chapter 10 ‘switch’ construct 36
‘switch’ construct
Multi-way selection statement:
switch (expression) {case v1:s1 ;
break;case v2:s2 ;
break;. . .default:sn ;
break; / * optional break */}
Chapter 10 ‘switch’ construct 37
‘switch’ construct
May only test constant integral expressions, i.e., expressions that evaluate to integers or characters.
The vi’s are integral values; the si’s are compound statements.
After expression is evaluated, control jumps to appropriate ‘case’ label.
‘break’ statements are inserted to avoid falling through.
Chapter 10 ‘switch’ construct 38
‘switch’ construct
Example: switch (class) { case 'B': case 'b': printf ("Battleship\n"); break; case 'C': case 'c': printf ("Cruiser\n"); break; case 'D': case 'd': printf ("Destroyer\n"); break; case 'F': case 'f': printf ("Frigate\n"); break; default : printf ("Unknown ship class %c\n", class); }
Chapter 10 Repetition Structure 39
Repetition Structure
Counter-controlled repetiton: number of iterations known.
Sentinel-controlled repetiton: iterate until a sentinel value is entered, or terminating condition is true.
Chapter 10 ‘while’ construct 40
‘while’ construct
Loop structure with pre-test condition.
while (expression)statement ;
expression is loop condition.
If expression is true, statement in loop body is executed, and expression tested again.
If expression is false, loop terminates.
Chapter 10 ‘while’ construct 41
‘while’ construct
Example: Print n asterisks. count_star = 0; while (count_star < n) { printf("*"); count_star++; }
count_star = 0; while (count_star++ < n) printf("*");
count_star is the loop control variable.
Chapter 10 ‘while’ construct 42
‘while’ construct
Example: Compute sum of first 100 positive integers.
int num = 1; /* declaration and */int total = 0; /* initialisation */
while (num <= 100) { total += num; num++;}
Chapter 10 ‘while’ construct 43
‘while’ construct
Which of these is/are same as previous code?
int num = 1;int total = 0;while (num <= 100) { total += num; ++num;}
int num = 1;int total = 0;while (num <= 100) total += num++;
int num = 1;int total = 0;while (num <= 100) total += ++num;
Chapter 10 ‘while’ construct 44
‘while’ construct
Loop control variable. Initialisation: before the loop is entered, the variable
must be initialised. Testing: condition involving the loop control variable
is tested before the start of each loop iteration; if condition is true, loop body is executed.
Updating: loop control variable is updated during each iteration (usually at the beginning or the end of the loop body).
Chapter 10 Counter-control repetition 45
Counter-control repetition
A counter is used to keep track of number of iterations. #define N 10
. . .
total = 0; count = 1;
while (count++ <= N) { printf("Enter score: "); scanf("%d", &score); total += score; }
avg = (float) total / N; printf("Average is %.2f\n", avg);
Chapter 10 Sentinel-control repetition 46
Sentinel-control repetition
A sentinel is used to denote end of data.
#define SENTINEL –1 . . .
total = 0; count = 0;
printf("Enter score, –1 to end: "); scanf("%d", &score);
while (score != SENTINEL) { total += score; count++; printf("Enter score, –1 to end: "); scanf("%d", &score); }
if (count) { avg = (float) total/count; printf("Average is %.2f\n", avg); } else printf("No scores were entered\n");
Chapter 10 ‘do-while’ construct 47
‘do-while’ construct
Loop structure with post-test condition.
do statement ;while (expression);
Loop body is executed at least once.
Chapter 10 ‘do-while’ construct 48
‘do-while’ construct
Examples:
count = 1; do { printf ("%d ", count); } while (++count <= 10);
do { printf("Enter a letter A thru E: "); scanf("%c", &letter); } while (letter < 'A' || letter > 'E');
Chapter 10 Flag-controlled loops 49
Flag-controlled loops
When loop condition is complex, flags may be used.
valid = 1; while (valid) { printf("Enter a letter A thru E: "); scanf("%c", &letter); valid = (letter >= 'A' && letter <= 'E'); }
Chapter 10 ‘for’ construct 50
‘for’ construct
Another pre-test loop structure.Provides more compact form for counter-
controlled loops.
for ( initialisation-expression;loop-condition;update-expression )
statement;
Chapter 10 ‘for’ construct 51
‘for’ constructThe ‘for’ construct is similar to this ‘while’ construct.
initialisation-expression;while ( loop-condition ) { statement; update-expression;}
Chapter 10 ‘for’ construct 52
‘for’ construct
Example:
for (count_star = 0; /* init */ count_star < N; /* condition */ count_star++) /* update */ printf ("*");
Chapter 10 ‘for’ construct 53
‘for’ construct
The initialisation-expression and update-expression are often comma-separated lists of expressions.
The comma operator evaluates the list from left to right.
for (x = 1, total = 0; x <= 100; x++) total += x;
Chapter 10 ‘for’ construct 54
‘for’ construct
Any of the three expressions in the ‘for’ header may be omitted, but the semi-colons must stay.
If initialisation-expression is omitted, you must perform necessary initialisation before loop.
x = 1; total = 0; for (; x <= 100; x++) total += x;
Chapter 10 ‘for’ construct 55
‘for’ construct
If update-expression is omitted, you must ensure that necessary update operations are done in loop body.
for (x = 1, total = 0; x <= 100;) { total += x; x++; }
Chapter 10 ‘for’ construct 56
‘for’ construct
If loop-condition is omitted, then the test is always true.
This loop is infinite:
for (x = 1, total = 0; ; x++) total += x;
Chapter 10 Common Mistakes 57
Common Mistakes
Wrong placement of semi-colon.
for (x = 1; x <= 10; x++); printf("%d\n", x);
x = 1; while (x <= 10); printf("%d\n", x++);
Chapter 10 Common Mistakes 58
Common Mistakes
Omitting semi-colons in ‘for’ header.Mixing up semi-colons with commas in ‘for’
header.Off-by-one error, where the loop executes one
more or one fewer iteration than intended. How many iterations does this loop execute?
for (count = 0; count <= n; ++count) sum += count;
Chapter 10 ‘break’ statement 59
‘break’ statement
Used in loops, ‘break’ causes execution to break out of the loop that contains the statement.
#include <stdio.h> main() { int x; for (x = 1; x <= 10; x++) { if (x == 5) break; /* break loop only if x == 5 */ printf("%d ", x); } printf("\nBroke out of loop at x == %d\n", x); return 0; }
1 2 3 4 Broke out of loop at x == 5
Chapter 10 'continue’ statement 60
‘continue’ statement
The ‘continue’ statement causes execution to skip remaining loop body and proceed to next iteration. #include <stdio.h>
main() { int x; for (x = 1; x <= 10; x++) { if (x == 5) continue; /* skip remaining code in loop only if x == 5 */ printf("%d ", x); } printf("\nUsed 'continue' to "); printf("skip printing the value 5\n"); return 0; }
1 2 3 4 6 7 8 9 10 Used 'continue' to skip printing the value 5
Chapter 10 Nested loops & combined structures
61
Nested loops & combined structures
An example of nested ‘for’ loops.
for (i = 1; i <= 4; ++i) { for (j = 1; j <= 6; ++j) printf("*"); printf("\n"); }
****** ****** ****** ******
Chapter 10 Nested loops & combined structures
62
Nested loops & combined structures
Example 2:
for (i = 1; i <= 4; ++i) { for (j = 1; j <= i; ++j) printf("*"); printf("\n"); }
* ** *** ****
Chapter 10 Nested loops & combined structures
63
Nested loops & combined structures
Example 3:
for (i = 1; i <= 6; ++i) { if (i <= 3) printf("%d", i); else for (j = 1; j <= i; ++j) printf("*"); printf("\n"); }
1 2 3 **** ***** ******
Chapter 10 Homework 64
Homework
Try exercises behind chapter 10.