C++ Programming Guide
C++ Programming Guide
3 Language Paradigms 7
Over the years, several other languages—most notably BASIC, Pascal, Ada, C, C++,
and Java—were developed. Today, one of the popular high-level languages for system soft-
ware and new application code is C++, which we discuss in this book.
Computer language
paradigms
Object-
Procedural Functional Logic
oriented
a
b
sum
a 6 6
input a b
sum
input b
a 6
sum = a + b 8
b 8
output sum sum
a 6
Program b 8
sum 14
a 6
b 8 14
14
sum 14
States
a. If we are writing code for different programs, we can package the code and create
what is called a procedure (or function). A procedure can be written once and then
copied in different programs. The standard procedures can be stored in the language
library and be used instead of rewritten.
b. If we are handling a large set of data items (for example, hundred or thousands of
numbers), we need to store them in a package (called different names such as array
or record) and input them all together, process them all together, and output them
all at the same time. The operation at the background is still done one data item at a
time, but the program can see the data items as packages.
The following shows how a procedural paradigm uses three lines of code to sort a list of
numbers of any size. Of course, we must have already written the procedures and already
packaged data items into a list.
input (list);
sort (list);
output (list);
Objects
13 17 8 10 list1
sort ( )
reverse ( )
11 17 38 14 list2
search (...)
print (...)
Shared 12 10 91 20 listn
Procedures
in any typical dish-washing machine. However, each time we load the machine with a dif-
ferent set of dishes (same as a different set of data). We need to be careful, however, not to
load the machine with a load it is not designed for (not to wash clothes, for example, in the
dish-washing machine).
In the real world, all the hardware necessary for an operation is included in an object;
in the object-oriented programming world, each object holds only data, but the code that
defines the procedures is shared. Figure 1.12 shows the relationship between the procedures
and data in the object-oriented paradigm.
list (6, 8)
first () rest ()
Visualization
element is (8). The function first gets a number, but the function rest gets a list. To get
the second number in the list, we first use the function rest to get the list (8) and then use
the function first to get 8.
What type of numbers are we dealing with (with fractions or without fractions)?
Are the numbers arranged in any special sequence, such as lowest to highest?
How many numbers can we expect?
If we don’t clarify the problem—that is, if we make assumptions about the input or
the output—we may supply the wrong answer. To answer our questions, we need to process
integers arranged in any sequence. There is no limit as to the number of integers.
As this example shows, even the simplest problem statements may require clarifica-
tion. Imagine how many questions must be asked for a program that contains hundreds or
thousands of detailed statements.
13 7 19 29 23
We begin with a simple assumption: The algorithm processes the numbers one at a
time. We name the algorithm FindLargest. Every algorithm has a name to identify it.
FindLargest looks at each number in turn without knowing the values of the others. As it
processes each number, it compares it to the largest number known to that point and deter-
mines if the new number is larger. It then looks at the next number to see if it is larger, and
then the next number and the next number until all of the numbers have been processed.
Figure 1.15 shows the steps in determining the largest among five integers.
The algorithm requires that we keep track of two values, the current number and the
largest number found. We determine the largest number using the following steps.
∙∙ Step 1: We input the first number, 13. Since largest has no value, we set it to the
value of the first number.
∙∙ Step 2: We input the second number, 7. Since 7 is less than 13, the value of largest
does not need to be changed.
∙∙ Step 3: We input the third number 19. When we compare 19 to the value of largest, 13,
we see that 19 is larger. We therefore set largest to 19.
∙∙ Step 4: We input the fourth number, 29. When we compare 29 to the value of largest,
19, we see that 29 is larger. We set largest to 29.
∙∙ Step 5: We input the fifth number, 23. Because it is smaller than 29, largest does not
need to be changed. Because there is no more input, we are done and we have deter-
mined that the largest value is 29.
∙∙ Step 6: We output the value of largest, which is 29.
12 Chapter 1 Introduction to Computers and Programming Languages
Input data
13 07 19 29 23
29
Output data
Algorithm Generalization
The algorithm shown in Figure 1.15 does not quite solve our original problem definition
because it only handles five numbers. To make it work for all number series, we need to re-
place steps 2 through 5 to process an undetermined number of values. This requires that we
generalize the statements so that they are the same. We can do this with a minor rephrasing
of the statements as shown below.
If the current number is greater than largest, set largest to the current number.
We then include the rephrased statement in a repeat statement that executes the steps
until all numbers are processed. The resulting algorithm is shown in Figure 1.16.
It is important to realize that the design is done before we write the program. In this
respect, it is like the architect’s blueprint. No one would start to build a house without
a detailed set of plans, yet one of the most common errors of both experienced and new
Output largest
programmers alike is to start coding a program before the design is complete and fully
documented.
This rush to start is partially because programmers think they fully understand the
problem and partially because they are excited about getting on with a new problem to solve.
In the first case, they find that they did not fully understand the problem. By taking the time
to design the program, they raise more questions that must be answered and therefore gain a
better understanding of the problem.
The second reason programmers code before completing the design is just human na-
ture. Programming is a tremendously exciting task. To see your design begin to take shape,
to see your program creation working for the first time, brings a form of personal satisfaction
that is a natural high.
Characters Disk
Source code
Editor
Programmer
Commands Disk
Compiled code
Compiler
Programmer Library code
Compiled code
Executable code
Linker
User
Memory
It is the job of the programmer to write the program and then to turn it into an execut-
able file. There are four steps in this process:
a. Write and edit the program.
b. Compile the program.
c. Link the program with the required library modules (normally done automatically).
d. Execute the program. From our point of view, executing the program is one step.
From the computer point of view, however, it is two substeps: load the program and
run the program.
1.6 TESTING
After we write the program, we must test it. Program testing can be a very tedious and
time-consuming part of program development. As the programmer, we are responsible for
completely testing it. We must make sure that every instruction and every possible situation
have been tested.
Finally, as we test the program, we discover more test cases. Again, we write them down
and incorporate them into the test plan. When the program is finished and in production, we
still need the test plan for modifications to the program. Testing of modifications is known as
regression testing and should start with the test plan developed when we wrote the program.
How do we know when our program is completely tested? In reality, there is no way
to know for sure, but there are a few things we can do to help the odds. While some of
these concepts will not be clear until we get to later chapters, we include them here for
completeness.
a. Verify that every line of code has been executed at least once. Fortunately, there are
programming tools on the market today that help us do this.
b. Verify that every conditional statement in the program has executed both the true and
false branches, even if one of them is null.
c. For every condition that has a range, make sure the tests include the first and last
items in the range, as well as items before the first and after the last. The most
common mistakes in range tests occur at the extremes of the range.
d. If error conditions are being checked, make sure all error logic is tested. This may
require a temporary modification to the program to force the errors; for instance, an
input/output error usually cannot be created—it must be simulated.
Specification Errors
Specification errors occur when the problem definition is either incorrectly stated or misin-
terpreted. Specification errors should be caught when we review our design with analysts
and users.
Code Errors
Code errors usually generate a compiler error message. These errors are the easiest to
correct. Some code errors generate what is known as a warning message, which usually
means that the compiler has made an assumption about the code and needs to have it
verified. It may be right, or it may be wrong. Even though the program may run with a
warning message, the code should be changed so that all warning messages are elimi-
nated.
Logic Errors
The most difficult errors to find and correct are logic errors. Examples of logic errors are
division by zero or forgetting to store the first number in largest in FindLargest. They
can be corrected only by thorough testing. And remember, before we run a test case, we
should know what the correct answer is. Don’t assume that the computer’s answer is correct;
if there’s a logic error, the answer will be wrong.
K e y T e r m s
algorithm loader
application software logic errors
application-specific software logic paradigm
arithmetic-logical unit (ALU) machine language
assembler object-oriented paradigm
assembly language operating system
central processing unit (CPU) output system
code errors primary memory
compiler procedural paradigm
computer hardware procedure
computer language program design
computer software program errors
computer system program testing
data item regression testing
executable file secondary storage
executable program software
function source file
functional paradigm specification errors
general-purpose software symbolic language
hardware system development software
high-level language system software
imperative paradigm system support software
linker text editor
input system Unified Modeling Language (UML)