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