Operations Chapter 4 & Section 5.2

advertisement
Operations
Chapter 4
&
Section 5.2
1
Expressions
As we've seen, in a C++ program, any finite
sequence of objects and operations that combine
to produce a value is called an expression.
A temperature conversion example:
fahrenheit = 1.8 * celsius + 32;
We now consider C++ operations.
Why not
fahrenheit = 9/5 * celsius + 32; ?
2
Numeric Expressions
C++ provides four familiar arithmetic operators:
+ for performing addition
- for performing subtraction
* for performing multiplication
C++ provides
more than 50
operations
(See Appendix C)
/ for performing division
Each can be applied to either real (double) or
integer (int) [or character (char)] operands.
3
Division
However, / behaves differently for int
than for double operands:




Type of Operands
double
int
Kind of Division Performed
_____________
_____________
Integer division calculates the quotient, but it also
calculates the remainder. To find it we can use the
modulus operator %; for example, 9 % 5 = ____.
4
More examples:
Keep in mind
for Project 3
456 / 100 =
56 / 10 =
1 / 2 =
2 / 3 =
456 % 100 =
56 % 10 =
1 % 2 =
2 % 3 =
What about mixed-mode (i.e., mixed-type)
expressions?
Automatic Type Conversion (p. 73): Promotion:
"Narrower" types (fewer storage bits) "widened" e.g.,
int  double; 9/3.0  9.0/3.0;
Explicit Type Conversion (p. 73-4): Type Casting
Use type name to convert an expression:
double(intVal) or (double)intVal
Functional Notation
Cast Notation
5
Numeric Functions
The library <cmath> contains a variety of
mathematical functions, including:
sin(x)
cos(x)
tan(x)
sqrt(x)
exp(x)
log(x)
log10(x)
asin(x)
acos(x)
atan(x)
abs(x)
pow(x, y)
floor(x)
ceil(x)
See Appendix D
for other math
functions and
other libraries.
Hyperbolic functions:
cosh(x), sinh(x), tanh(x)
6
Using <cmath> functions
#include <iostream>
C++ libraries whose names
start with 'c' are C libraries.
________________________
Their C-names do not have
the 'c' but have .h appended;
using namespace std;
e.g., <math.h>
int main()
{
cout << "\nEnter base and exponent: ";
double base, exponent;
Essentially
cin >> base >> exponent;
same as
'\n'
double result = ________________________;
cout << base << " raised to the power "
<< exponent << " is " << result << endl;
}
7
Precedence
Issue: Is the value of the expression
2 + 3 * 4
(2 + 3) * 4  24
or
2 + (3 * 4)  14 ?
Operator __________________ governs
evaluation order.
* has higher precedence than +, so it is applied
first, making the answer ______.
8
Associativity
Does the expression
8-4-2
evaluate (8 - 4) - 2  2
or
8 - (4 - 2)  6 ?
Precedence doesn’t help us.
Associativity does. Since - is ___________________,
the left - is evaluated first.
Most C++ operators that we use associate left.
See Appendix C for a complete list.
9
Assignment
Assignment is one operator that is rightassociative, which allows expressions like:
int w, x, y, z;
____________________________
The rightmost = is applied first, assigning z zero,
then y is assigned the value of z (0),
Assignment operator
returns the value
being assigned.
then x is assigned the value of y (0),
and finally w is assigned the value of x (0).
w = (x = (y = (z = 0)));
Mixed-mode assignments convert the
value to type of variable and assign it.
10
Assignment Shortcuts
Certain assignments are very common:
var = var + x;
// add x to var
var = var - y;
// sub y from var
C++ provides shortcuts for them:
_______________;
// add x to var
_______________;
// sub y from var
11
In General
Most arithmetic expressions of the form:
var = var D value;
can be written in the "shortcut" form:
var D= value;
Examples:
double x, y;
cin >> x >> y;
____________; // double x’s value
____________; // decrease y by half
12
Increment and Decrement
Other common assignments include:
var = var + 1;
// add 1 to var
var = var - 1;
// sub 1 from var
so C++ provides shortcuts for them, too:
____________;
// add 1 to var
_____________;
____________;
// sub 1 from var
Integer
variables
only!
____________;
13
Prefix vs. Postfix
 As long as the increment (or decrement)
operator is used as a separate statement:
int y = 0, x = 0;
. . .
++x;
// x becomes ____
y++;
// y becomes ____
it makes no difference which
version is used.
14
If the increment operator is used within

another expression, it does make a difference
whether it is prefix or postfix.
The prefix form of increment produces the
final (incremented) value as its result:
int x, y = 0;
x = 2 * (++y);

cout << x << " " << y; //
2 1 is displayed
The prefix decrement behaves similarly.
15
The postfix form of increment produces the
original (unincremented) value as its result:
int x, y = 0;
x = 2 * (y++);

cout << x << " " << y; // 0 1 is displayed
The prefix decrement behaves similarly.
16
I/O
In most programming languages, input and
output are performed by functions with
names like read() and print(). In C++,
however, (but not C) they are performed by
____________ >> and <<:
•input_stream
>> variable
•output_stream << expression.
•17
We know that:
cin >> variable reads a value from the
keyboard and assigns it to variable
cout << expression outputs the value of
expression to the screen.
But these are _____________. Because >> and <<
are operators, these i/o expessions must also
produce a ___________.
cin >> variable returns ______ as its value;
cout << expression returns _______ as its value.
18
Why???
Arithmetic operators can be chained together in
expressions like a + b + c and a - b - c.
Input and output operators can also be chained; for
example:
cout << "Width =" << width << "
ft.\n";
and
cin >> length >> width;
These work because of the values returned by
>> and << and both are ________-associative.
19
Example:
cout << "Width =" << width << " ft.\n";
_cout << "Width ="_
<< width << " ft.\n";
______ << width << " ft.\n";
_cout << width_
<< " ft.\n";
______ << " ft.\n";
______;
Width = 8.5 ft.
20
Relational Operations
C++ provides six operators for comparisons.
Each has two operands and produces a _______
value (___________________):
x == y
x != y
x < y
x >= y
x > y
x <= y
Warning: 1 < x < 2
21
C, the parent language of C++, has no bool type.
Instead, it uses _____ to represent false
and ______________ values to represent true.
For upward compatibility, C++ also does this:
• 0 is interpreted as false
• nonzero is interpreted as true
For input and output, 0 is used for false, 1 for true
(see program on Slide #29)
unless_____________ is inserted in an I/O statement
(see modification of program on Slide #29).
It remains in effect for rest of program (unless
noboolalpha is used in an I/O statement).
22
One of the easiest mistakes to make
in C++ is using __________________
in place of ________________
See the program on Slide #24.
Also, it can be dangerous to compare reals
with _____ and _____ when one or both of the
reals may have roundoff error.
See the program on Slide #25.
23
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "Enter an integer: ";
cin >> x;
if (x = 99)
cout << "Yes\n";
else
cout << "No\n";
}
Executions:
Enter an integer: 99
Yes
Enter an integer: -99
Yes
Enter an integer: 0
Yes
With change:
if (x == 99)
Enter an integer: 99
Yes
Enter an integer: -99
No
Enter an integer: 0
No
24
Execution:
0 0
//-- Effect of roundoff error
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
for (float x = 0; x != 50.0; x = x + 0.1)
{
float y = x * sqrt(1 + sin(x));
cout << x << " " << y << endl;;
}
}
0.1
0.104873
0.2
0.218968
. . .
49.9998
42.937
50.0998 45.7826
50.1998 48.5246
. . .
100.099 76.3241
. . .
With change:
for (float x = 0; x < 50.0; x = x + 0.1)
Enter an integer: 1
0 0
0.1
0.104873
0.2
0.218968
. . .
49.7998
49.8998
49.9998
36.9654
39.9954
42.937
or
abs(x - 50) >= 1E-10
25
Preconditions
e.g.,
Project 2.3
Sometimes values must satisfy certain
requirements for a program to process them (e.g.,
they must be positive) .
Such requirements are called preconditions or
_______________ . They are boolean
expressions that must be true in order for the
program to work correctly.
A convenient way to check preconditions is to use
C++’s assert() mechanism.
if statement
later
26
Assertions
#include <iostream>
#include _________________
using namespace std;
int main()
{
cout << "\nEnter the current month number: ";
int month;
cin >> month;
_______________________________________;
// ...
}
assert() will halt the program if month < 1
or month > 12 and display a message.
27
Logical Operators
More complex boolean expressions can be built
using the logical operators:
b1 && b1
// true iff b1, b2 are both
b1 || b2
// true iff b1 or b2 is true
!b
// true iff b is false
NOTE
true
Example:
cin >> month;
______________________________________
NOT:
assert(1 <= month <= 12);
28
#include <iostream>
using namespace std;
int main()
{
bool input1, input2, output;
cout << "Enter inputs: ";
cin >> input1 >> input2;
Executions:
Enter inputs: 0 1
Output for inputs 0 and 1 is 1
Enter inputs: 1 1
Output for inputs 1 and 1 is 0
output = (input1 || input2) && !(input1 && input2);
cout << "Output for inputs " << input1
<< " and " << input2 << " is " << output << '\n';
}
With change:
cout << "Output for inputs " << boolalpha << input1
<< " and " << input2 << " is " << output << '\n';
Enter inputs: 0 1
Output for inputs false and true is true
Binary HalfAdder: (§5.3)
Full Adder:
(Programming
Problems)
With change:
cin >> boolalpha >> input1 >> input2;
Enter inputs: false true
Output for inputs false and true is true
29
See
App. D
Character Functions
The library <cctype> contains an assortment
of boolean character-processing functions:
isalpha(ch)
isdigit(ch)
islower(ch)
isspace(ch)
isprint(ch)
isalnum(ch)
iscntrl(ch)
isupper(ch)
ispunct(ch)
isgraph(ch)
and two case-conversion functions:
toupper(ch)
tolower(ch)
30
Examples:
Write an assertion that will halt the
program if a char object named ch is not an
uppercase letter:
assert('A' <= ch && ch <= 'Z');
or
assert(isupper(ch));
Write an assertion that will halt the
program if ch is not one of ‘A’ through ‘G’:
assert('A' <= ch && ch <= 'G');
31
Operator Precedence
( )
HIGHER
+ (positive), - (negative), ! (NOT)
*, /, %
+ (addition), - (subtraction)
<, <=, >, >=
<<, >>
54 operators
18 precedence
levels
==, !=
&&
When in doubt,
use parentheses!
||
=
See Appendix C for a complete list.
LOWER
32
Download