0% found this document useful (0 votes)
17 views76 pages

Sow C++ Cso Chapter 11 10e

Chapter 11 discusses structured data, focusing on abstract data types (ADTs), structures in C++, and their usage. It covers how to define, access, and initialize structures, as well as the use of arrays and nested structures. Additionally, it explains the role of structures in function arguments and introduces enumerated data types.

Uploaded by

David Cross
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views76 pages

Sow C++ Cso Chapter 11 10e

Chapter 11 discusses structured data, focusing on abstract data types (ADTs), structures in C++, and their usage. It covers how to define, access, and initialize structures, as well as the use of arrays and nested structures. Additionally, it explains the role of structures in function arguments and introduces enumerated data types.

Uploaded by

David Cross
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 76

Chapter 11:

Structured Data

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.1
Abstract Data Types

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Abstract Data Types

• A data type that specifies


• values that can be stored
• operations that can be done on the values
• User of an abstract data type does not
need to know the implementation of the
data type, e.g., how the data is stored
• ADTs are created by programmers

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Abstraction and Data Types
• Abstraction: a definition that captures
general characteristics without details
• Ex: An abstract triangle is a 3-sided polygon.
A specific triangle may be scalene, isosceles,
or equilateral
• Data Type defines the values that can be
stored in a variable and the operations that
can be performed on it

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.2
Combining Data into Structures

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Combining Data into Structures
• Structure: C++ construct that allows multiple
variables to be grouped together
• General Format:
struct <structName>
{
type1 field1;
type2 field2;
. . .
};

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Example struct Declaration
struct Student structure tag
{
int studentID;
string name; structure
short yearInSchool; members

double gpa;
};

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
struct Declaration Notes
• Must have ; after closing }
• struct names commonly begin with
uppercase letter
• Multiple fields of same type can be in
comma-separated list:
string name,
address;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Defining Variables
• struct declaration does not allocate
memory or create variables
• To define variables, use structure tag as
type name:
bill
Student bill; studentID
name
yearInSchool

gpa

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.3
Accessing Structure Members

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Accessing Structure Members
• Use the dot (.) operator to refer to members of
struct variables:
cin >> stu1.studentID;
getline(cin, stu1.name);
stu1.gpa = 3.75;

• Member variables can be used in any manner


appropriate for their data type

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Displaying a struct Variable
• To display the contents of a struct
variable, must display each field
separately, using the dot operator:
cout << bill; // won’t work
cout << bill.studentID << endl;
cout << bill.name << endl;
cout << bill.yearInSchool;
cout << " " << bill.gpa;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Comparing struct Variables
• Cannot compare struct variables
directly:
if (bill == william) // won’t work

• Instead, must compare on a field basis:


if (bill.studentID ==

william.studentID) ...

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.4
Initializing a Structure

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Initializing a Structure

• struct variable can be initialized when


defined:
Student s = {11465, "Joan", 2, 3.75};

• Can also be initialized member-by-


member after definition:
s.name = "Joan";
s.gpa = 3.75;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
More on Initializing a Structure
• May initialize only some members:
Student bill = {14579};
• Cannot skip over members:
Student s = {1234, "John", ,
2.83}; // illegal
• Cannot initialize in the structure
declaration, since this does not allocate
memory

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Excerpts From Program 11-3

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.5
Arrays of Structures

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Arrays of Structures
• Structures can be defined in arrays
• Can be used in place of parallel arrays
const int NUM_STUDENTS = 20;
Student stuList[NUM_STUDENTS];
• Individual structures accessible using subscript
notation
• Fields within structures accessible using dot
notation:
cout << stuList[5].studentID;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.6
Nested Structures

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Nested Structures
A structure can contain another structure as a
member:
struct PersonInfo
{ string name,
address,
city;
};
struct Student
{ int studentID;
PersonInfo pData;
short yearInSchool;
double gpa;
};
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Members of Nested Structures
• Use the dot operator multiple times to refer
to fields of nested structures:

Student s;
s.pData.name = "Joanne";
s.pData.city = "Tulsa";

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.7
Structures as Function Arguments

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Structures as Function
Arguments
• May pass members of struct variables to
functions:
computeGPA(stu.gpa);
• May pass entire struct variables to functions:
showData(stu);
• Can use reference parameter if function needs
to modify contents of structure variable

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Excerpts from Program 11-6

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Structures as Function
Arguments - Notes
• Using value parameter for structure can
slow down a program, waste space
• Using a reference parameter will speed
up program, but function may change
data in structure
• Using a const reference parameter
allows read-only access to reference
parameter, does not waste space, speed

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Revised showItem Function

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.8
Returning a Structure from a
Function

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Returning a Structure from a
Function
• Function can return a struct:
Student getStudentData(); // prototype
stu1 = getStudentData(); // call

• Function must define a local structure


• for internal use
• for use with return statement

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Returning a Structure from a
Function - Example
Student getStudentData()
{ Student tempStu;
cin >> tempStu.studentID;
getline(cin, tempStu.pData.name);
getline(cin, tempStu.pData.address);
getline(cin, tempStu.pData.city);
cin >> tempStu.yearInSchool;
cin >> tempStu.gpa;
return tempStu;
}

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.9
Using Structured Binding
Declarations with Structures

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Structured Binding Declarations
• A structured binding declaration defines a set of
variables and initializes them with the values
that are stored in a structure.
• A process known as unpacking a structure
• Can also be used to unpack arrays (see Chapter 7)

• Structured binding declarations were introduced


in C++ 17

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Structured Binding Declarations
• General format:
auto [variable1, variable2, etc...] = structureVar;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Structured Binding Declarations
• Example:
struct Automobile
{
string make;
int year;
double mileage;
};
Automobile car = { "Porsche", 2020, 12400.0 };
auto [first, second, third] = car;
This
This code
code will
will display:
display:
cout << first << endl; Porsche
Porsche
cout << second << endl; 2020
2020
cout << third << endl; 12400.0
12400.0

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.10
Pointers to Structures

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Pointers to Structures
• A structure variable has an address
• Pointers to structures are variables that
can hold the address of a structure:
Student *stuPtr;
• Can use & operator to assign address:
stuPtr = & stu1;
• Structure pointer can be a function
parameter

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Accessing Structure Members
via Pointer Variables
• Must use () to dereference pointer
variable, not field within structure:
cout << (*stuPtr).studentID;

• Can use structure pointer operator to


eliminate () and use clearer notation:
cout << stuPtr->studentID;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
From Program 11-9

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
11.12
Enumerated Data Types

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types

• An enumerated data type is a programmer-


defined data type. It consists of values
known as enumerators, which represent
integer constants.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
• Example:

enum Day { MONDAY, TUESDAY,


WEDNESDAY, THURSDAY,
FRIDAY };
• The identifiers MONDAY, TUESDAY,
WEDNESDAY, THURSDAY, and FRIDAY,
which are listed inside the braces, are
enumerators. They represent the values
that belong to the Day data type.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types

enum Day { MONDAY, TUESDAY,


WEDNESDAY, THURSDAY,
FRIDAY };

Note that the enumerators are not strings,


so they aren’t enclosed in quotes.
They are identifiers.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
• Once you have created an enumerated
data type in your program, you can define
variables of that type. Example:

Day workDay;

• This statement defines workDay as a


variable of the Day type.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
• We may assign any of the enumerators
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, or FRIDAY to a variable of the
Day type. Example:

workDay = WEDNESDAY;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
• So, what is an enumerator?
• Think of it as an integer named constant
• Internally, the compiler assigns integer
values to the enumerators, beginning at 0.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
enum Day { MONDAY, TUESDAY,
WEDNESDAY, THURSDAY,
FRIDAY };
In memory...
MONDAY =0
TUESDAY =1
WEDNESDAY =2
THURSDAY =3
FRIDAY =4
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
• Using the Day declaration, the following
code...
cout << MONDAY << " "
<< WEDNESDAY << " “
<< FRIDAY << endl;

...will produce this output:

0 2 4
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Assigning an integer to an enum
Variable
• You cannot directly assign an integer value
to an enum variable. This will not work:

workDay = 3; // Error!
• Instead, you must cast the integer:

workDay = static_cast<Day>(3);

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Assigning an Enumerator to an int
Variable
• You CAN assign an enumerator to an int
variable. For example:

int x;
x = THURSDAY;

• This code assigns 3 to x.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Comparing Enumerator Values

• Enumerator values can be compared using


the relational operators. For example, using
the Day data type the following code will
display the message "Friday is greater than
Monday.“

if (FRIDAY > MONDAY)


{
cout << "Friday is greater "
<< "than Monday.\n";
}
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Continued…
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerated Data Types
• Program 11-9 shows enumerators used to
control a loop:

// Get the sales for each day.


for (index = MONDAY; index <= FRIDAY; index++)
{
cout << "Enter the sales for day "
<< index << ": ";
cin >> sales[index];
}

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Anonymous Enumerated Types

• An anonymous enumerated type is simply


one that does not have a name. For
example, in Program 11-10 we could have
declared the enumerated type as:

enum { MONDAY, TUESDAY,


WEDNESDAY, THURSDAY,
FRIDAY };

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Using Math Operators with enum
Variables
• You can run into problems when trying to perform math
operations with enum variables. For example:

Day day1, day2; // Define two Day variables.


day1 = TUESDAY; // Assign TUESDAY to day1.
day2 = day1 + 1;// ERROR! Will not work!

• The third statement will not work because the expression


day1 + 1 results in the integer value 2, and you cannot
store an int in an enum variable.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Using Math Operators with enum
Variables
• You can fix this by using a cast to explicitly
convert the result to Day, as shown here:

// This will work.


day2 = static_cast<Day>(day1 + 1);

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Using an enum Variable to Step
through an Array's Elements
• Because enumerators are stored in memory as
integers, you can use them as array subscripts.
For example:
enum Day { MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY };
const int NUM_DAYS = 5;
double sales[NUM_DAYS];
sales[MONDAY] = 1525.0;
sales[TUESDAY] = 1896.5;
sales[WEDNESDAY] = 1975.63;
sales[THURSDAY] = 1678.33;
sales[FRIDAY] = 1498.52;

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Using an enum Variable to Step
through an Array's Elements
• Remember, though, you cannot use the ++
operator on an enum variable. So, the
following loop will NOT work.

Day workDay; // Define a Day variable


// ERROR!!! This code will NOT work.
for (workDay = MONDAY; workDay <= FRIDAY; workDay++)
{
cout << "Enter the sales for day "
<< workDay << ": ";
cin >> sales[workDay];
}

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Using an enum Variable to Step
through an Array's Elements
• You must rewrite the loop’s update
expression using a cast instead of ++:
for (workDay = MONDAY; workDay <= FRIDAY;
workDay = static_cast<Day>(workDay + 1))
{
cout << "Enter the sales for day "
<< workDay << ": ";
cin >> sales[workDay];
}

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Continued…
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Enumerators Must Be Unique
Within the same Scope
• Enumerators must be unique within the same scope.
(Unless strongly typed)
• For example, an error will result if both of the following
enumerated types are declared within the same scope:

enum Presidents { MCKINLEY, ROOSEVELT, TAFT };

enum VicePresidents { ROOSEVELT, FAIRBANKS,


SHERMAN };

ROOSEVELT is declared twice.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Strongly Typed enums
• In C++ 11 and later, you can use a new type of enum ,
known as a strongly typed enum

• Allows you to have multiple enumerators in the same


scope with the same name

enum class Presidents { MCKINLEY, ROOSEVELT, TAFT };


enum class VicePresidents { ROOSEVELT, FAIRBANKS, SHERMAN };

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Strongly Typed enums
• Prefix the enumerator with the name of the enum ,
followed by the :: operator:
Presidents prez = Presidents::ROOSEVELT;
VicePresidents vp = VicePresidents::ROOSEVELT;

• Use a cast operator to retrieve integer value:

int x = static_cast<int>(Presidents::ROOSEVELT);

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.
Declaring the Type and Defining
the Variables in One Statement
• You can declare an enumerated data type
and define one or more variables of the
type in the same statement. For example:

enum Car { PORSCHE, FERRARI, JAGUAR } sportsCar;

This code declares the Car data type and defines a


variable named sportsCar.

Copyright © 2021, 2018, 2015, 2012, 2009 Pearson Education, Inc. All rights reserved.

You might also like