starting out with c++ 1 chapter 11 – structured data abstract data types (adts) are data types...

36
1 Starting Out with C++ Chapter 11 – Structured Data • Abstract data types (ADTs) are data types created by the programmer. • ADTs have their own range (or domain) of data and their own set of operations that may be performed on them.

Post on 22-Dec-2015

217 views

Category:

Documents


1 download

TRANSCRIPT

1

Starting Out with C++

Chapter 11 – Structured Data

• Abstract data types (ADTs) are data types created by the programmer.

• ADTs have their own range (or domain) of data and their own set of operations that may be performed on them.

2

Starting Out with C++

Abstraction

• An abstraction is a general model of something.

3

Starting Out with C++

Data Types

• C++ has several primitive data types:

bool int unsigned long int

char long int float

unsigned char

unsigned short int

double

short int unsigned int long double

4

Starting Out with C++

What groups/types were there in high school?

• How did you recognize them?– What they looked like– What they did

• This is the concept of a data type!

5

Starting Out with C++

Abstract Data Types

• A data type created by the programmer:– The programmer decides what values are

acceptable for the data type.– The programmer decides what operations may

be performed on the data type.

6

Starting Out with C++

Combining Data into Structures

• C++ allows you to group several variables together into a single item known as a structure.

7

Starting Out with C++

Payroll System

Variable Declaration Information Held

int empNumber; Employee number

char name [25]; Employee name

float hours; Hours worked

float payRate; Hourly pay rate

float grossPay; Gross pay

8

Starting Out with C++

Payroll as a C++ struct

struct PayRoll // NOTE capitalization of type names

{ int EmpNumber; char Name[25]; float Hours; float PayRate; float GrossPay;}; // PayRoll

9

Starting Out with C++

PayRoll deptHead;

empNumber

name

hours

payRate

grossPay

deptHead

Structure Variable Name

Members

10

Starting Out with C++

PayRoll deptHead, foreman, associate;

empNumbernamehourspayRategrossPay

deptHead

empNumbernamehourspayRategrossPay

foreman

empNumbernamehourspayRategrossPay

associate

11

Starting Out with C++

At seats

• Discuss with your neighbor why you would want to group data into a structure.

12

Starting Out with C++

Two Steps to Create a Structures

• Define the type: Create structure declaration. – This establishes the tag (or name) of the structure

and a list of items that are members.

• Declare variables of that type

13

Starting Out with C++

Accessing Structure Members

• The dot operator (.) allows you to access structure members in a program.

14

Starting Out with C++

Using Structures – Program

struct PayRoll{

int empNumber; // Employee numberchar name[25]; // Employee's namefloat hours; // Hours workedfloat payRate; // Hourly Payratefloat grossPay; // Gross Pay

}; // PayRoll

15

Starting Out with C++

Using Structures – Program (cont)

void main ( void ){ PayRoll employee; // Employee is a PayRoll structure

cout << "Enter the employee's number: ";cin >> employee.empNumber;cout << "Enter the employee's name: ";cin.ignore(); // Skip the remaining '\n' charactercin.getline(employee.name, 25);cout << "How many hours did the employee work? ";cin >> employee.hours;cout << "What is the employee's hourly payrate? ";cin >> employee.payRate;employee.grossPay = employee.hours * employee.payRate;cout << "Here is the employee's payroll data:\n";cout << "Name: " << employee.name << endl;

}

16

Starting Out with C++

Displaying a Structure

• The contents of a structure variable cannot be displayed by passing the entire variable to cout.

• For example, assuming employee is a PayRoll structure variable, cout << employee; will not work: (We will learn later how to extend the system to do this.

17

Starting Out with C++

Circle Structure – Program

struct Circle{

float radius;float diameter;float area;

}; // Circle

const float PI = 3.14159;

At seats: use structs and method circleArea (which you write) to return area of give circle

18

Starting Out with C++

Strings as Structure Members

• When a character array is a structure member, use the same string manipulation techniques with it as you would with any other character array.

• In other words, after qualification, it is just a simple type (which you know how to use).

19

Starting Out with C++

Arrays of Structures

• Arrays of structures can simplify some programming tasks.struct BookInfo{ char title[50]; char author[30]; char publisher[25]; float price;}; // BookInfoBookInfo bookList[20];How would you refer to the first letter of the author in the

third book?

At seats: given an array of books, print out the title of all books costing more than $100.

20

Starting Out with C++

Initializing a Structure Array

struct PayInfo{ int jobId; float rate;};PayInfo workers[5] = {{ 10, 9.75}, {15, 8.62}, {20, 10.50}, {40, 18.75}, {50, 15.65}};

21

Starting Out with C++

Nested Structures

struct Costs{ float wholesale; float retail;}; // Costs

struct Item{ string partNum string description; Costs pricing;}; // Item

22

Starting Out with C++

Questions

• Can we have arrays of structures?

• Can we have structures of arrays?

• Can we have structures of structures of structures of arrays of arrays of structures….

• YES

23

Starting Out with C++

Nested Structures – Program

struct Date{

int month;int day;int year;

}; // Datestruct Place{

string address;string city;string state;string zip;

}; // Place

24

Starting Out with C++

Nested Structures – Program (cont)

struct EmpInfo{ string name;

int empNumber;Date birthDate;Place residence;

}; // EmpInfo

void main ( void ){ EmpInfo manager;

cout << "Enter the manager's name: ";getline(cin,manager.name); cout << "Enter the manager's employee number: ";cin >> manager.empNumber;

25

Starting Out with C++

Nested Structures – Program (cont)

cout << "Now enter the manager's date-of-birth.\n";cout << "Month (up to 2 digits): ";cin >> manager.birthDate.month;cout << "Day (up to 2 digits): ";cin >> manager.birthDate.day;cout << "Year (2 digits): ";cin >> manager.birthDate.year;cin.get(); // Eat the remaining newline charactercout << "Enter the manager's street address: ";getline(cin,manager.residence.address);

…}

26

Starting Out with C++

Structures as Arguments – Program

struct InvItem{

int partNum; // Part numberstring description; // Item descriptionint onHand; // Units on handfloat price; // Unit price

}; // InvItem

// Function Prototypesvoid GetItem ( InvItem & ); // & Important or nothing will be changedvoid ShowItem ( InvItem );

27

Starting Out with C++

Structures as Arguments – Program (cont)void main ( void ){ InvItem part;

GetItem(part);ShowItem(part);

} // main

void GetItem ( InvItem &piece ){ …} // GetItem

28

Starting Out with C++

Constant Reference Parameters

• Sometimes structures can be quite large.• Therefore, passing by value can decrease a

program’s performance. But passing by reference can cause problems.

• Instead, pass by constant reference:void ShowItem ( const InvItem &piece ){ cout.setf(ios::precision(2) | ios::fixed | ios::showpoint); cout << "Part Number: " << piece.partNum << endl; cout << "Price: $" << piece.price << endl;} // ShowItem

29

Starting Out with C++

Returning a Structure – Program

struct Circle{float radius;

float diameter;float area;

}; // Circle

Circle getInfo ( void );const float PI = 3.14159;

30

Starting Out with C++

Returning a Structure – Program (cont)

void main ( void ){ Circle c;

c = getInfo();c.area = PI * pow(c.radius, 2.0);cout << "The radius and area of the circle are:\n";cout.precision(2);cout.setf(ios::fixed | ios::showpoint);cout << "Radius: " << c.radius << endl;cout << "Area: " << c.area << endl;

} // mainCircle getInfo ( void ){ Circle Round;

cout << "Enter the diameter of a circle: ";cin >> Round.Diameter;Round.Radius = Round.Diameter / 2;return Round;

} // getInfo

31

Starting Out with C++

Pointers to Structures

• You may take the address of a structure variable and create variables that are pointers to structures.Circle *cirPtr;CirPtr = &piePlate;*cirPtr.Radius = 10; // incorrect (*cirPtr).Radius = 10; // correctcirPtr->Radius = 10; // easier notation

32

Starting Out with C++

Pointers and Structures – Program (cont)

void main ( void ){ PayRoll *employee;

employee = new PayRoll;assert( employee == NULL );// Always good to do

cout << "Enter the employee's number: ";cin >> employee->empNumber;cout << "Enter the employee's name: ";cin.ignore();getline(cin,employee->name);

…}

33

Starting Out with C++

The Use of ., ->, and *Expression Description

s->ms is a structure pointer and m is a member. This expression accesses the m member of the structure pointer to by s.

*a.pa is a structure variable and p, a pointer, is a member. This expression dereferences the value pointed to by p.

(*s).m

s is a structure pointer and m is a member. The * operator dereferences s, causing the expression to access the m member of the structure pointed to by s. This expression is the same as s->m.

*s->ps is a structure pointer and p, a pointer, is a member of the structure pointed to by s. This expression accesses the value pointed to by p.

*(*s).ps is a structure pointer and p, a pointer, is a member of the structure pointed to by s. This expression accesses the value pointed to by p.

34

Starting Out with C++

Unions

• A union is like a structure, except all the members occupy the same memory area (to save space).union PaySource{ short hours; float sales;}; // PaySourcePaySource employee;

• Fallen from favor as “unsafe” – cannot do type checking as can store as one type and use as another.

35

Starting Out with C++

Unions – Program

union PaySource{ short hours;

float sales;}; // PaySource

void main ( void ){ PaySource employee1;

char payType;float payRate, grossPay;

36

Starting Out with C++

Unions – Program (cont)

if ( toupper(payType) == 'H' ){ cout << "What is the hourly pay rate? ";

cin >> payRate;cout << "How many hours were worked? ";cin >> employee1.hours;GrossPay = employee1.hours * payRate;cout << "Gross pay: $" << grossPay << endl;

} // ifelse if (toupper(payType) == 'C'){ cin >> employee1.sales; grossPay = employee1.sales * 0.10;} // else ifelse cout << payType << " is not a valid selection.\n";