• No results found

C++ Plus Data Structures

N/A
N/A
Protected

Academic year: 2021

Share "C++ Plus Data Structures"

Copied!
51
0
0

Loading.... (view fulltext now)

Full text

(1)

1

C++ Plus Data Structures

Nell Dale Chapter 2

Data Design and Implementation

Slides by Sylvia Sorkin, Community College of Baltimore County - Essex Campus

(2)

2

Data Abstraction

Separation of a data type’s logical properties from its implementation.

LOGICAL PROPERTIES IMPLEMENTATION

What are the possible values? How can this be done in C++?

What operations will be needed? How can data types be used?

(3)

3

APPLICATION

0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

REPRESENTATION

Data Encapsulation

is the separation of the representation of data from the applications that use the data at a logical level; a programming

language feature that enforces information hiding.

int y;

y = 25;

(4)

4

Encapsulated C++ Data Type int

Value range:

INT_MIN . . INT_MAX Operations:

+ prefix - prefix + infix - infix * infix / infix % infix

Relational Operators infix

TYPE int

(inside)

Representation of int

as 16 bits two’s complement

+

Implementation of Operations

(5)

5

Abstract Data Type (ADT)

A data type whose properties (domain and operations) are specified independently of any particular implementation.

(6)

6

Application (or user) level: modeling real- life data in a specific context.

Logical (or ADT) level: abstract view of the domain and operations. WHAT

Implementation level: specific

representation of the structure to hold the data items, and the coding for operations.

HOW

Data from 3 different levels

(7)

7

Viewing a library from 3 different levels

Application (or user) level: Library of

Congress, or Baltimore County Public Library.

Logical (or ADT) level: domain is a collection of books; operations include: check book out, check book in, pay fine, reserve a book.

Implementation level: representation of the structure to hold the “books”, and the coding for operations.

(8)

8

Composite Data Type

A composite data type is a type which

stores a collection of individual data components under one variable name,

and allows the individual data components to be accessed.

(9)

4 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 without

changing them.

Iterator -- allows us to process all the

components in a data structure sequentially.

9

(10)

Two Forms of

Composite Data Types

Components are not

organized with respect to one another.

The organization

determines method used to access individual

data components.

UNSTRUCTURED STRUCTURED

EXAMPLES: EXAMPLES: arrays

classes and structs

10

(11)

11

C++ Built-In Data Types C++ Built-In Data Types

Composite

array struct union class

Address

pointer reference

Simple

Integral Floating

char short int long enum

float double long double

(12)

12

Records

A record is a composite data type made up of a finite collection of not necessarily

homogeneous elements called members or fields. For example . . .

.year 1999

.maker ‘h’ ‘o’ ‘n’ ‘d’ ‘a’ ‘\0’ . . . .price 18678.92

thisCar at Base Address 6000

(13)

13

struct CarType

struct CarType {

int year ;

char maker[10];

float price ; } ;

CarType thisCar; //CarType variables CarType myCar;

(14)

14

Accessing struct members

The member selection operator (period . ) is used between the variable name and the member identifier to access individual

members of a record (struct or class) type variable.

EXAMPLES

myCar.year

thisCar.maker[4]

(15)

15

Valid struct operations

Operations valid on an entire struct type variable:

assignment to another struct variable of same type, pass as a parameter to a function

(either by value or by reference), return as the value of a function.

(16)

Pass-by-value

CALLING

BLOCK FUNCTION

CALLED sends a copy

of the contents of

the actual parameter

SO,

the actual parameter cannot be changed by the function.

16

(17)

Pass-by-reference

sends the location (memory address)

of the actual parameter

can change value of actual parameter

CALLING

BLOCK FUNCTION

CALLED

17

(18)

18

Using struct type

Reference Parameter to change a member

void AdjustForInflation(CarType& car, float perCent) // Increases price by the amount specified in perCent {

car.price = car.price * perCent + car.price;

} ;

SAMPLE CALL

AdjustForInflation(myCar, 0.03);

(19)

19

Using struct type

Value Parameter to examine a member

bool LateModel(CarType car, int date)

// Returns true if the car’s model year is later than or // equal to date; returns false otherwise.

{

return ( car.year >= date ) ; } ;

SAMPLE CALL

if ( LateModel(myCar, 1995) )

cout << myCar.price << endl ;

(20)

20

One-Dimensional Array at the Logical Level

A one-dimensional array is a structured composite data type made up of a finite, fixed size (known at compile time) collection of homogeneous (all of the same data type) elements having relative positions and to which there is direct access (any element can be accessed immediately).

Array operations (creation, storing a value, retrieving a value) are performed using a declaration and indexes.

(21)

21

Implementation Example

float values[5]; // assume element size is 4 bytes

This ACCESSING FUNCTION gives position of values[Index]

Address(Index) = BaseAddress + Index * SizeOfElement

Base Address

values[0] values[1] values[2] values[3] values[4]

7000 7004 7008 7012 7016

Indexes

(22)

22

One-Dimensional Arrays in C++

The index must be of an integral type (char, short, int, long, or enum).

The index range is always 0 through the array size minus 1.

Arrays cannot be assigned, and cannot be the return type of a function.

(23)

23

Another Example

char name[10]; // assume element size is 1 byte

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

6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 Base Address

This ACCESSING FUNCTION gives position of name[Index]

Address(Index) = BaseAddress + Index * SizeOfElement

(24)

24

Passing Arrays as Parameters

In C++, arrays are always passed by reference, and & is not used with the formal parameter type.

Whenever an array is passed as a

parameter, its base address is sent

to the called function.

(25)

25

const array parameter

Because arrays are always passed as reference

parameters, you can protect the actual parameter from unintentional changes by using const in

formal parameter list and function prototype.

FOR EXAMPLE . . .

// prototype float SumValues(const float values[ ],

int numOfValues );

(26)

float SumValues (const float values[ ],

int numOfValues )

// Pre: values[ 0] through values[numOfValues-1]

// have been assigned

// Returns the sum of values[0] through // values[numOfValues-1]

{

float sum = 0;

for ( int index = 0; index < numOfValues; index++ ) {

sum += values [ index ] ; }

return sum;

}

26

(27)

27

Two-Dimensional Array at the Logical Level

A two-dimensional array is a structured composite data type made up of a finite, fixed size collection of homogeneous elements having relative

positions and to which there is direct access.

Array operations (creation, storing a value, retrieving a value) are performed using a declaration and a pair of indexes (called row and column)

representing the component’s position in each dimension.

(28)

28

EXAMPLE -- To keep monthly high temperatures for 50 states in a two-dimensional array.

const int NUM_STATES = 50 ; const int NUM_MONTHS = 12 ;

int stateHighs [ NUM_STATES ] [ NUM_MONTHS ] ;

[ 0 ] [ 1 ] [ 2 ] .

. stateHighs [2] [7]

. [ 48 ] [ 49 ]

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

66 64 72 78 85 90 99 115 98 90 88 80 row 2,

col 7

might be Arizona’s high for August

(29)

29

Finding the average high temperature for Arizona

int total = 0 ; int month ; int average ;

for ( month = 0 ; month < NUM_MONTHS ; month ++ ) total = total + stateHighs [ 2 ] [ month ] ;

average = int ( total / 12.0 + 0.5 ) ;

(30)

30

const int NUM_STATES = 50 ; const int NUM_MONTHS = 12 ;

int stateHighs [ NUM_STATES ] [ NUM_MONTHS ] ;

In memory, C++ stores arrays in row order.

The first row is followed by the second row, etc.

12 highs for state 0 12 highs for state 1 etc.

Alabama Alaska first row second row

8000 8024 8048

Base Address

STORAGE

. . . rows columns

(31)

31

Implementation Level View

stateHighs[ 0 ] [ 0 ] stateHighs[ 0 ] [ 1 ] stateHighs[ 0 ] [ 2 ] stateHighs[ 0 ] [ 3 ] stateHighs[ 0 ] [ 4 ] stateHighs[ 0 ] [ 5 ] stateHighs[ 0 ] [ 6 ] stateHighs[ 0 ] [ 7 ] stateHighs[ 0 ] [ 8 ] stateHighs[ 0 ] [ 9 ] stateHighs[ 0 ] [10 ] stateHighs[ 0 ] [11 ] stateHighs[ 1 ] [ 0 ] stateHighs[ 1 ] [ 1 ] stateHighs[ 1 ] [ 2 ] stateHighs[ 1 ] [ 3 ] .

. .

To locate an element such as stateHighs [ 2 ] [ 7]

the compiler needs to know that there are 12 columns

in this two-dimensional array.

At what address will

stateHighs [ 2 ] [ 7 ] be found?

Assume 2 bytes for type int.

Base Address 8000

(32)

32

Two-Dimensional Array Parameters

Just as with a one-dimensional array, when a

two- (or higher) dimensional array is passed as a parameter, the base address of the actual array is sent to the function.

The size of all dimensions except the first must be included in the function heading and

prototype.

The sizes of those dimensions for the formal parameter must be exactly the same as in the actual array.

(33)

33

const int NUM_STATES = 50 ; const int NUM_MONTHS = 12 ;

int stateHighs [ NUM_STATES ] [ NUM_MONTHS ] ; int stateAverages [ NUM_STATES ] ;

[ 0 ] ? [ 1 ] ? [ 2 ] . . . [ 48 ] [ 49 ]

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

43 42 50 55 60 78 79 80 77 72 63 40 66 64 72 78 85 90 99 115 98 90 88 80

Use the two-dimensional stateHighs array to fill a one-dimensional stateAverages array

Alaska Arizona

(34)

void findAverages ( const int stateHighs [ ] [ NUM_MONTHS] , int stateAverages [ ] )

// Pre: stateHighs[ 0..NUM_STATES-1] [ 0..NUM_MONTHS-1] assigned // Post: stateAverages[ 0..NUM_STATES-1 ] contains rounded average // high temperature for each state

{

int state;

int month;

int total;

for ( state = 0 ; state < NUM_STATES; state++ )

{

total = 0 ;

for ( month = 0 ; month < NUM_MONTHS ; month++ ) total += stateHighs [ state ] [ month ] ;

stateAverages [ state ] = int ( total / 12.0 + 0.5 ) ;

} }

34

(35)

35

Using typedef with arrays

helps eliminate the chances of size mismatches between formal and actual parameters. FOR EXAMPLE,

typedef int StateHighsType [ NUM_STATES ] [ NUM_MONTHS ] ; typedef int StateAveragesType [ NUM_STATES ] ;

void findAverages( const StateHighsType stateHighs , StateAveragesType stateAverages )

{

. . .

} 35

(36)

36

Declaring Multidimensional Arrays

EXAMPLE USING TYPEDEF

const int NUM_DEPTS = 5 ; // mens, womens, childrens, electronics, linens const int NUM_MONTHS = 12 ;

const int NUM_STORES = 3 ; // White Marsh, Owings Mills, Towson

typedef long MonthlySalesType [NUM_DEPTS] [NUM_MONTHS] [NUM_STORES];

MonthlySalesType monthlySales;

(37)

const int NUM_DEPTS = 5 ; // mens, womens, childrens, electronics, linens const int NUM_MONTHS = 12 ;

const int NUM_STORES = 3 ; // White Marsh, Owings Mills, Towson

typedef long MonthlySalesType [NUM_DEPTS] [NUM_MONTHS] [NUM_STORES] ;

MonthlySalesType monthlySales;

monthlySales[3][7][0]

sales for electronics in August at White Marsh

12 MONTHS columns

5 DEPTS rows

3 STORES sheets

37

(38)

38

C++ class data type

A class is an unstructured type that encapsulates a fixed number of data components (data members) with the

functions (called member functions) that manipulate them.

The predefined operations on an instance of a class are whole assignment and

component access.

(39)

39

class DateType Specification

// SPECIFICATION FILE ( datetype.h )

class DateType // declares a class data type {

public : // 4 public member functions

void Initialize ( int newMonth , int newDay , int newYear ) ; int YearIs( ) const ; // returns year

int MonthIs( ) const ; // returns month int DayIs( ) const ; // returns day private : // 3 private data members

int year ; int month ; int day ;

} ; 39

(40)

40

Use of C++ data type class

Variables of a class type are called objects (or instances) of that particular class.

Software that declares and uses objects of the class is called a client.

Client code uses public member functions (called methods in OOP) to handle its class objects.

Sending a message means calling a public member function.

(41)

41

Client Code Using DateType

#include “datetype.h” // includes specification of the class

#include “bool.h”

int main ( void )

{

DateType startDate ; // declares 2 objects of DateType DateType endDate ;

bool retired = false ;

startDate.Initialize ( 6, 30, 1998 ) ; endDate.Initialize ( 10, 31, 2002 ) ;

cout << startDate.MonthIs( ) << “/” << startDate.DayIs( ) << “/” << startDate.YearIs( ) << endl;

while ( ! retired )

{ finishSomeTask( ) ; . . .

}

} 41

(42)

42

2 separate files generally used for class type

// SPECIFICATION FILE ( datetype .h ) // Specifies the data and function members.

class DateType {

public:

. . .

private:

. . . } ;

// IMPLEMENTATION FILE ( datetype.cpp ) // Implements the DateType member functions.

. . .

(43)

43

DateType Class Instance Diagrams

Initialize YearIs MonthIs

DayIs

startDate endDate

Private data:

year month day

2002 10 31 Initialize

YearIs MonthIs

DayIs 1998

6 30

Private data:

year month day

(44)

44

Implementation of DateType member functions

// IMPLEMENTATION FILE (datetype.cpp)

#include “datetype.h” // also must appear in client code void DateType :: Initialize ( int newMonth, int newDay,

int newYear ) // Post: year is set to newYear.

// month is set to newMonth.

// day is set to newDay.

{

year = newYear ; month = newMonth ; day = newDay ; }

44

(45)

int DateType :: MonthIs ( ) const

// Accessor function for data member month {

return month ; }

int DateType :: YearIs ( ) const

// Accessor function for data member year {

return year ; }

int DateType :: DayIs ( ) const

// Accessor function for data member day {

return day ;

} 45

(46)

46

Familiar Class Instances and Member Functions

The member selection operator ( . ) selects either data members or member functions.

Header files iostream.h and fstream.h declare the istream, ostream,and ifstream, ofstream I/O classes.

Both cin and cout are class objects and get and ignore are member functions.

cin.get (someChar) ; cin.ignore (100, ‘\n’) ;

These statements declare myInfile as an instance of class ifstream and invoke member function open.

ifstream myInfile ;

myInfile.open ( “A:\\mydata.dat” ) ;

(47)

47

Scope Resolution Operator ( :: )

C++ programs typically use several class types.

Different classes can have member functions with the same identifer, like Write( ).

Member selection operator is used to determine the class whose member function Write( ) is invoked.

currentDate .Write( ) ; // class DateType

numberZ .Write( ) ; // class ComplexNumberType

In the implementation file, the scope resolution operator is used in the heading before the member function’s name to specify its class.

void DateType :: Write ( ) const

{ . . . }

(48)

48

Information Hiding

Class implementation details are hidden from the client’s view. This is called information hiding.

Public functions of a class provide the interface between the client code and the class objects.

client

code specification barrabstraction implementation ier

(49)

// SPECIFICATION FILE ( strtype.h )

#include <fstream.h>

#include <iostream.h>

const int MAX_CHARS = 200 ;

enum RelationType { LESS, EQUAL, GREATER } ;

enum InType { ALPHA_NUM, ALPHA, NON_WHITE, NOT_NEW } ; class StrType // declares class data type

{

public : // 7 public member functions void MakeEmpty ( ) ;

void GetString ( bool skip, InType charsAllowed ) ; void GetStringFile ( bool skip, InType charsAllowed, ifstream& inFile ) ;

void PrintToScreen ( bool newLine ) const ;

void PrintToFile ( bool newLine, ofstream& outFile) const ; int LengthIs( ) const ;

void CopyString( StrType& newString ) const ; private : // 1 private data member

char letters [MAX_CHARS + 1 ] ;

} ; 49

(50)

50

StrType Class Interface Diagram

StrType class

Private data:

letters GetString

GetStringFile

CopyString LengthIs PrintToFile MakeEmpty

PrintToScreen ‘c’’a’’t’’\0’ ...

(51)

// IMPLEMENTATION FILE (strtype.cpp)

#include “strtype.h” // also appears in client code

#include “string.h”

void StrType :: MakeEmpty ( ) // Post: letters is empty string.

{

letters[0] = ‘\0’ ; }

. . .

int StrType :: LengthIs ( ) const // Returns length of letters string.

{

return strlen ( letters ) ;

} 51

References

Related documents

А для того, щоб така системна організація інформаційного забезпечення управління існувала необхідно додержуватися наступних принципів:

An array is a collection of more than one homogenous element. The data items /elements of the same type and same length are the homogenous elements. To represent

We show that suit- ably &#34;close&#34; von Neumann algebras (&#34;close&#34; in a sense to be made precise in the next section, Definition A, but, roughly, that the unit ball of

 if the input file does not exist on disk, open is not successful.  if the output file does not exist on disk, a new file with that name

3 Constructor parameters are placed in a parameter list in the declaration of the class object. 4 The parameterless constructor is the default

 When a variable is declared, enough memory to hold a value of that type is allocated for it at an unused memory location... What is a

content and multidimensional array example to manipulate tabular data to access the same data elements of all the following c programming with the function.. Used a time of array

UW’s Facilities Maintenance &amp; Construction will use SAFETY as the leverage point for maturing their staff in “4 Key Systems”: Goals, Visual Management, Daily Kaizen and