4
C Program�Control
1
© 2007 Pearson Education, Inc. All rights reserved.
Not everything that can be counted counts, and�not every thing that counts can be counted.
Who can control his fate?
The used key is always bright.
2
© 2007 Pearson Education, Inc. All rights reserved.
Intelligence… is the faculty of making artificial objects, especially tools to make tools.
Every advantage in the past is judged in the light�of the final issue.
3
© 2007 Pearson Education, Inc. All rights reserved.
OBJECTIVES
In this chapter you will learn:
4
© 2007 Pearson Education, Inc. All rights reserved.
4.1 Introduction
4.2 Repetition Essentials
4.3 Counter-Controlled Repetition
4.4 for Repetition Statement
4.5 for Statement: Notes and Observations
4.6 Examples Using the for Statement
4.7 switch Multiple-Selection Statement
4.8 do...while Repetition Statement
4.9 break and continue Statements
4.10 Logical Operators
4.11 Confusing Equality (==) and Assignment (=) Operators
4.12 Structured Programming Summary
5
© 2007 Pearson Education, Inc. All rights reserved.
4.1 Introduction
6
© 2007 Pearson Education, Inc. All rights reserved.
4.2 Repetition Essentials
7
© 2007 Pearson Education, Inc. All rights reserved.
4.3 Counter-Controlled Repetition
8
© 2007 Pearson Education, Inc. All rights reserved.
4.3 Counter-Controlled Repetition
int counter = 1; // initialization
while ( counter <= 10 ) { // repetition condition
printf( "%d\n", counter );
++counter; // increment
}
int counter = 1;
9
© 2007 Pearson Education, Inc. All rights reserved.
10
Outline
fig04_01.c
Definition and assignment are performed simultaneously
© 2007 Pearson Education, Inc. All rights reserved.
4.3 Counter-Controlled Repetition
11
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.1
Because floating-point values may be approximate, controlling counting loops with floating-point variables may result in imprecise counter values and inaccurate tests for termination.
12
© 2007 Pearson Education, Inc. All rights reserved.
Error-Prevention Tip 4.1
Control counting loops with integer values.
13
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.1
Indent the statements in the body of each control statement.
14
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.2
Put a blank line before and after each control statement to make it stand out in a program.
15
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.3
Too many levels of nesting can make a program difficult to understand. As a general rule, try to avoid using more than three levels of nesting.
16
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.4
The combination of vertical spacing before and after control statements and indentation of the bodies of control statements within the control-statement headers gives programs a two-dimensional appearance that greatly improves program readability.
17
© 2007 Pearson Education, Inc. All rights reserved.
18
Outline
fig04_02.c
for loop begins by setting counter to 1 and repeats while counter <= 10. Each time the end of the loop is reached, counter is incremented by 1.
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.3 | for statement header components.
19
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.2
Using an incorrect relational operator or using an incorrect initial or final value of a loop counter in the condition of a while or for statement can cause off-by-one errors.
20
© 2007 Pearson Education, Inc. All rights reserved.
Error-Prevention Tip 4.2
Using the final value in the condition of a while or for statement and using the <= relational operator will help avoid off-by-one errors. For a loop used to print the values 1 to 10, for example, the loop-continuation condition should be counter <= 10 rather than counter < 11 or counter < 10.
21
© 2007 Pearson Education, Inc. All rights reserved.
4.4 for Repetition Statement
for ( initialization; loopContinuationTest; increment ) � statement
for( int counter = 1; counter <= 10; counter++ )
printf( "%d\n", counter );
22
© 2007 Pearson Education, Inc. All rights reserved.
4.4 for Repetition Statement
initialization;�while ( loopContinuationTest ) {� statement;� increment;�}
for (int i = 0, j = 0; j + i <= 10; j++, i++)
printf( "%d\n", j + i );
23
© 2007 Pearson Education, Inc. All rights reserved.
Software Engineering Observation 4.1
Place only expressions involving the control variables in the initialization and increment sections of a for statement. Manipulations of other variables should appear either before the loop (if they execute only once, like initialization statements) or in the loop body (if they execute once per repetition, like incrementing or decrementing statements).
24
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.3
Using commas instead of semicolons in a for header is a syntax error.
25
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.4
Placing a semicolon immediately to the right of a for header makes the body of that for statement an empty statement. This is normally a logic error.
26
© 2007 Pearson Education, Inc. All rights reserved.
4.5 for Statement : Notes and Observations
for ( j = x; j <= 4 * x * y; j += y / x )
is equivalent to
for ( j = 2; j <= 80; j += 5 )
27
© 2007 Pearson Education, Inc. All rights reserved.
Error-Prevention Tip 4.3
Although the value of the control variable can be changed in the body of a for loop, this can lead to subtle errors. It is best not to change it.
28
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.4 | Flowcharting a typical for repetition statement.
29
© 2007 Pearson Education, Inc. All rights reserved.
30
Outline
fig04_05.c
Note that number has a different value each time this statement is executed
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.5
Although statements preceding a for and statements in the body of a for can often be merged into the for header, avoid doing so because it makes the program more difficult to read.
31
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.6
Limit the size of control-statement headers to a single line if possible.
32
© 2007 Pearson Education, Inc. All rights reserved.
33
Outline
fig04_06.c
(1 of 2 )
additional header
pow function calculates the value of the first argument raised to the power of the second argument
© 2007 Pearson Education, Inc. All rights reserved.
34
Outline
fig04_06.c
(2 of 2 )
© 2007 Pearson Education, Inc. All rights reserved.
Error-Prevention Tip 4.4
Do not use variables of type float or double to perform monetary calculations. The impreciseness of floating-point numbers can cause errors that will result in incorrect monetary values.
35
© 2007 Pearson Education, Inc. All rights reserved.
4.7 switch Multiple-Selection Statement
switch ( value ){
case '1':
actions
case '2':
actions
default:
actions
}
36
© 2007 Pearson Education, Inc. All rights reserved.
37
Outline
fig04_07.c
(1 of 4 )
Outline
EOF stands for “end of file;” this character varies from system to system
switch statement checks each of its nested cases for a match
break statement makes program skip to end of switch
© 2007 Pearson Education, Inc. All rights reserved.
38
Outline
fig04_07.c
(2 of 4 )
© 2007 Pearson Education, Inc. All rights reserved.
39
Outline
fig04_07.c
(3 of 4 )
default case occurs if none of the cases are matched
© 2007 Pearson Education, Inc. All rights reserved.
40
Outline
fig04_07.c
(4 of 4 )
© 2007 Pearson Education, Inc. All rights reserved.
Portability Tip 4.1
The keystroke combinations for entering EOF (end of file) are system dependent.
41
© 2007 Pearson Education, Inc. All rights reserved.
Portability Tip 4.2
Testing for the symbolic constant EOF rather than –1 makes programs more portable. The C standard states that EOF is a negative integral value (but not necessarily –1). Thus, EOF could have different values on different systems.
42
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.5
Forgetting a break statement when one is needed in a switch statement is a logic error.
43
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.8 | switch multiple-selection statement with breaks.
44
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.7
Provide a default case in switch statements. Cases not explicitly tested in a switch are ignored. The default case helps prevent this by focusing the programmer on the need to process exceptional conditions. There are situations in which no default processing is needed.
45
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.8
Although the case clauses and the default case clause in a switch statement can occur in any order, it is considered good programming practice to place the default clause last.
46
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.9
In a switch statement when the default clause is listed last, the break statement is not required. But some programmers include this break for clarity and symmetry with other cases.
47
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.6
Not processing newline characters in the input when reading characters one at a time can cause logic errors.
48
© 2007 Pearson Education, Inc. All rights reserved.
Error-Prevention Tip 4.5
Remember to provide processing capabilities for newline (and possibly other white-space) characters in the input when processing characters one at a time.
49
© 2007 Pearson Education, Inc. All rights reserved.
4.8 do…while Repetition Statement
do {
statement;
} while ( condition );
50
© 2007 Pearson Education, Inc. All rights reserved.
4.8 do…while Repetition Statement
do {
printf( "%d ", counter );
} while (++counter <= 10);
51
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.10
Some programmers always include braces in a do...while statement even if the braces are not necessary. This helps eliminate ambiguity between the do...while statement containing one statement and the while statement.
52
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.7
Infinite loops are caused when the loop-continuation condition in a while, for or do...while statement never becomes false. To prevent this, make sure there is not a semicolon immediately after the header of a while or for statement. In a counter-controlled loop, make sure the control variable is incremented (or decremented) in the loop. In a sentinel-controlled loop, make sure the sentinel value is eventually input.
53
© 2007 Pearson Education, Inc. All rights reserved.
54
Outline
fig04_09.c
increments counter then checks if it is less than or equal to 10
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.10 | Flowcharting the do...while repetition statement.
55
© 2007 Pearson Education, Inc. All rights reserved.
4.9 break and continue Statements
56
© 2007 Pearson Education, Inc. All rights reserved.
57
Outline
fig04_11.c
break immediately ends for loop
© 2007 Pearson Education, Inc. All rights reserved.
4.9 break and continue Statements
58
© 2007 Pearson Education, Inc. All rights reserved.
59
Outline
fig04_12.c
continue skips to end of for loop and performs next iteration
© 2007 Pearson Education, Inc. All rights reserved.
Software Engineering Observation 4.2
Some programmers feel that break and continue violate the norms of structured programming. Because the effects of these statements can be achieved by structured programming techniques we will soon learn, these programmers do not use break and continue.
60
© 2007 Pearson Education, Inc. All rights reserved.
Performance Tip 4.1
The break and continue statements, when used properly, perform faster than the corresponding structured techniques that we will soon learn.
61
© 2007 Pearson Education, Inc. All rights reserved.
Software Engineering Observation 4.3
There is a tension between achieving quality software engineering and achieving the best-performing software. Often one of these goals is achieved at the expense of the other.
62
© 2007 Pearson Education, Inc. All rights reserved.
4.10 Logical Operators
Expression Result
true && false false�true || false true
!false true
63
© 2007 Pearson Education, Inc. All rights reserved.
64
Fig. 4.13 | Truth table for the && (logical AND) operator.
© 2007 Pearson Education, Inc. All rights reserved.
65
Fig. 4.14 | Truth table for the logical OR (||) operator.
© 2007 Pearson Education, Inc. All rights reserved.
66
Fig. 4.15 | Truth table for operator ! (logical negation).
© 2007 Pearson Education, Inc. All rights reserved.
Performance Tip 4.2
In expressions using operator &&, make the condition that is most likely to be false the leftmost condition. In expressions using operator ||, make the condition that is most likely to be true the leftmost condition. This can reduce a program’s execution time.
67
© 2007 Pearson Education, Inc. All rights reserved.
68
Fig. 4.16 | Operator precedence and associativity.
© 2007 Pearson Education, Inc. All rights reserved.
4.11 Confusing Equality (==) and Assignment (=) Operators
if ( payCode == 4 )
printf( "You get a bonus!\n" );
69
© 2007 Pearson Education, Inc. All rights reserved.
4.11 Confusing Equality (==) and Assignment (=) Operators
if ( payCode = 4 )
printf( "You get a bonus!\n" );
This sets payCode to 4
4 is nonzero, so expression is true, and bonus awarded no matter what the payCode was
70
© 2007 Pearson Education, Inc. All rights reserved.
Common Programming Error 4.8
Using operator == for assignment or using operator = for equality is a logic error.
71
© 2007 Pearson Education, Inc. All rights reserved.
4.11 Confusing Equality (==) and Assignment (=) Operators
72
© 2007 Pearson Education, Inc. All rights reserved.
Good Programming Practice 4.11
When an equality expression has a variable and a constant, as in x == 1, some programmers prefer to write the expression with the constant on the left and the variable name on the right (e.g. 1 == x as protection against the logic error that occurs when you accidentally replace operator == with =.
73
© 2007 Pearson Education, Inc. All rights reserved.
Error-Prevention Tip 4.6
After you write a program, text search it�for every = and check that it is being used properly.
74
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.17 | C’s single-entry/single-exit sequence, selection and repetition statements.
75
© 2007 Pearson Education, Inc. All rights reserved.
4.12 Structured Programming Summary
76
© 2007 Pearson Education, Inc. All rights reserved.
77
Fig. 4.18 | Rules for forming structured programs.
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.19 | Simplest flowchart.
78
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.20 | Repeatedly applying rule 2 of Fig. 4.18 to the simplest flowchart.
79
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.21 | Applying rule 3 of Fig. 4.18 to the simplest flowchart.
80
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.22 | Stacked, nested and overlapped building blocks.
81
© 2007 Pearson Education, Inc. All rights reserved.
Fig. 4.23 | An unstructured flowchart.
82
© 2007 Pearson Education, Inc. All rights reserved.
4.12 Structured Programming Summary
Nesting (rule 3)
Stacking (rule 2)
83
© 2007 Pearson Education, Inc. All rights reserved.