Control Statements
Control statements enable us to specify the flow of program control; ie, the order in which the instructions in a program must be executed. They make it possible to make decisions, to perform tasks repeatedly or to jump from one section of code to another.
There are four types of control statements in C:
The if-else statement is used to carry out a logical test and then take one of two possible actions depending on the outcome of the test (ie, whether the outcome is true or false).
Syntax:
if (condition)
{
statements
}
else
{
statements
}
If the condition specified in the if statement evaluates to true, the statements inside the if-block are executed and then the control gets transferred to the statement immediately after the if-block. Even if the condition is false and no else-block is present, control gets transferred to the statement immediately after the if-block.
The else part is required only if a certain sequence of instructions needs to be executed if the condition evaluates to false. It is important to note that the condition is always specified in parentheses and that it is a good practice to enclose the statements in the if block or in the else-block in braces, whether it is a single statement or a compound statement.
The following program checks whether the entered number is positive or negative.
#include<stdio.h>
int main( )
{
int a;
printf("n Enter a number:");
scanf("%d", &a);
if(a>0)
{
printf( "n The number %d is positive.",a);
}
else
{
printf("n The number %d is negative.",a);
}
return 0;
}
The following program compares two strings to check whether they are equal or not.
#include <stdio.h>
#include <string.h>
int main( )
{
char a[20] , b[20];
printf("n Enter the first string:");
scanf("%s",a);
printf("n Enter the second string:");
scanf("%s",b);
if((strcmp(a,b)==0))
{
printf("nStrings are the same");
}
else
{
printf("nStrings are different");
}
return 0;
}
The above program compares two strings to check
whether they are the same or not. The strcmp
function is used for this purpose. It is
declared in the string.h
file as:
int strcmp(const char *s1, const char *s2);
It compares the string pointed to by s1
to the string pointed
to by s2
. The strcmp
function returns an
integer greater than, equal to, or less than zero, accordingly as the
string pointed to by s1
is greater than, equal to, or less than
the string pointed to by s2
.
Therefore in the above program, if the two
strings a
and b
are
equal , the strcmp
function should return a 0. If it returns a 0, the strings
are the same; else they are different.
It is also possible to embed or to nest if-else statements one within the other. Nesting is useful in situations where one of several different courses of action need to be selected.
The general format of a nested if-else statement is:
if(condition1)
{
// statement(s);
}
else if(condition2)
{
//statement(s);
}
.
.
.
.
else if (conditionN)
{
//statement(s);
}
else
{
//statement(s);
}
The above is also called the if-else ladder. During the execution of a nested if-else statement, as soon as a condition is encountered which evaluates to true, the statements associated with that particular if-block will be executed and the remainder of the nested if-else statements will be bypassed. If neither of the conditions are true, either the last else-block is executed or if the else-block is absent, the control gets transferred to the next instruction present immediately after the else-if ladder.
The following program makes use of the nested if-else statement to find the greatest of three numbers.
#include<stdio.h>
int main( )
{
int a, b,c;
a=6,b= 5, c=10;
if(a>b)
{
if(b>c)
{
printf("nGreatest is: " , a);
}
else if(c>a)
{
printf("nGreatest is: ", c);
}
}
else if(b>c) //outermost if-else block
{
printf("nGreatest is: " , b);
}
else
{
printf( "nGreatest is: " , c);
}
return 0;
}
The above program compares three integer
quantities, and prints the greatest. The first if statement compares the values
of a
and b
.
If a>b
is true, program control gets transferred to the if-else
statement nested inside the if block, where b
is compared to c
. If b>c
is also true, the value of a
is printed; else the value of c
and a
are compared
and if c>a
is true, the value of c
is printed. After this the rest of the if-else ladder is
bypassed.
However, if the first condition a>b
is false, the control
directly gets transferred to the outermost else-if block, where the value of b
is compared with c
(as a
is not the greatest).
If b>c
is true the value of b
is printed else the value of c
is printed. Note the
nesting, the use of braces, and the indentation. All this is required to
maintain clarity.
A switch statement is used for multiple way selections that will branch into different code segments based on the value of a variable or expression. This expression or variable must be of integer data type.
Syntax:
switch (expression)
{
case value1:
code segment1;
break;
case value2:
code segment2;
break;
.
.
.
case valueN:
code segmentN;
break;
default:
default code segment;
}
The value of this expression is either generated during program execution or read in as user input. The case whose value is the same as that of the expression is selected and executed. The optional default label is used to specify the code segment to be executed when the value of the expression does not match with any of the case values.
The break
statement is present at the end of every
case. If it were not so, the execution would continue on into the code segment
of the next case without even checking the case value. For example, supposing a switch
statement has five
cases and the value of the third case matches the value of expression. If no break statement were present at the end of the third
case, all the cases after case 3 would also get executed along with case 3. If
break is present only the required case is selected and executed; after which
the control gets transferred to the next statement immediately after the
switch statement. There is no break
after default
because after the default case the control will
either way get transferred to the next statement immediately after switch.
Example: a program to print the day of the week.
#include<stdio.h>
int main( )
{
int day;
printf("nEnter the number of the day:");
scanf("%d",&day);
switch(day)
{
case 1:
printf("Sunday");
break;
case 2:
printf("Monday");
break;
case 3:
printf("Tuesday");
break;
case 4:
printf("Wednesday");
break;
case 5:
printf("Thursday");
break;
case 6:
printf("Friday");
break;
case 7:
printf("Saturday");
break;
default:
printf("Invalid choice");
}
return 0;
}
This is a very basic program that explains the
working of the switch-case construct. Depending upon the number entered by the
user, the appropriate case is selected and executed. For example, if the
user input is 5, then case 5 will be executed. The break
statement present in case 5
will pause execution of the switch statement after case 5 and the control will
get transferred to the next statement after switch, which is:
return 0;
It is also possible to embed compound statements inside the case of a switch statement. These compound statements may contain control structures. Thus, it is also possible to have a nested switch by embedding it inside a case.
All programs written using the switch-case
statement can also be written using the if-else statement. However, it makes
good programming sense to use the if statement when you need to take some
action after evaluating some simple or complex condition which may involve a
combination of relational and logical expressions (eg, (if((a!=0)&&(b>5))
).
If you need to select among a large group of values, a switch statement will run much faster than a set of nested ifs. The switch differs from the if in that switch can only test for equality, whereas if can evaluate any type of Boolean expression.
The switch statement must be used when one needs to make a choice from a given set of choices. The switch case statement is generally used in menu-based applications. The most common use of a switch-case statement is in data handling or file processing. Most of file handling involves the common functions: creating a file, adding records, deleting records, updating records, printing the entire file or some selective records. The following program gives an idea of how the switch case statement may be used in data handling. It does not involve the code for file processing as we can discuss file handling in C only after we have learnt advanced concepts like pointers, structures and unions.
Example: A switch case statement used in data file processing.
#include<stdio.h>
int main()
{ //create file &set file pointer .
int choice;
printf("n Please select from the following options:");
printf("n 1. Add a record at the end of the file.");
printf("n 2. Add a record at the beginning of the file:");
printf("n 3. Add a record after a particular record:";
printf("nPlease enter your choice:(1/2/3)?");
scanf("%d",&choice);
switch(choice)
{
case 1:
//code to add record at the end of the file
break;
case 2:
//code to add record at the beginning of the file
break;
case 3:
//code to add record after a particular record
break;
default:
printf("n Wrong Choice");
}
return 0;
}
The above example of switch-case generally involves nesting the switch-case construct inside an iteration construct like do-while. In our nex post, we will discuss these iteration statements.