4.1introduction arrays –structures of related data items –static entity (same size throughout...
Post on 22-Dec-2015
223 views
TRANSCRIPT
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++)
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
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]
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
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 ];
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
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].
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
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.
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
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
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).
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
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.
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.
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.
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
Print out stars
For each element in the array
print out index,
print out value at index
print out stars
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].
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 *
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'
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
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.
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.
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
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
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.
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.
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
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
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] );
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 [] );
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.
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.
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.
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
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.
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
2003 Prentice Hall, Inc. All rights reserved.
39
Vectors
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
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
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
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
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
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
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 )
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
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
Using Arrays in Abstract Data Types
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.
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?
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?
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……….
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
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];
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
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?
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
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****
#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…..
Find position for new letter
//find position for new letter
while (alpharray[i] < addlet && i < sizeofarray)
i++;
newpos =i;
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];
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]; }
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?
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; }
Delete an element from a list
• Must find the element to delete:• Then move everything over
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--;
}
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…..
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.
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]
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
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
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;
…}
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
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; }
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;
}
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?