Arrays
Mirza Mohammad Lutfe Elahi
CSE 115 Programming Language I ECE@NSU
2
Outline
• Declaring, Initializing, and Indexing Arrays
• Using Loops for Sequential Array Access
• Using Array Elements as Function Arguments
• Array Arguments
• Partially Filled Arrays
CSE 115 Programming Language I ECE@NSU
3
What is an Array?
• Scalar data types, such as int, store a single value
• Sometimes, we need to store a collection of values
• An array is a collection of data items, such that:
– All data values are of the same type (such as int)
– Are referenced by the same array name
• Individual cells in an array are called array elements
• An array is called a data structure
– Because it stores many data items under the same name
• Example: using an array to store exam scores
CSE 115 Programming Language I ECE@NSU
4
Declaring an Array
• To declare an array, we must declare:
– The array name
– The type of array element
– The number of array elements
• Example: double x[8];
• Associate 8 elements with array name x
CSE 115 Programming Language I ECE@NSU
5
Initializing Arrays
• You can declare a variable without initialization
double average; /* Not initialized */
• You can also declare a variable with initialization
int sum = 0; /* Initialized to 0 */
• Similarly, you can declare arrays without initialization
double x[20]; /* Not initialized */
• You can also declare an array and initialize it
int prime[5] = {2, 3, 5, 7, 11};
• No need to specify the array size when initializing it
int prime[] = {2, 3, 5, 7, 11};
CSE 115 Programming Language I ECE@NSU
6
Visualizing an Array in Memory
/* Array A has 6 elements */
int A[] = {9, 5, -3, 10, 27, -8};
Memory
Array A Addresses
All arrays start at index 0 0 9 342900
1 5 342904
Array Index 2 -3 342908
Array Element 3 10 342912
4 27 342916
5 -8 342920
CSE 115 Programming Language I ECE@NSU
7
Array Indexing
double x[8];
• Each element of x stores a value of type double
• The elements are indexed starting with index 0
– An array with 8 elements is indexed from 0 to 7
• x[0] refers to 0th element (first element) of array x
• x[1] is the next element in the array, and so on
• The integer enclosed in brackets is the array index
• The index must range from zero to array size – 1
CSE 115 Programming Language I ECE@NSU
8
Array Indexing (Cont’d)
• An array index is also called a subscript
• Used to access individual array elements
• Examples of array indexing:
x[2] = 6.0; /* index 2 */
y = x[i+1]; /* index i+1 */
• Array index should be any expression of type int
• A valid index must range from 0 to array size – 1
• C compiler does not provide array bound checking
• It is your job to ensure that each index is valid
CSE 115 Programming Language I ECE@NSU
9
Statements that Manipulate Array x
CSE 115 Programming Language I ECE@NSU
10
Arrays of Characters
• You can declare and initialize a char array as
follows:
char vowels[] = {'A','E','I','O','U'};
• You can also use a string to initialize a char array:
char string[] = "This is a string";
• It is better to use a named constant as the array size:
#define SIZE 100
. . .
char name[SIZE]; /* Not initialized */
• You can declare arrays and variables on same line:
char name[SIZE], answer;
CSE 115 Programming Language I ECE@NSU
11
Array Input/Output
#include<stdio.h>
#define SIZE 5 /* array size */
int main(void) {
double x[SIZE];
int i;
for(i = 0; i < SIZE; i++) {
printf("Enter element[%d]: ", i);
scanf("%lf", &x[i]);
}
printf("\n");
for(i = 0; i < SIZE; i++)
printf("Element[%d] is %.2f\n", i, x[i]);
return 0;
}
CSE 115 Programming Language I ECE@NSU
12
Computing Sum and Sum of Squares
/* We use a for loop to traverse an
* array sequentially and accumulate
* the sum and the sum of squares
*/
double sum = 0;
double sum_sqr = 0;
for(i = 0; i < SIZE; i++) {
sum += x[i];
sum_sqr += x[i] * x[i];
}
CSE 115 Programming Language I ECE@NSU
13
Computing Standard Deviation
• The mean is computed as: sum / SIZE
• The Standard Deviation is computed as follows:
CSE 115 Programming Language I ECE@NSU
/* Program that computes the mean and standard deviation*/ 14
#include <stdio.h>
#include <math.h>
#define SIZE 8 /* array size */
int main(void) {
double x[SIZE], mean, st_dev, sum=0, sum_sqr=0;
int i;
/* Input the data */
printf("Enter %d numbers separated by blanks\n> ", SIZE);
for(i = 0; i < SIZE; i++) scanf("%lf", &x[i]);
/* Compute the sum and the sum of the squares */
for(i = 0; i < SIZE; i++) {
sum += x[i];
sum_sqr += x[i] * x[i];
}
CSE 115 Programming Language I ECE@NSU
15
/* Compute and print the mean and standard deviation */
mean = sum / SIZE ;
st_dev = sqrt(sum_sqr / SIZE – mean * mean);
printf("\nThe mean is %.2f.\n", mean);
printf("The standard deviation is %.2f.\n", st_dev);
/* Display the difference between an item and the mean */
printf("\nTable of differences ");
printf("\nBetween data values and the mean\n\n");
printf("Index Item Difference\n");
for(i = 0; i < SIZE; i++)
printf("%3d %9.2f %9.2f\n", i, x[i], x[i] - mean);
return 0;
}
CSE 115 Programming Language I ECE@NSU
16
Sample Run…
CSE 115 Programming Language I ECE@NSU
17
Array Elements as Function Arguments
• From the last example:
x[i] is used as an actual argument to printf
printf("%3d %9.2f %9.2f\n", i, x[i], x[i]-
mean);
• The value of x[i] is passed to printf
• Similarly, &x[i] was an actual argument to scanf
scanf("%lf", &x[i]);
• The address &x[i] is passed to scanf
• Array elements are treated as scalar variables
CSE 115 Programming Language I ECE@NSU
18
Array Elements as Function Arguments
• Suppose that we have a function do_it defined as:
void do_it(double arg_1, double *arg2_p, double
*arg3_p) {
*arg2_p = …
*arg3_p = …
}
• Let x be an array of double elements declared as:
double x[8] = {16.0, 12.0, 6.0, 8.0, 2.5, 12.0,
14.0, -54.6};
• We can call the function do_it as follows:
do_it(x[0], &x[1], &x[2]);
• It will change the values of x[1] and x[2]
CSE 115 Programming Language I ECE@NSU
19
do_it(x[0], &x[1], &x[2]);
CSE 115 Programming Language I ECE@NSU
20
Array Arguments
• Besides passing array elements to functions, we can
write functions that have arrays as arguments
• Such functions can compute some or all of the array
elements
• Unlike scalar variables where we have the option of
passing either the value or address of a variable to a
function, C only passes the address of an array to a
function array argument
• An array cannot be passed by value to a function
CSE 115 Programming Language I ECE@NSU
21
Array Arguments
• list[] parameter does not specify the array size
• We can pass an array of any size to the function
CSE 115 Programming Language I ECE@NSU
22
Calling Function fill_array
• To call fill_array, you must pass 3 arguments:
– Actual array name to fill
– Number of array elements to fill
– Value to store in array
• Examples of calling fill_array:
/* fill 5 elements of x with 1 */
fill_array(x, 5, 1);
/* fill 10 elements of y with num */
fill_array(y, 10, num);
CSE 115 Programming Language I ECE@NSU
23
fill_array(x, 5, 1)
The address of array x
is passed to list
CSE 115 Programming Language I ECE@NSU
24
An Array Argument is a Pointer
• Equivalent declarations of function fill_array
void fill_array(int list[], int n, int val);
void fill_array(int *list, int n, int val);
The first declaration is more readable and preferable
• Equivalent calls to function fill_array
fill_array(x, 5, num);
fill_array(&x[0], 5, num);
The first call is more readable and preferable
CSE 115 Programming Language I ECE@NSU
25
Arrays as Input Arguments
The const keyword indicates that list[] is an input
parameter that cannot be modified by the function
/* Returns the max in an array of n elements */
/* Pre: First n elements of list are defined */
double get_max(const double list[], int n) {
int i;
double max = list[0];
for(i = 1; i < n; ++i)
if(list[i] > max) max = list[i];
return max;
}
CSE 115 Programming Language I ECE@NSU
26
Compute Average of Array Elements
/* Returns the average of n array elements */
/* Pre: First n elements of list are defined */
double get_average(const double list[], int n)
{
int i;
double sum = 0; The const keyword indicates
for(i = 0; i < n; ++i) that list[] is an input
sum += list[i]; parameter that cannot be
return (sum/n); modified by the function
}
CSE 115 Programming Language I ECE@NSU
27
Returning an Array Result
• In C, the return type of a function cannot be an array
• Thus, to return an array as result from a function, we can only
have the array as an output parameter
• Recall that output parameters for a function are declared as
pointers
• An array parameter is also a pointer
• Thus, an array parameter is an output parameter, unless the
const keyword is used
CSE 115 Programming Language I ECE@NSU
28
Example: read_array
/* read n doubles from the keyboard */
/* return an array of n doubles */
void read_array(double list[], int n) {
int i;
printf("Enter %d real numbers\n", n);
printf("Separated by spaces or newlines\n");
printf("\n>");
for(i = 0; i < n; ++i)
scanf("%lf", &list[i]);
}
CSE 115 Programming Language I ECE@NSU
29
/* Program to compute max and average of an array */
#include <stdio.h>
#define SIZE 8
void read_array(double list[], int n);
double get_max(const double list[], int n);
double get_average(const double list[], int n);
int main(void) {
double array[SIZE];
read_array(array, SIZE);
double max = get_max(array, SIZE);
double ave = get_average(array, SIZE);
printf("\nmax = %.2f, average = %.2f\n", max, ave);
return 0;
}
CSE 115 Programming Language I ECE@NSU
30
Sample Run…
CSE 115 Programming Language I ECE@NSU
31
Function to Add Two Arrays
/* Add n corresponding elements of arrays
a[] and b[], storing result in array sum[] */
void
add_arrays(const double a[], /* input array */
const double b[], /* input array */
double sum[], /* output array */
int n) /* n elements */
{
int i;
for(i = 0; i < n; i++)
sum[i] = a[i] + b[i];
}
CSE 115 Programming Language I ECE@NSU
32
Partially Filled Arrays
• The format of array declaration requires that we
specify the array size at the point of declaration
• Moreover, once we declare the array, its size cannot
be changed. The array is a fixed size data structure
• There are many programming situations where we do
not really know the array size before hand
• For example, suppose we want to read test scores
from a data file and store them into an array, we do
not know how many test scores exist in the file.
• So, what should be the array size?
CSE 115 Programming Language I ECE@NSU
33
Partially Filled Arrays (Cont’d)
• One solution is to declare the array big enough so that
it can work in the worst-case scenario
• For the test scores data file, we can safely assume that
no section is more than 50 students
• We define the SIZE of the array to be 50
• However, in this case, the array will be partially filled
and we cannot use SIZE to process it
• We must keep track of the actual number of elements
in the array using another variable
CSE 115 Programming Language I ECE@NSU
34
Read an Array from a File
#include <stdio.h>
#define SIZE 50 /* maximum array size */
int read_file(const char filename[], double list[]);
void print_array(const double list[], int n);
int main(void) {
double array[SIZE];
int count = read_file("scores.txt", array);
printf("Count of array elements = %d\n", count);
print_array(array, count);
return 0;
}
CSE 115 Programming Language I ECE@NSU
int read_file(const char filename[], double list[]) { 35
int count = 0;
FILE *infile = fopen(filename, "r");
if (infile == NULL) { /* failed to open file */
printf("Cannot open file %s\n", filename);
return 0; /* exit function */
}
int status = fscanf(infile, "%lf", &list[count]);
while(status == 1) { /* successful read */
count++; /* count element */
if(count == SIZE)
break; /* exit while */
status = fscanf(infile, "%lf", &list[count]);
}
fclose(infile);
return count; /* number of elements read */
}
CSE 115 Programming Language I ECE@NSU
36
Function to Print an Array
void print_array(const double list[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("Element[%d] = %.2f\n", i, list[i]);
}
CSE 115 Programming Language I ECE@NSU
37
Sample Run
Cannot read
abc as double
CSE 115 Programming Language I ECE@NSU