4.1introduction arrays –structures of related data items –static entity (same size throughout...

77
4.1 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++)

Post on 22-Dec-2015

223 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.1 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++)

Page 2: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.2 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 cc[ 0 ], c[ 1 ] … c[ n - 1 ]

– Nth element as position N-1

Page 3: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.2 Arrays

• Array elements like other variables– Assignment, printing for an integer array c

c[ 0 ] = 3;

cout << c[ 0 ];

• Can perform operations inside subscriptc[ 5 – 2 ] same as c[3]

Page 4: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.2 Arrays

c[6]

-45

6

0

72

1543

-89

0

62

-3

1

6453

78

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

c[0]

c[1]

c[2]

c[3]

c[11]

c[10]

c[9]

c[8]

c[7]

c[5]

c[4]

Position number of the element within array c

 

Page 5: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.3 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 ];

Page 6: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.4 Examples 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 valueint n[ 5 ] = { 0 };

– If array size omitted, initializers determine sizeint n[] = { 1, 2, 3, 4, 5 };

• 5 initializers, therefore 5 element array

Page 7: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_03.cpp(1 of 2)

1 // Fig. 4.3: fig04_03.cpp2 // 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()13 {14 int n[ 10 ]; // n is an array of 10 integers15 16 // initialize elements of array n to 0 17 for ( int i = 0; i < 10; i++ ) 18 n[ i ] = 0; // set element at location i to 019 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

Declare a 10-element array of integers.

Initialize array to 0 using a for loop. Note that the array has elements n[0] to n[9].

Page 8: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_03.cpp(2 of 2)

fig04_03.cppoutput (1 of 1)

26 return 0; // indicates successful termination27 28 } // end main

Element Value

0 0

1 0

2 0

3 0

4 0

5 0

6 0

7 0

8 0

9 0

Page 9: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_04.cpp(1 of 1)

1 // Fig. 4.4: fig04_04.cpp2 // Initializing an array with a declaration.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()13 {14 // use initializer list to initialize array n 15 int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 };16 17 cout << "Element" << setw( 13 ) << "Value" << endl;18 19 // output contents of array n in tabular format20 for ( int i = 0; i < 10; i++ )21 cout << setw( 7 ) << i << setw( 13 ) << n[ i ] << endl;22 23 return 0; // indicates successful termination24 25 } // end main

Note the use of the initializer list.

Page 10: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_04.cppoutput (1 of 1)

Element Value

0 32

1 27

2 64

3 18

4 95

5 14

6 90

7 70

8 60

9 37

Page 11: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.4 Examples 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

Page 12: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_05.cpp(1 of 2)

1 // Fig. 4.5: fig04_05.cpp2 // 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()13 {14 // constant variable can be used to specify array size15 const int arraySize = 10;16 17 int s[ arraySize ]; // array s has 10 elements18 19 for ( int i = 0; i < arraySize; i++ ) // set the values20 s[ i ] = 2 + 2 * i; 21 22 cout << "Element" << setw( 13 ) << "Value" << endl;23

Note use of const keyword. Only const variables can specify array sizes.

The program becomes more scalable when we set the array size using a const variable. We can change arraySize, and all the loops will still work (otherwise, we’d have to update every loop in the program).

Page 13: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_05.cpp(2 of 2)

fig04_05.cppoutput (1 of 1)

24 // output contents of array s in tabular format25 for ( int j = 0; j < arraySize; j++ ) 26 cout << setw( 7 ) << j << setw( 13 ) << s[ j ] << endl;27 28 return 0; // indicates successful termination29 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

Page 14: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_06.cpp(1 of 1)

fig04_06.cppoutput (1 of 1)

1 // Fig. 4.6: fig04_06.cpp2 // Using a properly initialized constant variable.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 int main()9 {10 const int x = 7; // initialized constant variable11 12 cout << "The value of constant variable x is: "13 << x << endl;14 15 return 0; // indicates successful termination16 17 } // end main

The value of constant variable x is: 7

Proper initialization of const variable.

Page 15: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_07.cpp(1 of 1)

fig04_07.cppoutput (1 of 1)

1 // Fig. 4.7: fig04_07.cpp2 // A const object must be initialized.3 4 int main()5 {6 const int x; // Error: x must be initialized7 8 x = 7; // Error: cannot modify a const variable9 10 return 0; // indicates successful termination11 12 } // end main

d:\cpphtp4_examples\ch04\Fig04_07.cpp(6) : error C2734: 'x' : const object must be initialized if not extern

d:\cpphtp4_examples\ch04\Fig04_07.cpp(8) : error C2166:

l-value specifies const object

Uninitialized const results in a syntax error. Attempting to modify the const is another error.

Page 16: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_08.cpp(1 of 1)

fig04_08.cppoutput (1 of 1)

1 // Fig. 4.8: fig04_08.cpp2 // Compute the sum of the elements of the array.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 int main()9 {10 const int arraySize = 10;11 12 int a[ arraySize ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };13 14 int total = 0;15 16 // sum contents of array a 17 for ( int i = 0; i < arraySize; i++ )18 total += a[ i ]; 19 20 cout << "Total of array element values is " << total << endl;21 22 return 0; // indicates successful termination23 24 } // end main

Total of array element values is 55

Compute the sum of the elements of the array.

Page 17: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Print out a histogram

Given an array of integers print out a histogram, with the index number, the amount, and stars:

Index Number Number in array Stars

0 7 ********

1

2

3

Page 18: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Print out stars

For each element in the array

print out index,

print out value at index

print out stars

Page 19: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_09.cpp(1 of 2)

1 // Fig. 4.9: fig04_09.cpp2 // Histogram printing program.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()13 {14 const int arraySize = 10;15 int n[ arraySize ] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 };16 17 cout << "Element" << setw( 13 ) << "Value"18 << setw( 17 ) << "Histogram" << endl;19 20 // for each element of array n, output a bar in histogram21 for ( int i = 0; i < arraySize; i++ ) {22 cout << setw( 7 ) << i << setw( 13 )23 << n[ i ] << setw( 9 ); 24 25 for ( int j = 0; j < n[ i ]; j++ ) // print one bar26 cout << '*';

Prints asterisks corresponding to size of array element, n[i].

Page 20: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_09.cpp(2 of 2)

fig04_09.cppoutput (1 of 1)

27 28 cout << endl; // start next line of output29 30 } // end outer for structure31 32 return 0; // indicates successful termination33 34 } // end main

Element Value Histogram

0 19 *******************

1 3 ***

2 15 ***************

3 7 *******

4 11 ***********

5 9 *********

6 13 *************

7 5 *****

8 17 *****************

9 1 *

Page 21: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.4 Examples Using Arrays

• Strings (more in ch. 5)– 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 sameString1[ 0 ] is 'h'

string1[ 2 ] is 'l'

Page 22: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.4 Examples Using Arrays

• Input from keyboardchar 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• We want to avoid this (section 5.12 explains how)

• Printing strings– cout << string2 << endl;

• Does not work for other array types

– Characters printed until null found

Page 23: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_12.cpp(1 of 2)

1 // Fig. 4_12: fig04_12.cpp2 // Treating character arrays as strings.3 #include <iostream>4 5 using std::cout;6 using std::cin;7 using std::endl;8 9 int main()10 {11 char string1[ 20 ], // reserves 20 characters12 char string2[] = "string literal"; // reserves 15 characters13 14 // read string from user into array string215 cout << "Enter the string \"hello there\": ";16 cin >> string1; // reads "hello" [space terminates input]17 18 // output strings19 cout << "string1 is: " << string1 20 << "\nstring2 is: " << string2;21 22 cout << "\nstring1 with spaces between characters is:\n";23

Two different ways to declare strings. string2 is initialized, and its size determined automatically .

Examples of reading strings from the keyboard and printing them out.

Page 24: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_12.cpp(2 of 2)

fig04_12.cppoutput (1 of 1)

24 // output characters until null character is reached25 for ( int i = 0; string1[ i ] != '\0'; i++ )26 cout << string1[ i ] << ' '; 27 28 cin >> string1; // reads "there"29 cout << "\nstring1 is: " << string1 << endl;30 31 return 0; // indicates successful termination32 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

Can access the characters in a string using array notation. The loop ends when the null character is found.

Page 25: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.4 Examples Using Arrays

• Recall static storage (chapter 3)– 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

Page 26: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_13.cpp(1 of 3)

1 // Fig. 4.13: fig04_13.cpp2 // Static arrays are initialized to zero.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 void staticArrayInit( void ); // function prototype9 void automaticArrayInit( void ); // function prototype10 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 termination23 24 } // end main25

Page 27: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_13.cpp(2 of 3)

26 // function to demonstrate a static local array27 void staticArrayInit( void )28 {29 // initializes elements to 0 first time function is called30 static int array1[ 3 ]; 31 32 cout << "\nValues on entering staticArrayInit:\n";33 34 // output contents of array135 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 array141 for ( int j = 0; j < 3; j++ )42 cout << "array1[" << j << "] = " 43 << ( array1[ j ] += 5 ) << " ";44 45 } // end function staticArrayInit46

Static array, initialized to zero on first function call.

Array data is changed; the modified values stay.

Page 28: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_13.cpp(3 of 3)

47 // function to demonstrate an automatic local array48 void automaticArrayInit( void )49 {50 // initializes elements each time function is called51 int array2[ 3 ] = { 1, 2, 3 };52 53 cout << "\n\nValues on entering automaticArrayInit:\n";54 55 // output contents of array256 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 array262 for ( int j = 0; j < 3; j++ )63 cout << "array2[" << j << "] = " 64 << ( array2[ j ] += 5 ) << " ";65 66 } // end function automaticArrayInit

Automatic array, recreated with every function call.

Although the array is changed, it will be destroyed when the function exits and the changes will be lost.

Page 29: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_13.cppoutput (1 of 1)

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

Page 30: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.5 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

Page 31: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.5 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] );

Page 32: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

4.5 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 [] );

Page 33: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_14.cpp(1 of 3)

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

Syntax for accepting an array in parameter list.

Page 34: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_14.cpp(2 of 3)

26 27 cout << endl;28 29 // pass array a to modifyArray by reference30 modifyArray( a, arraySize ); 31 32 cout << "The values of the modified array are:\n";33 34 // output modified array35 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 value44 modifyElement( a[ 3 ] ); 45 46 // output value of a[ 3 ]47 cout << "The value of a[3] is " << a[ 3 ] << endl;48 49 return 0; // indicates successful termination50 51 } // end main

Pass array name (a) and size to function. Arrays are passed-by-reference.

Pass a single array element by value; the original cannot be modified.

Page 35: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_14.cpp(3 of 3)

52 53 // in function modifyArray, "b" points to 54 // the original array "a" in memory 55 void modifyArray( int b[], int sizeOfArray )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 of64 // array element a[ 3 ] passed from main 65 void modifyElement( int e ) 66 { 67 // multiply parameter by 2 68 cout << "Value in modifyElement is " 69 << ( e *= 2 ) << endl; 70 71 } // end function modifyElement

Although named b, the array points to the original array a. It can modify a’s data.

Individual array elements are passed by value, and the originals cannot be changed.

Page 36: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_14.cppoutput (1 of 1)

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

Page 37: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_15.cpp(1 of 2)

1 // Fig. 4.15: fig04_15.cpp2 // Demonstrating the const type qualifier.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 void tryToModifyArray( const int [] ); // function prototype9 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 termination19 20 } // end main21

Array parameter declared as const. Array cannot be modified, even though it is passed by reference.

Page 38: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

fig04_15.cpp(2 of 2)

fig04_15.cppoutput (1 of 1)

22 // In function tryToModifyArray, "b" cannot be used23 // 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

Page 39: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

39

Vectors

Page 40: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

40

7.11 Introduction to C++ Standard Library Class Template vector (Cont.)

• vector elements can be obtained as an unmodifiable lvalue or as a modifiable lvalue– Unmodifiable lvalue

• Expression that identifies an object in memory, but cannot be used to modify that object

– Modifiable lvalue • Expression that identifies an object in memory, can be used to

modify the object

Page 41: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

41

7.11 Introduction to C++ Standard Library Class Template vector (Cont.)

• vector member function at– Provides access to individual elements

– Performs bounds checking• Throws an exception when specified index is invalid

• Accessing with square brackets does not perform bounds checking

Page 42: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

42 1 // Fig. 7.26: fig07_26.cpp

2 // Demonstrating C++ Standard Library class template vector.

3 #include <iostream>

4 using std::cout;

5 using std::cin;

6 using std::endl;

7

8 #include <iomanip>

9 using std::setw;

10

11 #include <vector>

12 using std::vector;

13

14 void outputVector( const vector< int > & ); // display the vector

15 void inputVector( vector< int > & ); // input values into the vector

16

17 int main()

18 {

19 vector< int > integers1( 7 ); // 7-element vector< int >

20 vector< int > integers2( 10 ); // 10-element vector< int >

21

22 // print integers1 size and contents

23 cout << "Size of vector integers1 is " << integers1.size()

24 << "\nvector after initialization:" << endl;

25 outputVector( integers1 );

26

27 // print integers2 size and contents

28 cout << "\nSize of vector integers2 is " << integers2.size()

29 << "\nvector after initialization:" << endl;

30 outputVector( integers2 );

Outline

• fig07_26.cpp

• (1 of 6)

Using const prevents outputVector from modifying the vector passed to it

These vectors will store ints

Function size returns number of elements in the vector

Page 43: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

4331

32 // input and print integers1 and integers2

33 cout << "\nEnter 17 integers:" << endl;

34 inputVector( integers1 );

35 inputVector( integers2 );

36

37 cout << "\nAfter input, the vectors contain:\n"

38 << "integers1:" << endl;

39 outputVector( integers1 );

40 cout << "integers2:" << endl;

41 outputVector( integers2 );

42

43 // use inequality (!=) operator with vector objects

44 cout << "\nEvaluating: integers1 != integers2" << endl;

45

46 if ( integers1 != integers2 )

47 cout << "integers1 and integers2 are not equal" << endl;

48

49 // create vector integers3 using integers1 as an

50 // initializer; print size and contents

51 vector< int > integers3( integers1 ); // copy constructor

52

53 cout << "\nSize of vector integers3 is " << integers3.size()

54 << "\nvector after initialization:" << endl;

55 outputVector( integers3 );

56

57 // use overloaded assignment (=) operator

58 cout << "\nAssigning integers2 to integers1:" << endl;

59 integers1 = integers2; // integers1 is larger than integers2

Outline

• fig07_26.cpp

• (2 of 6)

Comparing vectors using !=

Copying data from one vector to another

Assigning data from one vector to another

Page 44: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

4460

61 cout << "integers1:" << endl;

62 outputVector( integers1 );

63 cout << "integers2:" << endl;

64 outputVector( integers2 );

65

66 // use equality (==) operator with vector objects

67 cout << "\nEvaluating: integers1 == integers2" << endl;

68

69 if ( integers1 == integers2 )

70 cout << "integers1 and integers2 are equal" << endl;

71

72 // use square brackets to create rvalue

73 cout << "\nintegers1[5] is " << integers1[ 5 ];

74

75 // use square brackets to create lvalue

76 cout << "\n\nAssigning 1000 to integers1[5]" << endl;

77 integers1[ 5 ] = 1000;

78 cout << "integers1:" << endl;

79 outputVector( integers1 );

80

81 // attempt to use out-of-range subscript

82 cout << "\nAttempt to assign 1000 to integers1.at( 15 )" << endl;

83 integers1.at( 15 ) = 1000; // ERROR: out of range

84 return 0;

85 } // end main

Outline

• fig07_26.cpp

• (3 of 6)Comparing vectors using ==

Updating a value in the vector

Function at provides bounds checking

Displaying a value in the vector

Page 45: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

4586

87 // output vector contents

88 void outputVector( const vector< int > &array )

89 {

90 size_t i; // declare control variable

91

92 for ( i = 0; i < array.size(); i++ )

93 {

94 cout << setw( 12 ) << array[ i ];

95

96 if ( ( i + 1 ) % 4 == 0 ) // 4 numbers per row of output

97 cout << endl;

98 } // end for

99

100 if ( i % 4 != 0 )

101 cout << endl;

102 } // end function outputVector

103

104 // input vector contents

105 void inputVector( vector< int > &array )

106 {

107 for ( size_t i = 0; i < array.size(); i++ )

108 cin >> array[ i ];

109 } // end function inputVector

Outline

• fig07_26.cpp

• (4 of 6)

Input vector values using cin

Display each vector element

Page 46: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

46

Outline

• fig07_26.cpp

• (5 of 6)

Size of vector integers1 is 7 vector after initialization: 0 0 0 0 0 0 0 Size of vector integers2 is 10 vector after initialization: 0 0 0 0 0 0 0 0 0 0 Enter 17 integers:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 After input, the vectors contain: integers1: 1 2 3 4 5 6 7 integers2: 8 9 10 11 12 13 14 15 16 17 Evaluating: integers1 != integers2 integers1 and integers2 are not equal Size of vector integers3 is 7 vector after initialization: 1 2 3 4 5 6 7 (continued at top of next slide )

Page 47: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

47

Outline

• fig07_26.cpp

• (6 of 6)

( continued from bottom of previous slide) Assigning integers2 to integers1: integers1: 8 9 10 11 12 13 14 15 16 17 integers2: 8 9 10 11 12 13 14 15 16 17 Evaluating: integers1 == integers2 integers1 and integers2 are equal integers1[5] is 13 Assigning 1000 to integers1[5] integers1: 8 9 10 11 12 1000 14 15 16 17 Attempt to assign 1000 to integers1.at( 15 ) abnormal program termination

Call to function at with an invalid

subscript terminates the program

Page 48: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

2003 Prentice Hall, Inc. All rights reserved.

48

7.12 (Optional) Software Engineering Case Study: Collaboration Among Objects in the ATM System

• Collaborations– When objects communicate to accomplish task

• One object sends a message to another object

• Accomplished by invoking operations (functions)

– Identifying the collaborations in a system• Read requirements document to find

– What ATM should do to authenticate a user

– What ATM should do to perform transactions

• For each action, decide

– Which objects must interact

• Sending object

• Receiving object

Page 49: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Using Arrays in Abstract Data Types

Page 50: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

What is an Abstract Data Type

• A built-in data type is an int, float, double, etc.• An Abstract Data Type (ADT) is a collection of

data and a set of operations on the data. You can use an ADT’s operations, if you know their specifications, without knowing how the operations are implemented or how the data is stored. Ultimately, you will implement an ADT with a data-structure, which is a construct you can define within a programming language to store a collection of data.

• Examples of ADT: lists, stacks, queues, trees, graphs, etc.

Page 51: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

ADT: SIMPLE LIST

Examples of lists: lists of student id’s in a class, grocery items, lists of records in a collection, list of club members, etc….

Create a list

Insert an element

Arrange elements in sorted order

Find if an element is in the list

Delete an element

Print the list of elements

WHAT ARE BASIC OPERATIONS ON A LIST?

Page 52: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

What operations are likely to be performed on lists?

Create/Insert an element

Delete an element

Arrange elements in sorted order (whatever sort criteria)

Print the list of elements

Find if an element is in the list

Print statistics about list (if numeric)

Grocery items:ChipsSalsaCoke

Tissues Sprite

Jelly beans

Original list

Grocery items:ChipsSalsaCoke

Tissues Sprite

Jelly beansBeer

Add Beer

Grocery items:ChipsSalsaCokeSprite

Jelly beansBeer

Delete tissues

Grocery items:BeerChipsCoke

Jelly beans SalsaSprite

Sort alphabetically

Grocery items:BeerCoke Sprite

Jelly beans ChipsSalsa

Sort by grocery aisles

Is beer on the list?

Page 53: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Implementation of the ADT List

One way to implement a “list” is using an array to hold the elements in the list…..

Now have to figure out how to : insert, delete, sort, find, etc….

In the next lessons, we will slowly build up these functionalities until we can integrate them all into a “list” program. EVENTUAL GOAL : CREATE A PROGRAM TO MAINTAIN A LIST OF STUDENTS……….

Page 54: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Let’s make a simpler list

• Instead of strings, we will have a list of letters

const int MAXCHARS = 8;

char alpharray[MAXCHARS];

B J K M S Z

0 1 2 3 4 5 6 7

Page 55: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Print Elements in a list

for (i=0; i<numofelements; i++)

cout << alpharray[i] << endl;

Input elements into the list:// numtoinsert should be set to the number of initial elements

to insert

for (i=0; i<numtoinsert; i++)

cin >> alpharray[i];

Page 56: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Insert an element into an array

• Simple insert routine: find end of array, insert element:

alpharray[endofarray] = newelement;

endofarray++;

B J K M S Z

B J K M S Z L

Before:

After inserting L

Page 57: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Insert a letter in the list

• Should it be inserted at the end of the list (in this case we need to know what is the end of the list)?

• Should the new element be inserted into the beginning of the list?

• Is the list stored in some special order and elements should be inserted to maintain that order – e.g., if the list is stored in alphabetical order the new element must be inserted in alphabetical order?

• Should the user choose where to store the new element?

Page 58: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Assume the following letters are stored in array named alpharray: B, J, K, M, S, and Z. Write a program which calls a function adlet(), which accepts both the alphabet array and a new letter as parameters and inserts the new letter in the correct alphabetical order in the alphabet array.

B J K M S Z

alphabet [0] [1] [2] [3] [4] [5] [6] [7] …...

B J K L M S ZAfter adding ‘L’

Before:

INSERTING INTO A ARRAY BASED Alphabetical LIST

Page 59: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

ALGORITHM:

•Prompt user for new letter to add

•Find the position (index) of where this letter should go in the alphabetical array. (This is called a linear search.)

•Move all letters after this position down to free up the space

•Insert letter into array****

Page 60: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

#include <iostream>void insertletter(char[],char,int&);

int main() { const int MAXCHARS = 30; const int STARTCHARS=6; char alpharray[MAXCHARS] = {‘B’, ‘J’, ‘K’, ‘M’,’S’,’Z’}; char newlet; int sizeofarray=STARTCHARS;

while (5) { //loop forever

cout << “ Enter a letter to add:”; cin >> newlet; insertletter(alpharray,newlet,sizeofarray); } }

CONTINUED…..

Page 61: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Find position for new letter

//find position for new letter

while (alpharray[i] < addlet && i < sizeofarray)

i++;

newpos =i;

Page 62: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Find position for new letter

//move chars over --- should check for full array first

if (sizeofarr == MAXCHARS) …..

for (i=sizeofarr; i>newpos; i--)

alpharray[i] = alpharray[i-1];

Page 63: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

void insertletter(char alpharray[], char addlet, int& sizeofarr){ int i=0, endpos,newpos; //find position for new letter while (alpharray[i] < addlet && i < sizeofarr) i++; newpos =i; //move chars over --- should check for full array first for (i=sizeofarr; i>newpos; i--) alpharray[i] = alpharray[i-1];

alpharray[newpos] = addlet; //insert new letter sizeofarr++; //print out array for(i=0; i<sizeofarr; i++) cout <<alpharray[i]; }

Page 64: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Analysis of the simple insertion algorithm

• In the worst case --- How many comparisons are needed to find the position of the letter to be inserted?

• In the worst case --- How many letters have to be shifted to make room for a new letter to be inserted?

• Are these the same cases?

Page 65: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

void insertletter(char alpharray[], char addlet, int& sizeofarr)

{

int i=0, endpos,newpos;

//find position for new letter

while (alpharray[i] < addlet && i < sizeofarr)

i++;

newpos =i;

//move chars over --- should check for full array first

for (i=sizeofarr; i>newpos; i--)

alpharray[i] = alpharray[i-1];

alpharray[newpos] = addlet; //insert new letter

sizeofarr++; //print out array

for(i=0; i<sizeofarr; i++) cout <<alpharray[i];

What happens if the array is full?

Can we use this code to insert elements into an empty list?

If (sizeofarr == 0) { alpharray[0] = addlet; sizeofarr++; return 0; }

Page 66: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Delete an element from a list

• Must find the element to delete:• Then move everything over

Page 67: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Delete

Let’s assume we are given the position of the item to delete in delpos;

DeleteElement(char alpharray[], int delpos, int& sizeofarr)

{

for (i=delpos+1; i<sizeofarr; i++)

alpharray[i-1] = alpharray[i];

sizeofarr--;

}

Page 68: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

ADT LIST:

• DONE: Insert element at end of a list; Insert element into previously sorted list

• TO DO: Sort List, Delete element, Create list, Find Element…..

Page 69: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

ADT: List

• Operation: sort.

• Given a list of unordered values in an array, sort the values so that they can be printed in sorted order.

Page 70: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

SIMPLE Sorting

• Sorting is a typical operation to put the elements in an array in order.

• Internal Sorts [for small data sets]selectionbubble (exchange)

• External Sorts [for large data sets]

Page 71: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Simple Sorting Selection sort

Find smallest element, andput at the head of the list, repeatwith remainder of list. The algorithm can also be formulated by finding the largest element and putting that at the head of the list

Page 72: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Selection Sort

index (k) sm_index

0 2swap 21, 9

1 1swap 13, 13

2 3swap 21, 15

3 4swap 21, 17

21 159 13 17

15 179 13 21

99 152121 13 17

15 21219 13 1717

2121 15159 13 17

Find smallest element, andput at the head of the list,repeatwith remainder of list

Scan 1

Scan 2

Scan 3

Scan 4

Page 73: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Selection Sort

const int size = 5;void sort(double [size]);void swap(double [size], int, int) // prototypes

int main(void){ int index;

double my_list[ ] = {21, 13, 9, 15, 17};

sort(my_list); // function call

cout<<"\nThe sorted array is: \n";for(index=0; index<size; index++)

cout<<'\t'<<my_list[index]<<endl;

…}

Page 74: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Let’s build up the algorithm

outer loop – array scans, each scan starts from the element after the previous scan

inner loop – find smallest element

swap smallest element with start of scan

next outer loop

Page 75: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Selection Sort

void sort(double testArray[]){ int n, k, sm_index, moves=0; double smallest;

for(k=0; k<size; k++) // size-1 = number of passes{

}}

smallest=testArray[k];sm_index=k;

swap(testArray, sm_index, k); // call to swap()

for(n=k+1; n<size; n++) if(testArray[n]<smallest) { smallest=testArray[n];

sm_index=n; }

Page 76: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

Selection Sort

void swap(double testArray[], int smaller, int pass){ // pass = current position: k

double temp;

temp=testArray[pass];testArray[pass]=testArray[smaller];testArray[smaller]=temp;

}

Page 77: 4.1Introduction Arrays –Structures of related data items –Static entity (same size throughout program) A few types –Pointer-based arrays (C-like) –Arrays

for(k=0; k<size; k++) // size-1 = number of passes{

}}

smallest=testArray[k];sm_index=k;

swap(testArray, sm_index, k); // call to swap()

for(n=k+1; n<size; n++) if(testArray[n]<smallest) { smallest=testArray[n];

sm_index=n; }

How many times is the inner if statement called?

How many times is the “sm_index” being reset?

How many times is the swap() function called?