Download presentation
Presentation is loading. Please wait.
Published byHansl Calvin Kalb Modified over 6 years ago
1
Bjarne Stroustrup www.stroustrup.com/Programming
Chapter 4 Computation Bjarne Stroustrup
2
Abstract basics of computation Selection, Iteration, Function, Vector
Expressions select between two alternative actions (“selection”) how to iterate over a series of values (“iteration”) I’ll also show how a particular sub-computation can be named and specified separately as a function. To be able to perform more realistic computations, I will introduce the vector type to hold sequences of values. Selection, Iteration, Function, Vector Stroustrup/Programming
3
Overview Computation Language constructs and ideas
What is computable? How best to compute it? Abstractions, algorithms, heuristics, data structures Language constructs and ideas Sequential order of execution Expressions and Statements Selection Iteration Functions Vectors Stroustrup/Programming
4
Computation Code, often messy, often a lot of code (input) data
(output) data data Input: from keyboard, files, other input devices, other programs, other parts of a program Computation – what our program will do with the input to produce the output. Output: to screen, files, other output devices, other programs, other parts of a program Stroustrup/Programming
5
Computation Our job is to express computations
Correctly Simply Efficiently One tool is called abstraction, which provides a higher-level concept that hides detail cin is an abstraction of keyboard device Device driver handles details about hardware interrupt, buffering, … cout data type such as int, double, are abstractions of memory Stroustrup/Programming
6
Computation (cont’d) One tool is called Divide and Conquer
to break up big computations into many smaller ones Like assembly line, organization, building lego toys Organization of data is often the key to good code Input/output formats Protocols Data structures A pizza restaurant system that keeps all transaction records Note the emphasis on structure and organization You don’t get good code just by writing a lot of statements Stroustrup/Programming
7
Language features Each programming language feature exists to express a fundamental idea + : addition * : multiplication if (expression) statement else statement ; selection while (expression) statement ; iteration f(x); function/operation … We combine language features to create programs Stroustrup/Programming
8
You already know most of this
You know how to do arithmetic d = a+b*c You know how to select “if this is true, do that; otherwise do something else ” You know how to “iterate” “do this until you are finished” “do that 100 times” You know how to do functions “go ask Joe and bring back the answer” “hey Joe, calculate this for me and send me the answer” What we learn here is mostly just vocabulary and syntax for what you already know Stroustrup/Programming
9
Expressions An expression computes a value from a number of operands
Most basic building block of programs Simplest expression: a literal value, name of variables 10, ‘a’, 3.24, “Hello world!\n” total_due, change, … More complicated expressions: made out of operators and operands Operators specify what is to be done, +, *, =, /, … Operands specify the data for the operators to work with Stroustrup/Programming
10
Expressions // compute area: int length = 20; // the simplest expression: a literal (here, 20) // (here used to initialize a variable) int width = 40; int area = length*width; // a multiplication int average = (length+width)/2; // addition and division The usual rules of precedence apply: a*b+c/d means (a*b)+(c/d) and not a*(b+c)/d. If in doubt, parenthesize. If complicated, parenthesize. Don’t write “absurdly complicated” expressions: a*b+c/d*(e-f/g)/h+7 // too complicated Choose meaningful names. Stroustrup/Programming
11
Constant expressions Three types of constant expressions: literal value, named constant, an expression with only constant operands 3.1415, 15.39, 19.39 const double PRICE_12_PIZZA = 15.39; double total = num12*PRICE_12_PIZZA + num14*PRICE_14_PIZZA; const int max=18; max+2; //this is a constant expression Stroustrup/Programming
12
Assignment expression
int average=20; average = average/2; average on left-hand side and right-hand side of = interpreted differently Left-hand: means “the object named average”, “lvalue of average” Right-hand: means “the value of the object named by average”, “the value of average”, “rvalue of average” Left-hand operand of assignment operator, =, needs to be a variable 10=a; // compilation error “error: lvalue required as left operand of assignment” Stroustrup/Programming
13
Data types & OPERATORS Integer types: short, int, long
Arithmetic operators: +, -, *, /, % (remainder) Relational operators: < (less than), > (greater than), <=, >= Floating-point types: e.g., float, double (e.g., and e3) arithmetic operators: +, -, *, / Boolean type: bool (true and false) Equality operators: = = (equal), != (not equal) Logical operators: && (and), || (or), ! (not) Character type: char (e.g., 'a', '7', and Stroustrup/Programming
14
Integer division and module operation
Integer types: short, int, long Arithmetic operators: +, -, *, /, % (remainder) All above operations evaluate to an integer 4/3, 123 % 2, … Integer division: fraction part is thrown away 4/3 = 1 23/45 = 0 Module operator: % a%b evaluates to the remainder when a is divided by b 5 % 2 is 1 , 4 % 2 is 0 23 % 10 is 3 ,… Stroustrup/Programming
15
Integer/float arithmetic
Fahrenheit to Celsius (°F - 32) x 5/9 => °C How to implement it in C++ code? Stroustrup/Programming
16
Exercises What’s the value of the following expressions?
1.0+13/4 , (1.0+13)/4 123 % 10 How to express using C++? double x1= double x2= Recall function sqrt(t) return square root of t How to find the 10th digit of an integer? E.g., 10th digit of 342 is 4 Stroustrup/Programming
17
Concise Operators For many binary operators, there are (roughly) equivalent more concise operators For example a += c means a = a+c a *= scale means a = a*scale ++a means a += 1 or a = a+1 “Concise operators” are generally better to use (clearer, express an idea more directly) Stroustrup/Programming
18
Note: = is used for assignment
Comparison operators Used to compare numbers and strings, evaluate to a bool value (true or false) C++ Math Notation Description >> > Greater than, >= ≥ Greater than or equal < < Less than <= ≤ Less than or equal == = Equal != ≠ Not equal Note: = is used for assignment == tests for equality Stroustrup/Programming
19
Data types & OPERATORS Integer types: short, int, long
Arithmetic operators: +, -, *, /, % (remainder) Relational operators: < (less than), > (greater than), <=, >=, ==, != Floating-point types: e.g., float, double (e.g., and e3) arithmetic operators: +, -, *, / Boolean type: bool (true and false) Logical/Boolean operators: && (and), || (or), ! (not) Character type: char (e.g., 'a', '7', and Stroustrup/Programming
20
Data Type: bool an bool variable has two possible value: true or false
Useful for storing a value to be used later: bool discounted = (country == "USA" && weight <= 1); ... if (discounted) ... Also makes the code more legible Stroustrup/Programming
21
Data Type: bool in C++ any nonzero value “evaluates” to true
if (n) // if (n!=0) cout << “n is not zero \n”; Don't do this: if (x = 7) ... // a logic error! Will always be true x will have the value 7 afterwards Stroustrup/Programming
22
Boolean Operations Boolean operators (after George Boole) have Boolean expressions as operands combine conditions into larger, more complex Boolean expressions Two binary operators: && logical and || Logical or One uniary operators: ! Logic not Stroustrup/Programming
23
Boolean Operations (examples)
Following test is true only when both country is "USA", and the weight is < 1 if (country == "USA" && weight <= 1) shipping_charge = 2.50; following test is true if state is either "HI" or "AK": if (state == "HI" || state == "AK") shipping_charge = 10.00; Stroustrup/Programming
24
Boolean Operations (not operator)
The ! operator (said "not") inverts the value of a Boolean expression (unary operator) ! (n==0) is the same as (n!=0) ! (n>=0) is same as (n<0) ! (k>m) is same as ? Prefer the simpler expressions Stroustrup/Programming
25
Common Error: Multiple Relational Operators
x=-10.0; if (-0.5 <= x <= 2.5) // a logic error Makes sense in mathematics, testing whether x falls within the range C++ interprets it as follows: -0.5 <= x evaluates to true (1) or false (0) Compare Boolean value to double value of 2.5, always true Needs to be done this way: if (-0.5 <= x && x <= 0.5) ... Stroustrup/Programming
26
Boolean Operations (summary)
A && B true false A B A || B true false A !A True False true Stroustrup/Programming
27
Boolean Operations (lazy evaluation)
&& and || operators are evaluated lazily Operands are evaluated left-to-right Evaluation ends as soon as the truth value is determined Given X is true and Y is false: X || Y is true; Y is not evaluated (there is no need …) Y && X is false; X is not evaluated This is quite handy: (n > 0) && (tot/n < 0.9) Stroustrup/Programming
28
Exercise What the value of following boolean expression? int x=10;
bool b1 = (x % 2 == 0); bool b2 = (x>10 || x!=2); bool b3 = ( (x-2)<8 ); Stroustrup/Programming
29
Statements A statement is
an expression followed by a semicolon, a = b; a declaration, double d2 = 2.5; a “control statement” that determines the flow of control if (x == 2) y = 4; while (cin >> number) numbers.push_back(number); int average = (length+width)/2; return x; You may not understand all of these just now, but you will … Stroustrup/Programming
30
Selection Sometimes we must specify a conditional process
if number of 12-inch pizzas is greater than 0 , display the number and price if (num12 > 0) cout <<″12-inch pizza\t\t″ <<num12<<″\t″ <<num12*PRICE_12_PIZZA <<″\n″; Syntax is if (condition) statement //statement is executed only if condition is true true condition statement false Next statement in program Stroustrup/Programming
31
Selection if (a<b) // Note: No semicolon here
select between alternatives E.g, to identify larger of two values: if (a<b) // Note: No semicolon here max = b; else // Note: No semicolon here max = a; syntax is if (condition) statement-1 // if condition is true, do statement-1 else statement-2 // if not, do statement-2 false true condition Statement-1 Statement-2 Next statement in program Stroustrup/Programming
32
Block statement if (condition) statement //if condition is true, do statement statement-1 // if condition is true, do statement-1 else statement-2 // if not, do statement-2 Statement can be a block statement, i.e., a sequence of statements enclosed by { and } if (num_12 < 0) { cout <<“Invalid input\n”; return -1; //exit the program with a -1 return value } Stroustrup/Programming
33
Next half Stroustrup/Programming
34
Rules of operator precedence
Operators in parentheses evaluated first Nested/embedded parentheses Operators in innermost pair first Multiplication, division, modulus applied next Operators applied from left to right Addition, subtraction applied last CS1600 Xiaolan Zhang Fall 2010
35
Programming errors Syntax errors (or compilation errors)
Mistyping a keyword Variables not declared Missing semicolons, … Runtime errors Not captured by compiler, execution aborted E.g. divide by zero, accessing wrong memory location, … Avoid them by checking input, … Logic errors Program executed normally to the end, but outcome is wrong E.g. int area = r*r*3.1415;
36
Question Question : Which statement is correct , A or B ?
int integerOne = 1; double doubleOne = 2.5; int sumOne = integerOne + doubleOne; //A double sumTwo = integerOne + doubleOne; //B Which statement is correct , A or B ? CS1600 Xiaolan Zhang
37
Output Statement With Expression
Variables or expressions could be inserted into output statement, its value is printed out. Long output statement could be broken into multiple lines. Example: std::cout << “sum is ” << sum << “. bye-bye! \n”; std::cout << “sum is ” << number1 + number2 ; CS1600 Xiaolan Zhang
38
INT, double, float, … Stroustrup/Programming
39
Data type int Representing whole numbers, i.e., those numbers that have no decimal parts For counting number of people, classrooms, stars,… In C/C++, int data type is 4 byte long (32 bits) Can store values from -2,147,483,648 to 2,147,483,647 long long: 8 byte long (64 bits) -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
40
Floating point type For storing values with decimal parts, real values
E.g., , 15.39, , sqrt(2), C/C++ provides two floating point type: float and double float: usually 32 bits long Can store values within range: 3.4 e-38, 3.4e+38 has a precision of 7 digits type double: 64 bits long Can store value within range: 1.7e308, 1.7e308 15 digits precision Stroustrup/Programming
41
If change double to float,
#include <iostream> #include <iomanip> using namespace std; int main() { double a= e10; // the literal constant has 8 significant digits cout <<"a=" << setprecision(10) << a<<endl; } Output: a= e+10 //double can represent the value accurately If change double to float, a= e+10 //float cannot Stroustrup/Programming
42
#include <iomanip> int main() { double a; int n; cout <<"Enter a:"; cin >> a; cout <<"a's value is " << a << “\n"; } test_double.cpp Try following input: 30, output 30 30.00, output 30 2e310, output e+308 , output Value overflow! By default, cout outputs a double value with up to 6 significant digits Stroustrup/Programming
43
double data type represents a number
If enter value output: If value entered is: output is: e-08 output is : e+26 e+00 double data type represents a number approximately, the precision is 15 significant digits. (sometimes you get lucky ). #include <iomanip> int main() { double a; cout <<"Enter a:"; cin >> a; cout <<"a's value is " << setprecision (20) // display value up to 20 // significant digits << a <<"\n"; } test_double2.cpp Stroustrup/Programming
44
Significant digits Significant digits of a number: digits that carry meaning contributing to its precision. this includes all digits except leading zeros double data type guarantees to represents a number accurately up to 15 significant digits, i.e., it has a precision of 15 float data type guarantees to represents a number accurately up to 7 significant digits, i.e., it has a precision of 7 long double … Stroustrup/Programming
45
significant DIGITS All non-zero digits are considered significant.
91 has two (9 and 1), while has five (1, 2, 3, 4 and 5). Zeros appearing between two non-zero digits are significant has five: 1, 0, 1, 1 and 2. Leading zeros are not significant has two significant figures: 5 and 2. Trailing zeros in a number are significant. has six : 1, 2, 2, 3, 0 and 0. still has only six (the zeros before the 1 are not significant) has five significant figures 12.23 vs Stroustrup/Programming
46
Precision of floating type
Precision: the number of significant digits the data type can store without loss of information E.g …33 There are 100 number of 3. Both double and type use finite amount of memory, cannot store all possible real value exactly
47
Output: If change to float type,
#include <iostream> #include <iomanip> using namespace std; int main() { double a= e10; // the literal constant has 8 significant digits cout <<"a=" << setprecision(10) << a<<endl; } Output: a= e+10 //double can represent the value accurately If change to float type, a= e+10 //float cannot Stroustrup/Programming
48
[zhang@storm Codes]$ ./a.out
double change= *1; cout <<"change due" << fixed <<change<<endl; int d= change; cout <<"d=" << d <<endl; int q = (change-d)/0.25; cout <<"q=" << q <<endl; int dm = (change-d-q*0.25)/0.1; cout <<"dm=" << dm <<endl; int n = (change-d-q*0.25-dm*0.1)/0.05; cout <<"n=" << n <<endl; int p = (change-d-q*0.25-dm*0.1-n*0.05)/0.01; cout <<"Right hand side" << setprecision(15) << fixed << (change-d-q*0.25-dm*0.1-n*0.05)/0.01 <<endl; cout <<"p=" << p <<endl; Give Change problem Codes]$ ./a.out change due d=24 q=2 dm=1 n=0 Right hand side p=1 Stroustrup/Programming
49
49 Solution Better solution: use int to store money amount (measured in cents) #include <math.h> int dollar = floor(change); int p = round(change-d-q*0.25-dm*0.1-n*0.05)/0.01; int cents = round(change); floor(double x): return the largest integral value that is not greater than x round (double x): round x to the nearest integer round (0.5)=1, round (56.0)=56
50
Back to selection statement, i.e., IF/else statement
Stroustrup/Programming
51
Nested Branches Often necessary to nest an if/else statement inside another, to decide across several categories Stroustrup/Programming
52
Demo Write embedded if/else statements Exercise
Leap year testing logic Stroustrup/Programming
53
Multiple alternative if (richter>=8.0)
cout <<“most structure fall\n”; else { if (richter>=7.0) cout <<“Many buildings destroyed\n”; else { if (richter >=6.0) cout <<“Many building consi…\n”; if (richter>=4.5) cout <<“damage to ..\n”; } cout <<“No des…\n”; Stroustrup/Programming
54
Multiple alternative if (richter>=8.0) if (richter>=8.0)
cout <<“most structure fall\n”; else if (richter>=7.0) cout <<“Many buildings destroyed\n”; if (richter >=6.0) cout <<“Many building consi…\n”; if (richter>=4.5) cout <<“damage to ..\n”; cout <<“No des…\n”; if (richter>=8.0) cout <<“most structure fall\n”; else { if (richter>=7.0) cout <<“Many buildings destroyed\n”; else { if (richter >=6.0) cout <<“Many building consi…\n”; if (richter>=4.5) cout <<“damage to ..\n”; } cout <<“No des…\n”; Stroustrup/Programming
55
Multiple alternatives
if (richter >= 8.0) cout << "Most structures fall"; else if (richter >= 7.0) cout << "Many buildings destroyed"; else if (richter >= 6.0) cout << "Many buildings …"; else if (richter >= 4.5) cout << "Damage to …"; else cout << "Generally no damage"; if (richter>=8.0) cout <<“most structure fall\n”; else if (richter>=7.0) cout <<“Many buildings destroyed\n”; if (richter >=6.0) cout <<“Many building consi…\n”; if (richter>=4.5) cout <<“damage to ..\n”; cout <<“No des…\n”; Stroustrup/Programming
56
Exercise Implement a menu selection, where program prompt user to select diff. action based on input: Enter a simple arithmetic expression (+,-,*,/,%): Result is: 36 Hint: char op; cin >> num1 >> op >> num2; //test whether op is equal to ‘+’, ‘-’,’*’,’/’. Stroustrup/Programming
57
Summary Expression, operators Statement
Declaration statement Expression statement if statement, return statement cout, cin, statement Difference between expression and statement? Statement ends with ; Expression can be used in cout cout <<“Total is: “ << n1*p1+n2*p2 <<“\n”; cout <<“total is: “ << double total <<“\n”; //not an expression Stroustrup/Programming
58
Iteration (while loop)
The world’s first “real program” running on a stored- program computer (David Wheeler, Cambridge, May 6, 1949) // calculate and print a table of squares 0-99: int main() { int i = 0; while (i<100) { cout << i << '\t' << square(i) << '\n'; ++i ; // increment i } // (No, it wasn’t actually written in C++ .) Stroustrup/Programming
59
Iteration (while loop)
What it takes A loop variable (control variable); here: i Initialize the control variable; here: int i = 0 A termination criterion; here: if i<100 is false, terminate Increment the control variable; here: ++i Something to do for each iteration; here: cout << … int i = 0; while (i<100) { cout << i << '\t' << square(i) << '\n'; ++i ; // increment i } Stroustrup/Programming
60
Iteration (for loop) Another iteration form: for loop
You can collect all the control information in one place, at the top, where it’s easy to see for (int i = 0; i<100; ++i) { cout << i << '\t' << square(i) << '\n'; } That is, for (initialize; condition ; increment ) controlled statement Note: what is square(i)? Stroustrup/Programming
61
Functions But what was square(i)? A call of the function square()
int square(int x) { return x*x; } We define a function when we want to separate a computation because it is logically separate makes the program text clearer (by naming the computation) is useful in more than one place in our program eases testing, distribution of labor, and maintenance Stroustrup/Programming
62
Control Flow int main() { i=0; while (i<100) square(i) }
int square(int x) { return x * x; } i<100 i==100 Stroustrup/Programming
63
Functions is an example of Our function int square(int x) {
return x*x; } is an example of Return_type function_name ( Parameter list ) // (type name, etc.) // use each parameter in code return some_value; // of Return_type Stroustrup/Programming
64
Another Example Earlier we looked at code to find the larger of two values. Here is a function that compares the two values and returns the larger value. int max(int a, int b) // this function takes 2 parameters { if (a<b) return b; else return a; } int x = max(7, 9); // x becomes 9 int y = max(19, -27); // y becomes 19 int z = max(20, 20); // z becomes 20 Stroustrup/Programming
65
Data for Iteration - Vector
To do just about anything of interest, we need a collection of data to work on. We can store this data in a vector. For example: // read some temperatures into a vector: int main() { vector<double> temps; // declare a vector of type double to store // temperatures – like 62.4 double temp; // a variable for a single temperature value while (cin>>temp) // cin reads a value and stores it in temp temps.push_back(temp); // store the value of temp in the vector // … do something … } // cin>>temp will return true until we reach the end of file or encounter // something that isn’t a double: like the word “end” Stroustrup/Programming
66
Vector Vector is the most useful standard library data type v: 5 1 4 2
a vector<T> holds an sequence of values of type T Think of a vector this way A vector named v contains 5 elements: {1, 4, 2, 3, 5}: size() v: 5 v[0] v[1] v[2] v[3] v[4] 1 4 2 3 5 v’s elements: Stroustrup/Programming
67
Vectors vector<int> v; // start off empty v.push_back(1); // add an element with the value 1 v.push_back(4); // add an element with the value 4 at end (“the back”) v.push_back(3); // add an element with the value 3 at end (“the back”) v[0] v[1] v[2] v: 1 1 v: 2 1 4 v: 3 1 4 3 v: Stroustrup/Programming
68
Vectors Once you get your data into a vector you can easily manipulate it: // compute mean (average) and median temperatures: int main() { vector<double> temps; // temperatures in Fahrenheit, e.g. 64.6 double temp; while (cin>>temp) temps.push_back(temp); // read and put into vector double sum = 0; for (int i = 0; i< temps.size(); ++i) sum += temps[i]; // sums temperatures cout << "Mean temperature: " << sum/temps.size() << endl; sort(temps.begin(),temps.end()); cout << "Median temperature: " << temps[temps.size()/2] << endl; } Stroustrup/Programming
69
Combining Language Features
You can write many new programs by combining language features, built-in types, and user-defined types in new and interesting ways. So far, we have Variables and literals of types bool, char, int, double vector, push_back(), [ ] (subscripting) !=, ==, =, +, -, +=, <, &&, ||, ! max( ), sort( ), cin>>, cout<< if, for, while You can write a lot of different programs with these language features! Let’s try to use them in a slightly different way… Stroustrup/Programming
70
Example – Word List // “boilerplate” left out vector<string> words; string s; while (cin>>s && s != "quit") // && means AND words.push_back(s); sort(words.begin(), words.end()); // sort the words we read for (int i=0; i<words.size(); ++i) cout<<words[i]<< "\n"; /* read a bunch of strings into a vector of strings, sort them into lexicographical order (alphabetical order), and print the strings from the vector to see what we have. */ Stroustrup/Programming
71
Word list – Eliminate Duplicates
// Note that duplicate words were printed multiple times. For // example “the the the”. That’s tedious, let’s eliminate duplicates: vector<string> words; string s; while (cin>>s && s!= "quit") words.push_back(s); sort(words.begin(), words.end()); for (int i=1; i<words.size(); ++i) if(words[i-1]==words[i]) “get rid of words[i]” // (pseudocode) for (int i=0; i<words.size(); ++i) cout<<words[i]<< "\n"; // there are many ways to “get rid of words[i]”; many of them are messy // (that’s typical). Our job as programmers is to choose a simple clean // solution – given constraints – time, run-time, memory. Stroustrup/Programming
72
Example (cont.) Eliminate Words!
// Eliminate the duplicate words by copying only unique words: vector<string> words; string s; while (cin>>s && s!= "quit") words.push_back(s); sort(words.begin(), words.end()); vector<string>w2; if (0<words.size()) { // Note style { } w2.push_back(words[0]); for (int i=1; i<words.size(); ++i) if(words[i-1]!=words[i]) w2.push_back(words[i]); } cout<< "found " << words.size()-w2.size() << " duplicates\n"; for (int i=0; i<w2.size(); ++i) cout << w2[i] << "\n"; Stroustrup/Programming
73
Algorithm We just used a simple algorithm
An algorithm is (from Google search) “a logical arithmetical or computational procedure that, if correctly applied, ensures the solution of a problem.” – Harper Collins “a set of rules for solving a problem in a finite number of steps, as for finding the greatest common divisor.” – Random House “a detailed sequence of actions to perform or accomplish some task. Named after an Iranian mathematician, Al-Khawarizmi. Technically, an algorithm must reach a result after a finite number of steps, …The term is also used loosely for any sequence of actions (which may or may not terminate).” – Webster’s We eliminated the duplicates by first sorting the vector (so that duplicates are adjacent), and then copying only strings that differ from their predecessor into another vector. Stroustrup/Programming
74
Ideal Basic language features and libraries should be usable in essentially arbitrary combinations. We are not too far from that ideal. If a combination of features and types make sense, it will probably work. The compiler helps by rejecting some absurdities. Stroustrup/Programming
75
The next lecture How to deal with errors Stroustrup/Programming
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.