420 likes | 519 Views
S. M. Farhad. Chapter 3: Control Flow. 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
E N D
S. M. Farhad Chapter 3: Control Flow
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; else z = 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 else statement • 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 1 0 1 2 3 4 1 2 3 4 5 int 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; } x = 4 low = 0, high = 5 – 1 = 4
Binary Search Step 1 0 1 2 3 4 1 2 3 4 5 > v[2] = 3 x = 4 int 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; } 3 low = 0, high = 4 mid = (0 + 4) / 2 = 2 low = 2 + 1 = 3
Binary Search Step 1 = v[3] x = 4 int 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; } 0 1 2 3 4 1 2 3 4 4 5 low = 3, high = 4 mid = (3 + 4) / 2 = 3 return 3
Switch • The switch statement is a multi-way decision that tests whether an expression matches one of a number of constant integer values switch (expression){ case const-expr: statements case const-expr: statements default: 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 integer i 0 1 2 3 4 5 n = 10*0 + (51 – 48) = 3 int 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
int atoi(char s[ ]) convert s to integer i 0 1 2 3 4 5 n = 10*3 + (52 – 48) = 34 int 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
int atoi(char s[ ]) convert s to integer i 0 1 2 3 4 5 n = 10*34 + (53 – 48) = 345 int 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
Nested Loop: Bubble Sort 0 1 2 3 4 8 2 5 4 1 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; } }
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; } } 0 1 2 3 4 8 2 5 1 4
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; } } 0 1 2 3 4 8 2 1 5 4
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; } } 0 1 2 3 4 8 1 2 5 4
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; } } 0 1 2 3 4 1 8 2 5 4
Try Output void 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 syntax do stmt while (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 Re write the do-while loop using while loop so that Integrity is same 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); } Menu Option Correction
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, newlines Returns the length of The string s When the entire string has been scanned int 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; } Breaks the loop when any char other than white spaces Breaks the loop when any char other than white spaces
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 Answer for (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?