Lecture Handout
Introduction
to Programming
Lecture No. 11
Reading
Material
Deitel
& Deitel - C++ How to Program chapter
4
4.2,
4.3, 4.4
Summary
•
• Arrays
• Initialization
of Arrays
• Sample
Program 1
• Copying
Arrays
• Linear
Search
• The
Keyword ‘const’
• Tips
Introduction
We
have started writing functions, which will become a part of our every program.
As C
language
is a function-oriented language, so we will be dealing with too many
functions.
Our
programming toolkit is almost complete but still a very important component is
missing.
We are going to discuss this component i.e. Arrays in
this lecture.
Let
us consider an example about calculation of average age of 10 students. At
first, we
will
declare 10 variables to store the age of each student and then sum up all the
ages and
divide
this with 10 to get the average age. Suppose, we have 100 students instead of
10,
we
have to declare 100 variables i.e. one for each student’s age. Is there any
other way to
deal
with this problem? Arrays are possible
solution to the problem.
Array
is a special data-type. If we have a collection of data of same type as in the
case of
storage
of ages of 100 students, arrays can be used. Arrays are data structure in which
identical
data types are stored. The concept of arrays is being explained further in the
following
parts of the lecture.
Arrays
In C language, every array has a data type
i.e. name and size. Data type can be any valid
data
type. The rules of variable naming convention apply to array names. The size of
the
array
tells how many elements are there in the array. The size of the array should be
a
precise
number. The arrays occupy the memory depending upon their size and have
contiguous
area of memory. We can access the arrays using the array index.
Declaration:
The
declaration of arrays is as follows:
data_type
array_name
[size] ;
for
example:
int
ages[10];
Let's
consider an array int C[10]; This is an array of integer and has a name ’C'. It
has a
size
ten which depicts that the array ‘C’ can contain ten elements of int data type.
In the
memory,
the array occupies the contiguous area, in this case it will occupy forty bytes
(one
int = 4 bytes). The elements of the array are manipulated using the index. In C
language,
the index of array starts from zero and is one less than array's size. Index of
array
is also called subscript.
Memory
image of an array:
Name
C[0] 24
C[1] 59
C[2] 35
C[3] …
..
..
C[7]
C[8]
C[9]
Index
In
the above figure, the memory chunk containing the array C is shown. On the
first line,
C[0]
is written while on the 2nd line, C[1] is written and so on. The number in the [ ] is
the
index of the array. C[0] is used for the first element, followed by C[1]
for the second
element
and so on. It is important to note that in an array the index 6 ([6]) means the
seventh
element of the array and thus the eighth element will have an index 7. Thus,
the
index
of the last element of the array will be 1 less than the size of the array. On
the right
hand
side, the values of the elements are shown in the memory i.e. the value of the
element
at zero position ( C[0] ) is 24 while that of
the element at first position ( C[1] ) is
59
and so on. The important thing to be noted here is that the indexing of the
array starts
from
zero, not from one. So in the above example, the index of the array C will be
from
C[0]
to C[9]. If we have an array of size 25, its index will be from 0 to 24.
Usage of Arrays
To
declare arrays, we have to give their data type, name and size. These are
fixed-size
arrays.
In the coming lectures, we will discuss arrays without using size at
declaration
time.
Arrays may be declared with simple variables in a single line.
int i, age [10];
int
height [10], length [10] ;
To
access array, we can’t use the whole array at a time. We access arrays element
by
element.
An index (subscript) may be used to access the first element of the array. In
this
case,
to access first element we write like age[0]. To access the 5th
element, we will write
age[4]
and so on. Using the index mechanism, we
can use the array elements as simple
variables.
Their use can be anywhere where there we can use a simple variable i.e. in
assignment
statements, expressions etc. Please do
not confuse the usage of array and
declaration
of array. When we write int age [10], it means we are declaring an array of
type
int, its name is age and its size is 10. When we write age[5], it means we are
referring
to the single element of the array not the whole array.
Consider
the example of student’s ages again. Is there a way to calculate the average
age
of
all the students in an array?
As
we know that arrays can be accessed with indexing. So we can use a 'for
loop' as
under;
for
(i = 0 ; i < 10 ; i++ )
{
cout
<< “Please enter the age of the student “;
cin
>> age [i];
}
In
the above 'for loop' the
value of i is changing from 0 to 9. Here the
loop condition is
i<10. This means that the cin and cout statements will be executed 10
times. We have
used
i as the index of the array. The
index we are referring to the array needs to be an
integer.
It can be 4, 5 or an integer variable like i. In
the first repetition, the value of i is
0,
i.e.
age[0] so
the value of first element of the age will be read. In
the second repetition,
the
value of i becomes 1 i.e. age[1] so
the value of 2nd element of the age will be read and
so
on. We get all the 10 values from the user which will be stored in the array age.
Now
we will calculate the total of ages. We can use another 'for
loop' to add up all the
elements
of the array age.
int
totalAge = 0;
for
(i = 0 ; i < 10 ; i++ )
{
totalAge
+= age [i];
}
In
the above loop, all the elements of the array age will be added to the variable
totalAge.
When
the value of i is 0
i.e. age[0] the
value of first element will be added to the
totalAge. As the value of i is changing from 0 to 9 so all the
10 elements of the array will
be
added to the totalAge. By
dividing this totalAge by
10 we will get the average age.
Initialization of Arrays
There
are many ways to initialize an array. Don't use the default initialization of
arrays.
Compiler
may assign some value to each declared array. Always initialize the array in
such
a manner that the process is clear.
We
can initialize an array using a 'loop' while assigning some value.
int
i, age [10];
for
( i = 0; i < 10 ; i++ )
{
age[i]
= 0;
}
With
the help of this simple loop, we have initialized all the elements of array age to
zero. In the loop condition, we have used the
condition i < 10,
where the size of the array
is
ten. As we know, the array index is one less than the size of the array. Here
we are
using
i
as
the index of array and its values are from 0 to 9.
We
can also initialize the array at the time of declaration as:
int
age [10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
The
above statement creates an array age of
integers and initializes all the elements with
zero.
We can use any value to initialize the array by using any other number instead
of
zero.
However, generally, zero is used to initialize the integer variables.
We
can do it by using the following shortcut.
int
age [10] = { 0 };
The
above statement has also initialized all the elements of the array to
zero.
We
have different ways of initializing the arrays. Initialization through the use
of loop is
a
better choice. If the size of the array gets larger, it is tedious to
initialize at the
declaration
time.
Consider
the following statement:
int
age [ ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Here
we have not mentioned the size of the array. The compiler is quite intelligent
as it
detects
the initialization list which consists of ten 0’s. Therefore, it creates an
array of 10
integers
and initializes all the elements with zero.
The
index of the arrays starts from the index 0 and is up to one less than the size
of the
array.
So if the size of the array is ten, the index will be from 0 to 9. Similarly,
if the size
of
the array is 253, the index will be from 0 to 252.
Sample Program 1
Problem Statement:
Write
a program which reads positive integers from the user and stores these ones in
an
array.
User can enter a maximum of 100 numbers. Stop taking input when user enters -1.
Solution:
We
have to declare an integer array of size 100 to be used to store the integers.
We used a
loop
to get the input from the users. There are two conditions to terminate the loop
i.e.
either
user has entered 100 numbers or user entered -1. 'For' and 'while' loops can
execute
zero
or more times whereas ‘do-while’ may execute one or more times. By analyzing
the
problem,
the loop will be executed at least once so do-while loop logically fits in this
problem.
We take an integer z to get the input from the user and
i as
the counter so the
condition
will be as ( z
!= -1 && i < 100 ). && is used to enforce that both the
conditions
are true. If any of the two conditions becomes false, the loop will be
terminated.
The loop counter is less than 100 because the index of the array will be from
0
to 99.
We
will read a number from the user and store it at some particular location of
the array
unless
user enters -1 or 100 numbers are entered. In the loop, we will use the if
statement
whether
the number entered by user is -1 or not. If the number entered is not -1, then
we
will
store it in the array. The index of the array will also be incremented in each
repetition.
We can assign some value to array element as:
c[
3 ] = 33;
In
an assignment statement, we cannot use expression on the left hand side. Here
c[3] is
used
as a variable which represents the 4th element of the array.
The
complete code of the program as under:
//
This program reads the input from user and store it into an array and stop at
-1.
#include <iostream.h>
main(
)
{
int c [ 100 ] ;
int
i, z;
do
{
int
z , i = 0 ;
cout << “Please enter the number (-1 to end
input) “ << endl;
cin
>> z ;
if
( z != -1 )
{
c[ i ] = z ;
}
i
++ ;
}
while ( z != -1 && i < 100 ) ;
cout
<< “ The total number of positive integers entered by user is “ <<
i -1;
}
The
above code shows that the assignment statement of the array is inside the if
block.
Here
the numbers will be assigned to the array elements when the 'if statement'
evaluates
to
true. When the user enters -1, the if
statement will evaluate it false. So the assignment
statement
will not be executed and next i will be incremented. The condition
in the 'while
loop'
will be tested. As the value of z is
-1, the loop will be terminated.
Now
we have to calculate how many positive numbers, the user has entered. In the
end,
we
have incremented i so the actual positive integers
entered by the users is i -1.
The
above example is very useful in terms of its practical usage. Suppose we have
to
calculate
the ages of students of the class. If we don’t know the exact number of
students
in
the class, we can declare an array of integers of larger size and get the ages
from the
user
and use -1 to end the input from the user.
A
sample out put of the program is as follow.
Please
enter the number (-1 to end input) 1
2
3
4
5
6
-1
The total number of positive integers entered by user is 6
Copying Arrays
Sometimes,
we need to copy an array. That means after copying, both the arrays will
contain
elements with same values. For being copy able, both arrays need to be of same
data
type and same size. Suppose, we have two arrays a and b and
want to copy array a
into
array b. Both arrays are of type int and
of size 10.
int
array a[10];
int
array b[10];
We
know that a value can be assigned to an element of array using the index. So we
can
write
assignment statements to copy these arrays as:
b[0]
= a[0] ;
b[1]
= a[1] ;
b[2]
= a[2] ;
……
……
……
b[9]
= a[9] ;
As
the size of array is 10, its index will be from 0 to 9. Using the above
technique, we
can
copy one array to another. Now if the array size is 100 or 1000, this method
can be
used.
Is there some other way to do things in a better way? We can use the loop
construct
to
deal with this easily in the following way.
for
(i = 0; i < 10 ; i ++)
{
b[i]
= a[i];
}
With
the help of loop, it becomes very simple. We are no more worried about the size
of
the
array. The same loop will work by just changing the condition. We are assigning
the
corresponding
values of array a into
array b. The
value of first element of array a is
assigned
to the first element of array b and so on.
Example:
Take
the sum of squares of 10 different numbers stored in an array.
Here
is the code of the program:
//
This program calculates the sum of squares of numbers stored in an array.
#include
<iostream.h>
main()
{
int
a[10];
int
sumOfSquares = 0 ;
int
i =0;
cout
<< "Please enter the ten numbers one by one " << endl;
//
Getting the input from the user.
for
(i = 0 ; i < 10 ; i++ )
{
cin
>> a [i];
}
//
Calculating the sum of squares.
for
( i = 0 ; i < 10 ; i ++ )
{
sumOfSquares
= sumOfSquares + a[ i ] * a[ i ] ;
}
cout
<< “The sum of squares is “
<< sumOfSquares << endl;
}
A sample out put of the program is given below.
Please
enter the ten numbers one by one
1
2
3
4
5
6
7
8
9
10
The sum of squares is 385
Linear Search
Arrays
are used to solve many problems. As we have seen that loops are used along with
the
arrays, so these two constructs are very important. Suppose, we are given a
list of
numbers
to find out a specific number out of them.
Is the number in the list or not? Let's
suppose
that there are 100 numbers in the list. We take an array of size 100 as int
a [100].
For populating it, , we can request the user to enter the numbers. Either these numbers
can
be stored into the array or we can just
populate it with numbers from 0 to 99. We can
write
a simple loop and assign the values as a[i]
= i. This means that at ith position, the
value
is i i.e. ( a[5] = 5 ), at 5th position
the value is 5 and so on. Then we can request the
user
to enter any number and store this number into an int variable. To search this
number
in the array, we write a loop and compare all the elements with the number. The
loop
will be terminated, if we found the number or we have compared all the elements
of
the
array, which means that number is not found. We used a flag to show that we
have
found
the number or not. If the value of found is zero, the number is not found while
the
value
1 will mean that number has been found. When we find the number, is there a
need
to
compare it with other elements of the array? May be not, so when we found the
number,
we just jumped out of the loop. In the end, we check the variable found. If
the
value
is 1, it means number has been found. Otherwise number stands unfound.
Here
is the complete code of the program.
//
This program is used to find a number from the array.
#include
<iostream.h>
main()
{
int
z, i ;
int
a [ 100 ] ;
//
Initializing the array.
for
( i =0 ; i < 100 ; i ++ )
{
a
[ i ] = i ;
}
cout
<< “ Please enter a positive integer
“ ;
cin
>> z ;
int
found = 0 ;
//
loop to search the number.
for
( i = 0 ; i < 100 ; i ++ )
{
if
( z == a [ i ] )
{
found
= 1 ;
break
;
}
}
if
( found == 1 )
cout
<< “ We found the integer at index ” << i ;
else
cout
<< “ The number was not found ” ;
}
The following is an output of the program.
Please
enter a positive integer 34
We found the integer at index 34
The
loop in the above program may run 100 times or less. The loop will terminate if
the
number
is found before the 100th repetition. Therefore, in the linear search the maximum
limit
of the loop execution is the size of the list. If the size of list is 100, then
the loop can
execute
a maximum of 100 times.
Using random function (Guessing Game):
We
can turn this problem into an interesting game. If we as programmers do not
know,
which
number is stored in the array? We can make this a guessing game. How can we do
that?
We need some mechanism by which the computer generates some number. In all
the
C compilers, a random number generation function is provided. The function is
rand() and is in the standard library. To access this function, we need to
include
<stdlib.h>
library in our program. This function will return a random number. The
number
can be between 0 and 32767. We can use this function as:
x
= rand ( );
The
random function generates an integer which is assigned to variable x. Let's
consider
the
function-calling mechanism. The program starts its execution in the main
function.
When
the control goes to the statement containing a function call, the main program
stops
here
and the control goes inside the function called. When the function completes or
returns
some value, the control comes back to the main program.
Here
is the complete code of the program using rand().
//
This program is used to find a number from the array.
#include
<iostream.h>
#include
<stdlib.h>
main()
{
int
z, i ;
int
a [ 100 ] ;
//
Initializing the array.
for
( i =0 ; i < 100 ; i ++ )
{
a
[i] = rand() ;
}
cout
<< “ Please enter a positive integer “ ;
cin
>> z ;
int
found = 0 ;
//
loop to search the number.
for
( i = 0 ; i < 100 ; i ++ )
{
if
( z == a [ i ] )
{
found
= 1 ;
break
;
}
}
if
( found == 1 )
cout
<< “ We found the integer at position ” << i ;
else
cout
<< “ The number was not found ” ;
}
The
following is an output of the program.
Please
enter a positive integer 34
The
number was not found
The
function rand ( ) returns a value between 0 and 32767. Can we limit the
generated
random
number in a smaller range? Suppose we have a die with six faces marked with 1,
2,
3, 4, 5 and 6. We want to generate random die number i.e. the number should be
between
1 and 6 inclusive. Here we can use the modulus operator to achieve this.
Modulus
operator returns the remainder. What will be the result of the statement?
rand
( ) % 6
When
6 divides any number, the remainder will always be less than 6. Therefore, the
result
will be between 0 and 5 inclusive. We want the number between 1 and 6,
therefore
we
will add 1.
1
+ rand ( ) % 6;
The
above statement will give us the desired result. We need to know whether this
is a
fair
die or not. A fair die is a die when it is rolled 10 or 100 million of times.
Then on
average,
equal number of 1’s, equal number of 2’s, equal number of 3’s etc. will be
generated.
Can we test our die i.e. it is fair or not? That is there are equal numbers of
chances
of 1 or 2 etc. Think about generating a test for our random number generator.
Does
it produce a fair die?
The
random function is very useful. It can be used to guess the tossing of the
coin. There
can
be only two possibilities of tossing a coin. Therefore we can use rand ( ) % 2
which
will
give 0 or 1.
The Keyword ‘const’:
To
declare an array, we need its data type, name and size. We use simple integer
for the
size
like 10 or 100. While using arrays in loops, we use the size a lot. Suppose if
we have
to
change the size of the array from 10 to 100, it will have to be changed at all
the places.
Missing
a place will lead to unexpected results. There is another way to deal this
situation
i.e.
keyword construct. The keyword const can be used with any data type and
is written
before
the data type as:
const
int arraySize = 100;
This
statement creates an identifier arraySize and assigns it the value 100. Now
the
arraySize is called integer constant. It is not a variable. We cannot change its
value in the
program.
In the array declaration, we can use this as:
int
age [arraySize];
Now
in the loop condition, we can write like this:
for
( i = 0; i < arraySize ; i ++)
If
we have to change the size of the array, we only have to change the value of arraySize
where
it is declared. The program will work fine in this case. This is a good
programming
practice
to use const for array size.
Tips
• Initialize
the array explicitly
• Array
index (subscript) starts from 0 and ends one less than the array size
• To
copy an array, the size and data type of both arrays should be same
• Array
subscript may be an integer or an integer expression
• Assigning
another value to a const is a syntax error
Post a Comment
Don't Forget To Join My FB Group VU Vicky
THANK YOU :)