Arrays Part A
Arrays Part A
Arrays
3.1 Introduction
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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 1
3.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 integral value or an expression that evaluates to an integral
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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 2
3.3.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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 3
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.
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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 4
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. 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.
For example, if we want to fill an array with even integers (starting from 0), then we will write the
code as shown in Fig. 3.11. In the code, we assign to each element a value equal to twice of its index,
where the index starts from 0. So after executing this code, we will have arr[0] = 0, arr[1] = 2, arr[2] =
4, and so on.
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.
Examples:
Write a program to read and display n numbers using an array.
#include <stdio.h>
void main()
{
int i, n, a[10];
printf("Enter the number of elements in the array : ");
scanf("%d", &n);
printf(“Enter the array elements:\n”);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("The array elements are:\n ");
for(i=0;i<n;i++)
printf("%d\n", a[i]);
}
Output
Enter the number of elements in the array: 5
Enter the array elements:
1
2
3
4
5
The array elements are:
1
2
3
4
5
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 6
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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 7
Algorithm to Insert an Element in the Middle of an Array
The algorithm INSERT will be declared as INSERT (A, N, POS, VAL). The arguments are
(a) A, the array in which the element has to be inserted
(b) N, the number of elements in the array
(c) POS, the position at which the element has to be inserted
(d) VAL, the value that has to be inserted
In the algorithm given in Fig. 3.14, in Step 1, we first initialize I with the total number of elements in
the array. In Step 2, a while loop is executed which will move all the elements having an index greater
than POS one position towards right to create space for the new element. In Step 5, we increment the
total number of elements in the array by 1 and finally in Step 6, the new value is inserted at the
desired position.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 8
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. 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.
Consider an array whose elements are arranged in ascending order. Now, suppose an element has to
be deleted, probably from somewhere in the middle of the array. To do this, we must first find the
location from where the element has to be deleted and then move all the elements (having a value
greater than that of the element) one position towards left so that the space vacated by the deleted
element can be occupied by rest of the elements.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 9
Calling DELETE (Data, 6, 2) will lead to the following processing in the array.
If we have two sorted arrays and the resultant merged array also needs to be a sorted one, then the task
of merging the arrays becomes a little difficult. The task of merging can be explained using Fig. 3.19.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 10
searching process displays an appropriate message and in this case searching is said to be
unsuccessful.
There are two popular methods for searching the array elements: linear search and binary search.
If the elements of the array are arranged in ascending order, then binary search should be used, as it is
more efficient for sorted lists in terms of complexity.
1. 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.
Example:
Write a program to search an element in an array using the linear search technique.
#include <stdio.h>
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 11
void main()
{
int array[100], key, i, n;
2. Binary Search
Binary search is a fast searching algorithm.
This search algorithm works on the principle of divide and conquers.
Binary search is a searching algorithm that works efficiently with a sorted list.
Binary search begins by comparing the middle element of the array with the key value. If the
key value matches the middle element, its position in the array is returned. If the key value is
less than the middle element, the search continues in the lower half of the array. If the key value
is greater than the middle element, the search continues in the upper half of the array.
Now, let us consider how this mechanism is applied to search for a value in a sorted array.
In this algorithm, we see that BEG and END are the beginning and ending positions of the segment
that we are looking to search for the element. MID is calculated as (LOW + HIGH)/2. Initially, LOW
= lower_bound and HIGH = upper_bound. The algorithm will terminate when KE = A[MID]. When
the algorithm ends, we will set POS = MID. POS is the position at which the value is present in the
array. However, if KEY is not equal to A[MID], then the values of LOW, HIGH, and MID will be
changed depending on whether VAL is smaller or greater than A[MID].
(a) If KEY < A[MID], then KEY will be present in the left segment of the array. So, the value of HIGH
will be changed as HIGH = MID – 1.
(b) If KEY > A[MID], then KEY will be present in the right segment of the array. So, the value of BEG
will be changed as LOW = MID + 1.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 12
(c) Finally, if KEY is not present in the array, then eventually, HIGH will be less than LOW. When this
happens, the algorithm will terminate and the search will be unsuccessful. Figure 14.2 shows the
algorithm for binary search.
low high
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 location 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
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 13
low high
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.
mid
low high
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
low high
mid = (low + high) / 2 = (5+6)/2 =5
low high
We compare the value stored at location 5 with our key value. We find that it is a match.
Example: C Program to search key elements in array using binary search algorithms.
#include <stdio.h>
#include<stdlib.h>
void main()
{
int i, low, high, mid, n, key, a[100];
printf("Enter number of elements in array:\n");
scanf("%d",&n);
printf("Enter integer numbers in ascending order:\n");
for (i = 0; i< n; i++) Output:
scanf("%d",&a[i]); Enter number of elements
printf("Enter value to Search\n"); in array:
scanf("%d", &key); 5
low = 0; Enter integer numbers in
high = n - 1; ascending order:
while (low <= high) 10
{ 25
mid = (low+high)/2; 35
if (key == a[mid]) 50
{ 65
printf("%d found at location %d.\n", key, mid+1); Enter a number to search:
exit(0); 65
} 65 is present at location 5
if (key > a[mid] )
low = mid + 1;
if (key < a[mid])
high = mid - 1;
}
printf(" %d is Not found! \n", key);
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 15
3.6.1 Passing Individual Elements
The individual elements of an array can be passed to a function by passing either their data values or
addresses.
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.
2. 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).
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 16
3.7 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.
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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 17
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.
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 18
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.
marks[1][2] = 79;
or
marks[1][2] = marks[1][1] + 10;
Example:
Write a C program to read and print the elements of a 2D array.
#include <stdio.h>
void main()
{
int arr[2][2], i, j, m, n;
printf(“Enter the size of the array:”);
scanf(“%d%d”,&m,&n);
printf(“Enter the elements of the array:\n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d", &arr[i][j]);
}
}
printf(“The elements of the array are:\n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
}
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 19
3.8 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:
1. Transpose
Transpose of an m × n matrix A is given as a n × m matrix B, where
Bi,j = Aj,i.
2. Sum
Two matrices that are compatible with each other can be added together, storing the result in the third
matrix. Two matrices are said to be compatible when they have the same number of rows and
columns. The elements of two matrices can be added by writing:
Ci,j = Ai,j + Bi,j
3. Difference
Two matrices that are compatible with each other can be subtracted, storing the result in the third
matrix. Two matrices are said to be compatible when they have the same number of rows and
columns. The elements of two matrices can be subtracted by writing:
Ci,j = Ai,j – Bi,j
4. Product
Two matrices can be multiplied with each other if the number of columns in the first matrix is equal to
the number of rows in the second matrix. Therefore, m × n matrix A can be multiplied with a p × q
matrix B if n=p. The dimension of the product matrix is m × q. The elements of two matrices can be
multiplied by writing:
Ci,j = Ʃ Ai,k Bk,j for k = 1 to n
Example:
1. Write a C program to transpose a 3 × 3 matrix.
#include <stdio.h>
void main()
{
int i, j, mat[3][3], transposed_mat[3][3];
printf("\n Enter the elements of the matrix ");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d", &mat[i][j]);
}
}
printf("\n The elements of the matrix are ");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 20
printf("%d\t", mat[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
transposed_mat[i][j] = mat[j][i];
}
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.
#include <stdio.h>
#include<stdlib.h>
void main()
{
int i, j, m, n, p, q, a[5][5], b[5][5], c[5][5];
printf("\n Enter the number of rows and columns in the first matrix : ");
scanf("%d%d",&m,&n);
printf("\n Enter the number of rows and columns in the second matrix : ");
scanf("%d%d",&p,&q);
if(m != p || n != q)
{
printf("\n Number of rows and columns of both matrices must be equal");
exit(0);
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 21
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
c[i][j] = a[i][j] + b[i][j];
}
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 22
1. Passing individual elements
The individual elements of an array can be passed to a function by passing either their data values or
addresses.
Passing Addresses
Calling function Called function
main() void func(int *num)
{ {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; printf("%d", *num);
func(&arr[1][1]); }
}
2. Passing a Row
A row of a two-dimensional array can be passed by indexing the array name with the row number.
Look at Fig. 3.32 which illustrates how a single row of a two-dimensional array can be passed to the
called function.
Calling function Called function
main() void func(int arr[])
{ {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; int i;
func(arr[1]); for(i=0;i<5;i++)
} printf("%d", arr[i]);
}
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 23
Calling function Called function
main() void func(int arr[5][5])
{ {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; for(i=0;i<5;i++)
func(arr); for(j=0;j<5;j++)
} printf("%d", arr[i][j]);
}
Example:
1. Write a program to read and display a 2 × 2 × 2 array.
#include <stdio.h>
void main()
{
int array[2][2][2], i, j, k;
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 24
printf("\n The matrix is : ");
for(i=0;i<2;i++)
{
printf("\n");
for(j=0;j<2;j++)
{
printf("\n");
for(k=0;k<2;k++)
printf("\t array[%d][%d][%d] = %d", i, j, k, array[i][j][k]);
}
}
}
Output
Enter the elements of the matrix
12345678
The matrix is
arr[0][0][0] = 1 arr[0][0][1] = 2
arr[0][1][0] = 3 arr[0][1][1] = 4
arr[1][0][0] = 5 arr[1][0][1] = 6
arr[1][1][0] = 7 arr[1][1][1] = 8
Dr. Azizkhan F Pathan, Prof. Meghana G R, Prof. Kotramma T S, Dept. of CS&E, JIT, Davangere 25
soprotection.com