Principles of Programming using C (BPOPS103/203) Module 3
MODULE 3
Chapter - 1 – FUNCTIONS
Definition:
The set of instructions that performs some specific, well-defined task is called as a
Function.
➢ Fig. 1.9 explains how the main() function calls another function to perform a well-
defined task.
➢ In the figure, we can see that main() calls a function named func1(). Therefore,
main() is known as the calling function and func1() is known as the called function.
➢ The moment the compiler encounters a function call, the control jumps to the
statements that are a part of the called function.
➢ After the called function is executed, the control is returned to the calling program.
Why are Functions needed?
➢ Dividing the program into separate well-defined functions facilitates each
function to be written and tested separately. This simplifies the process of getting
the total program to work.
➢ Understanding, coding, and testing multiple separate functions is easier than
doing the same for one big function.
➢ If a big program has to be developed without using any function other than main(),
then there will be countless lines in the main() function and maintaining that
program will be a difficult task.
➢ All the libraries in C contain a set of functions, which have been pre-written and
pre-tested, so the programmers can use them without worrying about their code
details. This speeds up program development, by allowing the programmer to
concentrate only on the code that he has to write.
➢ Like C libraries, programmers can also write their own functions and use them
from different points in the main program or any other program that needs its
Department of AI&ML, CIT - Ponnampet Page 1
Principles of Programming using C (BPOPS103/203) Module 3
functionalities.
➢ When a big program is broken into comparatively smaller functions, then different
programmers working on that project can divide the workload by writing different
functions.
Using Functions
While using functions, we will be using the following terminologies:
➢ A function f that uses another function g is known as the calling function, and g
is known as the called function.
➢ The inputs that a function takes are known as arguments.
➢ When a called function returns some result back to the calling function, it is said
to return that result.
➢ The calling function may or may not pass parameters to the called function. If the
called function accepts arguments, the calling function will pass parameters, else
not.
➢ Function declaration is a declaration statement that identifies a function’s name,
a list of arguments that it accepts, and the type of data it returns.
➢ Function definition consists of a function header that identifies the function,
followed by the body of the function containing the executable code for that
function.
Types of Functions
1. Library Functions/Pre-Defined/ Built-in Functions:
➢ C Library of C Compiler has a collection of various functions which perform
some standard and predefined tasks.
➢ These functions written by designers of C Compilers are called as Library
functions/Pre-Defined/Built-in functions.
➢ Ex: sqrt(n)- computes square root of n.
pow(x,y)- computes 𝑥𝑦.
printf()- used to print the data on the screen.
scanf()- used to read the data from the keyboard.
abs(x)- computes absolute value of x.
2. User-Defined/ Programmer Defined Functions:
➢ The functions written by the programmer/user to do the specific tasks is called
User-Defined/ Programmer Defined Functions.
➢ main( ) is the user defined function.
Department of AI&ML, CIT - Ponnampet Page 2
Principles of Programming using C (BPOPS103/203) Module 3
Elements of User-Defined Functions
➢ The three elements of user-defined functions are shown below:
1. Function Prototype/Declaration
2. Function Definition
3. Function Call
Function Declaration/Function Prototype:
➢ Before using a function, the compiler must know the number of parameters and the
type of parameters that the function expects to receive and the data type of value
that it will return to the calling program.
➢ Placing the function declaration statement prior to its use enables the compiler to
make a check on the arguments used while calling that function.
➢ The general format for declaring a function that accepts arguments and returns a
value as result can be given as:
➢ Here, function_name is a valid name for the function.
➢ A function should have a meaningful name that must specify the task that the
function will perform.
➢ return_data_type specifies the data type of the value that will be returned to the
calling function as a result of the processing performed by the called function.
➢ (data_type variable1, data_type variable2, ...) is a list of variables of specified data
types.
➢ These variables are passed from the calling function to the called function. They
are also known as arguments or parameters that the called function accepts to
perform its task.
Ex: int add(int a, int b);
Note:
Things to remember about function declaration:
➢ After the declaration of every function, there should be a semicolon. If the
semicolon is missing, the compiler will generate an error message.
➢ The function declaration is global.
➢ Use of argument name in the function declaration is optional.
int func(int, char, float);
or
int func(int num, char ch, float fnum);
Department of AI&ML, CIT - Ponnampet Page 3
Principles of Programming using C (BPOPS103/203) Module 3
➢ A function cannot be declared within the body of another function.
➢ A function having void as its return type cannot return any value.
➢ A function having void as its parameter list cannot accept any value. So the
function declared as void print(); does not accept any input/arguments from the
calling function.
➢ If the function declaration does not specify any return type, then by default, the
function returns an integer value. Therefore, when a function is declared as
sum(int a, int b);
The function sum accepts two integer values from the calling function and in sum
returns an integer value to the caller.
➢ Some compilers make it compulsory to declare the function before its usage while
other compilers make it optional.
Function Definition
➢ When a function is defined, space is allocated for that function in the memory.
➢ A function definition comprises of two parts:
• Function header
• Function body
➢ The syntax of a function definition can be given as:
➢ The number of arguments and the order of arguments in the function header must
be the same as that given in the function declaration statement.
➢ While return_data_type function_name(data_type variable1, data_type
variable2,...) is known as the function header, the rest of the portion comprising of
program statements within the curly brackets { } is the function body which
contains the code to perform the specific task.
➢ Note that the function header is same as the function declaration. The only difference
between the two is that a function header is not followed by a semi-colon.
Department of AI&ML, CIT - Ponnampet Page 4
Principles of Programming using C (BPOPS103/203) Module 3
Function Call
➢ The function call statement invokes the function.
➢ When a function is invoked, the compiler jumps to the called function to execute
the statements that are a part of that function.
➢ Once the called function is executed, the program control passes back to the calling
function.
➢ A function call statement has the following syntax:
Note:
The following points are to be noted while calling a function:
➢ Function name and the number and the type of arguments in the function call must
be same as that given in the function declaration and the function header of the
function definition.
➢ Names (and not the types) of variables in function declaration, function call, and
header of function definition may vary.
➢ Arguments may be passed in the form of expressions to the called function. In such
a case, arguments are first evaluated and converted to the type of formal parameter
and then the body of the function gets executed.
➢ If the return type of the function is not void, then the value returned by the called
function may be assigned to some variable as given below.
variable_name = function_name(variable1, variable2, ...);
Ex: add(a,b);
return STATEMENT
➢ The return statement terminates the execution of the called function and returns
control to the calling function.
➢ When the return statement is encountered, the program execution resumes in the
calling function at the point immediately following the function call.
➢ A return statement may or may not return a value to the calling function.
➢ The syntax of return state can be given as return <expression>;
➢ Here expression is placed in between angular brackets because specifying an
expression is optional.
➢ A function that has void return type cannot return any value to the calling function.
Department of AI&ML, CIT - Ponnampet Page 5
Principles of Programming using C (BPOPS103/203) Module 3
Passing Parameters to Functions
➢ There are two ways in which arguments or parameters can be passed to the called
function.
1. Call by value: The values of the variables are passed by the calling
function to the called function.
2. Call by reference or Call by address: The addresses of the variables are
passed by the calling function to the called function.
Call by Value
➢ In this method, the called function creates new variables to store the value of the
arguments passed to it. Therefore, the called function uses a copy of the actual
arguments to perform its intended task.
➢ If the called function is supposed to modify the value of the parameters passed to
it, then the change will be reflected only in the called function.
➢ In the calling function, no change will be made to the value of the variables.
➢ This is because all the changes are made to the copy of the variables and not to the
actual variables.
Example: Write a C program to add two numbers using call by value.
Advantages:
➢ The biggest advantage of using the call-by-value technique is that arguments can
be passed as variables, literals, or expressions.
Disadvantages:
➢ Main drawback is that copying data consumes additional storage space.
➢ In addition, it can take a lot of time to copy, thereby resulting in performance
penalty, especially if the function is called many times.
Department of AI&ML, CIT - Ponnampet Page 6
Principles of Programming using C (BPOPS103/203) Module 3
Call by Reference
➢ When the calling function passes arguments to the called function using the call-
by-value method, the only way to return the modified value of the argument to the
caller is explicitly using the return statement. A better option is to pass arguments
using the call-by-reference technique.
➢ In this method, we declare the function parameters as references rather than normal
variables.
➢ When this is done, any changes made by the function to the arguments it received
are also visible in the calling function.
➢ To indicate that an argument is passed using call by reference, an asterisk (*) is
placed after the type in the parameter list.
➢ Hence, in the call-by-reference method, a function receives an implicit reference to
the argument, rather than a copy of its value.
➢ Therefore, the function can modify the value of the variable and that change will
be reflected in the calling function as well.
Example: Write a C program to add two numbers using call by reference.
Advantages:
➢ Since arguments are not copied into the new variables, it provides greater time and
space efficiency.
➢ The function can change the value of the argument and the change is reflected in
the calling function.
➢ A function can return only one value. In case we need to return multiple values, we
can pass those arguments by reference, so that the modified values are visible in
the calling function.
Department of AI&ML, CIT - Ponnampet Page 7
Principles of Programming using C (BPOPS103/203) Module 3
Disadvantages:
➢ However, the drawback of using this technique is that if inadvertent changes are
caused to variables in called function, then these changes would be reflected in
calling function as original values would have been overwritten.
Write a C program to swap two numbers using call by reference.
Scope of Variables
➢ In C, all constants and variables have a defined scope.
➢ By scope we mean the accessibility and visibility of the variables at different points
in the program.
➢ A variable or a constant in C has four types of scope: block, function, program, and
file.
Block Scope
➢ We have studied that a statement block is a group of statements enclosed within
opening and closing curly brackets { }.
➢ If a variable is declared within a statement block then as soon as the control exits
that block, the variable will cease to exist.
➢ Such a variable also known as a local variable is said to have a block scope.
➢ So far we had been using local variables.
➢ For example, if we declare an integer x inside a function, then that variable is
unknown to the rest of the program (i.e., outside that function).
➢ Variables declared with same names as those in outer block mask the outer block
variables while executing the inner block.
Department of AI&ML, CIT - Ponnampet Page 8
Principles of Programming using C (BPOPS103/203) Module 3
➢ In nested blocks, variables declared outside the inner blocks are accessible to the
nested blocks, provided these variables are not re-declared within the inner block.
Function Scope
➢ Function scope indicates that a variable is active and visible from the beginning to
the end of a function.
➢ In C, only the goto label has function scope.
➢ In other words, function scope is applicable only with goto label names. This means
that the programmer cannot have the same label names inside a function.
➢ In this example, the label loop is visible from the beginning to the end of the main
() function. Therefore, there should not be more than one label having the same name
within the main() function.
Program Scope
➢ Till now we have studied that variables declared within a function are local
variables. These local variables (also known as internal variables) are automatically
created when they are declared in the function and are usable only within that
function.
➢ The local variables are unknown to other functions in the program. Such variables
cease to exist after the function in which they are declared is exited and are re-created
each time the function is called.
➢ However, if you want a function to access some variables which are not passed to it
as arguments, then declare those variables outside any function blocks. Such
variables are commonly known as global variables and can be accessed from any
point in the program.
➢ Lifetime: Global variables are created at the beginning of program execution and
remain in existence throughout the period of execution of the program. These
Department of AI&ML, CIT - Ponnampet Page 9
Principles of Programming using C (BPOPS103/203) Module 3
variables are known to all the functions in the program and are accessible to them
for usage. Global variables are not limited to a particular function so they exist even
when a function calls another function. These variables retain their value so that they
can be used from every function in the program.
➢ Place of Declaration: The Global variables are declared outside all the functions
including main(). It is always recommended to declare them on top of the program
code.
➢ Name conflict: If we have a variable declared in a function that has same name as
that of the global variable, then the function will use the local variable declared
within it and ignore the global variable.
File Scope
➢ When a global variable is accessible until the end of the file, the variable is said to
have file scope.
➢ To allow a variable to have file scope, declare that variable with the static keyword
before specifying its data type: static int x;
➢ A global static variable can be used anywhere from the file in which it is declared
but it is not accessible by any other file.
Department of AI&ML, CIT - Ponnampet Page 10
Principles of Programming using C (BPOPS103/203) Module 3
Storage Classes
➢ Storage class defines the scope (visibility) and lifetime of variables and/or functions
declared within a C program.
➢ In addition to this, the storage class gives the following information about the
variable or the function.
1. The storage class of a function or a variable determines the part of memory
where storage space will be allocated for that variable or function (whether
the variable function will be stored in a register or in RAM).
2. It specifies how long the storage allocation will continue to exist for that
function or variable.
3. It specifies the scope of the variable or function.
4. It specifies whether the variable or function has internal, external, or no
linkage.
5. It specifies whether the variable will be automatically initialized to zero or
to any indeterminate value.
➢ C supports four storage classes: automatic, register, external, and static.
➢ The general syntax for specifying the storage class of a variable can be given as:
<storage_class_specifier> <data type > <variable name>
auto Storage Class
➢ The auto storage class specifier is used to explicitly declare a variable with automatic
storage.
➢ It is the default storage class for variables declared inside a block.
➢ For example, if we write auto int x;
then x is an integer that has automatic storage. It is deleted when the block in which
x is declared is exited.
➢ The auto storage can be used to declare variables in a block or the names of function
parameters.
Important things to remember about the variables declared with auto storage class are as
follows:
➢ All the variables declared within a function belong to automatic storage class by
default.
➢ They should be declared at the start of the program block, right after the opening
curly brackets {.
Department of AI&ML, CIT - Ponnampet Page 11
Principles of Programming using C (BPOPS103/203) Module 3
➢ Memory for the variable is automatically allocated upon entry to a block and freed
automatically upon exit from that block.
➢ The scope of the variable is local to the block in which it is declared.
➢ Every time the block is entered, the variable is initialized with the values declared.
➢ The auto variables are stored in the primary memory of the computer.
➢ If auto variables are not initialized at the time of declaration, then they contain some
garbage value.
register Storage Class
➢ When a variable is declared using register as its storage class, it is stored in a CPU
register instead of RAM.
➢ Since the variable is stored in a register, the maximum size of the variable is equal
to the register size.
➢ A register variable is declared in the following manner: register int x;
➢ Register variables are used when quick access to the variable is needed.
➢ Each time the block is entered, the register variables defined in that block are
accessible and the moment that block is exited, the variables become no longer
accessible for use.
extern Storage Class
➢ The extern storage class is used to give a reference of a global variable that is visible
to all the program files.
➢ Such global variables are declared like any other variables in one of the program
files.
➢ To declare a variable x as extern write, extern int x;
➢ External variables may be declared outside any function source code file as any other
variable is declared.
➢ Usually external variables are declared and defined in the beginning of a source file.
➢ Memory is allocated for the external variables when the program begins execution
and remains allocated until the program terminates.
➢ In case if the external variable is not initialized, then it will be initialized to zero by
default.
➢ External variables have global scope, i.e. these variables are visible and accessible
from all the functions in the program.
Department of AI&ML, CIT - Ponnampet Page 12
Principles of Programming using C (BPOPS103/203) Module 3
static Storage Class
➢ static is the default storage class for all global variables.
➢ Static variables have a lifetime over the entire program. i.e., memory for the static
variables is allocated when the program begins running and is freed when the
program terminates.
➢ To declare an integer x as static, write static int x = 10;
Here x is a local static variable.
➢ Static local variables when defined within a function are initialized at the runtime.
➢ The static variables are initialized just once, when defined within a function it is not
re-initialized when the function is called again and again.
➢ When a static variable is not explici1ly initialized by the programmer, then it is
automatically initialized to zero when memory is allocated for it.
Comparison of Storage Classes
Recursion
➢ The process in which a function calls itself again and again is called as Recursion.
➢ Since a recursive function repeatedly calls itself, it makes use of the system stack to
temporarily store the return address and local variables of the calling function. Every
recursive solution has two major cases. They are:
1. Base case, in which the problem is simple enough to be solved directly
without making any further calls to the same function.
Department of AI&ML, CIT - Ponnampet Page 13
Principles of Programming using C (BPOPS103/203) Module 3
2. Recursive case, in which first the problem at hand is divided into simpler
sub-parts. Second the function calls itself but with sub-parts of the problem
obtained in the first step. Third, the result is obtained by combining the
solutions of simpler sub-parts.
Examples:
1. Write a C program to calculate factorial of a given number.
2. Write a C program to calculate the GCD of two numbers using recursive
functions.
Department of AI&ML, CIT - Ponnampet Page 14
Principles of Programming using C (BPOPS103/203) Module 3
3. Write a C program to find the Fibonacci series using recursive function.
Department of AI&ML, CIT - Ponnampet Page 15
Principles of Programming using C (BPOPS103/203) Module 3
Chapter - 2 – ARRAYS
➢ An array is a collection of similar data elements.
➢ These data elements have the same data type.
➢ The elements of the array are stored in consecutive memory locations and are
referenced by an index (also known as the subscript).
➢ The subscript is an ordinal number which is used to identify an element of the array.
Declaration of 1-D Arrays
➢ An array must be declared before being used.
➢ Arrays are declared using the following syntax: type name[size];
➢ Declaring an array means specifying the following:
1. Data type—the kind of values it can store.
For example, int, char, float, double, or any other valid data type.
2. Name—to identify the array.
3. Size—the maximum number of values that the array can hold. i.e., the
maximum number of elements that can be stored in the array.
For example, if we write, int marks[10];
then the statement declares marks to be an array containing 10 elements.
➢ In C, the array index starts from zero.
➢ The first element will be stored in marks[0], second element in marks[1], and so on.
➢ Therefore, the last element, that is the 10th element, will be stored in marks[9].
➢ Note that 0, 1, 2, 3 written within square brackets are the subscripts. In the memory,
the array will be stored as shown in Fig. 3.2.
➢ Figure 3.3 shows how different types of arrays are declared.
Department of AI&ML, CIT - Ponnampet Page 16
Principles of Programming using C (BPOPS103/203) Module 3
Accessing the Elements of an Array
➢ To access all the elements, we must use a loop.
➢ That is, we can access all the elements of an array by varying the value of the
subscript into the array.
➢ But note that the subscript must be an integer value or an expression that evaluates
to an integer value.
➢ As shown in Fig. 3.2, the first element of the array marks[10] can be accessed by
writing marks[0].
➢ Now to process all the elements of the array, we use a loop as shown in Fig. 3.4.
➢ Figure 3.5 shows the result of the code shown in Fig. 3.4.
➢ The code accesses every individual element of the array and sets its value to –1.
➢ In the for loop, first the value of marks[0] is set to –1, then the value of the index (i)
is incremented and the next value, that is, marks[1] is set to –1.
➢ The procedure continues until all the 10 elements of the array are set to –1.
Calculating the Address of Array Elements
➢ The array name is a symbolic reference to the address of the first byte of the array.
➢ When we use the array name, we are actually referring to the first byte of the array.
➢ The subscript or the index represents the offset from the beginning of the array to
the element being referenced.
➢ That is, with just the array name and the index, C can calculate the address of any
element in the array.
➢ Since an array stores all its data elements in consecutive memory locations, storing
just the base address, that is the address of the first element in the array, is sufficient.
➢ The address of other data elements can simply be calculated using the base address.
The formula to perform this calculation is,
Address of data element, A[k] = BA(A) + w(k – lower_bound)
Department of AI&ML, CIT - Ponnampet Page 17
Principles of Programming using C (BPOPS103/203) Module 3
Here, A is the array, k is the index of the element of which we have to calculate the
address, BA is the base address of the array A, and w is the size of one element in
memory, for example, size of int is 2.
Calculating the Length of an Array
➢ The length of an array is given by the number of elements stored in it.
➢ The general formula to calculate the length of an array is,
Length = upper_bound – lower_bound + 1
where, upper_bound is the index of the last element and lower_bound is the index
of the first element in the array.
Storing Values in Arrays / Initialization of 1-D Arrays
➢ When we declare an array, we are just allocating space for its elements; no values
are stored in the array.
➢ There are three ways to store values in an array.
1. To initialize the array elements during declaration.
2. To input values for individual elements from the keyboard.
3. To assign values to individual elements.
Department of AI&ML, CIT - Ponnampet Page 18
Principles of Programming using C (BPOPS103/203) Module 3
1. Initializing Arrays during Declaration
➢ The elements of an array can be initialized at the time of declaration, just as any
other variable.
➢ When an array is initialized, we need to provide a value for every element in the
array.
➢ Arrays are initialized by writing,
type array_name[size]={list of values};
➢ Note that the values are written within curly brackets and every value is separated
by a comma. It is a compiler error to specify more values than there are elements in
the array.
➢ When we write, int marks[5]={90, 82, 78, 95, 88};
➢ An array with the name marks is declared that has enough space to store five
elements.
➢ The first element, that is, marks[0] is assigned value 90. Similarly, the second
element of the array, that is marks[1], is assigned 82, and so on.
➢ This is shown in Fig. 3.7.
➢ While initializing the array at the time of declaration, the programmer may omit the
size of the array. For example, int marks[ ]= {98, 97, 90};
➢ The above statement is absolutely legal.
➢ Here, the compiler will allocate enough space for all the initialized elements.
➢ Note that if the number of values provided is less than the number of elements in the
array, the un-assigned elements are filled with zeros.
➢ Figure 3.8 shows the initialization of arrays.
Department of AI&ML, CIT - Ponnampet Page 19
Principles of Programming using C (BPOPS103/203) Module 3
2. Inputting Values from the Keyboard
➢ An array can be initialized by inputting values from the keyboard.
➢ In this method, a while/do–while or a for loop is executed to input the value for each
element of the array. For example, look at the code shown in Fig. 3.9.
➢ In the code, we start at the index i at 0 and input the value for the first element of the
array.
➢ Since the array has 10 elements, we must input values for elements whose index varies
from 0 to 9.
3. Assigning Values to Individual Elements
➢ The third way is to assign values to individual elements of the array by using the
assignment operator.
➢ Any value that evaluates to the data type as that of the array can be assigned to the
individual array element.
➢ A simple assignment statement can be written as marks[3] = 100;
➢ Here, 100 is assigned to the fourth element of the array which is specified as
marks[3].
➢ To copy an array, you must copy the value of every element of the first array into
the elements of the second array.
➢ Figure 3.10 illustrates the code to copy an array.
Department of AI&ML, CIT - Ponnampet Page 20
Principles of Programming using C (BPOPS103/203) Module 3
➢ In Fig. 3.10, the loop accesses each element of the first array and simultaneously
assigns its value to the corresponding element of the second array.
➢ The index value i is incremented to access the next element in succession.
➢ Therefore, when this code is executed, arr2[0] = arr1[0], arr2[1] = arr1[1], arr2[2]
= arr1[2], and so on.
Operations on Arrays
➢ There are a number of operations that can be performed on arrays. These operations
include:
1. Traversing an array.
2. Inserting an element in an array.
3. Searching an element in an array.
4. Deleting an element from an array.
5. Merging two arrays.
6. Sorting an array in ascending or descending order.
Traversing an Array
➢ Traversing an array means accessing each and every element of the array for a
specific purpose.
➢ Traversing the data elements of an array A can include printing every element,
counting the total number of elements, or performing any process on these
elements.
➢ The algorithm for array traversal is given in Fig. 3.12.
Department of AI&ML, CIT - Ponnampet Page 21
Principles of Programming using C (BPOPS103/203) Module 3
➢ In Step 1, we initialize the index to the lower bound of the array.
➢ In Step 2, a while loop is executed.
➢ Step 3 processes the individual array element as specified by the array name and
index value.
➢ Step 4 increments the index value so that the next array element could be
processed. The while loop in Step 2 is executed until all the elements in the array
are processed, i.e., until I is less than or equal to the upper bound of the array.
Example:
Write a program to read and display n numbers using an array.
Inserting an Element in an Array
➢ If an element has to be inserted at the end of an existing array, then we just have to
add 1 to the upper_bound and assign the value.
➢ Here, we assume that the memory space allocated for the array is still available.
➢ For example, if an array is declared to contain 10 elements, but currently it has only
8 elements, then obviously there is space to accommodate two more elements.
➢ But if it already has 10 elements, then we will not be able to add another element to
it.
➢ Figure 3.13 shows an algorithm to insert a new element to the end of an array.
➢ In Step 1, we increment the value of the upper_bound.
➢ In Step 2, the new value is stored at the position pointed by the upper_bound.
Department of AI&ML, CIT - Ponnampet Page 22
Principles of Programming using C (BPOPS103/203) Module 3
➢ For example, let us assume an array has been declared as int marks[60];
➢ The array is declared to store the marks of all the students in a class.
➢ Now, suppose there are 54 students and a new student comes and is asked to take
the same test.
➢ The marks of this new student would be stored in marks[55].
➢ Assuming that the student secured 68 marks, we will assign the value as marks[55]
= 68;
Deleting an Element from an Array
➢ Deleting an element from an array means removing a data element from an already
existing array.
➢ If the element has to be deleted from the end of the existing array, then we just have
to subtract 1 from the upper_bound.
➢ Figure 3.15 shows an algorithm to delete an element from the end of an array.
➢ For example, if we have an array that is declared as int marks[60];
➢ The array is declared to store the marks of all the students in the class.
Department of AI&ML, CIT - Ponnampet Page 23
Principles of Programming using C (BPOPS103/203) Module 3
➢ Now, suppose there are 54 students and the student with roll number 54 leaves the
course.
➢ The score of this student was stored in marks[54].
➢ We just have to decrement the upper_bound.
➢ Subtracting 1 from the upper_bound will indicate that there are 53 valid data in the
array.
Merging Two Arrays
➢ Merging two arrays in a third array means first copying the contents of the first array
into the third array and then copying the contents of the second array into the third
array.
➢ Hence, the merged array contains the contents of the first array followed by the
contents of the second array. This operation is shown in Fig 3.18.
Searching for a Value in an Array
➢ Searching means to find whether a particular value is present in an array or not.
➢ If the value is present in the array, then searching is said to be successful and the
searching process gives the location of that value in the array.
➢ However, if the value is not present in the array, the searching process displays an
appropriate message and in this case searching is said to be unsuccessful.
Department of AI&ML, CIT - Ponnampet Page 24
Principles of Programming using C (BPOPS103/203) Module 3
➢ There are two popular methods for searching the array elements: linear search and
binary search.
Linear Search
➢ Linear search, also called as sequential search, is a very simple method used for
searching an array for a particular value.
➢ It works by comparing the value to be searched with every element of the array one
by one in a sequence until a match is found.
➢ Linear search is mostly used to search an unordered list of elements (array in which
data elements are not sorted).
➢ For example, if an array A[] is declared and initialized as, int A[ ] = {10, 8, 2, 7, 3,
4, 9, 1, 6, 5}; and the value to be searched is VAL = 7, then searching means to find
whether the value ‘7’ is present in the array or not. If yes, then it returns the position
of its occurrence. Here, POS = 3 (index starting from 0).
➢ Figure 14.1 shows the algorithm for linear search. In Steps 1 and 2 of the algorithm, we
initialize the value of POS and I. In Step 3, a while loop is executed that would be
executed till I is less than N (total number of elements in the array). In Step 4, a check
is made to see if a match is found between the current array element and VAL. If a
match is found, then the position of the array element is printed, else the value of I is
incremented to match the next element with VAL. However, if all the array elements
have been compared with VAL and no match is found, then it means that VAL is not
present in the array.
Department of AI&ML, CIT - Ponnampet Page 25
Principles of Programming using C (BPOPS103/203) Module 3
Example:
Write a C program to search an element in an array using the linear search technique.
Binary Search
➢ Binary search is a searching algorithm that works efficiently with a sorted list.
➢ The algorithm finds the position of a particular element in the array.
➢ Below figure shows the algorithm of binary search.
Department of AI&ML, CIT - Ponnampet Page 26
Principles of Programming using C (BPOPS103/203) Module 3
How Binary Search Works?
➢ For a binary search to work, it is mandatory for the target array to be sorted.
➢ The following is our sorted array and let us assume that we need to search the
location of key value 31 using binary search.
Here n=10, key=31
➢ First, we shall determine middle position of the array by using this formula,
mid = (low + high) / 2
Here it is, mid = (0 + 9) / 2 = 4 (integer value of 4.5). So, 4 is the mid of the array.
➢ Now we compare the value stored at mid location i.e., 4, with the value being
searched, i.e. 31.
➢ We find that the value at location 4 is 27, which is not a match.
➢ Since the key element is greater than the middle element, we should search the key
element in the upper part of the array.
Department of AI&ML, CIT - Ponnampet Page 27
Principles of Programming using C (BPOPS103/203) Module 3
➢ We change our low to mid + 1 and find the new mid value again.
low = mid + 1 = 4 + 1 = 5
mid = (low + high) / 2 = (5 + 9) / 2 = 7
➢ Our new mid is 7 now. We compare the value stored at location 7 with our key value
31.
➢ The value stored at location 7 is not a match; rather it is more than what we are
looking for.
➢ Since the key element is less than the middle element, we should search the key
element in the lower part of the array.
➢ We change our high to mid - 1 and find the new mid value again.
high = mid - 1 = mid – 1 = 7 – 1 = 6
➢ Hence, we calculate the mid again.
mid = (low + high) / 2 = (5 + 6) / 2 = 5
This time it is 5.
➢ We compare the value stored at location 5 with our key value. We find that it is a
match.
➢ We conclude that the key value 31 is stored at position mid + 1= 5 + 1 = 6.
Department of AI&ML, CIT - Ponnampet Page 28
Principles of Programming using C (BPOPS103/203) Module 3
Example:
C Program to search key elements in an array using Binary search technique.
Passing Arrays to Functions
➢ Like variables of other data types, we can also pass an array to a function.
➢ In some situations, you may want to pass individual elements of the array; while in
other situations, you may want to pass the entire array.
1. Passing Individual Elements
The individual elements of an array can be passed to a function by passing either their
data values or addresses.
a. Passing Data Values
➢ Individual elements can be passed in the same manner as we pass variables of any
other data type.
➢ The condition is just that the data type of the array element must match with the type
of the function parameter.
➢ Look at Fig. 3.21(a) which shows the code to pass an individual array element by
passing the data value.
Department of AI&ML, CIT - Ponnampet Page 29
Principles of Programming using C (BPOPS103/203) Module 3
➢ In the above example, only one element of the array is passed to the called function.
➢ This is done by using the index expression. Here, arr[3] evaluates to a single integer
value.
b. Passing Addresses
➢ Like ordinary variables, we can pass the address of an individual array element by
preceding the indexed array element with the address operator.
➢ Therefore, to pass the address of the fourth element of the array to the called
function, we will write &arr[3].
➢ However, in the called function, the value of the array element must be accessed
using the indirection (*) operator.
➢ Look at the code shown in Fig. 3.21(b).
2. Passing the Entire Array
➢ In C the array name refers to the first byte of the array in the memory.
➢ The address of the remaining elements in the array can be calculated using the array
name and the index value of the element.
➢ Therefore, when we need to pass an entire array to a function, we can simply pass
the name of the array.
➢ Figure 3.22 illustrates the code which passes the entire array to the called function.
Department of AI&ML, CIT - Ponnampet Page 30
Principles of Programming using C (BPOPS103/203) Module 3
Two-Dimensional Arrays
➢ A two-dimensional array is specified using two subscripts where the first subscript
denotes the row and the second denotes the column.
➢ The C compiler treats a two-dimensional array as an array of one-dimensional
arrays.
➢ Figure 3.26 shows a two-dimensional array which can be viewed as an array of
arrays.
Declaring Two-dimensional Arrays
➢ Any array must be declared before being used. The declaration statement tells the
compiler the name of the array, the data type of each element in the array, and the
size of each dimension.
➢ A two-dimensional array is declared as:
data_type array_name[row_size][column_size];
➢ For example, if we want to store the marks obtained by three students in five
different subjects, we can declare a two-dimensional array as:
int marks[3][5];
➢ In the above statement, a two-dimensional array called marks has been declared that
has m(3) rows and n(5) columns.
➢ The first element of the array is denoted by marks[0][0], the second element as
marks[0][1], and so on.
➢ Here, marks[0][0] stores the marks obtained by the first student in the first subject,
marks[1][0] stores the marks obtained by the second student in the first subject.
➢ The pictorial form of a two-dimensional array is shown in Fig. 3.27.
Department of AI&ML, CIT - Ponnampet Page 31
Principles of Programming using C (BPOPS103/203) Module 3
➢ Hence, we see that a 2D array is treated as a collection of 1D arrays.
➢ Each row of a 2D array corresponds to a 1D array consisting of n elements, where n
is the number of columns.
➢ To understand this, we can also see the representation of a two-dimensional array as
shown in Fig. 3.28.
➢ There are two ways of storing a two-dimensional array in the memory. The first way
is the row major order and the second is the column major order.
➢ In a row major order, the elements of the first row are stored before the elements of the
second and third rows.
➢ That is, the elements of the array are stored row by row where n elements of the first
row will occupy the first n locations. This is illustrated in Fig. 3.29.
➢ However, when we store the elements in a column major order, the elements of the
first column are stored before the elements of the second and third column.
➢ That is, the elements of the array are stored column by column where m elements of
the first column will occupy the first m locations. This is illustrated in Fig. 3.30.
➢ If the array elements are stored in column major order, then the address can be
calculated as,
Address(A[I][J]) = Base_Address + w{M ( J – 1) + (I – 1)}
➢ And if the array elements are stored in row major order,
Address(A[I][J]) = Base_Address + w{N ( I – 1) + (J – 1)}
where w is the number of bytes required to store one element,
N is the number of columns,
M is the number of rows,
I and J are the subscripts of the array element.
Department of AI&ML, CIT - Ponnampet Page 32
Principles of Programming using C (BPOPS103/203) Module 3
Initializing Two-Dimensional Arrays
➢ A two-dimensional array is initialized in the same way as a one-dimensional array
is initialized.
➢ For example, int marks[2][3]={90, 87, 78, 68, 62, 71};
➢ Note that the initialization of a two-dimensional array is done row by row.
➢ The above statement can also be written as:
int marks[2][3]={{90,87,78},{68, 62, 71}};
➢ The above two-dimensional array has two rows and three columns.
➢ First, the elements in the first row are initialized and then the elements of the second
row are initialized.
➢ Therefore, marks[0][0] = 90
marks[0][1] = 87
marks[0][2] = 78
marks[1][0] = 68
marks[1][1] = 62
marks[1][2] = 71
➢ In case of one-dimensional arrays, we have discussed that if the array is completely
initialized, we may omit the size of the array.
➢ The same concept can be applied to a two-dimensional array, except that only the
size of the first dimension can be omitted.
➢ Therefore, the declaration statement given below is valid.
int marks[][3]={{90,87,78},{68, 62, 71}};
➢ In order to initialize the entire two-dimensional array to zeros, simply specify the
first value as zero.
That is, int marks[2][3] = {0};
➢ The individual elements of a two-dimensional array can be initialized using the
assignment operator as shown here.
Department of AI&ML, CIT - Ponnampet Page 33
Principles of Programming using C (BPOPS103/203) Module 3
marks[1][2] = 79;
or
marks[1][2] = marks[1][1] + 10;
Accessing the Elements of Two-dimensional Arrays
➢ The elements of a 2D array are stored in contiguous memory locations.
➢ Since the two-dimensional array contains two subscripts, we will use two for loops to
scan the elements.
➢ The first for loop will scan each row in the 2D array and the second for loop will scan
individual columns for every row in the array.
Example:
Write a C program to read and print the elements of a 2D array.
Operations on Two-Dimensional Arrays
➢ Two-dimensional arrays can be used to implement the mathematical concept of
matrices.
➢ In mathematics, a matrix is a grid of numbers, arranged in rows and columns.
➢ Thus, using two dimensional arrays, we can perform the following operations on
an m×n matrix: i.e., addition of matrices, subtraction of matrices, product of
matrices and transpose of a matrix.
Department of AI&ML, CIT - Ponnampet Page 34
Principles of Programming using C (BPOPS103/203) Module 3
Example:
1. Write a C program to transpose a 3 × 3 matrix.
Department of AI&ML, CIT - Ponnampet Page 35
Principles of Programming using C (BPOPS103/203) Module 3
2. Write a program to input two m × n matrices and then calculate the sum of
their corresponding elements and store it in a third m × n matrix.
Passing two-dimensional arrays to functions
➢ There are three ways of passing a two-dimensional array to a function.
➢ First, we can pass individual elements of the array. This is exactly the same as
passing an element of a one-dimensional array.
Department of AI&ML, CIT - Ponnampet Page 36
Principles of Programming using C (BPOPS103/203) Module 3
➢ Second, we can pass a single row of the two-dimensional array. This is equivalent
to passing the entire one-dimensional array to a function.
➢ Third, we can pass the entire two-dimensional array to the function.
1. Passing individual elements
➢ The individual elements of an array can be passed to a function by passing either
their data values or addresses.
2. Passing a Row
➢ A row of a two-dimensional array can be passed by indexing the array name with
the row number.
3. Passing the Entire 2D Array
➢ To pass a two-dimensional array to a function, we use the array name as the actual
parameter.
➢ However, the parameter in the called function must indicate that the array has two
dimensions.
Department of AI&ML, CIT - Ponnampet Page 37
Principles of Programming using C (BPOPS103/203) Module 3
Multi-Dimensional Arrays
➢ A multi-dimensional array in simple terms is an array of arrays.
➢ As we have one index in a one-dimensional array, two indices in a two-dimensional
array, in the same way, we have n indices in an n-dimensional array or multi-
dimensional array.
➢ Conversely, an n–dimensional array is specified using n indices.
➢ An n-dimensional m1 × m2 ×m3 × ... × mn array is a collection of m1 × m2 × m3
× ...× mn elements.
➢ In a multi-dimensional array, a particular element is specified by using n subscripts
as A[I1][I2][I3]...[In].
➢ Figure 3.33 shows a three-dimensional array. The array has three pages, four rows,
and two columns.
Applications of Arrays
➢ Arrays are used to implement mathematical vectors, matrices and other kind of
rectangular tables.
➢ Many databases include one-dimensional arrays whose elements are records.
➢ Arrays are used to implement other data structures such as strings, stacks, queues,
heaps and hash tables.
➢ Arrays can be used to sort elements in ascending or descending order.
Department of AI&ML, CIT - Ponnampet Page 38