Contents

Preface

1   Overview of Programming and Problem Solving

1.1   Overview of Programming

What Is Programming?

How Do We Write a Program?

What Is an Algorithm?

What Is a Programming Language?

1.2   How Does a Computer Run a Program?

What Kinds of Instructions Can Be Written in a Programming Language?

What Is Software Maintenance?

Software Maintenance Case Study: An Introduction to Software Maintenance

1.3   What’s Inside the Computer?

1.4   Ethics and Responsibilities in the Computing Profession

Software Piracy

Privacy of Data

Use of Computer Resources

Software Engineering

1.5   Problem-Solving Techniques

Ask Questions

Look for Things That Are Familiar

Solve by Analogy

Means-Ends Analysis

Divide and Conquer

The Building-Block Approach

Merging Solutions

Mental Blocks: The Fear of Starting

Algorithmic Problem Solving

Problem-Solving Case Study: Leap Year Algorithm

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Case Study Follow-Up

Line Number

2   C++ Syntax and Semantics, and the Program Development Process

2.1   The Elements of C++ Programs

C++ Program Structure

Syntax and Semantics

Syntax Templates

Naming Program Elements: Identifiers

Data and Data Types

Naming Elements: Declarations

Taking Action: Executable Statements

Beyond Minimalism: Adding Comments to a Program

2.2   Program Construction

Blocks (Compound Statements)

The C++ Preprocessor

Software Maintenance Case Study: Adding Titles to Names

2.3   More About Output

Creating Blank Lines

Inserting Blanks Within a Line

Special Characters

2.4   Program Entry, Correction, and Execution

Entering a Program

Compiling and Running a Program

Problem-Solving Case Study: Printing a Chessboard

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

3   Numeric Types, Expressions, and Output

3.1   Overview of C++ Data Types

3.2   Numeric Data Types

Integral Types

Floating-Point Types

3.3   Declarations for Numeric Types

Named Constant Declarations

Variable Declarations

3.4   Simple Arithmetic Expressions

Arithmetic Operators

Increment and Decrement Operators

3.5   Compound Arithmetic Expressions

Precedence Rules

Type Coercion and Type Casting

Software Maintenance Case Study: Precedence Error

3.6   Function Calls and Library Functions

Value-Returning Functions

Library Functions

Void Functions

3.7   Formatting Output

Integers and Strings

Floating-Point Numbers

3.8   Additional string Operations

The length and size Functions

The find Function

The substr Function

Accessing Characters Within a String: The at Function

Converting to Lowercase and Uppercase

Problem-Solving Case Study: Mortgage Payment Calculator

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

4   Program Input and the Software Design Process

4.1   Getting Data into Programs

Input Streams and the Extraction Operator (>>)

The Reading Marker and the Newline Character

Reading Character Data with the get Function

Skipping Characters with the ignore Function

Reading String Data

4.2   Interactive Input/Output

4.3   Noninteractive Input/Output

4.4   File Input and Output

Files

Using Files

Software Maintenance Case Study: Adding File Input/Output to a Program

Run-Time Input of File Names

4.5   Input Failure

4.6   Software Design Methodologies

4.7   Functional Decomposition

Modules

Implementing the Design

A Perspective on Design

Problem-Solving Case Study: Displaying a Name in Multiple Formats

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

5   Conditions, Logical Expressions, and Selection Control Structures

5.1   Flow of Control

Selection

5.2   Conditions and Logical Expressions

The bool Data Type

Logical Expressions

5.3   The If Statement

The If-Then-Else Form

Blocks (Compound Statements)

The If-Then Form

A Common Mistake

Software Maintenance Case Study: Incorrect Output

5.4   Nested If Statements

The Dangling else

5.5   Logical Operators

Precedence of Operators

Relational Operators with Floating-Point Types

5.6   Testing the State of an I/O Stream

Problem-Solving Case Study: BMI Calculator

Testing and Debugging

Testing in the Problem-Solving Phase: The Algorithm Walk-Through

Testing in the Implementation Phase

The Test Plan

Tests Performed Automatically During Compilation and Execution

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

6   Looping

6.1   The While Statement

6.2   Phases of Loop Execution

6.3   Loops Using the While Statement

Count-Controlled Loops

Event-Controlled Loops

Looping Subtasks

Software Maintenance Case Study: Make a Program General

6.4   How to Design Loops

Designing the Flow of Control

Designing the Process Within the Loop

The Loop Exit

6.5   Nested Logic

Designing Nested Loops

Problem-Solving Case Study: Recording Studio Design

Testing and Debugging

Loop-Testing Strategy

Test Plans Involving Loops

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

7   Additional Control Structures

7.1   The Switch Statement

7.2   The Do-While Statement

7.3   The For Statement

Software Maintenance Case Study: Changing a Loop Implementation

7.4   The Break and Continue Statements

7.5   Guidelines for Choosing a Looping Statement

7.6   Additional C++ Operators

Assignment Operators and Assignment Expressions

Increment and Decrement Operators

Bitwise Operators

The Cast Operation

The sizeof Operator

The ?: Operator

Operator Precedence

Type Coercion in Arithmetic and Relational Expressions

Problem-Solving Case Study: The Rich Uncle

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

8   Functions

8.1   Functional Decomposition with Void Functions

When to Use Functions

Why Do Modules Need an Interface Design?

Designing Interfaces

Writing Modules as Void Functions

8.2   An Overview of User-Defined Functions

Flow of Control in Function Calls

Function Parameters

8.3   Syntax and Semantics of Void Functions

Function Call (Invocation)

Function Declarations and Definitions

Local Variables

The Return Statement

8.4   Parameters

Value Parameters

Reference Parameters

Software Maintenance Case Study: Refactoring a Program

Using Expressions with Parameters

A Last Word of Caution About Argument and Parameter Lists

Writing Assertions as Function Documentation

Problem-Solving Case Study: Lawn Care Company Billing

Testing and Debugging

The assert Library Function

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

9   Scope, Lifetime, and More on Functions

9.1   Scope of Identifiers

Scope Rules

Variable Declarations and Definitions

Namespaces

9.2   Lifetime of a Variable

Initializations in Declarations

Software Maintenance Case Study: Debug a Simple Program

9.3   Interface Design

Side Effects

Global Constants

9.4   Value-Returning Functions

Complete Example

Boolean Functions

Interface Design and Side Effects

When to Use Value-Returning Functions

9.5   Type Coercion in Assignments, Argument Passing, and Return of a Function Value

Problem-Solving Case Study: Health Profile

Testing and Debugging

Stubs and Drivers

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

10 User-Defined Data Types

10.1 Built-In Simple Types

Numeric Types

Characters

10.2 User-Defined Simple Types

The Typedef Statement

Enumeration Types

Named and Anonymous Data Types

10.3 Simple Versus Structured Data Types

10.4 Records (Structs)

Accessing Individual Components

Aggregate Operations on Structs

More About Struct Declarations

Binding Like Items

Software Maintenance Case Study: Changing a Loop Implementation

10.5 Hierarchical Records

10.6 Unions

10.7 Pointers

Pointer Variables

Pointers Expressions

10.8 Reference Types

Problem-Solving Case Study: Stylistical Analysis of Text

Testing and Debugging

Coping with Input Errors

Debugging with Pointers

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

11 Arrays

11.1 One-Dimensional Arrays

Declaring Arrays

Accessing Individual Components

Out-of-Bounds Array Indexes

Initializing Arrays in Declarations

(Lack of) Aggregate Array Operations

Examples of Declaring and Accessing Arrays

Passing Arrays as Arguments

Commenting Arrays

Software Maintenance Case Study: Modularizing a Program

Using Typedef with Arrays

Pointer Expressions and Arrays

C-Style Strings

Strings as Arrays

C String Operations

Converting C Strings to C++ Strings

Which String Representation to Use

11.2 Arrays of Records

Arrays of Records

11.3 Special Kinds of Array Processing

Subarray Processing

Indexes with Semantic Content

11.4 Two-Dimensional Arrays

11.5 Passing Two-Dimensional Arrays as Arguments

11.6 Processing Two-Dimensional Arrays

Sum the Rows

Sum the Columns Revised

Sum the Columns

Initialize the Array

Print the Array

11.7 Another Way of Defining Two-Dimensional Arrays

11.8 Multidimensional Arrays

Problem-Solving Case Study: Calculating Exam Statistics

Problem-Solving Case Study: Favorite Rock Group

Testing and Debugging

One-Dimensional Arrays

Complex Structures

Multidimensional Arrays

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

12 Classes and Abstraction

12.1 Abstract Data Types

12.2 C++ Classes

Implementing the Member Functions

Classes, Objects, and Members

Built-in Operations on Objects

Class Scope

12.3 Information Hiding

User-Written Header Files

Specification and Implementation Files

Compiling and Linking a Multifile Program

12.4 What Is an Object?

12.5 Class Design Principles

Encapsulation

Abstraction

Designing for Modifiability and Reuse

Mutability

Software Maintenance Case Study: Comparing Two TimeOfDay Objects

12.6 The Name ADT

Specification of the ADT

Implementation File

12.7 Composition

Design of an Entry Class

12.8 UML Diagrams

Diagramming a Class

Diagramming Composition of Classes

Problem-Solving Case Study: Create an Array of Name Objects

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

13 Array-Based Lists

13.1 What Is a List?

13.2 The List as an Abstract Data Type

Refining Responsibilities

Data Representation

Example Program

13.3 Implementation of List ADT

Basic Operations

Insertion and Deletion

Sequential Search

Iterators

Software Maintenance Case Study: Enhancing Class List with a Sort

13.4 Sorted Lists

Basic Operations

Insertion

Sequential Search

Binary Search

Deletion

13.5 Sorted List of Classes

IsThere

Insert and Delete

13.6 More on UML Diagrams

Problem-Solving Case Study: Calculating Exam Statistics Revisited

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

14 Dynamic Data and Linked Lists

14.1 Dynamic Data

Allocating Dynamic Data

Deleting Dynamic Data

Constants and Dynamic Data

14.2 Sequential Versus Linked Structures

14.3 Creating a Dynamic Linked List: A Walk-Through Example

14.4 Dynamic Implementation of ADT List

Creating an Empty Linked List

Inserting into a Linked List

Traversals of a Linked List

Deleting from a Linked List

Resetting the List

Getting the Next Item

Testing for the Full Linked List

Searching the List

14.5 Destructors and Copy Constructors

Destructor

Shallow Versus Deep Copying

Copy-Constructor

14.6 Sorted Linked List

Insert(20)

Insert(60) (pick up with loop)

Insert(100)

Deleting from a Linked List

Delete(30)

Delete(50)

Problem-Solving Case Study: Creating a Sorted List of Entry Objects

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

15 Inheritance, Polymorphism, and Object-Oriented Design

15.1 Object-Oriented Programming

15.2 Inheritance

An Analogy

Inheritance and the Object-Oriented Design Process

Deriving One Class from Another Class

Specification of the ExpandedEntry Class

Implementation of the ExpandedEntry Class

Constructor Execution Order

Software Maintenance Case Study: Extending TimeOfDay with Support for a Time Zone

15.3 Dynamic Binding and Virtual Functions

The Slicing Problem

Virtual Functions

15.4 Object-Oriented Design

Brainstorming

Filtering

Scenario Exploration

Responsibility Algorithms

A Final Word

15.5 Implementing a Design

Problem-Solving Case Study: Creating an Appointment Calendar

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

16 Templates, Operator Overloading, and Exceptions

16.1 Template Classes

Defining a Class Template

Instantiating a Class Template

Another Way of Implementing Incoming Parameters: const References

Organization of Program Code

A Word of Caution

16.2 Generic Functions

Function Overloading

Defining a Function Template Outside a Class

Instantiating a Function Template

16.3 Operator Overloading

Using *this

16.4 Exceptions

The throw Statement

The try-catch Statement

Nonlocal Exception Handlers

Rethrowing an Exception

Standard Exceptions

Software Maintenance Case Study: Adding Exceptions to the Date Class

Problem-Solving Case Study: Starship Weight and Balance

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

17 Introduction to Data Structures Using the Standard Template Library

17.1 Abstract Data Structures versus Implementations

17.2 Additional Linear Structures

Stacks

Queues

Priority Queues

17.3 Bidirectional Linear Structures

Bidirectional Lists

Deques

17.4 An Introduction to the STL

Iterators

The vector Template

The list Template

The stack Template

The queue Template

The priority_queue Template

The deque Template

Software Maintenance Case Study: Appointment Calendar Using STL List

17.5 Nonlinear Structures

Binary Trees

Hash Tables

17.6 Associative Containers

The set Template

The map Template

Problem-Solving Case Study: Creating a Deck of Cards

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

18 Recursion

18.1 What Is Recursion?

18.2 Recursive Algorithms with Simple Variables

18.3 Towers of Hanoi

18.4 Recursive Algorithms with Structured Variables

Software Maintenance Case Study: Substituting Binary Search for Linear Search

18.5 Recursion Using Pointer Variables

Printing a Dynamic Linked List in Reverse Order

Copying a Dynamic Linked List

18.6 Recursion or Iteration?

Problem-Solving Case Study: Quicksort

Testing and Debugging

Summary

Quick Check Answers

Exam Preparation Exercises

Programming Warm-Up Exercises

Programming Problems

Case Study Follow-Up

Appendices

Appendix A: Reserved Words

Appendix B: Operator Precedence

Appendix C: A Selection of Standard Library Routines

Appendix D: Using This Book with a Prestandard Version of C++

Appendix E: Character Sets

Appendix F: Program Style, Formatting, and Documentation

Appendix G: More on Floating-Point Numbers

Appendix H: Using C Strings

Appendix I: C++ char Constants

Index