chapter 3: control flow s. m. farhad. statements and blocks an expression becomes a statement when...
TRANSCRIPT
Chapter 3: Control Flow
S. M. Farhad
Statements and Blocks
An expression becomes a statement when it is followed by a semicolon
Braces { and } are used to group declarations and statements together into a compound statement or block
A block is syntactically equivalent to a single statement
Variables can be declared inside any block There is no semicolon after the right brace that ends
a block
if-else
The if-else statement is used to express decisions
Formally the syntax is
if (expression)
statement1
else
statement2
The else part is optional
if-else Contd.
The statement1 is executed if expression is true (having a non-zero value)
The statement2 is executed if expression is false (having a zero value)
Since if simply tests the numeric value of an expression coding shortcuts are possible
“if (expression)” and “if (expression != 0)” have the same results
if-else Contd. Dangling else problem
z = c;if (n > 0)
if (a > b)z = a;
elsez = b;
As the else part of an if-else is optional, there is an ambiguity when an else is omitted from a nested if sequence
This is resolved by associating the else with the closest previous else-less if
It is good idea to use braces when there are nested ifs.
else-if
if (expression)statement
else if (expression)statement
else if (expression)statement
elsestatement
The last else part handles the “none of the above” or default case (optional)
Binary Search
If a particular value x occurs in the sorted array v
The elements of v must be in increasing order
The function returns the position if x occurs in v, and -1 if not
Binary Search Step 1int binsearch(int x, int v[ ], int n){
int low, high, mid;low = 0;high = n -1;while(low <= high){
mid = (low + high)/2;if (x < v[mid])
high = mid – 1;else if(x > v[mid])
low = mid + 1;else return mid;
}return -1;
}
1 2 3 4 5
1 2 3 40
x = 4
low = 0, high = 5 – 1 = 4
Binary Search Step 1int binsearch(int x, int v[ ], int n){
int low, high, mid;low = 0;high = n -1;while(low <= high){
mid = (low + high)/2;if (x < v[mid])
high = mid – 1;else if(x > v[mid])
low = mid + 1;else return mid;
}return -1;
}
1 2 3 4 5
1 2 3 40
low = 0, high = 4
mid = (0 + 4) / 2 = 2
x = 4 > v[2] = 3
low = 2 + 1 = 3
3
Binary Search Step 1int binsearch(int x, int v[ ], int n){
int low, high, mid;low = 0;high = n -1;while(low <= high){
mid = (low + high)/2;if (x < v[mid])
high = mid – 1;else if(x > v[mid])
low = mid + 1;else return mid;
}return -1;
}
1 2 3 4 5
1 2 3 40
low = 3, high = 4
mid = (3 + 4) / 2 = 3
x = 4 = v[3]
return 3
4
Switch
The switch statement is a multi-way decision that tests whether an expression matches one of a number of constant integer valuesswitch (expression){
case const-expr: statementscase const-expr: statementsdefault: statements
} All case expressions must be different Default is executed if none of the cases match A default is optional
Switch Contd.
The break statement causes an immediate exit from the switch
Falling through cases is a mixed blessing Falling through one case to another is not robust Put a break after the last case even though it is
unnecessary A number is n, if n is even then show the number is
even if n is odd then show the number is odd
Loops-While and For
for(expr1; expr3; expr3)
statement
is equivalent to
expr1;
while (expr2) {
statement
expr3;
}
Loops-While and For
Although equivalent the syntax of while is
while (expr)
stmt
What We Practice
If-else
if (expression){
statement1
}
else{
statement2
} Similarly else-if
What We Practice Contd.
Loops
for(expr1; expr3; expr3) {
statement
}
while (expr) {
statement
}
Loops-While and For Contd.
While is most natural when there is no initialization or re-initialization
For is preferable there is a simple initialization and increment Since it keeps the loop control stmts close together and
visible at the top of the loop The index and limit of a C for loop can be altered from
within the loop The index variable retains its value when the loop
terminates any reason The for loop is not restricted to arithmetic progressions It is bad style to force unrelated computations into the
initialization and increment portion
int atoi(char s[ ]) convert s to integerint atoi(char s[ ]){
int i, n, sign;for(i = 0; isspace(s[i]); i++)
; /* skip white space */sign = (s[i] == ‘-’) ? -1 : 1;if(s[i] == ‘+’ || s[i] == ‘-’)
i++; /* skip sign */for(n = 0; isdigit(s[i]); i++)
n = 10 * n + (s[i] – ‘0’);return sign * n;
}
- 3 4 5
0 1 2 3 4
\0
5i
n = 10*0 + (51 – 48)
= 3
int atoi(char s[ ]) convert s to integerint atoi(char s[ ]){
int I, n, sign;for(i = 0; isspace(s[i]); i++)
; /* skip white space */sign = (s[i] == ‘-’) ? -1 : 1;if(s[i] == ‘+’ || s[i] == ‘-’)
i++; /* skip sign */for(n = 0; isdigit(s[i]); i++)
n = 10 * n + (s[i] – ‘0’);return sign * n;
}
- 3 4 5
0 1 2 3 4
\0
5i
n = 10*3 + (52 – 48)
= 34
int atoi(char s[ ]) convert s to integerint atoi(char s[ ]){
int I, n, sign;for(i = 0; isspace(s[i]); i++)
; /* skip white space */sign = (s[i] == ‘-’) ? -1 : 1;if(s[i] == ‘+’ || s[i] == ‘-’)
i++; /* skip sign */for(n = 0; isdigit(s[i]); i++)
n = 10 * n + (s[i] – ‘0’);return sign * n;
}
- 3 4 5
0 1 2 3 4
\0
5i
n = 10*34 + (53 – 48)
= 345
Nested Loop: Bubble Sort
void bubble(int s[ ], n){int i, j, temp;for(i = 1; i < n; i++)
for(j = n - 1; j >= i; j--)if(s[j-1] > s[j]){
temp = s[j-1];s[j-1] = s[j];s[j] = temp;
}}
8 2 5 4 1
1 2 3 40
Nested Loop: Bubble Sort Contd.void bubble(int s[ ], n){
int i, j, temp;for(i = 1; i < n; i++)
for(j = n - 1; j >= i; j--)if(s[j-1] > s[j]){
temp = s[j-1];s[j-1] = s[j];s[j] = temp;
}}
8 2 5 1 4
1 2 3 40
Nested Loop: Bubble Sort Contd.void bubble(int s[ ], n){
int i, j, temp;for(i = 1; i < n; i++)
for(j = n - 1; j >= i; j--)if(s[j-1] > s[j]){
temp = s[j-1];s[j-1] = s[j];s[j] = temp;
}}
8 2 1 5 4
1 2 3 40
Nested Loop: Bubble Sort Contd.void bubble(int s[ ], n){
int i, j, temp;for(i = 1; i < n; i++)
for(j = n - 1; j >= i; j--)if(s[j-1] > s[j]){
temp = s[j-1];s[j-1] = s[j];s[j] = temp;
}}
8 1 2 5 4
1 2 3 40
Nested Loop: Bubble Sort Contd.void bubble(int s[ ], n){
int i, j, temp;for(i = 1; i < n; i++)
for(j = n - 1; j >= i; j--)if(s[j-1] > s[j]){
temp = s[j-1];s[j-1] = s[j];s[j] = temp;
}}
1 8 2 5 4
1 2 3 40
Try Outputvoid pyramid(int n){
int i, j, k;for(i = 0; i < n; i++){
for(j = 0; j < (n - i); j++ ){printf(" "); // space
}for(k = 0, j = i + 1; k <= i; j++, k++){
printf("%d ", j % 10); //1st side of a row}for(k = 0, j -= 2; k < i; j--, k++){
printf("%d ", j % 10); //2nd side of a row}printf("\n");
}} Run
Loops--Do-while
The syntaxdo
stmtwhile (exp);
Tests the termination condition at the bottom after making each pass through the loop body
The body is always executed at least once The sequence of execution
Loops--Do-while Contd.
Do-while is much less used than while and for
From time to time it is valuable Itoa function
Itoa: convert n to string s
void itoa (int n, char s[ ]){if ((sign = n) < 0)
n = -n; /* make it positive */i = 0;do{
s [i++] = n % 10; + ‘0’;} while ((n /= 10) > 0);if (sign < 0) s [i++] = ‘-’;s [i] = ‘\0’;reverse (s);
}
Re write the do-while loop using while loop so that Integrity is
same
Menu OptionCorrection
Break and Continue
It is sometimes convenient to be able to exit from a loop other than by testing at the top or bottom
break statement provides an early exit from for, while, and do, just as from switch
A break causes the innermost enclosing loop or switch to be exited immediately
The function “trim” removes the trailing blanks, tabs, and new lines from the end of a string
Trim: remove trailing blanks, tabs, newlinesint trim (char s [ ]){
int n;
for (n = strlen (s) – 1; n >= 0; n--)
if (s [n] != ‘ ‘ && s [n] = ‘\t’ && s [n] != ‘\n’)
break;
s [n + 1] = ‘\0’;
return n;
}
Returns the length ofThe string s
Breaks the loop when any char other than
white spaces
Breaks the loop when any char other than
white spaces
When the entire string has been scanned
Continue Statement
It is related to break statement but less often used
It causes the next iteration of the enclosing for, while, or do loop to begin
In the case of while and do, this means that the test part is executed immediately
In the for, control passes to the increment step The continue statement applies only to loops,
not to switch
An Example with continue
The following fragment processes only the
non-negative elements in the array a;
negative values are skipped
for (i = 0; i < n; i++){
if (a[i] < 0)
continue;/* skip negative elements */
..... /* do positive elements */
}
What is the output?
for (i = 1; i < 5; i++){
for (j = 1; i < 5; j++){
if (i == j) break;
printf(“%d %d”, i, j);
}
printf (“\n”)
}
What is the output? With
Answerfor (i = 1; i < 5; i++){
for (j = 1; i < 5; j++){
if (i == j) break;
printf(“%d %d”, i, j);
}
printf (“\n”)
}
1 1
2 1 2 2
3 1 3 2 3 3
4 1 4 2 4 3 4 4
What is the output?
for (i = 1, x= 0; i <= 4; i++){
for (j = 1; i <= 3; j++){
if (i == j) continue;
printf (“i = %d j = %d,”, i, j);
x = x + i +j;
}
printf (“\nx = %d”, x);
}
printf (“\nx = %d”, x);
What is the output?
for (i = 1, x= 0; i <= 4; i++){
for (j = 1; i <= 3; j++){
if (i == j) continue;
printf (“i = %d j = %d,”, i, j);
x = x + i +j;
}
printf (“\nx = %d”, x);
}
printf (“\nx = %d”, x);
i=1 j=2, i=1 j=3
x = 7
i=2 j=1, i=2 j=3
x = 15
i=3 j=1, i=3 j=2
x = 24
...
Goto and Labels
C provides infinitely-abusable goto statement
and labels to branch to
Formally, the goto is never necessary
In practice, it is always easy to write code
without it
We will not allow to use goto statement to
used in our lab assignments
Goto and Labels Contd.
Nevertheless, there are a few situations where gotos
may find a place
The most common is to abandon processing in some
deeply nested structure
Breaking out of two or more loops at once
Code that relies on got statements is generally harder
to understand and to maintain than cod e without
gotos
Goto and Labels Contd.
for ( .. )
for ( .. ) {
…
if (disaster)
goto error;
}
...
error:
/* clean up the mess */
Goto and Labels Contd. As another example, consider the problem of
determining whether two arrays a and b have an element in common
for (i = 0, i < n; i++)
for (j = 0, j < m; j++)
if (a [i] == b [j])
goto found;
found: ...
The End of Chapter 3
Any Question?