1 chapter 13 applied arrays: lists and strings dale/weems/headington

76
1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Upload: ralf-lawson

Post on 17-Jan-2018

232 views

Category:

Documents


0 download

DESCRIPTION

3 What is a List? l A list is a varying-length, linear collection of homogeneous elements. l linear means each list element (except the first) has a unique predecessor, and each element (except the last) has a unique successor

TRANSCRIPT

Page 1: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

1

Chapter 13

Applied Arrays: Lists and Strings

Dale/Weems/Headington

Page 2: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

2

Chapter 13 Topics Meaning of a List Insertion and Deletion of List Elements Selection Sort of List Elements Insertion and Deletion using a Sorted List Binary Search in a Sorted List Order of Magnitude of a Function Declaring and Using C Strings Using typedef with Arrays

Page 3: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

3

What is a List?

A list is a varying-length, linear collection of homogeneous elements.

linear means each list element (except the first) has a unique predecessor, and each element (except the last) has a unique successor

Page 4: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

3 Basic Kinds of ADT Operations

Constructor -- creates a new instance (object) of an ADT

Transformer -- changes the state of one or more of the data values of an instance

Observer -- allows us to observe the state of one or more of the data values of an instance without changing them

4

Page 5: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

ADT List Operations

Transformers Insert Delete SelSort

Observers IsEmpty IsFull Length IsPresent Print

change state

observe state

5

Page 6: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

ADT Unsorted List Data Components

length

data[ 0 . . MAX_LENGTH -1 ]

number of elements in list

array of list elements

6

Page 7: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

7

Array-based class List

IsFull

Length

SelSort

IsPresent

Delete

IsEmpty

Insert

Print

Private data:length

data [ 0 ] [ 1 ] [ 2 ]

[MAX_LENGTH-1]

Page 8: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

8

// SPECIFICATION FILE ARRAY-BASED LIST ( list.h )const int MAX_LENGTH = 50 ;typedef int ItemType ;

class List // declares a class data type{public : // public member functions

List ( ) ;// constructorbool IsEmpty ( ) const ;bool IsFull ( ) const ; int Length ( ) const ; // returns length of list

void Insert ( ItemType item ) ; void Delete ( ItemType item ) ; bool IsPresent( ItemType item ) const ;void SelSort ( );void Print ( ) ;

private : // private data membersint length ; // number of values currently storedItemType data[MAX_LENGTH] ;

} ; 8

Page 9: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

9

Sorted and Unsorted Lists

UNSORTED LIST

Elements are placed into the list in no particular order.

SORTED LIST

List elements are in an order that is sorted in some way -- either numerically or alphabetically.

Page 10: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

10

// IMPLEMENTATION FILE ARRAY-BASED LIST ( list.cpp )

#include “list.h”#include <iostream>

using namespace std;

int List :: Length ( ) const// Post: Function value == length{

return length ;}

bool List :: IsFull ( ) const// Post: Function value == true, if list == MAX_LENGTH // == false, otherwise{

return ( length == MAX_LENGTH ) ;}

10

Page 11: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

11

List :: List ( )// Constructor// Post: length == 0{

length = 0 ;}

void List :: Insert ( /* in */ ItemType item )// Pre: length < MAX_LENGTH && item is assigned// Post: data[length@entry] == item && length == length@entry + 1{

data [ length ] = item ;length++ ;

}

11

Page 12: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Before Inserting 64 into anUnsorted List

length 3

data [ 0 ] 15

[ 1 ] 39

[ 2 ] -90

[ 3 ] .

. .

[MAX_LENGTH-1]

The item willbe placed intothe length location,and length will beincremented.

12

item 64

Page 13: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

After Inserting 64 into anUnsorted List

length 4

data [ 0 ] 15

[ 1 ] 39

[ 2 ] -90

[ 3 ] 64 .

. .

[MAX_LENGTH-1]

The item willbe placed intothe length location,and length will beincremented.

13

item 64

Page 14: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

14

bool List :: IsEmpty ( ) const// Post: Function value == true, if length == 0// == false, otherwise{

return ( length == 0 ) ;}

bool List :: IsPresent ( /* in */ ItemType item ) const // Searches the list for item, reporting whether it was found// Post: Function value == true, if item is in data [ 0 . . length-1 ]// == false, otherwise{ int index = 0 ;

while ( index < length && item != data [ index ] )index++ ;

return ( index < length ) ;} 14

Page 15: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

15

void List :: Delete ( /* in */ ItemType item ) // Pre: length > 0 && item is assigned// Post: IF item is in data array at entry// First occurrence of item is no longer in array// && length == length@entry - 1// ELSE// length and data array are unchanged

{ int index = 0 ;

while ( index < length && item != data [ index ] )index++;

// if item found, move last element into item’s placeif ( index < length )

{ data [ index ] = data [length - 1 ] ;

length-- ; }}

15

Page 16: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Deleting 39 from anUnsorted List

index : 0

39 hasnot been matched.

16

item 39

length 4

data [ 0 ] 15

[ 1 ] 39

[ 2 ] -90

[ 3 ] 64 .

. .

[MAX_LENGTH-1]

Page 17: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Deleting 39 from anUnsorted List

index : 1

17

item 39

length 4

data [ 0 ] 15

[ 1 ] 39

[ 2 ] -90

[ 3 ] 64 .

. .

[MAX_LENGTH-1]

39 hasbeen matched.

Page 18: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Deleting 39 from anUnsorted List

index : 1

18

item 39

length 4

data [ 0 ] 15

[ 1 ] 64

[ 2 ] -90

[ 3 ] 64 .

. .

[MAX_LENGTH-1]

Placed copy oflast list elementinto the position where 39 was before.

Page 19: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Deleting 39 from anUnsorted List

index : 1

19

item 39

length 3

data [ 0 ] 15

[ 1 ] 64

[ 2 ] -90

[ 3 ] 64 .

. .

[MAX_LENGTH-1]

Decremented length.

Page 20: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

20

void List :: Print ( ) // Prints the list// Post: Contents of data [0 . . length-1 ] have been output{

int index ;

for ( index = 0 ; index < length ; index++ )cout << data [ index ] << endl ;

}

20

Printing the List

Page 21: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

21

Selection Sort Process examines the entire list to select the smallest

element. Then places that element where it belongs (with array subscript 0)

examines the remaining list to select the smallest element from it. Then places that element where it belongs (with array subscript 1)

. . . examines the last 2 remaining list elements to select

the smallest one. Then places that element where it belongs in the array

Page 22: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

22

Selection Sort AlgorithmFOR passCount going from 0 through length - 2 Find minimum value in data [ passCount . . length-1 ] Swap minimum value with data [ passCount ]

length = 5

data [ 0 ] 40 25 data [ 1 ] 100 100 data [ 2 ] 60 60 data [ 3 ] 25 40 data [ 4 ] 80 80

pass = 0

Page 23: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

23

void List :: SelSort ( ) // Sorts list into ascending order using selection sort{ ItemType temp ;

int passCount ;int sIndx ;int minIndx ; // index of minimum so far

for ( passCount = 0 ; passCount < length - 1 ; passCount++ ){minIndx = passCount ;

// find index of smallest of data [ passCount . . length-1 ]for ( sIndx = passCount + 1 ; sIndx < length ; sIndx++ )

if ( data [ sIndx ] = data [ minIndx ] )minIndx = sIndx ;temp = data [ minIndx ] ; // swap data [ minIndx ] = data [ passCount ] ;data [ passCount ] = temp ;}

} 23

Page 24: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

24

Sorted and Unsorted Lists

UNSORTED LIST

Elements are placed into the list in no particular order.

SORTED LIST

List elements are in an order that is sorted in some way -- either numerically or alphabetically.

Page 25: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

25

Array-based class SortedList

IsFull

Length

IsPresent

Delete

IsEmpty

Insert

Print

Private data:length

data [ 0 ] [ 1 ] [ 2 ]

[MAX_LENGTH-1]

SortedList

Page 26: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

26

// SPECIFICATION FILE ARRAY-BASED SORTED LIST ( slist.h )const int MAX_LENGTH = 50 ;typedef int ItemType ;

class SortedList{public : // public member functions

SortedList ( ) ; // constructorbool IsEmpty ( ) const ;bool IsFull ( ) const ; int Length ( ) const ; // returns length of list void Insert ( ItemType item ) ; void Delete ( ItemType item ) ; bool IsPresent( ItemType item ) const ;void Print ( ) ;

private : // private data membersint length ; // number of values currently storedItemType data[MAX_LENGTH] ; void BinSearch ( ItemType item, bool& found, int& position ) const ;

} ;26

Page 27: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

27

Member Functions

Which member function specifications and implementations must change to ensure that any instance of SortedList ADT remains sorted at all times?

Insert

Delete

Page 28: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

28

Insert Algorithm for SortedList ADT

create space for the new item by shifting down all the larger list elements

put the new item in the list

increment length

Page 29: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

29

Implementing SortedList Member Function Insert

// IMPLEMENTATION FILE ( slist.cpp )

void SortedList :: Insert ( /* in */ ItemType item )// Pre: length < MAX_LENGTH && item is assigned // && data [ 0 . . length-1 ] are in ascending order// Post: item is in the list && length == length@entry + 1// && data [ 0 . . length-1 ] are in ascending order{

.

.

.

}

Page 30: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

30

void SortedList :: Insert ( ItemType item ){ int index ;

// find proper location for new elementindex = length - 1 ;// starting at bottom of array// shift down values larger than item// to make room for new item

while ( index >= 0 && item < data [ index ] ){data [ index + 1 ] = data [ index ] ;index-- ;

}// insert item into arraydata [ index ] = item ;

length++ ;}

30

Page 31: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

31

Delete Algorithm for SortedList ADT

find the position of the element to be deleted from the sorted list

eliminate space occupied by the item being deleted by shifting up all the larger list elements

decrement length

Page 32: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

32

Implementing SortedList Member Function Delete

void SortedList :: Delete ( /* in */ ItemType item )// Deletes item from list, if it is there// Pre: 0 < length <= INT_MAX/2 && item is assigned// && data [ 0 . . length-1 ] are in ascending order// Post: IF item is in data array at entry// First occurrence of item is no longer in array// && length == length@entry-1// && data [ 0 . . Length-1 ] are in ascending order// ELSE// length and data array are unchanged{

.

.

.} 32

Page 33: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

33

void SortedList :: Delete ( /* in */ ItemType item ){ bool found ; // true, if item is found

int position ;// position of item, if foundint index ;// find location of element to be deleted

BinSearch ( item, found, position) ;if ( found ){// shift up elements that follow deleted item in sorted list

for ( index = position ; index < length + 1 ; index++ )data [ index ] = data [ index + 1 ] ;

length-- ;}

33

Page 34: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

34

Improving Member Function IsPresent for SortedList

Recall that with the unsorted List ADT we examined each list element beginningwith data[ 0 ], until we either found a match with item, or we had examined all the elements in the unsorted List.

How can the searching algorithm be improved for SortedList ADT?

Page 35: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Searching for 55 in aSortedList

35

item 55

length 4

data [ 0 ] 15

[ 1 ] 39

[ 2 ] 64

[ 3 ] 90 .

. .

[MAX_LENGTH-1]

A sequential search for 55 can stop when 64 has beenexamined.

Page 36: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

36

Binary Search in SortedList Examines the element in the middle of the array.

Is it the sought item? If so, stop searching. Is the middle element too small? Then start looking in second half of array. Is the middle element too large? Then begin looking in first half of the array.

Repeat the process in the half of the data that should be examined next.

Stop when item is found, or when there is nowhere else to look and item has not been found.

Page 37: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

37

void SortedList::BinSearch ( ItemType item, bool& found, int& position ) // Searches sorted list for item, returning position of item, if item was found{

int middle ;int first = 0;

int last = length - 1 ;

found = false ;while ( last >= first && !found ){ middle = ( first + last ) / 2 ; // INDEX OF MIDDLE ELEMENT

if ( item < data [ middle ] ) last = middle - 1 ; // LOOK IN FIRST HALF NEXT else if ( item > data [ middle ] ) first = middle + 1 ; // LOOK IN SECOND HALF NEXTelse found = true ; // ITEM HAS BEEN FOUND

} if ( found ) position = middle ;

} 37

Page 38: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

38

Trace of Binary Search

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

item = 84

first middle last

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

first middle last

item > data [ middle ] first = middle + 1

item < data [ middle ] last = middle - 1

Page 39: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

39

Trace continued

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

item = 84

first, last, middle

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

first, last middle

item == data [ middle ] found = true

item > data [ middle ] first = middle + 1

Page 40: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

40

Another Binary Search Trace

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

item = 45

first middle last

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

first middle last

item < data [ middle ] last = middle - 1

item > data [ middle ] first = middle + 1

Page 41: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

41

Trace continued

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

item = 45

first, middle, last

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

first, last middle

item < data [ middle ] last = middle - 1

item > data [ middle ] first = middle + 1

Page 42: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

42

Trace concludes

data[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

15 26 38 57 62 78 84 91 108 119

item = 45

last first

first > last found = false

Page 43: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

43

bool SortedList :: IsPresent ( /* in */ ItemType item ) const // Searches the list for item, reporting whether it was found// Pre: length <= INT_MAX/2 && item is assigned// && data [ 0 . . length-1 ] are in ascending order // Post: Function value == true, if item is in data [ 0 . . length-1 ]// == false, otherwise{

bool found ;int position ;

BinSearch ( item, found, position ) ;

return found ;}

43

More Efficient IsPresent for SortedList

Page 44: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Comparison of Sequential and Binary Searches

Average Number of Iterations to Find item

Length Sequential Search Binary Search

10 5.5 2.9

100 50.5 5.8

1,000 500.5 9.0

10,000 5000.5 12.4

44

Page 45: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Order of Magnitude of a Function

The order of magnitude, or Big-O notation, of an expression describes the complexityof an algorithm according to the highest order of N that appears in its complexity expression.

45

Page 46: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Names of Orders of Magnitude

O(1) constant time

O(log2N) logarithmic time

O(N) linear time

O(N2) quadratic time

O(N3 ) cubic time

46

Page 47: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

N log2N N*log2N N2

1 0 0 1 2 1 2 4

4 2 8 16

8 3 24 64

16 4 64 256

32 5 160 1024

64 6 384 4096

128 7 896 16,384 47

Page 48: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

Big-O Comparison of List Operations

OPERATION UnsortedList SortedList

IsPresent O(N) O(N) sequential search O(log2N) binary search

Insert O(1) O(N)

Delete O(N) O(N)

SelSort O(N2)

48

Page 49: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

In Addition . . .

To the string class from the standard library accessed by #include <string>

C++ also has another library of string functions for C strings that can be accessed by #include <cstring>

49

Page 50: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

50

What is a C String?A C string is a char array terminated by the null

character ‘\0’ ( with ASCII value 0 ).

A C string variable can be initialized in its declaration in two equivalent ways.

char message [ 8 ] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’ };

char message [ 8 ] = “Hello” ;

message [0] [1] [2] [3] [4] [5] [6] [7]

‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’

Page 51: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

51

char vs. C string

‘A’ has data type charand is stored in 1 byte

“A” is a C string of 2 charactersand is stored in 2 bytes

5000

‘A’

6000

‘A’

6001

‘\0’

Page 52: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

52

Recall that . . .

char message[8]; // declaration allocates memory

To the compiler, the value of the identifier message alone is the base address of the array. We say message is a pointer (because its value is an address). It “points” to a memory location.

message [0] [1] [2] [3] [4] [5] [6] [7]

‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’

6000

Page 53: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

53

Aggregate C String I/O in C++

I/O of an entire C string is possible using the array identifier with no subscripts and no looping.

EXAMPLE

char message [ 8 ] ; cin >> message ; cout << message ;

HOWEVER . . .

Page 54: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

54

Extraction operator >>When using the extraction operator ( >> ) to read

input characters into a string variable,

the >> operator skips any leading whitespace characters such as blanks and newlines

it then reads successive characters into the array, and stops at the first trailing whitespace character (which is not consumed, but remains waiting in the input stream)

the >> operator adds the null character to the end of the string

Page 55: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

55

Example Using >>char name [ 5 ] ;cin >> name ;

Suppose input stream looks like this: J o e

name [0] name [1] name [2] name [3] name [4]

7000

total number of elements in the array

null character is added

‘J’ ‘o’ ‘e’ ‘\0’

Page 56: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

56

Function get( ) because the extraction operator stops reading at the

first trailing whitespace, >> cannot be used to input a string with blanks in it

if your string’s declared size is not large enough to hold the input characters and add the ‘\0’, the extraction operator stores characters into memory beyond the end of the array

use get function with 2 parameters to overcome these obstacles

EXAMPLEchar message [ 8 ] ;cin.get ( message, 8 ) ; // inputs at most 7 characters plus ‘\0’

Page 57: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

57

inFileStream.get ( str, count + 1)

get does not skip leading whitespace characters such as blanks and newlines

get reads successive characters (including blanks) into the array, and stops when it either has read count characters, or it reaches the newline character ‘\n’, whichever comes first

get appends the null character to str

if it is reached, newline is not consumed by get, but remains waiting in the input stream

Page 58: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

58

Function ignore( )

can be used to consume any remaining characters up to and including the newline ‘\n’ left in the input stream by get

EXAMPLE cin.get ( string1, 81 ) ; // inputs at most 80 characters cin.ignore ( 30, ‘\n’ ) ; // skips at most 30 characters

// but stops if ‘\n’ is read cin.get ( string2, 81 ) ;

Page 59: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

59

Another Example Using get( )char ch ;char fullName [ 31 ] ;char address [ 31 ] ;

cout << “Enter your full name: “ ;cin.get ( fullName, 31 ) ;cin.get (ch) ; // to consume the newlinecout << “Enter your address: “ ;cin.get ( address, 31 ) ;

fullName [0]

‘N’ ‘e’ ‘l’ ‘l’ ‘ ’ ‘D’ ‘a’ ‘l’ ‘e’ ‘\0’ . . .

address [0]

‘A’ ‘u’ ‘s’ ‘t’ ‘i‘ ‘n’ ‘ ’ ‘T’ ‘X’ ‘\0’ . . .

Page 60: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

60

String Function Prototypes in<cstring >

int strlen (char str [ ] ); // FCTNVAL == integer length of string str ( not including ‘\0’ )

int strcmp ( char str1 [ ], char str2 [ ] ); // FCTNVAL == negative, if str1 precedes str2 lexicographically// == positive, if str1 follows str2 lexicographically// == 0, if str1 and str2 characters same through ‘\0’

char * strcpy ( char toStr [ ], char fromStr [ ] );// FCTNVAL == base address of toStr ( usually ignored )// POSTCONDITION : characters in string fromStr are copied to// string toStr, up to and including ‘\0’, // overwriting contents of string toStr 60

Page 61: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

61

# include <cstring > . . .

char author [ 21 ] ; int length ;

cin.get ( author , 21 ) ; length = strlen ( author ) ; // What is the value of length ?

5000

author [0]

‘C’ ‘h’ ‘i’ ‘p’ ‘ ’ ‘W’ ‘e’ ‘e’ ‘m’ ‘s’ ‘\0’ . . . .

Page 62: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

62

char myName [ 21 ] = “Huang” ; // WHAT IS OUTPUT?char yourName [ 21 ] ;

cout << “Enter your last name : “ ;cin.get ( yourName, 21 ) ;

if ( strcmp ( myName, yourName ) == 0 )cout << “We have the same name! “ ;

else if ( strcmp ( myName, yourName ) < 0 )cout << myName << “ comes before “ << yourName ;

else if ( strcmp ( myName, yourName ) > 0 )cout << yourName << “comes before “ << myName ;

myName [0]

‘H’ ‘u’ ‘a’ ‘n’ ‘g’ ‘\0’ . . .

yourName [0]

‘H’ ‘e’ ‘a’ ‘d’ ‘i‘ ‘n’ ‘ g’ ‘t’ ‘o’ ‘n’ ‘\0’ . . .

Page 63: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

63

char myName [ 21 ] = “Huang” ;char yourName [ 21 ] ;

if ( myName == yourName ) // compares addresses only!{ // That is, 4000 and 6000 here. . // DOES NOT COMPARE CONTENTS! . .}

myName [0]

‘H’ ‘u’ ‘a’ ‘n’ ‘g’ ‘\0’ . . .

yourName [0]

‘H’ ‘e’ ‘a’ ‘d’ ‘i‘ ‘n’ ‘ g’ ‘t’ ‘o’ ‘n’ ‘\0’ . . .

4000

6000

Page 64: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

64

char myName [ 21 ] = “Huang” ;char yourName [ 21 ] ;

cin.get ( yourName, 21 ) ;yourName = myName; // DOES NOT COMPILE!

// What is the value of myName ?

myName [0]

‘H’ ‘u’ ‘a’ ‘n’ ‘g’ ‘\0’ . . .

yourName [0]

4000

6000

‘H’ ‘e’ ‘a’ ‘d’ ‘i‘ ‘n’ ‘ g’ ‘t’ ‘o’ ‘n’ ‘\0’ . . .

Page 65: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

65

char myName [ 21 ] = “Huang” ;char yourName [ 21 ] ;

cin.get ( yourName, 21 ) ;strcpy ( yourName, myName ) ; // changes string yourName

// OVERWRITES CONTENTS!

myName [0]

‘H’ ‘u’ ‘a’ ‘n’ ‘g’ ‘\0’ . . .

yourName [0]

‘H’ ‘e’ ‘a’ ‘d’ ‘i‘ ‘n’ ‘ g’ ‘t’ ‘o’ ‘n’ ‘\0’ . . .

4000

6000 ‘u’ ‘n’ ‘g’ ‘\0’

Page 66: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

66

Using typedef with Arrays

typedef char String20 [ 21 ] ; // names String20 as an array type

String20 myName ; // these declarationsString20 yourName ; // allocate memory for 3 variablesbool isSeniorCitizen ;

5000

7000

6000

Page 67: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

67

Write a program that will...

Read the ID numbers, hourly wages, and names, for up to 50 persons from a data file.

Then display the ID number and hourly wage for any person in the file whose name is entered at the keyboard, or indicate that the person was not located, if that is the case.

Page 68: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

68

Assume file has this form withdata for no more than 50 persons

4562 19.68 Dale Nell 1235 15.75 Weems Chip 6278 12.71 Headington Mark . . . . . . . . .

8754 17.96 Cooper Sonia2460 14.97 Huang Jeff

Page 69: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

69

Parallel arrays hold related data

const int MAX_PERSONS = 50;

typedef char String20[ 21] ; // define data type . . .

// declare 3 parallel arraysint idNums[ MAX_PERSONS ] ; float wages[ MAX_PERSONS ] ; String20 names[ MAX_PERSONS ] ;

// holds up to 50 strings each with// up to 20 characters plus null character

‘\0’

Page 70: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

70

idNums[ 0 ] 4562 wages[ 0 ] 19.68 names[ 0 ] “Dale Nell”

idNums[ 1 ] 1235 wages[ 1 ] 15.75 names[ 1 ] “Weems Chip”

idNums[ 2 ] 6278 wages[ 2 ] 12.71 names[ 2 ] “Headington Mark”

. . . . . . . . . . . . . . . . . .

idNums[ 48] 8754 wages[ 48] 17.96 names[ 48] “Cooper Sonia”

idNums[ 49] 2460 wages[ 49] 14.97 names[ 49] “Huang Jeff”

int idNums [ MAX_PERSONS ] ; // parallel arraysfloat wages [ MAX_PERSONS ] ; String20 names [ MAX_PERSONS ] ;

70

Page 71: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

71

#include < iomanip >#include < iostream >#include < fstream >#include < cctype >#include < cstring >

using namespace std ;

typedef char String20 [ 21 ] ;const int MAX_PERSONS = 50 ;

void GetData ( int [ ], float [ ], String20 [ ], int & ) ; // prototypes

void HandleRequests ( int [ ], float [ ], String20 [ ], int ) ;

void LookUp ( String20 [ ], String20, int, Boolean & , int & ) ;

Using Array of Strings

71

Page 72: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

72

Main Programint main ( ){ int idNums [MAX_PERSONS] ; // holds up to 50 IDs float wages [MAX_PERSONS] ; // holds up to 50 wages String20 names [MAX_PERSONS] ; // holds up to 50 names int numPersons; // number of persons’ information in file

GetData ( idNums, wages, names, numPersons ) ;

HandleRequests ( idNums, wages, names, numPersons ) ;

cout << “End of Program.\n”;

return 0 ;}

Page 73: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

73

Module Structure Chart

Main

GetData

LookUp

HandleRequests

names oneNamenumPersons

idNums wages names numPersons

idNums wages names numPersons

foundindex

Page 74: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

74

void GetData ( /* out */ int ids[ ] , /* out*/ float wages[ ] , /* out */ String20 names[ ] , /* out */ int & howMany )

{ ifstream myInfile ; // Reads data from data fileint k = 0 ;

char ch ;

myInfile.open (“A:\\my.dat”) ; if ( ! myInfile ) { cout << “File opening error. Program terminated! “ << endl ; exit ( 1 ) ; } myInfile >> ids[ k ] >> wages [k] ; // get information for first person myInfile.get(ch) ; // read blank myInfile.get (names[ k ] , 21) ; myInfile.ignore(30, ‘\n’) ; // consume newline

while (myInfile) // while the last read was successful { k++ ;

myInfile >> ids[ k ] >> wages [k] ; myInfile.get(ch) ; // read blank myInfile.get (names[ k ] , 21) ;

myInfile.ignore(30, ‘\n’) ; // consume newline } howMany = k;}

Page 75: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

75

void HandleRequests( const /* in */ int idNums[ ], const /* in */ float wages[ ] , const /* in */ String20 names[ ], /* in */ int numPersons )

{ String20 oneName ; // string to hold name of one person int index ; // will hold an array index value char response; // user’s response whether to continue bool found; // has oneName been located in array names do { cout << “Enter name of person to find: ” ; cin.get (oneName, 21) ;

cin.ignore (100, ‘\n’); // consume newline

LookUp (names, oneName, numPersons, found, index );

if ( found ) cout << oneName << “ has ID # “ << idNums [index]

<< “ and hourly wage $ “ << wages [index] << endl;else cout << oneName << “ was not located. “ << endl;

cout << “Want to find another (Y/N)? “;cin >> response ;response = toupper ( response );

} while ( response == ‘Y’ );} 75

Page 76: 1 Chapter 13 Applied Arrays: Lists and Strings Dale/Weems/Headington

76

void LookUp ( const /* in */ String20 names [ ], const /* in */ String20 oneName, /* in */ int numPersons, /* out */ bool& found , /* out */ int &

index)

// Sequential search of unordered array. // POSTCONDITION:// IF oneName is in names array// found == true && names[index] == oneName// ELSE// found == false && index == numPersons{

index = 0; found = false; // initialize flag while ( ( ! found ) && ( index < numPersons ) ) // more to search

{if ( strcmp ( oneName, names[index] ) == 0 ) // match here

found = true ; // change flagelse

index ++ ; }

} 76