UNIT%6
Problem%Solving% with%
Selection%and%Repetition%Statements
http://www.com p. nus.edu.sg/~cs1010/
Problem Solving with Selection and Repetition Statements Unit6 - 2NUS
Objectives:
§ Using relational and logical operators
§ Using selection statements to choose between two or
more execution paths in a program
§ Using repetition statements to repeat a segment of
code
Reference:
§ Chapter 4 Selection Structures
§ Chapter 5 Repetition and Loop Statements
Unit 6: Problem Solving with Selection and
Repetition Statements
Unit 6: Problem Solving with Selection and
Repetition Statements (1/2)
Problem Solving with Selection and Repetition Statements Unit6 - 3NUS
1. Sequential vs Non-Sequential Control Flow
2. Selection Structures
3. Nested if and if-else Statements
4. Style Issues
5. Common Errors
6. The switch Statement
7. Testing and Debugging
Unit 6: Problem Solving with Selection and
Repetition Statements (2/2)
Problem Solving with Selection and Repetition Statements Unit6 - 4NUS
8. The while Loop
9. The do-while Loop
10. The for Loop
11. Common Errors
12. Some Notes of Caution
13. Using break in Loop
14. Using continue in Loop
NUS Problem Solving with Selection and Repetition Statements Unit6 - 5
Recall: Control Structures
1. Sequential Control Flow
Problem Solving with Selection and Repetition Statements Unit6 - 6NUS
§ Recall Simple “drawingproblem in Unit 5:
Write a program to draw a rocket ship, a male stick figure,
and a female stick figure.
rocket
male
female
Draw
Triangle
Draw
Rectangle
Draw
Inverted V
Draw Circle
Draw
Rectangle
Draw
Inverted V
Draw Circle
Draw
Triangle
Draw
Inverted V
Draw 3
Figures
Draw Rocket
Ship
Draw Male
Stick Figure
Draw Female
Stick Figure
1. Non-Sequential Control Flow
Problem Solving with Selection and Repetition Statements Unit6 - 7NUS
§ New requirement:
Write a program to allow user to select only ONE of the following
options: Draw a (1) rocket ship, (2) male stick figure, or (3) female
stick figure.
Draw
Triangle
Draw
Rectangle
Draw
Inverted V
Draw Circle
Draw
Rectangle
Draw
Inverted V
Draw Circle
Draw
Triangle
Draw
Inverted V
Draw 3
Figures
Draw Rocket
Ship
Draw Male
Stick Figure
Draw Female
Stick Figure
Select
only one
2. Selection Structures
Problem Solving with Selection and Repetition Statements Unit6 - 8NUS
§ C provides two control structures that allow
you to select a group of statements to be
executed or skipped when certain
conditions are met.
2.1 if and if-else Statements
Problem Solving with Selection and Repetition Statements Unit6 - 9NUS
§ if statement
How are conditions specified
and how are they evaluated?
§ if-else statement
if ( condition ) {
/* Execute these statements if TRUE */
}
if ( condition ) {
/* Execute these statements if TRUE */
}
else {
/* Execute these statements if FALSE */
}
cond?
true
false
cond?
true
false
Braces { } are optional only if there is one statement
in the block. But for beginners, we recommended
writing braces even if there is one statement.
2.1 if and if-else Statements
Problem Solving with Selection and Repetition Statements Unit6 - 10NUS
§ if statement
§ if-else statement
if ( you are hungry ) {
Eat something
}
if ( gender == male ) {
go to gents
}
else {
go to ladies
}
cond?
true
false
cond?
true
false
2.2 Condition
Problem Solving with Selection and Repetition Statements Unit6 - 11NUS
§ A condition is an expression evaluated to true or false.
§ It is composed of expressions combined with relational
operators.
§ Examples: (a <= 10), (count > max), (value != -9)
Relational Operator Interpretation
< is less than
<= is less than or equal to
> is greater than
>= is greater than or equal to
== is equal to
!= is not equal to
2.3 Truth Values
Problem Solving with Selection and Repetition Statements Unit6 - 12NUS
§ Boolean values: true or false.
§ There is no boolean type in ANSI C. Instead, we use
integers:
§ 0 to represent false
§ Any other value to represent true (1 is used as the representative
value for true in output)
§ Example:
a = 0; b = 1
int a = (2 > 3);
int b = (3 > 2);
printf("a = %d; b = %d\n", a, b);
Unit6_TruthValues.c
2.4 Logical Operators
Problem Solving with Selection and Repetition Statements Unit6 - 13NUS
§ Complex condition: combining two or more boolean expressions.
§ Examples:
§ If temperature is greater than 40C or blood pressure is greater than 200,
go to A&E immediately.
§ If all the three subject scores (English, Maths and Science) are greater
than 85 and mother tongue score is at least 80, recommend takinf Higher
Mother Tongue.
§ Logical operators are needed: && (and), || (or), ! (not).
A B A && B A || B !A
False False False False True
False True False True True
True False False True False
True True True True False
Note: There are bitwise
operators such as & , |
and ^, but we are not
covering these in CS1010.
2.5 Evaluation of Boolean Expressions (1/2)
Problem Solving with Selection and Repetition Statements Unit6 - 14NUS
§ The evaluation of a boolean expression is done according
to the precedence and associativity of the operators.
Operator
Type
Operator
Associativity
Primary expression
operators
( ) [ ] .
-> expr++ expr--
Left to Right
Unary operators
* & +
- ! ~ ++expr --expr (typecast) sizeof
Right
to Left
Binary operators
* / %
Left to Right
+
-
< > <= >=
== !=
&&
||
Ternary operator
?:
Right
to Left
Assignment
operators
= +=
-= *= /= %=
Right
to Left
2.5 Evaluation of Boolean Expressions (2/2)
Problem Solving with Selection and Repetition Statements Unit6 - 15NUS
§ What is the value of x?
x is true (1)
int x, y, z,
a = 4, b = -2, c = 0;
x = (a > b || b > c && a == b);
gcc issues warning (why?)
§ What is the value of z?
z = ((a > b) && !(b > c));
z is true (1)
See Unit6_EvalBoolean.c
§ Always good to add parentheses for readability.
y = ((a > b || b > c) && a == b);
y is false (0)
2.6 Caution (1/2)
Problem Solving with Selection and Repetition Statements Unit6 - 16NUS
§ Since the values 0 and 1 are the returned values for false
and true respectively, we can have codes like these:
int a = 12 + (5 >= 2); // 13 is assigned to a
§ However, you are certainly not encouraged to write such
convoluted codes!
( 5 >= 2) evaluates to 1; hence a = 12 + 1;
int b = (4 > 5) < (3 > 2) * 6; // 1 assigned to b
* has higher precedence than <.
(3 > 2) evaluates to 1, hence (3 > 2) * 6 evaluates to 6.
(4 > 5) evaluates to 0, hence 0 < 6 evaluates to 1.
int c = ((4 > 5) < (3 > 2)) * 6; // 6 assigned to c
(4 > 5) evaluates to 0, (3 > 2) evaluates to 1, hence
(4 > 5) < (3 > 2) is equivalent to (0 < 1) which evaluates to 1.
Hence 1 * 6 evaluates to 6.
2.6 Caution (2/2)
Problem Solving with Selection and Repetition Statements Unit6 - 17NUS
§ Very common mistake:
int num;
printf("Enter an integer: ");
scanf("%d", &num);
if (num = 3) {
printf("The value is 3.\n");
}
printf("num = %d\n", num);
§ What if user enters 7?
§ Correct the error.
2.7 Short-Circuit Evaluation
Problem Solving with Selection and Repetition Statements Unit6 - 18NUS
§ Does the following code give an error if variable a is zero?
if ((a != 0) && (b/a > 3))
printf(. . .);
§ Short-circuit evaluation
§ expr1 || expr2: If expr1 is true, skip evaluating expr2 and return true
immediately, as the result will always be true.
§ expr1 && expr2: If expr1 is false, skip evaluating expr2 and return
false immediately, as the result will always be false.
2.8 if and if-else Statements: Examples (1/2)
Problem Solving with Selection and Repetition Statements Unit6 - 19NUS
int a;
. . .
if (a % 2 == 0) {
printf("%d is even\n", a);
}
else {
printf("%d is odd\n", a);
}
int a, b, t;
. . .
if (a > b) {
// Swap a with b
t = a; a = b; b = t;
}
// After above, a is the smaller
if statement
without else part
if-else statement
2.8 if and if-else Statements: Examples (2/2)
Problem Solving with Selection and Repetition Statements Unit6 - 20NUS
if (cond) {
statement-a;
statement-b;
statement-j;
statement-x;
statement-y;
}
else {
statement-a;
statement-b;
statement-k;
statement-x;
statement-y;
}
§ Move common statements out of the if-else construct.
statement-a;
statement-b;
if (cond) {
statement-j;
}
else {
statement-k;
}
statement-x;
statement-y;
3. Nested if and if-else Statements (1/2)
Problem Solving with Selection and Repetition Statements Unit6 - 21NUS
§ Nested if (if-else) structures refer to the containment of
an if (if-else) structure within another if (if-else) structure.
§ For example:
§ If it is a weekday, you will be in school from 8 am to 6 pm, do
revision from 6 pm to 12 midnight, and sleep from 12 midnight to
8 am.
§ If it is a weekend, then you will sleep from 12 midnight to 10 am
and have fun from 10 am to 12 midnight.
3. Nested if and if-else Statements (2/2)
Problem Solving with Selection and Repetition Statements Unit6 - 22NUS
§ Drawing task in Unit 5
int main(void) {
draw_rocket();
printf("\n\n");
draw_male();
printf("\n\n");
draw_female();
printf("\n\n");
return 0;
}
§ Draw only 1 figure
int main(void) {
char resp;
printf("(R)ocket, ");
printf("(M)ale, or ");
printf("(F)emale? ");
scanf("%c", &resp);
if (resp == 'R')
draw_rocket();
else if (resp == 'M')
draw_male();
else if (resp == 'F')
draw_female();
return 0;
}
4. Style Issues: Indentation (1/6)
Problem Solving with Selection and Repetition Statements Unit6 - 23NUS
§ Once we write non-sequential control structures, we need
to pay attention to indentation.
Acceptable
if (cond) {
statements;
}
else {
statements;
}
if (cond)
{
statements;
}
else
{
statements;
}
if (cond) {
statements;
} else {
statements;
}
Non-acceptable
if (cond)
{
statements;
}
else
{
statements;
}
if (cond) {
statements; }
else {
statements; }
No indentation!
Closing braces
not aligned with
if/else keyword!
Do you
remember which
vim command to
auto-indent your
program?
4. Style Issues: Indentation (2/6)
Problem Solving with Selection and Repetition Statements Unit6 - 24NUS
§ Note that appropriate indentation of comments is just as
important.
Correct
// Comment on the whole if
// construct should be aligned with
// the ‘if’ keyword
if (cond) {
// Comment on the statements in
// this block should be aligned
// with the statements below
statements;
}
else {
// Likewise, comment for this
// block should be indented
// like this
statements;
}
Incorrect
// Compute the fare
if (cond) {
// For peak hours
statements;
}
else {
// For non-peak hours
statements;
}
NUS Problem Solving with Selection and Repetition Statements Unit6 - 25
4. Style Issues: Indentation (3/6)
Problem Solving with Selection and Repetition Statements Unit6 - 26NUS
§ Sometimes we may have a deeply nested if-else-if
construct:
int marks;
char grade;
. . .
if (marks >= 90)
grade = 'A';
else
if (marks >= 75)
grade = 'B';
else
if (marks >= 60)
grade = 'C';
else
if (marks >= 50)
grade = 'D';
else
grade = 'F';
§ This follows the
indentation guideline, but
in this case the code
tends to be long and it
skews too much to the
right.
4. Style Issues: Indentation (4/6)
Problem Solving with Selection and Repetition Statements Unit6 - 27NUS
§ Alternative (and preferred) indentation style for deeply
nested if-else-if construct:
int marks;
char grade;
. . .
if (marks >= 90)
grade = 'A';
else
if (marks >= 75)
grade = 'B';
else
if (marks >= 60)
grade = 'C';
else
if (marks >= 50)
grade = 'D';
else
grade = 'F';
Alternative style
int marks;
char grade;
. . .
if (marks >= 90)
grade = 'A';
else if (marks >= 75)
grade = 'B';
else if (marks >= 60)
grade = 'C';
else if (marks >= 50)
grade = 'D';
else
grade = 'F';
NUS Problem Solving with Selection and Repetition Statements Unit6 - 28
4. Style Issues: Naming ‘booleanvariables (5/6)
Problem Solving with Selection and Repetition Statements Unit6 - 29NUS
§ Here, boolean variables refer to int variables which are
used to hold 1 or 0 to represent true or false respectively.
§ These are also known as boolean flags.
§ To improve readability, boolean flags should be given
descriptive names just like any other variables.
§ In general, add suffices such as “is” or “has” to names of
boolean flags (instead of just calling them “flag”!)
§ Example: isEven, isPrime, hasError, hasDuplicates
int isEven, num;
. . .
if (num % 2 == 0)
isEven = 1;
else
isEven = 0;
4. Style Issues: Removing ‘if (6/6)
Problem Solving with Selection and Repetition Statements Unit6 - 30NUS
§ The following code pattern is commonly encountered:
int isEven, num;
. . .
if (num % 2 == 0)
isEven = 1;
else
isEven = 0;
§ In this case, the if statement can be rewritten into a single
assignment statement, since (num % 2 == 0) evaluates to
either 0 or 1.
§ Such coding style is common and the code is shorter.
int isEven, num;
. . .
isEven = (num % 2 == 0);
5. Common Errors (1/2)
Problem Solving with Selection and Repetition Statements Unit6 - 31NUS
§ The code fragments below contain some very common
errors. One is caught by the compiler but the other is not
(which makes it very hard to detect). Spot the errors.
int a = 3;
if (a > 10);
printf("a is larger than 10\n");
printf("Next line.\n");
Unit6_CommonErrors1.c
int a = 3;
if (a > 10);
printf("a is larger than 10\n");
else
printf("a is not larger than 10\n");
printf("Next line.\n");
Unit6_CommonErrors2.c
5. Common Errors (2/2)
Problem Solving with Selection and Repetition Statements Unit6 - 32NUS
§ Proper indentation is important. In the following code, the
indentation does not convey the intended purpose of the
code. Why? Which if is the else matched to?
int a, b;
. . .
if (a > 10)
if (b < 9)
printf("Hello\n");
else
printf("Goodbye\n");
Unit6_CommonErrors3.c
int a, b;
. . .
if (a > 10)
if (b < 9)
printf("Hello\n");
else
printf("Goodbye\n");
Same as
Use braces if you want to
make it more readable:
int a, b;
. . .
if (a > 10) {
if (b < 9)
printf("Hello\n");
else
printf("Goodbye\n");
}
6. The switch Statement (2/3)
Problem Solving with Selection and Repetition Statements Unit6 - 33NUS
§ Write a program that reads in a 6-digit zip code and uses
its first digit to print the associated geographic area.
If zip code
begins with
Print this message
0, 2 or 3
<zip code> is on the East Coast.
4
– 6
<zip code>
is in the Central Plains.
7
<zip
code> is in the South.
8 or 9
<zip code> is in the West.
others
<zip code> is invalid.
What if there is one input but a lot of
choices?
int n;
/* some code to put the first digit of the zip
code into n. */
if (n == 0)
/* do first choice */
else if (n == 2)
/* do first choice */
else if (n == 3)
/* do second choice */
else if (n == 9)
/* sian. */
NUS Problem Solving with Selection and Repetition Statements Unit6 - 34
6. The switch Statement (1/3)
Problem Solving with Selection and Repetition Statements Unit6 - 35NUS
§ An alternative to if-else-if is to use the switch statement.
§ Restriction: Value must be of discrete type (eg: int, char)
switch ( <variable or expression> ) {
case value1:
Code to execute if <variable or expr> == value1
break;
case value2:
Code to execute if <variable or expr> == value2
break;
...
default:
Code to execute if <variable or expr> does not
equal to the value of any of the cases above
break;
}
6. The switch Statement (3/3)
Problem Solving with Selection and Repetition Statements Unit6 - 36NUS
#include <stdio.h>
int main(void) {
int zip;
printf("Enter a 6-digit ZIP code: ");
scanf("%d", &zip);
switch (zip/100000) {
case 0: case 2: case 3:
printf("%06d is on the East Coast.\n", zip);
break;
case 4: case 5: case 6:
printf("%d is in the Central Plains.\n", zip);
break;
case 7:
printf("%d is in the South.\n", zip);
break;
case 8: case 9:
printf("%d is in the West.\n", zip);
break;
default:
printf("%d is invalid.\n", zip);
} // end switch
return 0;
}
Unit6_ZipCode.c
7. Testing and Debugging (1/3)
Problem Solving with Selection and Repetition Statements Unit6 - 37NUS
§ Finding the maximum value among 3 variables:
§ What is wrong with the code? Did you test it with the correct test
data?
§ What test data would expose the flaw of the code?
§ How do you correct the code?
§ After correcting the code, would replacing the 3 if statements with a
nested if-else statement work? If it works, which method is better?
// Returns largest among num1, num2, num3
int getMax(int num1, int num2, int num3) {
int max = 0;
if ((num1 > num2) && (num1 > num3))
max = num1;
if ((num2 > num1) && (num2 > num3))
max = num2;
if ((num3 > num1) && (num3 > num2))
max = num3;
return max;
}
Unit6_FindMax_v1.c
7. Testing and Debugging (2/3)
Problem Solving with Selection and Repetition Statements Unit6 - 38NUS
§ With selection structures (and next time, repetition structures), you
are now open to many alternative ways of solving a problem.
§ Alternative approach to finding maximum among 3 values:
// Returns largest among num1, num2, num3
int getMax(int num1, int num2, int num3) {
int max = 0;
if (num1 > max)
max = num1;
else if (num2 > max)
max = num2;
else if (num3 > max)
max = num3;
return max;
}
Unit6_FindMax_v2.c
§ What is wrong with this code? (There are more than one error.)
§ What test data should you use to expose its flaw?
7. Testing and Debugging (3/3)
Problem Solving with Selection and Repetition Statements Unit6 - 39NUS
§ The preceding examples will be discussed in class.
§ Remember: Test your programs thoroughly with your own
data.
Do NOT rely on
CodeCrunch to test your
programs!
Repetition
NUS Problem Solving with Selection and Repetition Statements Unit6 - 41
Each round of the
loop is called an
iteration.
8. The while Loop
while ( condition )
{
// loop body
}
con d?
Loop
body
true
false
Braces { } are optional only if there is one statement
in the block. But for beginners, we recommended
writing braces even if there is one statement.
If condition is true,
execute loop body;
otherwise, terminate
loop.
while (the enemy does not make a deal) {
Go back time
}
NUS Problem Solving with Selection and Repetition Statements Unit6 - 42
NUS Problem Solving with Selection and Repetition Statements Unit6 - 43
8.1 The while Loop: Demo (1/3)
§ Keep prompting the
user to input a non-
negative integer, and
print that integer.
§ Halt the loop when
the input is negative.
§ Print the maximum
integer input.
Enter a number: 12
Enter a number: 0
Enter a number: 26
Enter a number: 5
Enter a number: -1
The maximum number is 26
NUS Problem Solving with Selection and Repetition Statements Unit6 - 44
8.1 The while Loop: Demo (2/3)
maxi = 0;
read num;
while (num >= 0) {
if (maxi < num)
maxi = num;
read num;
}
print maxi;
maxi = 0;
read num;
if (num >= 0) {
if (maxi < num)
maxi = num;
read num;
}
else stop;
if (num >= 0) {
if (maxi < num)
maxi = num;
read num;
}
else stop;
...
print maxi;
NUS Problem Solving with Selection and Repetition Statements Unit6 - 45
8.1 The while Loop: Demo (3/3)
#include <stdio.h>
int main(void) {
int num, maxi = 0;
printf("Enter a number: ");
scanf("%d", &num);
while (num >= 0) {
if (maxi < num) {
maxi = num;
}
printf("Enter a number: ");
scanf("%d", &num);
}
printf("The maximum number is %d\n", maxi);
return 0;
}
Unit6_FindMax.c
NUS Problem Solving with Selection and Repetition Statements Unit6 - 46
8.2 Condition for while Loop
§ When the loop condition is
always false, the loop body is
not executed.
Output: ?
// pseudo-code
a = 2;
b = 7;
while (a == b) {
print a;
a = a + 2;
}
§ When the loop condition is always true, the loop body is
executed forever infinite loop.
Output: ?
// pseudo-code
a = 2;
b = 7;
while (a != b) {
print a;
a = a + 2;
}
2
4
6
8
10
:
Press ctrl-c
to interrupt
NUS Problem Solving with Selection and Repetition Statements Unit6 - 47
8.3 Style: Indentation for while Loop
§ Loop body must be indented.
§ Comment in loop body must be aligned with statements in loop
body.
§ Closing brace must be on a line by itself and aligned with the while
keyword.
while (cond) {
// loop body
statement-1;
statement-2;
...
}
or
while (cond)
{
// loop body
statement-1;
statement-2;
...
}
while (cond) {
// loop body
statement-1;
...
}
No indentation!
while (cond) {
// loop body
statement-1;
statement-2; }
NUS Problem Solving with Selection and Repetition Statements Unit6 - 48
9. The do-while Loop (1/3)
do
{
// loop body
} while ( condition );
Execute loop body
at least once.
con d?
Loop
body
true
false
NUS Problem Solving with Selection and Repetition Statements Unit6 - 49
9. The do-while Loop (2/3)
§ Example: Count the number
of digits in an integer.
do
{
// loop body
} while ( condition );
// Precond: n > 0
int count_digits(int n) {
int count = 0;
do {
count++;
n = n/10;
} while (n > 0);
return count;
}
Unit6_CountDigits.c
n count
395 0
39 1
3 2
0 3
Assume that n is passed
the value 395:
NUS Problem Solving with Selection and Repetition Statements Unit6 - 50
9. The do-while Loop (3/3)
§ Style: similar to while loop
do {
// loop body
statement-1;
statement-2;
} while (cond);
or
do
{
// loop body
statement-1;
statement-2;
} while (cond);
do {
// loop body
statement-1;
statement-2;
} while (cond);
No indentation!
NUS Problem Solving with Selection and Repetition Statements Unit6 - 51
9. The do-while Loop: Exercise
Its time to practise Computational Thinking again!
§ Add the digits in a positive integer.
§ Eg: 395 à 17
// Precond: n > 0
int count_digits(int n) {
int count = 0;
do {
count++;
n = n/10;
} while (n > 0);
return count;
}
// Precond: n > 0
int add_digits(int n) {
int sum = 0;
return sum;
}
do {
sum = sum + n%10;
n = n/10;
} while (n > 0);
Which concept in Computational
Thinking is employed here?
NUS Problem Solving with Selection and Repetition Statements Unit6 - 52
A Very Common Pattern of while-loop
#include <stdio.h>
int main(void) {
int num, maxi = 0;
printf("Enter a number: ");
scanf("%d", &num);
while (num >= 0) {
if (maxi < num) {
maxi = num;
}
printf("Enter a number: ");
scanf("%d", &num);
}
printf("The maximum number is %d\n", maxi);
return 0;
}
Unit6_FindMax.c
Check
condition
Initialise
Condition
Update
Condition
NUS Problem Solving with Selection and Repetition Statements Unit6 - 53
10. The for Loop (1/2)
for ( initialization; condition; update )
{
// loop body
}
Initialization:
initialize the
loop variable
Condition: repeat loop
while the condition on
loop variable is true
Update: change
value of loop
variable
NUS Problem Solving with Selection and Repetition Statements Unit6 - 54
10. The for Loop (2/2)
§ Example: Print numbers 1 to 10
int n;
for (n=1; n<=10; n++) {
printf("%3d", n);
}
Steps:
1.n=1;
2.if (n<=10) {
printf(…);
n++;
Go to step 2
}
3. Exit the loop
Equivalent to
int n=1;
while ( n <= 10) {
printf("%3d", n);
n++;
}
NUS Problem Solving with Selection and Repetition Statements Unit6 - 55
10. The for Loop (2/2)
§ Example: Print numbers 1 to 10
int n;
for ( A ; B ; C) {
do something
}
Equivalent to
A;
while ( B ) {
do something;
C;
}
A, B, and C are three
statements
NUS Problem Solving with Selection and Repetition Statements Unit6 - 56
10.1 The for Loop: Odd Integers (1/3)
#include <stdio.h>
void print_odd_integers(int);
int main(void) {
int num;
printf("Enter a positive integer: ");
scanf("%d", &num);
print_odd_integers(num);
return 0;
}
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i+=2)
printf("%d ", i);
printf("\n");
}
Unit6_OddIntegers_v1.c
print_odd_integers(12)
1 3 5 7 9 11
NUS Problem Solving with Selection and Repetition Statements Unit6 - 57
10.1 The for Loop: Odd Integers (2/3)
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i++)
if (i%2 != 0)
printf("%d ", i);
printf("\n");
}
Unit6_OddIntegers_v2.c
// Precond: n > 0
void print_odd_integers(int n) {
for ( ; n > 0; n--)
if (n%2 != 0)
printf("%d ", n);
printf("\n");
}
Unit6_OddIntegers_v3.c
Values printed from
largest to smallest.
Empty
statement
print_odd_integers(12)
1 3 5 7 9 11
print_odd_integers(12)
11 9 7 5 3 1
NUS Problem Solving with Selection and Repetition Statements Unit6 - 58
10.1 The for Loop: Odd Integers (3/3)
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i++)
if (i%2 != 0)
printf("%d ", i);
printf("\n");
}
Unit6_OddIntegers_v2.c
// Precond: n > 0
void print_odd_integers(int n) {
int i;
for (i=1; i<=n; i+=2)
printf("%d ", i);
printf("\n");
}
Unit6_OddIntegers_v1.c
Which is better?
NUS Problem Solving with Selection and Repetition Statements Unit6 - 59
11. Common Errors (1/2)
§ What are the outputs for the following programs? (Do
not code and run them. Trace the programs manually.)
int i;
for (i=0; i<10; i++);
printf("%d\n", i);
Unit6_CommonErrors4.c
int i = 0;
while (i<10);
{
printf("%d\n", i);
i++;
}
Unit6_CommonErrors5.c
NUS Problem Solving with Selection and Repetition Statements Unit6 - 60
11. Common Errors (2/2)
§ Off-by-one error; make sure the loop repeats exactly
the correct number of iterations.
§ Make sure the loop body contains a statement that
will eventually cause the loop to terminate.
§ Common mistake: Using =’ where it should be ==’
§ Common mistake: Putting ‘;’ where it should not be
(just like for the if statement)
int z = 3;
while (z = 1) {
printf("z = %d\n", z);
z = 99;
}
Unit6_CommonErrors6.c
NUS Problem Solving with Selection and Repetition Statements Unit6 - 61
12. Some Notes of Caution (1/2)
§ Involving real numbers
§ Trace the program manually without running it.
double one_seventh = 1.0/7.0;
double f = 0.0;
while (f != 1.0) {
printf("%f\n", f);
f += one_seventh;
}
Unit6_Caution1.c
Expected output:
0.000000
0.142857
0.285714
0.428571
0.571429
9.714286
0.857143
1.000000
NUS Problem Solving with Selection and Repetition Statements Unit6 - 62
12. Some Notes of Caution (2/2)
§ Involving ‘wrap-around’
§ Trace the program manually without running it.
int a = 2147483646;
int i;
for (i=1; i<=5; i++) {
printf("%d\n", a);
a++;
}
Unit6_Caution2.c
Expected output:
2147483646
2147483647
2147483648
2147483649
2147483650
NUS Problem Solving with Selection and Repetition Statements Unit6 - 63
13. Using break in Loop (1/3)
§ break is used in switch statement
§ It can also be used in a loop
// without 'break'
printf ("Without 'break':\n");
for (i=1; i<=5; i++) {
printf("%d\n", i);
printf("Ya\n");
}
// with 'break'
printf ("With 'break':\n");
for (i=1; i<=5; i++) {
printf("%d\n", i);
if (i==3)
break;
printf("Ya\n");
}
Without 'break':
1
Ya
2
Ya
3
Ya
4
Ya
5
Ya
With 'break':
1
Ya
2
Ya
3
Unit6_BreakInLoop.c
NUS Problem Solving with Selection and Repetition Statements Unit6 - 64
13. Using break in Loop (2/3)
Unit6_BreakInLoop.c
// with 'break' in a nested loop
printf("With 'break' in a nested loop:\n");
for (i=1; i<=3; i++) {
for (j=1; j<=5; j++) {
printf("%d, %d\n", i, j);
if (j==3)
break;
printf("Ya\n");
}
}
With 'break’ in …
1, 1
Ya
1, 2
Ya
1, 3
2, 1
Ya
2, 2
Ya
2, 3
3, 1
Ya
3, 2
Ya
3, 3
§ In a nested loop, break only breaks
out of the inner-most loop that
contains the break statement.
NUS Problem Solving with Selection and Repetition Statements Unit6 - 65
13. Using break in Loop (3/3)
§ Use break sparingly, because it violates the one-entry-one-
exit control flow.
§ A loop with break can be rewritten into one without break.
// with break
int n, i = 1, sum = 0;
while (i <= 5) {
scanf("%d", &n);
if (n < 0)
break;
sum += n;
i++;
}
// without break
int n, i = 1, sum = 0;
int isValid = 1;
while ((i <= 5) && isValid){
scanf("%d", &n);
if (n < 0)
isValid = 0;
else {
sum += n;
i++;
}
}
NUS Problem Solving with Selection and Repetition Statements Unit6 - 66
14. Using continue in Loop (1/2)
§ continue is used even less often than break
§ Test out Unit6_ContinueInLoop.c
// without 'continue'
printf ("Without 'continue':\n");
for (i=1; i<=5; i++) {
printf("%d\n", i);
printf("Ya\n");
}
Without 'continue':
1
Ya
2
Ya
3
Ya
4
Ya
5
Ya
// with 'continue'
printf ("With 'continue':\n");
for (i=1; i<=5; i++) {
printf("%d\n", i);
if (i==3)
continue;
printf("Ya\n");
}
With 'continue':
1
Ya
2
Ya
3
4
Ya
5
Ya
The rest of the loop
body is skipped if
(i==3), and it continues
to the next iteration.
NUS Problem Solving with Selection and Repetition Statements Unit6 - 67
14. Using continue in Loop (2/2)
// with 'continue' in a nested loop
printf("With 'continue' in a nested loop:\n");
for (i=1; i<=3; i++) {
for (j=1; j<=5; j++) {
printf("%d, %d\n", i, j);
if (j==3)
continue;
printf("Ya\n");
}
}
With ...
1, 1
Ya
1, 2
Ya
1, 3
1, 4
Ya
1, 5
Ya
2, 1
Ya
2, 2
Ya
2, 3
2, 4
Ya
2, 5
Ya
3, 1
Ya
3, 2
Ya
3, 3
3, 4
Ya
3, 5
Ya
§ In a nested loop, continue only skips
to the next iteration of the inner-
most loop that contains the continue
statement.
Summary
Problem Solving with Selection and Repetition Statements Unit6 - 68NUS
n In this unit, you have learned about
n The use of if-else construct and switch construct to
alter program flow (selection statements)
n The use of relational and logical operators in the
condition
n The use of while, do-while and for loop constructs to
repeat a segment of code (repetition statements)
n The use of break and continue in a loop
End of File
Problem Solving with Selection and Repetition Statements Unit6 - 69NUS