0% found this document useful (0 votes)
4 views

Part 4 Arrays

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views

Part 4 Arrays

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 45

1

Arrays

 2003 Prentice Hall, Inc. All rights reserved.


2

Introduction

• Arrays
– Structures of related data items
– Static entity (same size throughout program)
• A few types
– Pointer-based arrays (C-like)
– Arrays as objects (C++)

 2003 Prentice Hall, Inc. All rights reserved.


3

Arrays

• Array
– Consecutive group of memory locations
– Same name and type (int, char, etc.)
• To refer to an element
– Specify array name and position number (index)
– Format: arrayname[ position number ]
– First element at position 0
• N-element array c
c[ 0 ], c[ 1 ] … c[ n - 1 ]
– Nth element as position N-1

 2003 Prentice Hall, Inc. All rights reserved.


4

Arrays

• Array elements like other variables


– Assignment, printing for an integer array c
c[ 0 ] = 3;
cout << c[ 0 ];
• Can perform operations inside subscript
c[ 5 – 2 ] same as c[3]

 2003 Prentice Hall, Inc. All rights reserved.


5

Arrays
Name of array (Note
that all elements of
this array have the
same name, c)

c[0] -45
c[1] 6
c[2] 0
c[3] 72
c[4] 1543
c[5] -89
c[6] 0
c[7] 62
c[8] -3
c[9] 1
c[10] 6453
c[11] 78

Position number of the


element within array c

 2003 Prentice Hall, Inc. All rights reserved.


6

Declaring Arrays

• When declaring arrays, specify


– Name
– Type of array
• Any data type
– Number of elements
– type arrayName[ arraySize ];
int c[ 10 ]; // array of 10 integers
float d[ 3284 ]; // array of 3284 floats

• Declaring multiple arrays of same type


– Use comma separated list, like regular variables
int b[ 100 ], x[ 27 ];

 2003 Prentice Hall, Inc. All rights reserved.


7

Using Arrays

• Initializing arrays
– For loop
• Set each element
– Initializer list
• Specify each element when array declared
int n[ 5 ] = { 1, 2, 3, 4, 5 };
• If not enough initializers, rightmost elements 0
• If too many syntax error
– To set every element to same value
int n[ 5 ] = { 0 };
– If array size omitted, initializers determine size
int n[] = { 1, 2, 3, 4, 5 };
• 5 initializers, therefore 5 element array

 2003 Prentice Hall, Inc. All rights reserved.


8
1 // Fig. 4.3: fig04_03.cpp
2 // Initializing an array.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 #include <iomanip>
9
10 using std::setw;
11
12 int main()
Declare a 10-element array of integers.
13 {
14 int n[ 10 ]; // n is an array of 10 integers
15
16 // initialize elements of array n to 0
Initialize array to 0 using a for loop. Note that
17 for ( int i = 0; i < 10; i++ ) the array has elements n[0] to n[9].
18 n[ i ] = 0; // set element at location i to 0
19
20 cout << "Element" << setw( 13 ) << "Value" << endl;
21
22 // output contents of array n in tabular format
23 for ( int j = 0; j < 10; j++ )
24 cout << setw( 7 ) << j << setw( 13 ) << n[ j ] << endl;
25
26 return 0; // indicates successful termination
27
28 } // end main

 2003 Prentice Hall, Inc. All rights reserved.


9
Element Value
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0

 2003 Prentice Hall, Inc. All rights reserved.


10

Using Arrays

• Array size
– Can be specified with constant variable (const)
• const int size = 20;
– Constants cannot be changed
– Constants must be initialized when declared
– Also called named constants or read-only variables

 2003 Prentice Hall, Inc. All rights reserved.


11
1 // Fig. 4.5: fig04_05.cpp
2 // Initialize array s to the even integers from 2 to 20.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 #include <iomanip>
9
10 using std::setw;
11
12 int main() Note use of const keyword. Only const
13 { variables can specify array sizes.
14 // constant variable can be used to specify array size
15 const int arraySize = 10; The program becomes more
16 scalable when we set the array size
17 int s[ arraySize ]; // array s has 10 elements using a const variable. We can
18
change arraySize, and all the
19 for ( int i = 0; i < arraySize; i++ ) // set the values
20 s[ i ] = 2 + 2 * i;
loops will still work (otherwise,
21 we’d have to update every loop in
22 cout << "Element" << setw( 13 ) << "Value" << endl; the program).
23

 2003 Prentice Hall, Inc. All rights reserved.


12
24 // output contents of array s in tabular format
25 for ( int j = 0; j < arraySize; j++ )
26 cout << setw( 7 ) << j << setw( 13 ) << s[ j ] << endl;
27
28 return 0; // indicates successful termination
29
30 } // end main

Element Value
0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20

 2003 Prentice Hall, Inc. All rights reserved.


13

Using Arrays

• Strings (more in next session)


– Arrays of characters
– All strings end with null ('\0')
– Examples
• char string1[] = "hello";
– Null character implicitly added
– string1 has 6 elements
• char string1[] = { 'h', 'e', 'l', 'l',
'o', '\0’ };
– Subscripting is the same
String1[ 0 ] is 'h'
string1[ 2 ] is 'l'

 2003 Prentice Hall, Inc. All rights reserved.


14

Using Arrays

• Input from keyboard


char string2[ 10 ];
cin >> string2;
– Puts user input in string
• Stops at first whitespace character
• Adds null character
– If too much text entered, data written beyond array
• Printing strings
– cout << string2 << endl;
• Does not work for other array types
– Characters printed until null found

 2003 Prentice Hall, Inc. All rights reserved.


15
1 // Fig. 4_12: fig04_12.cpp
2 // Treating character arrays as strings.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::endl; Two different ways to declare
8 strings. string2 is initialized, and
9 int main()
10 {
its size determined automatically .
11 char string1[ 20 ], // reserves 20 characters
12 char string2[] = "string literal"; // reserves 15 characters
13
14 // read string from user into array string2
15 cout << "Enter the string \"hello there\": ";
16 cin >> string1; // reads "hello" [space terminates input]
17
18 // output strings Examples of reading strings from
19 cout << "string1 is: " << string1 the keyboard and printing them out.
20 << "\nstring2 is: " << string2;
21
22 cout << "\nstring1 with spaces between characters is:\n";
23

 2003 Prentice Hall, Inc. All rights reserved.


16
24 // output characters until null character is reached
25 for ( int i = 0; string1[ i ] != '\0'; i++ )
26 cout << string1[ i ] << ' ';
27
28 cin >> string1; // reads "there"
Can access the characters in a string
29 cout << "\nstring1 is: " << string1 << endl; using array notation. The loop ends
30 when the null character is found.
31 return 0; // indicates successful termination
32
33 } // end main

Enter the string "hello there": hello there


string1 is: hello
string2 is: string literal
string1 with spaces between characters is:
h e l l o
string1 is: there

 2003 Prentice Hall, Inc. All rights reserved.


17

Using Arrays

• Recall static storage


– If static, local variables save values between function
calls
– Visible only in function body
– Can declare local arrays to be static
• Initialized to zero
static int array[3];
• If not static
– Created (and destroyed) in every function call

 2003 Prentice Hall, Inc. All rights reserved.


18
1 // Fig. 4.13: fig04_13.cpp
2 // Static arrays are initialized to zero.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 void staticArrayInit( void ); // function prototype
9 void automaticArrayInit( void ); // function prototype
10
11 int main()
12 {
13 cout << "First call to each function:\n";
14 staticArrayInit();
15 automaticArrayInit();
16
17 cout << "\n\nSecond call to each function:\n";
18 staticArrayInit();
19 automaticArrayInit();
20 cout << endl;
21
22 return 0; // indicates successful termination
23
24 } // end main
25

 2003 Prentice Hall, Inc.


All rights reserved.
19
26 // function to demonstrate a static local array
27 void staticArrayInit( void )
28 {
29 // initializes elements to 0 first time function is called
30 static int array1[ 3 ];
Static array, initialized to zero on
31
32 cout << "\nValues on entering staticArrayInit:\n";
first function call.
33
34 // output contents of array1
35 for ( int i = 0; i < 3; i++ )
36 cout << "array1[" << i << "] = " << array1[ i ] << " ";
37
38 cout << "\nValues on exiting staticArrayInit:\n";
39
40 // modify and output contents of array1 Array data is changed; the
41 for ( int j = 0; j < 3; j++ ) modified values stay.
42 cout << "array1[" << j << "] = "
43 << ( array1[ j ] += 5 ) << " ";
44
45 } // end function staticArrayInit
46

 2003 Prentice Hall, Inc.


All rights reserved.
20
47 // function to demonstrate an automatic local array
48 void automaticArrayInit( void )
49 {
50 // initializes elements each time function is called
Automatic array, recreated
51 int array2[ 3 ] = { 1, 2, 3 };
52
with every function call.
53 cout << "\n\nValues on entering automaticArrayInit:\n";
54
55 // output contents of array2
56 for ( int i = 0; i < 3; i++ )
57 cout << "array2[" << i << "] = " << array2[ i ] << " ";
58
59 cout << "\nValues on exiting automaticArrayInit:\n";
60
61 // modify and output contents of array2 Although the array is
62 for ( int j = 0; j < 3; j++ ) changed, it will be destroyed
63 cout << "array2[" << j << "] = " when the function exits and
64 << ( array2[ j ] += 5 ) << " "; the changes will be lost.
65
66 } // end function automaticArrayInit

 2003 Prentice Hall, Inc.


All rights reserved.
21
First call to each function:

Values on entering staticArrayInit:


array1[0] = 0 array1[1] = 0 array1[2] = 0
Values on exiting staticArrayInit:
array1[0] = 5 array1[1] = 5 array1[2] = 5

Values on entering automaticArrayInit:


array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6 array2[1] = 7 array2[2] = 8

Second call to each function:

Values on entering staticArrayInit:


array1[0] = 5 array1[1] = 5 array1[2] = 5
Values on exiting staticArrayInit:
array1[0] = 10 array1[1] = 10 array1[2] = 10

Values on entering automaticArrayInit:


array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6 array2[1] = 7 array2[2] = 8

 2003 Prentice Hall, Inc.


All rights reserved.
22

Passing Arrays to Functions

• Specify name without brackets


– To pass array myArray to myFunction
int myArray[ 24 ];
myFunction( myArray, 24 );
– Array size usually passed, but not required
• Useful to iterate over all elements

 2003 Prentice Hall, Inc. All rights reserved.


23

Passing Arrays to Functions

• Arrays passed-by-reference
– Functions can modify original array data
– Value of name of array is address of first element
• Function knows where the array is stored
• Can change original memory locations
• Individual array elements passed-by-value
– Like regular variables
– square( myArray[3] );

 2003 Prentice Hall, Inc. All rights reserved.


24

Passing Arrays to Functions

• Functions taking arrays


– Function prototype
• void modifyArray( int b[], int arraySize );
• void modifyArray( int [], int );
– Names optional in prototype
• Both take an integer array and a single integer
– No need for array size between brackets
• Ignored by compiler
– If declare array parameter as const
• Cannot be modified (compiler error)
• void doNotModify( const int [] );

 2003 Prentice Hall, Inc. All rights reserved.


25
1 // Fig. 4.14: fig04_14.cpp
2 // Passing arrays and individual array elements to functions.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 #include <iomanip> Syntax for accepting an array
9
in parameter list.
10 using std::setw;
11
12 void modifyArray( int [], int ); // appears strange
13 void modifyElement( int );
14
15 int main()
16 {
17 const int arraySize = 5; // size of array a
18 int a[ arraySize ] = { 0, 1, 2, 3, 4 }; // initialize a
19
20 cout << "Effects of passing entire array by reference:"
21 << "\n\nThe values of the original array are:\n";
22
23 // output original array
24 for ( int i = 0; i < arraySize; i++ )
25 cout << setw( 3 ) << a[ i ];

 2003 Prentice Hall, Inc.


All rights reserved.
26
26
27 cout << endl;
28
29 // pass array a to modifyArray by reference
Pass array name (a) and size to function.
30 modifyArray( a, arraySize );
31
Arrays are passed-by-reference.
32 cout << "The values of the modified array are:\n";
33
34 // output modified array
35 for ( int j = 0; j < arraySize; j++ )
36 cout << setw( 3 ) << a[ j ];
37
38 // output value of a[ 3 ]
39 cout << "\n\n\n"
40 << "Effects of passing array element by value:"
41 << "\n\nThe value of a[3] is " << a[ 3 ] << '\n';
42
43 // pass array element a[ 3 ] by value
44 modifyElement( a[ 3 ] ); Pass a single array element by value;
45 the original cannot be modified.
46 // output value of a[ 3 ]
47 cout << "The value of a[3] is " << a[ 3 ] << endl;
48
49 return 0; // indicates successful termination
50
51 } // end main

 2003 Prentice Hall, Inc.


All rights reserved.
27
52
53 // in function modifyArray, "b" points to Although named b, the array
54 // the original array "a" in memory points to the original array a.
55 void modifyArray( int b[], int sizeOfArray ) It can modify a’s data.
56 {
57 // multiply each array element by 2
58 for ( int k = 0; k < sizeOfArray; k++ )
59 b[ k ] *= 2;
60
61 } // end function modifyArray
62
63 // in function modifyElement, "e" is a local copy of
64 // array element a[ 3 ] passed from main
65 void modifyElement( int e ) Individual array elements are
66 { passed by value, and the
67 // multiply parameter by 2
originals cannot be changed.
68 cout << "Value in modifyElement is "
69 << ( e *= 2 ) << endl;
70
71 } // end function modifyElement

 2003 Prentice Hall, Inc.


All rights reserved.
28
Effects of passing entire array by reference:

The values of the original array are:


0 1 2 3 4
The values of the modified array are:
0 2 4 6 8

Effects of passing array element by value:

The value of a[3] is 6


Value in modifyElement is 12
The value of a[3] is 6

 2003 Prentice Hall, Inc.


All rights reserved.
29
1 // Fig. 4.15: fig04_15.cpp
2 // Demonstrating the const type qualifier.
3 #include <iostream>
4 Array parameter declared as const.
5 using std::cout; Array cannot be modified, even
6 using std::endl; though it is passed by reference.
7
8 void tryToModifyArray( const int [] ); // function prototype
9
10 int main()
11 {
12 int a[] = { 10, 20, 30 };
13
14 tryToModifyArray( a );
15
16 cout << a[ 0 ] << ' ' << a[ 1 ] << ' ' << a[ 2 ] << '\n';
17
18 return 0; // indicates successful termination
19
20 } // end main
21

 2003 Prentice Hall, Inc.


All rights reserved.
30
22 // In function tryToModifyArray, "b" cannot be used
23 // to modify the original array "a" in main.
24 void tryToModifyArray( const int b[] )
25 {
26 b[ 0 ] /= 2; // error
27 b[ 1 ] /= 2; // error
28 b[ 2 ] /= 2; // error
29
30 } // end function tryToModifyArray

d:\cpphtp4_examples\ch04\Fig04_15.cpp(26) : error C2166:


l-value specifies const object
d:\cpphtp4_examples\ch04\Fig04_15.cpp(27) : error C2166:
l-value specifies const object
d:\cpphtp4_examples\ch04\Fig04_15.cpp(28) : error C2166:
l-value specifies const object

 2003 Prentice Hall, Inc.


All rights reserved.
31

Sorting Arrays

• Sorting data
– Important computing application
– Virtually every organization must sort some data
• Massive amounts must be sorted
• Bubble sort (sinking sort)
– Several passes through the array
– Successive pairs of elements are compared
• If increasing order (or identical), no change
• If decreasing order, elements exchanged
– Repeat these steps for every element

 2003 Prentice Hall, Inc. All rights reserved.


32

Sorting Arrays

• Example:
– Go left to right, and exchange elements as necessary
• One pass for each element
– Original: 3 4 2 7 6
– Pass 1: 3 2 4 6 7 (elements exchanged)
– Pass 2: 2 3 4 6 7
– Pass 3: 2 3 4 6 7 (no changes needed)
– Pass 4: 2 3 4 6 7
– Pass 5: 2 3 4 6 7
– Small elements "bubble" to the top (like 2 in this example)

 2003 Prentice Hall, Inc. All rights reserved.


33
Searching Arrays: Linear Search and Binary
Search
• Search array for a key value
• Linear search
– Compare each element of array with key value
• Start at one end, go to other
– Useful for small and unsorted arrays
• Inefficient
• If search key not present, examines every element

 2003 Prentice Hall, Inc. All rights reserved.


34
Searching Arrays: Linear Search and Binary
Search
• Binary search
– Only used with sorted arrays
– Compare middle element with key
• If equal, match found
• If key < middle
– Repeat search on first half of array
• If key > middle
– Repeat search on last half
– Very fast
• At most N steps, where 2N > # of elements
• 30 element array takes at most 5 steps
5
2 > 30

 2003 Prentice Hall, Inc. All rights reserved.


35

Multiple-Subscripted Arrays

• Multiple subscripts
– a[ i ][ j ]
– Tables with rows and columns
– Specify row, then column
– “Array of arrays”
• a[0] is an array of 4 elements
• a[0][0] is the first element of that array
Column 0 Column 1 Column 2 Column 3
Row 0 a[ 0 ][ 0 ] a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ]

Row 1 a[ 1 ][ 0 ] a[ 1 ][ 1 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ]

Row 2 a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 2 ] a[ 2 ][ 3 ]

Column subscript

Array name
Row subscript

 2003 Prentice Hall, Inc. All rights reserved.


36

Multiple-Subscripted Arrays

• To initialize
– Default of 0
– Initializers grouped by row in braces 1 2
int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; 3 4
Row 0 Row 1

1 0
int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; 3 4

 2003 Prentice Hall, Inc. All rights reserved.


37

Multiple-Subscripted Arrays

• Referenced like normal


cout << b[ 0 ][ 1 ]; 1 0

– Outputs 0 3 4

– Cannot reference using commas


cout << b[ 0, 1 ];
• Syntax error
• Function prototypes
– Must specify sizes of subscripts
• First subscript not necessary, as with single-scripted arrays
– void printArray( int [][ 3 ] );

 2003 Prentice Hall, Inc. All rights reserved.


38

Multiple-Subscripted Arrays

• Next: program showing initialization


– After, program to keep track of students grades
– Multiple-subscripted array (table)
– Rows are students
– Columns are grades Quiz1 Quiz2

Student0 95 85
Student1 89 80

 2003 Prentice Hall, Inc. All rights reserved.


39
1 // Fig. 4.23: fig04_23.cpp
2 // Double-subscripted array example.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7 using std::fixed;
8 using std::left;
9
10 #include <iomanip>
11
12 using std::setw;
13 using std::setprecision;
14
15 const int students = 3; // number of students
16 const int exams = 4; // number of exams
17
18 // function prototypes
19 int minimum( int [][ exams ], int, int );
20 int maximum( int [][ exams ], int, int );
21 double average( int [], int );
22 void printArray( int [][ exams ], int, int );
23

 2003 Prentice Hall, Inc.


All rights reserved.
40
24 int main()
25 {
26 // initialize student grades for three students (rows)
27 int studentGrades[ students ][ exams ] =
28 { { 77, 68, 86, 73 },
29 { 96, 87, 89, 78 },
30 { 70, 90, 86, 81 } };
31
32 // output array studentGrades
33 cout << "The array is:\n";
34 printArray( studentGrades, students, exams );
35
36 // determine smallest and largest grade values
37 cout << "\n\nLowest grade: "
38 << minimum( studentGrades, students, exams )
39 << "\nHighest grade: "
40 << maximum( studentGrades, students, exams ) << '\n';
41
42 cout << fixed << setprecision( 2 );
43

 2003 Prentice Hall, Inc.


All rights reserved.
41
44 // calculate average grade for each student
45 for ( int person = 0; person < students; person++ )
46 cout << "The average grade for student " << person
47 << " is "
48 << average( studentGrades[ person ], exams )
49 << endl;
50
Determines the average for
51 return 0; // indicates successful termination one student. We pass the
52 array/row containing the
53 } // end main student’s grades. Note that
54 studentGrades[0] is
55 // find minimum grade itself an array.
56 int minimum( int grades[][ exams ], int pupils, int tests )
57 {
58 int lowGrade = 100; // initialize to highest possible grade
59
60 for ( int i = 0; i < pupils; i++ )
61
62 for ( int j = 0; j < tests; j++ )
63
64 if ( grades[ i ][ j ] < lowGrade )
65 lowGrade = grades[ i ][ j ];
66
67 return lowGrade;
68
69 } // end function minimum

 2003 Prentice Hall, Inc.


All rights reserved.
42
70
71 // find maximum grade
72 int maximum( int grades[][ exams ], int pupils, int tests )
73 {
74 int highGrade = 0; // initialize to lowest possible grade
75
76 for ( int i = 0; i < pupils; i++ )
77
78 for ( int j = 0; j < tests; j++ )
79
80 if ( grades[ i ][ j ] > highGrade )
81 highGrade = grades[ i ][ j ];
82
83 return highGrade;
84
85 } // end function maximum
86

 2003 Prentice Hall, Inc.


All rights reserved.
43
87 // determine average grade for particular student
88 double average( int setOfGrades[], int tests )
89 {
90 int total = 0;
91
92 // total all grades for one student
93 for ( int i = 0; i < tests; i++ )
94 total += setOfGrades[ i ];
95
96 return static_cast< double >( total ) / tests; // average
97
98 } // end function maximum

 2003 Prentice Hall, Inc.


All rights reserved.
44
99
100 // Print the array
101 void printArray( int grades[][ exams ], int pupils, int tests )
102 {
103 // set left justification and output column heads
104 cout << left << " [0] [1] [2] [3]";
105
106 // output grades in tabular format
107 for ( int i = 0; i < pupils; i++ ) {
108
109 // output label for row
110 cout << "\nstudentGrades[" << i << "] ";
111
112 // output one grades for one student
113 for ( int j = 0; j < tests; j++ )
114 cout << setw( 5 ) << grades[ i ][ j ];
115
116 } // end outer for
117
118 } // end function printArray

 2003 Prentice Hall, Inc.


All rights reserved.
45
The array is:
[0] [1] [2] [3]
studentGrades[0] 77 68 86 73
studentGrades[1] 96 87 89 78
studentGrades[2] 70 90 86 81

Lowest grade: 68
Highest grade: 96
The average grade for student 0 is 76.00
The average grade for student 1 is 87.50
The average grade for student 2 is 81.75

 2003 Prentice Hall, Inc.


All rights reserved.

You might also like