Console Input/Output 31
If price has the value 78.5, the output might be
The price is $78.500000
or it might be
The price is $78.5
or it might be output in the following notation (which was explained in the subsection
entitled Literals):
The price is $7.850000e01
It is extremely unlikely that the output will be the following, however, even though this
is the format that makes the most sense:
The price is $78.50
To ensure that the output is in the form you want, your program should contain some
sort of instructions that tell the computer how to output the numbers.
There is a “magic formula” that you can insert in your program to cause numbers
that contain a decimal point, such as numbers of type
double, to be output in everyday
notation with the exact number of digits after the decimal point that you specify. If you
want two digits after the decimal point, use the following magic formula:
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
If you insert the preceding three statements in your program, then any cout statements
that follow these statements will output values of any floating-point type in ordinary
notation, with exactly two digits after the decimal point. For example, suppose the fol-
lowing
cout statement appears somewhere after this magic formula and suppose the
value of
price is 78.5.
cout << "The price is $" << price << endl;
The output will then be as follows:
The price is $78.50
You may use any other nonnegative whole number in place of 2 to specify a different
number of digits after the decimal point. You can even use a variable of type
int in
place of the
2.
We will explain this magic formula in detail in Chapter 12. For now, you should
think of this magic formula as one long instruction that tells the computer how you
want it to output numbers that contain a decimal point.
mag
i
c
formula
outputting
money
amounts
01_CH01.fm Page 31 Wednesday, August 20, 2003 2:21 PM
32 C++ Basics
If you wish to change the number of digits after the decimal point so that different
values in your program are output with different numbers of digits, you can repeat the
magic formula with some other number in place of
2. However, when you repeat the
magic formula, you only need to repeat the last line of the formula. If the magic for-
mula has already occurred once in your program, then the following line will change
the number of digits after the decimal point to five for all subsequent values of any
floating-point type that are output:
cout.precision(5);
■
OUTPUT WITH
cerr
The object cerr is used in the same way as cout. The object cerr sends its output to
the standard error output stream, which normally is the console screen. This gives you
a way to distinguish two kinds of output:
cout for regular output, and cerr for error
message output. If you do nothing special to change things, then
cout and cerr will
both send their output to the console screen, so there is no difference between them.
On some systems you can redirect output from your program to a file. This is an
operating system instruction, not a C++ instruction, but it can be useful. On systems
that allow for output redirection,
cout and cerr may be redirected to different files.
■
INPUT USING
cin
You use cin for input more or less the same way you use cout for output. The syntax is
similar, except that
cin is used in place of cout and the arrows point in the opposite
direction. For example, in the program in Display 1.1, the variable
numberOfLanguages
was filled by the following cin statement:
cin >> numberOfLanguages;
O
UTPUTTING
V
ALUES
OF
T
YPE
double
If you insert the following “magic formula” in your program, then all numbers of type double
(or any other type of floating-point number) will be output in ordinary notation with two digits
after the decimal point:
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
You can use any other nonnegative whole number in place of the 2 to specify a different number
of digits after the decimal point. You can even use a variable of type
int in place of the 2.
cerr
cin
01_CH01.fm Page 32 Wednesday, August 20, 2003 2:21 PM
Console Input/Output 33
You can list more than one variable in a single cin statement, as illustrated by the fol-
lowing:
cout << "Enter the number of dragons\n"
<< "followed by the number of trolls.\n";
cin >> dragons >> trolls;
If you prefer, the above cin statement can be written on two lines, as follows:
cin >> dragons
>> trolls;
Notice that, as with the cout statement, there is just one semicolon for each occurrence
of
cin.
When a program reaches a
cin statement, it waits for input to be entered from the
keyboard. It sets the first variable equal to the first value typed at the keyboard, the sec-
ond variable equal to the second value typed, and so forth. However, the program does
not read the input until the user presses the Return key. This allows the user to back-
space and correct mistakes when entering a line of input.
Numbers in the input must be separated by one or more spaces or by a line break.
When you use
cin statements, the computer will skip over any number of blanks or
line breaks until it finds the next input value. Thus, it does not matter whether input
numbers are separated by one space or several spaces or even a line break.
You can read in integers, floating-point numbers, or characters using
cin. Later in
this book we will discuss the reading in of other kinds of data using
cin.
cin
S
TATEMENTS
A cin statement sets variables equal to values typed in at the keyboard.
S
YNTAX
cin >>
Variable_1
>>
Variable_2
>> ;
E
XAMPLES
cin >> number >> size;
cin >> timeLeft
>> pointsNeeded;
how cin
works
separate
numbers
with spaces
01_CH01.fm Page 33 Wednesday, August 20, 2003 2:21 PM
34 C++ Basics
Self-Test Exercises
Tip
L
INE
B
REAKS
IN
I/O
It is possible to keep output and input on the same line, and sometimes it can produce a nicer
interface for the user. If you simply omit a
\n or endl at the end of the last prompt line, then the
user’s input will appear on the same line as the prompt. For example, suppose you use the follow-
ing prompt and input statements:
cout << "Enter the cost per person: $";
cin >> costPerPerson;
When the cout statement is executed, the following will appear on the screen:
Enter the cost per person: $
When the user types in the input, it will appear on the same line, like this:
Enter the cost per person: $1.25
9. Give an output statement that will produce the following message on the screen.
The answer to the question of
Life, the Universe, and Everything is 42.
10. Give an input statement that will fill the variable theNumber (of type int) with a number
typed in at the keyboard. Precede the input statement with a prompt statement asking the
user to enter a whole number.
11. What statements should you include in your program to ensure that when a number of
type
double is output, it will be output in ordinary notation with three digits after the dec-
imal point?
12. Write a complete C++ program that writes the phrase
Hello world to the screen. The
program does nothing else.
13. Give an output statement that produces the letter
’A’, followed by the newline character,
followed by the letter
’B’, followed by the tab character, followed by the letter ’C’.
01_CH01.fm Page 34 Wednesday, August 20, 2003 2:21 PM
Program Style 35
Program Style
In matters of grave importance, style, not sincerity, is the
vital thing.
Oscar Wilde, The Importance of Being Earnest
C++ programming style is similar to that used in other languages. The goal is to make
your code easy to read and easy to modify. We will say a bit about indenting in the next
chapter. We have already discussed defined constants. Most, if not all, literals in a pro-
gram should be defined constants. Choice of variable names and careful indenting
should eliminate the need for very many comments, but any points that still remain
unclear deserve a comment.
■
COMMENTS
There are two ways to insert comments in a C++ program. In C++, two slashes, //, are
used to indicate the start of a comment. All the text between the
// and the end of the
line is a comment. The compiler simply ignores anything that follows
// on a line. If
you want a comment that covers more than one line, place a
// on each line of the
comment.
The symbols // do not have a space between them.
Another way to insert comments in a C++ program is to use the symbol pairs
/* and
*/. Text between these symbols is considered a comment and is ignored by the com-
piler. Unlike the
// comments, which require an additional // on each line, the /*-to-*/
comments can span several lines, like so:
/*This is a comment that spans
three lines. Note that there is no comment
symbol of any kind on the second line.*/
Comments of the /* */ type may be inserted anywhere in a program that a space or
line break is allowed. However, they should not be inserted anywhere except where
they are easy to read and do not distract from the layout of the program. Usually, com-
ments are placed at the ends of lines or on separate lines by themselves.
Opinions differ regarding which kind of comment is best to use. Either variety (the
// kind or the /* */ kind) can be effective if used with care. One approach is to use the
// comments in final code and reserve the /**/-style comments for temporarily com-
menting out code while debugging.
It is difficult to say just how many comments a program should contain. The only
correct answer is “just enough,” which of course conveys little to the novice program-
mer. It will take some experience to get a feel for when it is best to include a comment.
1.4
when to
comment
01_CH01.fm Page 35 Wednesday, August 20, 2003 2:21 PM
36 C++ Basics
Whenever something is important and not obvious, it merits a comment. However,
too many comments are as bad as too few. A program that has a comment on each line
will be so buried in comments that the structure of the program is hidden in a sea of
obvious observations. Comments like the following contribute nothing to understand-
ing and should not appear in a program:
distance = speed * time; //Computes the distance traveled.
Libraries and Namespaces
C++ comes with a number of standard libraries. These libraries place their definitions
in a namespace , which is simply a name given to a collection of definitions. The tech-
niques for including libraries and dealing with namespaces will be discussed in detail
later in this book. This section discusses enough details to allow you to use the standard
C++ libraries.
■
LIBRARIES AND
include
DIRECTIVES
C++ includes a number of standard libraries. In fact, it is almost impossible to write a
C++ program without using at least one of these libraries. The normal way to make a
library available to your program is with an
include directive. An include directive for
a standard library has the form:
#include <
Library_Name
>
For example, the library for console I/O is iostream. So, most of our demonstration
programs will begin
#include <iostream>
Compilers (preprocessors) can be very fussy about spacing in include directives. Thus,
it is safest to type an
include directive with no extra space: no space before the #, no
space after the
#, and no spaces inside the <>.
An include directive is simply an instruction to include the text found in a file at the
location of the
include directive. A library name is simply the name of a file that includes
all the definition of items in the library. We will eventually discuss using
include direc-
tives for things other than standard libraries, but for now we only need
include direc-
tives for standard C++ libraries. A list of some standard C++ libraries is given in
Appendix 4.
C++ has a preprocessor that handles some simple textual manipulation before the
text of your program is given to the compiler. Some people will tell you that
include
directives are not processed by the compiler but are processed by a preprocessor.
They’re right, but the difference is more of a word game than anything that need con-
cern you. On almost all compilers, the preprocessor is called automatically when you
compile your program.
1.5
#include
preprocessor
01_CH01.fm Page 36 Wednesday, August 20, 2003 2:21 PM
Libraries and Namespaces 37
Technically speaking only part of the library definition is given in the header file.
However, at this stage, that is not an important distinction, since using the
include
directive with the header file for a library will (on almost all systems) cause C++ to
automatically add the rest of the library definition.
■
NAMESPACES
A namespace is a collection of name definitions. One name, such as a function name,
can be given different definitions in two namespaces. A program can then use one of
these namespaces in one place and the other in another location. We will discuss
namespaces in detail later in this book. For now, we only need to discuss the namespace
std. All the standard libraries we will be using place their definitions in the std (stan-
dard) namespace. To use any of these definitions in your program, you must insert the
following
using directive:
using namespace std;
Thus, a simple program that uses console I/O would begin
#include <iostream>
using namespace std;
If you want to make some, but not all, names in a namespace available to your pro-
gram, there is a form of the
using directive that makes just one name available. For
example, if you only want to make the name
cin from the std namespace available to
your program, you could use the following
using directive:
using std::cin;
Thus, if the only names from the std namespace that your program uses are cin,
count, and endl, you might start your program with the following:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
instead of
#include <iostream>
using namespace std;
Older C++ header files for libraries did not place their definitions in the std
namespace, so if you look at older C++ code, you will probably see that the header file
names are spelled slightly differently and the code does not contain any
using directive.
This is allowed for backward compatibility. However, you should use the newer library
header files and the
std namespace directive.
namespace
using
namespace
01_CH01.fm Page 37 Wednesday, August 20, 2003 2:21 PM
38 C++ Basics
Pitfall
P
ROBLEMS
WITH
L
IBRARY
N
AMES
The C++ language is currently in transition. A new standard has come out with, among other
things, new names for libraries. If you are using a compiler that has not yet been revised to meet
the new standard, then you will need to use different library names.
If the following does not work
#include <iostream>
use
#include <iostream.h>
Similarly, other library names are different for older compilers. Appendix 5 gives the correspon-
dence between older and newer library names. This book always uses the new compiler names. If
a library name does not work with your compiler, try the corresponding older library name. In all
probability, either all the new library names will work or you will need to use all old library
names. It is unlikely that only some of the library names have been made up to date on your
system.
If you use the older library names (the ones that end in
.h), you do
not
need the using directive
using namespace std;
■ C++ is case sensitive. For example, count and COUNT are two different identifiers.
■ Use meaningful names for variables.
■ Variables must be declared before they are used. Other than following this rule, a
variable declaration may appear anyplace.
■ Be sure that variables are initialized before the program attempts to use their value.
This can be done when the variable is declared or with an assignment statement
before the variable is first used.
■ You can assign a value of an integer type, like int, to a variable of a floating-point
type, like
double, but not vice versa.
■ Almost all number constants in a program should be given meaningful names that
can be used in place of the numbers. This can be done by using the modifier
const
in a variable declaration.
■ Use enough parentheses in arithmetic expressions to make the order of operations
clear.
■ The object cout is used for console output.
■ A \n in a quoted string or an endl sent to console output starts a new line of output.
Chapter Summary
01_CH01.fm Page 38 Wednesday, August 20, 2003 2:21 PM
Answers to Self-Test Exercises 39
■ The object cerr is used for error messages. In a typical environment, cerr behaves
the same as
cout.
■ The object cin is used for console input.
■ In order to use cin, cout, or cerr, you should place the following directives near the
beginning of the file with your program:
#include <iostream>
using namespace std;
■ There are two forms of comments in C++: Everything following // on the same line
is a comment, and anything enclosed in
\* and *\ is a comment.
■ Do not overcomment.
ANSWERS TO SELF-TEST EXERCISES
1. int feet = 0, inches = 0;
int feet(0), inches(0);
2. int count = 0;
double distance = 1.5;
int count(0);
double distance(1.5);
3. The actual output from a program such as this is dependent on the system and the history
of the use of the system.
#include <iostream>
using namespace std;
int main( )
{
int first, second, third, fourth, fifth;
cout << first << " " << second << " " << third
<< " " << fourth << " " << fifth << "\n";
return 0;
}
4. 3*x
3*x + y
(x + y)/7
Note that x + y/7 is not correct.
(3*x + y)/(z + 2)
5. bcbc
6.
(1/3) * 3 is equal to 0
Since 1 and 3 are of type int, the / operator performs integer division, which discards the
remainder, so the value of
1/3 is 0, not 0.3333…. This makes the value of the entire
expression
0 * 3, which of course is 0.
01_CH01.fm Page 39 Wednesday, August 20, 2003 2:21 PM
40 C++ Basics
7. #include <iostream>
using namespace std;
int main(
)
{
int number1, number2;
cout << "Enter two whole numbers: ";
cin >> number1 >> number2;
cout << number1 << " divided by " << number2
<< " equals " << (number1/number2) << "\n"
<< "with a remainder of " << (number1%number2)
<< "\n";
return 0;
}
8. a. 52.0
b. 9/5 has int value 1. Since the numerator and denominator are both int, integer
division is done; the fractional part is discarded. The programmer probably wanted
floating-point division, which does not discard the part after the decimal point.
c.
f = (9.0/5) * c + 32.0;
or
f = 1.8 * c + 32.0;
9.
cout << "The answer to the question of\n"
<< "Life, the Universe, and Everything is 42.\n";
10. cout << "Enter a whole number and press Return: ";
cin >> theNumber;
11. cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(3);
12. #include <iostream>
using namespace std;
int main(
)
{
cout << "Hello world\n";
return 0;
}
13. cout << ’A’ << endl << ’B’ << ’\t’ << ’C’;
Other answers are also correct. For example, the letters could be in double quotes instead of
single quotes. Another possible answer is the following:
cout << "A\nB\tC";
01_CH01.fm Page 40 Wednesday, August 20, 2003 2:21 PM