Designing Classes and Programs
Download
Report
Transcript Designing Classes and Programs
Character Data Type (9.1)
is a built-in data type to represent a single character from the
computer’s character set
most commonly used standard character set is ASCII
letters, digits, symbols, punctuation marks, control characters (e.g. end of
line, end of file, etc.)
each character in ASCII set has a numeric code (0 .. 255)
See Table F.3 in page 763 for ASCII table
Character variables are defined using the type identifier char
char a, ch, letter;
Character literals are represented within single quotes
'A'
'3'
'.'
'f'
Pay attention to the difference between strings with single letter and
chars
"A" versus 'A'
first one is a string literal, second one is a character literal
String variables (objects) has several private data members even if it has
a single character in it. However, char variables occupy just one byte.
Character Codes in ASCII set
Each character occupies one byte
that is why character codes are between 0 and 255
first 32 characters (with codes 0 .. 31) are non-printable control
characters
such as eof
blank character has the code 32
Uppercase letters are consecutive and ordered in ASCII set
code for 'A' is 65, 'B' is 66, 'C' is 67, … 'Z' is 90
Similarly, lowercase letters are also ordered and consecutive
code for 'a' is 97, … 'z' is 122
Similarly digit characters are ordered and consecutive too
code for '0' is 48, '1' is 49, … '9' is 57
Do not memorize the codes for letters and digits; you can do
character arithmetic (see next slides)
Character Arithmetic
If you compare two characters (or a character with an integer)
character codes are used in comparison
If you apply an arithmetic operator (+ - * / %) to a character,
integer code of the character is processed
this is an implicit type casting (conversion) similar to bool
And if you process the result of such an operation as character, a
reverse conversion is automatically performed
you can also process the result as integer (actually this is the default
behavior)
Example: the value of
'A' + 2
is
'C' if you process as a char (you do not have to know the codes in order to
reach this result)
67 if you process as integer or if you do not mean any type
Example: what is the value of
'Z' - 'A' ?
25 (you do not have to know the codes of A and Z to answer this question)
Examples
Suppose digitch is a char variable and its content is a digit
character (between '0' and '9'), how can you obtain that digit
character’s numeric equivalent in an int variable digitnum?
digitnum = digitch - '0';
Write a function that takes a character parameter and returns the
uppercase equivalent of it if parameter is a lowercase letter. If
parameter is not a lowercase letter, function returns it unchanged.
char toupper (char ch)
{
if (ch >= 'a' && ch <= 'z')
// if lowercase
return ch + ('A' - 'a'); // return its uppercase
return ch;
// otherwise return parameter unchanged
}
Escape Sequences in C++
Special symbols for some characters (mostly for
control characters) to be used in character and string
literals only.
Not to be used while entering input
Full list is in Table 4.1 (page 103) or Table A.5 (page 716)
Some escape sequences
\n
\t
\a
\"
\'
\\
newline character
tab (used for aligned output)
bell
double quote
single quote
backslash
Example follows. What is the output?
cout << "\"\\\n\"\"\n\\";
"\
""
\
Escape Sequences in C++
If you want to represent a nonprintable character (such as new line, bell)
in a string or character literal, you have to use nonprintable escape
sequences.
"bla bla \n bla"
'\n'
However, for printable ones, you may use escape sequences whenever
needed
You may or may not use escape sequence to represent a double quote
character in a char literal
That means '\"' and '"' are the same
You may or may not use escape sequence to represent a single quote
character in a string literal
That means "bla \'
bla" and "bla ' bla" are the same
However, you have to represent a double quote in a string literal as an escape
sequence. Similarly, you have to represent a single quote in a char literal as an
escape sequence.
To represent a backslash, you always have to use escape sequence in both
char and string literals
Type Casting
Conversion of an expression to another type
among built-in types like double, int, char
string cannot be used in type casting
syntax
type_name (expression)
first expression is evaluated, then conversion is done
Examples
cout << double (3) / 4;
output is 0.75
first 3 is converted into double (3.0), then divided by 4
cout << 3 / 4;
without casting, integer division, output is 0
cout << double (3 / 4);
first 3 / 4 is evaluated to 0, then result is converted
output is 0
Type Casting Examples
real division using two integers
int a, b;
double div;
...
div = double (a) / b;
Conversion from double to int
cout << int (3.9);
double value is truncated
output is 3
Conversion from signed to unsigned integers
cout << unsigned int (-100);
output is NOT 100, output is 4294967196
the bit sequence to represent –100 is the same as the one of
4294967196
Type Casting Examples
Conversion from int to char
int i = 72;
cout << char (i);
output is
H
it is the character with code 72
Complex example: what is the value of the following expression?
3 + double (62 * (int ('C') - int ('A'))) / 5
2
124
124.0
24.8
27.8
Cast operators in C++
Four cast operators in C++, but only one is enough
static_cast <type_name> (expression)
functionally not different than type_name (expression)
Example
cout << static_cast <double> (3) / 4;
output is 0.75
Easier to spot casts in the code, but causes longer code
Switch statement (Section 7.3.2)
An alternative to if-else, but much less powerful
Useful when you have several choices
Syntax
switch (selector_expression)
{
case label1:
statement list;
break;
case label2:
statement list;
break;
...
default :
statement list;
}
- First selector is evaluated
- Labels are searched. If the
value of selector is listed,
then execution jumps there
- All statements are executed
until break
- If no label is the value of
selector, statements after
default are executed
Switch statement (Section 7.3.2)
Restrictions
selector expression must be integer (char, boolean ok), cannot
be real (double, float) or string
case labels must be given in literals (constant values)
no expressions
case a*2:
invalid
no ranges or lists
case 1, 2, 3: invalid
case 1 .. 10: invalid
Advantage
more efficient than if-else; only one statement is executed
Disadvantage
code becomes hard to read
listing all possible values may not be convenient
Better to see in an example
Switch example
Input a digit between 0 and 9 and display its name.
Display “not a digit” if not between 0 and 9.
See displaydigit.cpp
CAUTION: Do not forget break after each statement
list, otherwise execution unconditionally continues
until the next break or the end of the switch
statement.
Three phases of creating an executable
program
7.2.2, 7.2.3, 7.2.4, 7.2.5
3 steps
preprocessing
compilation
linking
Preprocessing
The preprocessor processes all #include directives (and other
preprocessor commands – all preprocessor commands start with #)
creates a translation unit which is the input of the next step (compilation)
all #include’d files are pasted in the translation unit recursively
e.g. replaces #include “foo.h” with contents of file foo.h, and does this
recursively, for all #includes that foo.h includes and so on
exceptions
there are some preprocessor directives that causes conditional preprocessing
#ifndef _FOO_H
// if _FOO_H is not defined
#define _FOO_H
// define it and
… header file for Foo goes here // include header file
#endif
if _FOO_H is not defined, then it is defined and file is included, otherwise
file is not included
prevents multiple inclusion of the same header file in a program
Preprocessing
Where are the include files located?
You can ask the preprocessor to look in certain directories in
order (Tools Options Projects and Solutions
VC++ Directories).
e.g. You can add your directory after the system directories to be
automatically searched for referenced include files
You get an error if the include file is not found in these
directories
adding an include file to the project is not sufficient
Preprocessing
#define identifier token
Another compiler directive
Generally written at the beginning of program (not in a function)
All instances of identifier in all functions are replaced with token
during preprocessing
Token is any character sequence
Example
#define LENGTH 10
...
cout << LENGTH << endl;
Displays 10 on screen
The above statement is compiled as
cout << 10 << endl;
Because LENGTH is replaced with 10 before compilation (during
preprocessing)
Compiler
The compiler takes a translation unit as input and
produces compiled object code as output
The object code is platform/architecture specific
The source code is the same on all platforms
We may need to compile several cpp files
dice.cpp, randgen.cpp, prompt.cpp, robots.cpp, …
because some functions and class implementations are in those
files
if you are using them in your program, you have to compile them
together with your main cpp file
add to the same project
you may generate libraries out of those files
ready-to-use object code
need not to compile, but add the .lib file to the project
Linker
Linking combines object files and libraries to create a
single executable program (the file with .exe extension)
May still create errors even if compilation is successful
unresolved external symbol ...
undefined symbol ...
Primary reason would be missing libraries or implementation files
(like date.cpp, prompt.cpp)
header files provide the definition, but body is missing!
If you have such errors, try to find where those symbols are
implemented and include those libs or cpps in your project
Next
Recursion, scope rules, global and static variables,
function templates
partially Chapter 10
Function templates are from Chapter 11
Pointers and introduction to linked lists
partially Chapter 12