You are on page 1of 45

C++ Plus Data Structures

Nell Dale
Chapter 2
Data Design and Implementation

1
What do mean by data?
● When talk about the function of a program, we
use words such as “add”, ”read”, ”Multiply”,
”write”…and so on.
● The date are the objects that are manipulated,
The information that is processed by a
computer program.
● This information is just a collection of bits that
can be turned off or on (computer’s view).
● Human thinks of information as numbers ,lists.
● To separate computer’s view from our view
we use data abstraction.

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
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.
APPLICATION REPRESENTATION
int y;

y = 25; 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

4
Encapsulated C++ Data Type int
TYPE
int
Value range: Representation of
INT_MIN . . INT_MAX
int
Operations:
+ prefix as 16 bits two’s
- prefix (inside) complement
+ infix
- infix +
* infix
/ infix Implementation of
% infix Operations
Relational Operators
infix
5
Abstract Data Type (ADT)

● A data type whose properties (domain and


operations) are specified independently of
any particular implementation.

6
Data from 3 different levels
● 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

7
Viewing a library from 3
different levels
● Application (or user) level: Library of our
University
● 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
C++ Built-In Data Types

Simple
Composite
Integral Floating
array struct union class

char short int long enum

float double long double


Address

pointer reference 9
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.

10
Two Forms of
Composite Data Types

UNSTRUCTURED STRUCTURED

Components are not The organization


organized with respect to determines method used
one another. to access individual
data components.

EXAMPLES: EXAMPLES:
classes and structs arrays

1111
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 . . .
thisCar at Base Address 6000
.year 1999

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

.price 18678.92

12
struct CarType
struct CarType
{
int year ;
char maker[10];
float price ;
} ;

CarType thisCar; //CarType variables


CarType myCar;

13
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]
14
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.

15
Pass-by-value
sends a copy
of the contents of
the actual parameter

CALLING FUNCTION
BLOCK CALLED

SO,
he actual parameter cannot be changed by the functio
1616
Pass-by-reference
sends the location
(memory address)
of the actual parameter

CALLING
BLOCK FUNCTION
CALLED

can change value of


actual parameter
1717
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);
18
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 ;
19
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.

20
Implementation Example
This ACCESSING FUNCTION gives position of values[Index]
Address(Index) = BaseAddress + Index * SizeOfElement

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


Base Address

7000 7004 7008 7012 7016

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

Indexes 21
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.

22
Another Example
This ACCESSING FUNCTION gives position of name[Index]
Address(Index) = BaseAddress + Index * SizeOfElement

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

Base Address

6000 6001 6002 6003 6004 6005 6006 6007 6008 6009

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

23
Exercise
struct CarType
{
int year ;
char maker[10];
float price ;
} ;
CarType thisCar; //CarType variables
CarType Cars[20];
Assume that an int and char require one cell, and float
requires two cells, and base address of thisCar is 2000.

a) what is the @ for thisCar.price = 17899;


24
Exercise
Member Length Offset Address

year 1 0 2000

maker 10 1 2001

price 2 11 2011

b) How much space does the compiler set aside for Cares.
13 * 20 = 260

25
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.

26
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 );

27
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;
} 2828
Exercises
Declare one-dimensional array,
studentID, that contains 30 integers.

int studentID [30];

Assign the value 4214 to the fifth


component of studentID

studentID[4]=4214;

If the base address of studentID is


2000,and each int requires two bytes,
what the address of the cell reference
studentID[4]?
2000+4*2 = 2008 29
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 )
{
.
.
.
}
3030
Exercises
struct carType
{
int year ;
char maker[10];
float price ;
} ;
Declare a one-dimensional array type,
carListType, of carType components
(containing 30 carType components).

typedef carType carListType[30];


Declare a variable, buyCar, of carListType.

carListType buyCar; 31
Exercises
struct carType
{
int year ;
char maker[10];
float price ;
} ;
Assign the value 2002 to the
year member of the 25
component in buyCar.

buyCar[24].year = 2002; 32
Exercises
struct carType
{
int year ;
char maker[10];
float price ;
} ;
Assume that an int and char require one cell, and
float requires two cells, and base address of
buyCar is 4000. What is the address of the member
assigned in
buyCar[24].year = 2002;
Address(Index) = BaseAddress + Index *
SizeOfElement
33
4000+24*13 = 4312
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.

34
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] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[0]
[ 1 ] 66 64 72 78 85 90 99 115 98 90 88 80
row 2,
col 7 [2]
might be .
Arizona’s . stateHighs [2] [7]
high for .
August
[ 48 ] 35
[ 49 ]
Finding the average high temperature for Arizona

int total = 0 ;
int month ;
float average ;

for ( month = 0 ; month < NUM_MONTHS ; month ++ )


total = total + stateHighs [ 2 ] [ month ] ;

average = total / 12.0 ;

36
Finding the average high temperature for all the
states:

int total = 0 ;
int month ;
float average ;
for (int state = 0; state <NUM_STATES; state ++)
for ( month = 0 ; month < NUM_MONTHS ; month ++ )
total = total + stateHighs [ state ] [ month ] ;

average = total / 600 ;

37
const int NUM_STATES = 50 ;
const int NUM_MONTHS = 12 ;
int stateHighs [ NUM_STATES ] [ NUM_MONTHS ] ;

rows columns
STORAGE
● In memory, C++ stores arrays in row order.
The first row is followed by the second row, etc.
Base Address
8000 8024 8048

...

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


Alabama Alaska
first row second row 38
Implementation Level View
stateHighs[ 0 ] [ 0 ] Base Address 8000
stateHighs[ 0 ] [ 1 ]
stateHighs[ 0 ] [ 2 ]
stateHighs[ 0 ] [ 3 ] To locate an element such as
stateHighs[ 0 ] [ 4 ]
stateHighs [ 2 ] [ 7]
stateHighs[ 0 ] [ 5 ]
stateHighs[ 0 ] [ 6 ] the compiler needs to know
stateHighs[ 0 ] [ 7 ] that there are 12 columns
stateHighs[ 0 ] [ 8 ]
in this two-dimensional array.
stateHighs[ 0 ] [ 9 ]
stateHighs[ 0 ] [10 ]
stateHighs[ 0 ] [11 ]
stateHighs[ 1 ] [ 0 ]
At what address will
stateHighs[ 1 ] [ 1 ]
stateHighs[ 1 ] [ 2 ] stateHighs [ 2 ] [ 7 ] be found?
stateHighs[ 1 ] [ 3 ]
. Assume 2 bytes for type int.
. 39
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.
40
Use the two-dimensional stateHighs array to fill a
one-dimensional stateAverages array

const int NUM_STATES = 50 ;


const int NUM_MONTHS = 12 ;
int stateHighs [ NUM_STATES ] [ NUM_MONTHS ] ;
int stateAverages [ NUM_STATES ] ;

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

[0]
Alaska ? [1] 43 42 50 55 60 78 79 80 77 72 63 40
Arizona ? [2] 66 64 72 78 85 90 99 115 98 90 88 80
.
.
.
[ 48 ]
[ 49 ] 41
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 ) ; 42
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;

43
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
E S
O R
s
ST eet
3 sh
5 DEPTS
rows

44
12 MONTHS columns
Exercise
● Consider the following matrix:
11 21 30 4
34 70 57 8
92 10 11 12
Assume the array is stored in raw-wise order
beginning at location 2000. Assume each array
element occupies four storage locations. Answer
the following:
● Give the storage address of the value 10.
● Give the value of the seventh element stored.
● Give the value of the element stored at location
2020.
● Give the program segment required to print the
stored values in column- wise order.
● Solve the above again for column order 45

You might also like