1 Flow of Control True and False in C Conditional Execution Iteration Nested Code(Nested-ifs, Nested-loops) Jumps
1
Flow of Control
True and False in C
Conditional Execution
Iteration
Nested Code(Nested-ifs, Nested-loops)
Jumps
2
True and False in C• False is represented by any zero value.
– The int expression having the value 0.– The floating expression having the value 0.0.– The null character ‘\0’.– The NULL pointer (for pointer see chap. 8).
• True is represented by any nonzero value.
A logical expression, such as a<b, is either true or false.– This expression yields the int value 1 if it is
true or the int value 0 if it is false.
3
Examplesint i=1, j=2, k=3;
double x=5.5, y=7.7, z=0.0;
i<j-k i<(j-k) 0
-i+5*j>=k+1 ((-i)+(5*j))>=(k+1) 1
x-y<=j-k-1 (x-y)<=((j-k)-1) 1
x+k+7<y/k ((x+k)+7)<(y/k) 0
i!=j 1
!!5 !(!5) 1
!i-j+4 ((!i)-j)+4 2
x||i&&j-2 x||(i&&(j-2)) 1
4
Selection
• if
• switch
5
if statement• Conditional Execution:
if (Boolean expression) statement; else statement;
Where a statement may consist of a single statement, a code block, or empty statement.
The else clause is optional.
6
if – logic: if (Boolean Expression)
statement_1;
If-else-logic: if (Boolean Expression){
compound_1
}
else{
compound_2
};
• Conditional execution allows you write
code that reacts to tested conditions.
No Semi-colon
Yes-For a
Semi-colon
7
Example
#include <stdio.h>
int main ( )
{
double salary, payrate;
int hours, union;
printf (“Please enter hours worked, payrate”,
“ and union status”);
8
printf (“Enter 1 if a union member, 0 if not”);
scanf (“%d%lf%d”, &hours, &payrate, &union);
if (hours > 40 && union = = 1)
salary = (40 * payrate) + ((1.5 * payrate) * (hours
- 40));
else
salary = payrate * hours;
printf (“Salary is: $ % 6.2 f”, salary);
}
9
Nested ifsNested: One statement coded within
another statement.
Nested ifs: An nested if is an if that is the target of another if or else.
Why Nested ifs? A simple - if and if - else statement are used to
handle 2-choice tasks. Nested ifs: Needed to handle tasks
where we have 3 or More options that are mutually exclusive.
ANSI C specifies that at least 15 levels of nesting
must be supported by the compiler.
10
The if-else-if ladder
• General form: OLD STYLEif (expression) statement;
else if (expression) statement; else if (expression) statement; . . . else statement;
11
• The conditions are evaluated from the top downward.
• As soon as a true condition is found, the statement associated with it is executed and the rest of the ladder is bypassed.
• If none of the conditions are true, the final else is executed. That is, if all other conditional tests fail, the last else statement is performed.
• If the final else is not present, no action takes place if all other conditions are false.
12
E.g. You are a salesperson for the Widget Manufacturing Co. You will earn a salary bonus according to the following rules:
Sales > = $50,000 earn $5,000
Sales > = $100,000 earn $15,000
Sales > = $150,000 earn $30,000
Example
13
double sales, bonus;printf (“please enter total sales”);scanf (“%lf”, &sales);
if (sales < 50000)bonus = 0;
else if (sales < 100000)bonus = 5000;
else if (sales < 150000)bonus = 15000;
else bonus = 30000;
14
In a nested if, an else always refers to the nearest if that is within the same block as the else and that is not already associated with an else.
if(i) { if(j) dosomething1(); if(k) dosomething2(); /* this if */ else dosomething3(); /* goes with this else */ }else dosomething4(); /* associated with if(i) */
15
Conditional Expression
• The expressions must simply evaluate to either a true or false (zero or nonzero) value.
• The expressions are not restricted to involving the relational and logical operators.
16
x = 10;y = x>9 ? 100 : 200;
x = 10;
if(x>9) y = 100;
else y = 200;
The ?: Alternative
Exp1 ? Exp2: Exp3
17
#include <stdio.h>int f1(int n);int f2(void);
int main(void){ int t; printf("Enter a number: "); scanf("%d", &t); t ? f1(t) + f2() : printf("zero entered."); printf("\n"); return 0;}
18
/* Divide the first number by the second. */#include <stdio.h>
int main(void){ int a, b; printf("Enter two numbers: "); scanf(''%d%d", &a, &b); if(b) printf("%d\n", a/b); else printf("Cannot divide by zero.\n");
return 0;}
if(b != 0) printf("%d\n", a/b);
19
switch statement
• switch is a multiple-branch selection statement, which successively tests the value of an expression against a list of integer or character constants (floating point expression, for example, are not allowed).
• When a match is found, the statements associated with that constant are executed.
20
General Form
switch (expression) { case constant1: statement sequence break; case constant2: statement sequence break; . .
default statement sequence
} //ANSI C allowed at least 257 case statements.
21
Execution• The value of the expression is tested against the
constants specified in the case statements in a top-down order..
• When a match is found, the statement sequence associated with that case is executed until the break statement or the end of the switch statement is reached.
• When break is encountered in a switch, program execution "jumps" to the line of code following the switch statement.
• The default statement is executed if no matches are found.
• The default is optional.
22
• The switch differs from the if in that switch can only test for equality, whereas if can evaluate any type of relational or logical expression.
• No two case constants in the same switch can have identical values. Of course, a switch statement enclosed by an outer switch may have case constants that are in common.
• If character constants are used in the switch statement, they are automatically converted to integers (as is specified by C's type conversion rules).
23
• The switch statement is often used to process keyboard commands, such as menu selection. The following function will when called: display the options, allow the user to make a selection, and then evoke the appropriate function to perform the task selected.
void menu(void){ char ch;
printf("1. Check Spelling\n"); printf(''2. Correct Spelling Errors\n"); printf("3. Display Spelling Errors\n"); printf("Strike Any Other Key to Skip\n"); printf(" Enter your choice: "); ch = getchar(); /* read the selection from the keyboard */
24
switch(ch) { case '1': check_spelling (); break;
case '2': correct_errors (); break;
case '3': display_errors (); break;
default : printf("No option selected"); }}
25
int flag, k; /* Assume k is initialized */ flag = -1; switch(k) { case 1: /* These cases have common */ case 2: /* statement sequences. */ case 3: flag = 0; break; case 4: flag = 1; case 5: error(flag); break; default: process(k); }
•The break inside the switch is optional.
•If the break is omitted, execution will continue on into the next case until either a break or the end of the switch is reached.
26
Nested Switch
• You can have a switch as a part of the statement sequence of an outer switch.
• Even if the case constants of the inner and the outer switch contain common values, no conflict arise.
27
switch(x) { case 1: switch(y) { case 0: printf(''Divide by zero error.\n"); break; case 1:
process(x, y); break; } break; case 2: ….
28
Iteration
• Iteration statements (also called loops) allow a set of instructions to be repeatedly executed until a certain condition is reached.
• This condition may be predetermined (as in the for and while loop) or open ended (as do-while loops).
29
for loop• General form
for (initialization; testing; increment)
Loop Body;• The initialization is an assignment statement
that is used to set the loop control variable.
• The testing is a relational expression that determines when the loop exits.
• The increment defines how the loop control variable changes each time the loop is repeated.
30
Execution
• The for loop continues to execute as long as the condition is true.
• Once the condition becomes false, program execution resumes on the statement following the body of the for loop.
31
#include <stdio.h>
int main(void){ int x; for(x=1; x <= 100; x++)
printf("%d ", x);
return 0;}
for(x=100; x != 65; x -= 5) { z = x*x; printf(''The square of %d, %d", x, z);}
32
The Elements of the For-loop
• The initialization, testing and incrementation can be any valid C expression.
for (x=0; Ajax>Manchester; Ajax=Q*7/i)
• Common use as a counting loop.
for (count=0; count <n; count=count+1)
33
• Pieces of the loop definition need not be there.
• The incrementation of the loop control variable can occur outside the for statement.
for(x=0; x != 123; ) scanf("%d", &x);
for( x=1 ; x < 10; ) { printf("%d", x); ++x;}
34
The Infinite Loop• Since none of the three expressions that
form the for loop are required, you can make an endless loop by leaving the conditional expression empty.
for( ; ; ) printf("This loop will run forever.\n");
for( ; ; ) { ch = getchar(); /* get a character */ if(ch == 'A') break; /* exit the loop */}printf("you typed an A");
•Terminate the infinite loop
35
For Loops With No Bodies• A loop body may be empty.
• This fact is used to simplify the coding of certain algorithms and to create time delay loops.
• Does what?
for(t=0; t < SOME_VALUE; t++) ;
36
Declaring Variables within a For Loop
• A variable so declared has its scope limited to the block of code controlled by that statement.
/* i is local to for loop; j is known outside loop.*/int j;
for(int i = 0; i<10; i++) j = i * i;
i = 10; /*** Error ***-- i not known here! */
37
While Loop• General form:
while(condition) statement;
• Execution:– Check the test condition at the top of the loop.– The loop iterates while the condition is true. – When the condition becomes false, program control
passes to the line of code immediately following the loop.
38
Example
char wait_for_char(void){ char ch; ch = '\0'; /* initialize ch */ while(ch != 'A') ch = getchar(); return ch;}
while((ch=getchar()) != 'A') ;
39
Example 2:void func1(){int process1(void); int process2(void); int process3(void); int working; working = 1; while (working) { working = process1(); if (working) working = process2(); if (working) working = process3(); }}
40
For loop Vs While LoopA-(Assignment), T-(testing), I-(Increment)
for (A; T; I){
Body;}
A;
While (T)
{
Body;
I;
}
41
NESTED LOOPS
Nested 1 loop syntax coded inside anotherLoop syntax.
Why?- Single -Loop? Have a statement or statements that you
want to repeat. A repetitive task
that you must solve.
Why? - Nested - Loops? You have a single - repetitive task -
THAT YOU MUST REPEAT i.e., a repetition of an already repetitive task.
42
General Format:while (boolean expression){
while (boolean expression) {
}
}
You may have any combination of the 3 loop syntax inside each other. The problem dictates what combination should be used.
43
/* Find triples of integers that add up to n. */#include <stdio.h>#define N 7
main(){ int cnt = 0, j , k , m;
for(j = 0; j <= N; ++j) for( k = 0; k <= N; ++k) for( m = 0: m <= N; ++m) if ( j + k + m == N) { ++cnt; printf(“%d%d%d”, j , k , m); }
printf(“\n Count: %d\n”, cnt); }
44
How many times will “if” be executed?
512 timesj range 0 7
k range 0 7
m range 0 7
8 * 8 * 8 = 512
45
What will the values of j, k, and m be in sequence?
j k m
0 0 0
0 0 1
0 0 2
0 0 7
0 1 0
0 1 1
0 1 2
0 1 7
46
0 2 0
0 2 1
0 2 7
Cont...
.
.
.
47
do-while Loop• General form:
do { statement;
} while(condition);
• Execution:– Always executes at least once.– Iterates until condition becomes false.
do { scanf(''%d", &num);} while(num > 100);
48
•The most common use of the do-while loop is in a menu selection function.
void menu(void){ char ch; printf("1. Check Spelling\n"); printf("2. Correct Spelling Errors\n"); printf("3. Display Spelling Errors\n"); printf(" Enter your choice: ");
49
do { ch = getchar(); /* read the selection from the keyboard */ switch(ch) { case '1': check_spelling(); break; case '2': correct_errors(); break; case '3': display_errors(); break; }
} while(ch=='1' || ch=='2' || ch=='3');}
50
Jump
• break
• continue
• return (will be introduced in Ch. 4,
Functions).
51
break Statement
Two uses:You can use it to terminate a case in the switchstatement.
You can also use it to force immediate termination of a loop, bypassing the normal loop conditional test.
#include <stdio.h>
int main (void){ int t;
for(t=0; t < 100; t++) { printf(''%d ", t); if(t == 10) break; }
return 0;}0 1 2 3 4 5 6 7 8 9 10
52
•A break causes an exit from only the
innermost loop.for(t=0; t < 100; ++t) { count = 1; for(;;) { printf(''%d ", count); count++; if(count == 10) break; }}1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 …
100 times
53
Breaking out of loops
• Sometimes loops need to be cut short:– You can break out of any loop with break ;
statement.– A break will cause the loop to be aborted
immediately.– The next statement executed is the statement
following the loop.
• Compare this with return:– A return will cause a function to be aborted
immediately.– Control returns to the calling function.
54
continue Statement
• General formcontinue;
• break forces termination of the loop.
• continue forces the next iteration of the loop to take place, skipping any code in between.
55
• continue can expedite the exit from a loop by forcing the conditional test to be performed sooner.
– For the for loop, continue causes the increment and then the conditional test portions of the loop to execute.
– For the while and do-while loops, program control passes to the conditional tests.
56
void code(void){ char done, ch; done = 0; while(!done) { ch = getchar(); if(ch == ‘S') { done = 1; continue;} /* test the condition now */
putchar(ch+1); }}
This function codes a message by shifting all characters you type one letter higher. For example, an A becomes a B. The function will terminate when you type a S.