You are on page 1of 50

Chapter 8: Arrays

Starting Out with C++


Early Objects
Seventh Edition

by Tony Gaddis, Judy Walters,


and Godfrey Muganda

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley


Topics

8.1 Arrays Hold Multiple Values


8.2 Accessing Array Elements
8.3 Inputting and Displaying Array Contents
8.4 Array Initialization
8.5 Processing Array Contents
8.6 Using Parallel Arrays

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-2


Topics (continued)

8.7 The typedef Statement


8.8 Arrays as Function Arguments
8.9 Two-Dimensional Arrays
8.10 Arrays with Three or More Dimensions
8.12 Arrays of Class Objects

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-3


8.1 Arrays Hold Multiple Values

• Array: variable that can store multiple


values of the same type
• Values are stored in adjacent memory
locations
• Declared using [] operator
const int CAP = 5;
int test[CAP]; … or int test[5];

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-4


Array Storage in Memory
The definition
int test[5];
allocates the following memory cells:

Element 0 Element 1 Element 2 Element 3 Element 4

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-5


Array Terminology
In the definition int test[5];

– int is the data type of each array element


– test is the name of the array
– 5, in [5], is the capacity declarator, the
maximum number of elements the array can hold.
– The size of an array is the number of bytes
allocated for it
(number of elements) * (bytes needed for each element)

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-6


Array Terminology Examples

Examples:
Assumes int uses 4 bytes and double uses 8 bytes
const int CAP = 5, DSIZE = 10;
int test[CAP]; // holds 5 ints, array
// occupies 20 bytes
double vol[DSIZE];// holds 10 doubles
// array is 80 bytes

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-7


8.2 Accessing Array Elements

• Each array element is a variable whose


“name” contains a subscript that uniquely
identifies the element.
• Name of 3rd element array test is test[2],
”test-sub-two”
• Subscripts start at 0

subscripts 0 1 2 3 4

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-8


Accessing Array Elements

Array elements are regular variables of the


base data type.
test
0 1 2 3 4
test[0] = 79;
cout << test[0];
cin >> test[1];
test[4] = test[0] + test[1];
cout << test; // illegal due to ??
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-9
8.3 Inputting and Displaying
Array Contents

Arrays can be loaded and displayed – one


element at a time.
int test[5]; // 5-element array
cout << "Enter first test score ";
cin >> test[0];
for (k=0; k<5; k++) cout << test[k];

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-10


Array Subscripts

• Array subscript can be an integer constant,


variable, or expression
• Examples: Subscript is

cin >> test[3]; int constant

cout << test[i]; int variable

cout << test[i+j]; int expression

cin >> test[test[0]]; int expression

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-11


Inputting and Displaying
All Array Elements

To access each element of an array


– Use a (for) loop
– The loop control variable sequence must be
the array valid subscripts, e.g., 0,1,2,…
– A different array element will be referenced
each time through the loop
for (i = 0; i < 5; i++)
sum = sum + test[i];
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-12
WARNING!! No Bounds Checking
• C++ does not check that an array subscript is
in range
• An invalid array subscript can cause program
to overwrite other memory
• Example:
num
int i = 4;
int num[3]; 25
num[i] = 25; [0] [1] [2]

• C++ Segmentation error!!

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-13


Off-By-One Errors
• Most often occur when a program
accesses data one position beyond the
start/end of an array, or misses the
first/element of an array.
• Don’t confuse the ordinal number of an
array element (first, second, third) with its
subscript (0, 1, 2)

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-14


8.4 Array Initialization

• Can be initialized during program execution


with assignment statements
test[0] = 79;
test[1] = 82; // etc.
• Can be initialized at array definition with an
initialization list
int test[5] = {79,82,91,77,84};

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-15


Partial Array Initialization

• If array is initialized at definition with fewer


values than the size declarator of the array,
remaining elements will be set to 0 or NULL
int test[5] = {79, 82};
79 82 0 0 0

• Initial values used in order; cannot skip over


elements to initialize noncontiguous range
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-16
Implicit Array Sizing
• Can determine array size by the size of the
initialization list
short quizzes[]={12,17,15,11};

12 17 15 11

• Must use either array size declarator or


initialization list when array is defined

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-17


8.5 Processing Array Contents

• Array elements can be


– treated as ordinary variables of the same type
as the array
– used in arithmetic operations, in relational
expressions, etc.
• Example:
if (principalAmt[3] >= 10000)
interest = principalAmt[3] * intRate1;
else
interest = principalAmt[3] * intRate2;

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-18


Using Increment and Decrement
Operators with Array Elements

int test[15];
When using ++ and -- operators, don’t
confuse the element with the subscript
test[i]++; // increments test[i], but has
// no effect on i.
test[i++]; // increments i, but has
// no effect on test array.

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-19


Copying One Array to Another
• Can not copy with an assignment
statement:
test2 = test; //won’t work
• Instead, must use a loop to copy element
by element:
for (int k=0; k < CAP; k++)
test2[k] = test[k];

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-20


Are Two Arrays Equal?
• Also, cannot compare in a single expression:
if (test2 == test)

• Use a while loop with a boolean flag:


bool Equal = true;
int k = 0;
while (k< CAP && Equal)
{
if(test[k] != test2[k])Equal = false;
k++;
}

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-21


Are Two Arrays Equal? Another Way?
• Use a while loop with a boolean flag:
bool Equal = true;
int k = 0;
while (k < CAP)
{
Equal = ( test[k] == test2[k]);
k++;
}

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-22


Are Two Arrays Equal? And This?
• Use a while loop with a boolean flag:
bool Equal = true;
int k = 0;
while (k < CAP)
{
Equal = Equal && (test[k]==test2[k]);
k++;
}

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-23


Are Two Arrays Equal? - Again
• Use a for loop with a boolean flag:

bool Equal = true;


int k = 0;
for (k=0; Equal && k<CAP; k++)
{
if(test[k] != test2[k])
Equal = false;
}

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-24


Sum, Average of Array Elements

• Use a simple loop to add together array


elements
float average, sum = 0;
for(int t=0; t<CAP; t++)
sum += test[t];
• Once summed, average can be computed
average = sum/CAP;

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-25


Largest Array Element
• Use a loop to examine each element and find
the largest element (i.e., one with the largest value)
int largest = test[0];
for (int t = 1; t < CAP; t++)
{ if (test[t] > largest)
largest = test[t];
}
cout << "Highest score is " << largest;

• A similar algorithm exists to find smallest.


Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-26
Partially-Filled Arrays
• The exact amount of data may not be known
when a program is written.
• Programmer estimates maximum amount of
data (capacity), and sizes array accordingly.
• Programmer must track the number of array
elements actually being used – to avoid
exceeding array capacity (segmentation error)

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-27


C-Strings and string Objects

Can be processed using array name


– Entire string at once, or
– One element at a time by using a subscript
string city;
cout << "Enter city name: ";
cin >> city;

'S' 'a' 'l' 'e' 'm'


city[0] city[1] city[2] city[3] city[4]

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-28


8.6 Using Parallel Arrays

• Parallel arrays: two or more arrays that


contain related data
• Subscript is used to relate corresponding
data
– elements at same subscript are related
• The arrays may hold different data types

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-29


Parallel Array Example

const int CAP = 5;


string name[CAP]; // student name
float average[CAP]; // course average
char grade[CAP]; // course grade

name average grade


0 0 0
1 1 1
2 2 2
3 3 3
4 4 4

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-30


Parallel Array Processing
const int CAP = 5;
string name[CAP]; // student name
float average[CAP]; // course average
char grade[CAP]; // course grade
...
for (int i = 0; i < CAP; i++)
cout << " Student: " << name[i]
<< " Average: " << average[i]
<< " Grade: " << grade[i]
<< endl;

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-31


8.7 The typedef Statement

• Creates an alias for a data type.


• Format:
typedef existingType newName;

• Example:
typedef float Money;
Money Paycheck[CAP]; // array of
// floats.

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-32


Uses of typedef

• Can make code more readable.


• Can be used to create alias for array of a
particular type
// Define yearArray as a data type
// that is an array of 12 ints
typedef int yearArray[MONTHS];
// Create two of these arrays
yearArray highTemps, lowTemps;

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-33


8.8 Arrays as Function Arguments
• To declare a function with an array parameter, use
empty [] to indicate the argument is an array.
• To pass an array argument to a function, just use
the array name
// Function prototype
void showScores(int []);
// Function header
void showScores(int test[])
// Function call
showScores(test);
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-34
Passing an Array Element

• Passing a single array element to a function is no


different than passing a regular variable of that
data type
• Function does not need to know that the value it
receives is coming from an array
displayValue(score[i]); // call
void displayValue(int item) // header
{ cout << item << endl;
}

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-35


Passing an Entire Array

• Use the array name, without any brackets,


as the argument
• Can also pass the array size so the function
knows how many elements to process
showScores(test, 5); // call
void showScores(int[], int); // prototype
void showScores(int A[],
int size) // header

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-36


Using typedef with a Passed Array
Can use typedef to simplify function prototype
and heading
// Make intArray an integer array
// of unspecified size
typedef int intArray[];

// Function prototype
void showScores(intArray, int);
// Function header
void showScores(intArray test, int size)

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-37


Modifying Arrays in Functions

• Array parameters are passed by reference


• Changes made to array in a function are
made to the actual array in the calling function
• Must be careful that an array is not
inadvertently changed by a function

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-38


8.9 Two-Dimensional Arrays

• Can define one array for multiple sets of data


• Like a table in a spreadsheet
• Use two size declarators in definition
int exam[4][3];

Number Number
of rows of cols

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-39


Two-Dimensional Array Representation
int exam[4][3];

columns
exams[0][0] exams[0][1] exams[0][2]
r
o exams[1][0] exams[1][1] exams[1][2]
w exams[2][0] exams[2][1] exams[2][2]
s
exams[3][0] exams[3][1] exams[3][2]

Must use two subscripts to access element


exam[2][2] = 86;

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-40


Initialization at Definition
• Two-dimensional arrays are initialized row-
by-row
int exam[2][2] = { {84, 78},
{92, 97} };
84 78
92 97

• exam[0] is row 1, an int array


containing {84, 78}.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-41
Passing a Two-Dimensional Array to a
Function

• Use array name as argument in function call


getExams(exam, 2);
• Use empty [] for row and a size declarator for col in
the prototype and header
// Prototype, where #cols is 2
void getExams(int[][2], int);
// Header
void getExams (int Ex[][2], int rows)

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-42


Using typedef with a
Two-Dimensional Array

Can use typedef for simpler notation


typedef int intExams[][2];
...
// Function prototype
void getExams(intExams, int);
// Function header
void getExams(intExams exam, int rows)

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-43


2D Array Traversal
• Use nested loops, one for row and one for
column, to visit each array element.
for (int r=0; r<NROWS; r++)
for (int c=0; c<NCOLS; c++)
process exam[r][c] …

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-44


8.10 Arrays with Three or More
Dimensions

• Can define arrays with any number of


dimensions
short rectSolid [2][3][5];
double timeGrid[3][4][3][4];
• When used as parameter, specify size of
all but 1st dimension
void getRectSolid(short [][3][5]);

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-45


8.13 Arrays of Structures

• Structures can be used as array elements


struct Student
{
int studentID;
string name;
short year;
double gpa;
};
Student Class[30]; // Holds 30
// Student records.

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-46


Arrays of Structures

• Use array subscript [ ] to access a specific


structure in the array
• Then use dot . operator to access members
of that structure
cin >> Class[25].studentID;
cout << Class[i].name << " has GPA "
<< Class[i].gpa << endl;

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-47


Chapter 8: Arrays

Starting Out with C++


Early Objects
Seventh Edition

by Tony Gaddis, Judy Walters,


and Godfrey Muganda

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley


8.14 Arrays of Class Objects

• Class objects can also be used as array elements


class Square
{ private:
int side;
public:
Square(int s = 1)
{ side = s; }
int getSide()
{ return side; }
};
Square shapes[10]; // Create array of 10
// Square objects
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-49
Arrays of Class Objects

• First, use an array subscript [ ] to access a


specific object in the array
• Then, use dot . operator to access the
member of that object
for (i = 0; i < 10; i++)
cout << shapes[i].getSide() << endl;

member
object
function
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley 8-50

You might also like