Transcript Document
Bjarne Stroustrup
www.stroustrup.com/Programming
basics of computation
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
2
Computation
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
3
Code, often messy,
(input) data
often a lot of code
(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
4
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
5
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
6
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
7
You
know how to do arithmetic
d = a+b*c
You
know how to select
You
know how to “iterate”
“if this is true, do that; otherwise do something else ”
“do this until you are finished”
“do that 100 times”
“go ask Joe and bring back the answer”
“hey Joe, calculate this for me and send me the answer”
You
know how to do functions
What we learn here is mostly just vocabulary and
syntax for what you already know
Stroustrup/Programming
8
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
9
// 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;
int average = (length+width)/2;
// a multiplication
// 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
10
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
11
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
12
Integer types: short, int, long
Arithmetic operators: +, -, *, /, % (remainder)
Relational operators: < (less than), > (greater than), <=,
>=
Floating-point types: e.g., float, double
(e.g., 12.45 and
1.234e3)
arithmetic operators: +, -, *, /
Relational operators: < (less than), > (greater than), <=,
>=
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
13
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
14
Fahrenheit
to Celsius
(°F - 32) x 5/9 => °C
How
to implement it in C++ code?
Stroustrup/Programming
15
What’s
the value of the following
expressions?
1.0+13/4 , (1.0+13)/4
123 % 10
How
double x1=
double x2=
Recall function sqrt(t) return square root of t
How
to express using C++?
to find the 10th digit of an integer?
E.g., 10th digit of 342 is 4
Stroustrup/Programming
16
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
17
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
18
Integer types: short, int, long
Arithmetic operators: +, -, *, /, % (remainder)
Relational operators: < (less than), > (greater than), <=,
>=, ==, !=
Floating-point types: e.g., float, double
(e.g., 12.45 and
1.234e3)
arithmetic operators: +, -, *, /
Relational operators: < (less than), > (greater than), <=,
>=, ==, !=
Boolean type: bool
(true and false)
Logical/Boolean operators:
&& (and), || (or), ! (not)
Character type: char
(e.g., 'a', '7', and '@')
Stroustrup/Programming
19
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
20
in
C++ any nonzero value “evaluates” to true
n=10;
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
21
Boolean
operators (after George Boole)
have Boolean expressions as operands
combine conditions into larger, more complex
Boolean expressions
Two
&& logical and
|| Logical or
One
binary operators:
uniary operators:
! Logic not
Stroustrup/Programming
22
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
or "AK":
test is true if state is either "HI"
if (state == "HI" || state == "AK")
shipping_charge = 10.00;
Stroustrup/Programming
23
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
24
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
25
A
B
A && B
true
true
true
true
false
false
false
true
false
false
false
false
A
B
A || B
A
!A
true
true
true
True
False
true
false
true
False
true
false
true
true
false
false
false
Stroustrup/Programming
26
&&
and || operators are evaluated lazily
Operands are evaluated left-to-right
Evaluation ends as soon as the truth value is
determined
Given
X || Y is true; Y is not evaluated (there is no
need …)
Y && X is false; X is not evaluated
This
X is true and Y is false:
is quite handy:
(n > 0) && (tot/n < 0.9)
Stroustrup/Programming
27
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
28
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
29
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″;
cond
ition
true
statement
false
Syntax is
if (condition)
statement
//statement is executed only if condition is true
Stroustrup/Programming
Next statement
in program
30
select between alternatives
E.g, to identify larger of two values:
if (a<b)
max =
else
max =
// Note: No semicolon here
b;
// Note: No semicolon here
a;
false
Statement-2
syntax is
cond
ition
true
Statement-1
Next statement
in program
if (condition)
statement-1 // if condition is true, do statement-1
else
statement-2 // if not, do statement-2
Stroustrup/Programming
31
if (condition)
statement //if condition is true, do statement
if (condition)
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
32
Stroustrup/Programming
33
Operators
in parentheses evaluated first
Nested/embedded parentheses
Operators in innermost pair first
Multiplication,
next
Operators applied from left to right
Addition,
division, modulus applied
subtraction applied last
Operators applied from left to right
CS1600 Xiaolan Zhang
Fall 2010
34
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;
Question
:
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
36
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
37
Stroustrup/Programming
38
Representing
whole numbers, i.e., those
numbers that have no decimal parts
For counting number of people, classrooms,
stars,…
In
int data type is 4 byte long (32 bits)
C/C++,
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
For
storing values with decimal parts, real
values
E.g., 3.1415, 15.39, 0.3333333333333, sqrt(2),
C/C++
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
provides two floating point type:
double: 64 bits long
Can store value within range: 1.7e308, 1.7e308
15 digits precision
Stroustrup/Programming
40
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double a=1.2345678e10; // the literal constant has 8 significant digits
cout <<"a=" << setprecision(10) << a<<endl;
}
Output:
a=1.2345678e+10 //double can represent the value accurately
If change double to float,
a=1.234567782e+10 //float cannot
Stroustrup/Programming
41
#include <iomanip>
int main()
test_double.cpp
{
double a;
int n;
cout <<"Enter a:";
cin >> a;
cout <<"a's value is "
<< a << “\n";
}
Try following input:
•30, output 30
•30.00, output 30
•2e310, output 1.79769e+308
•1.234567890123456789, output
1.23457
Stroustrup/Programming
Value overflow!
By default, cout outputs
a double value with up to
6 significant digits
42
If enter value 1.234567890123456789
output:
1.2345678901234566904
#include <iomanip>
int main()
If value entered is:
0.00000001234567890123456789
output is:
1.23456789012345674501e-08
{
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
If value entered is:
123456789012345678900000000
output is :
1.23456789012345678153e+26
If value entered is:
2.1234567890000000000000
output is:
2.123456789000000011213842299185e+
00
double data type represents a number
approximately, the precision is 15
significant digits. (sometimes you get
lucky ).
43
Stroustrup/Programming
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
44
All non-zero digits are considered significant.
Zeros appearing between two non-zero digits are
significant
101.12 has five: 1, 0, 1, 1 and 2.
Leading zeros are not significant
91 has two (9 and 1), while 123.45 has five (1, 2, 3, 4 and 5).
0.00052 has two significant figures: 5 and 2.
Trailing zeros in a number are significant.
12.2300 has six : 1, 2, 2, 3, 0 and 0.
0.000122300 still has only six (the zeros before the 1 are
not significant)
120.00 has five significant figures
12.23 vs 12.2300
Stroustrup/Programming
45
Precision:
the number of significant digits
the data type can store without loss of
information
E.g. 0.3333333333333333333…33
There are 100 number of 3.
Both
double and type use finite amount of
memory, cannot store all possible real value
exactly
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double a=1.2345678e10; // the literal constant has 8 significant digits
cout <<"a=" << setprecision(10) << a<<endl;
}
Output:
a=1.2345678e+10 //double can represent the value accurately
If change to float type,
a=1.234567782e+10 //float cannot
Stroustrup/Programming
47
double change=40.0-15.38*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;
[zhang@storm Codes]$ ./a.out
change due 24.620000
d=24
q=2
dm=1
n=0
Right hand side1.99999999999974
p=1
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;
Stroustrup/Programming
48
49
#include <math.h>
int dollar = floor(change);
Better solution: use int to store
money amount (measured in cents)
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
Stroustrup/Programming
50
Often necessary to nest an if/else statement
inside another, to decide across several categories
Stroustrup/Programming
51
Write
embedded if/else statements
Exercise
Leap year testing logic
Stroustrup/Programming
52
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”;
else
{
if (richter>=4.5)
{
cout <<“damage to ..\n”;
}
else
cout <<“No des…\n”;
}
}
Stroustrup/Programming
53
if (richter>=8.0)
if (richter>=8.0)
cout <<“most structure fall\n”;
cout <<“most structure fall\n”;
else
else
if (richter>=7.0)
{
cout <<“Many buildings destroye
if (richter>=7.0)
else
cout <<“Many buildings destroyed\n”;
if (richter >=6.0)
else {
cout <<“Many building consi…
if (richter >=6.0)
else
cout <<“Many building consi…\n”;
if (richter>=4.5)
else
cout <<“damage to ..\n”;
{
else
if (richter>=4.5)
cout <<“No des…\n”;
{
cout <<“damage to ..\n”;
}
else
cout <<“No des…\n”;
}
}
Stroustrup/Programming
54
if (richter >= 8.0)
if (richter>=8.0)
cout <<“most structure fall\n”;
cout << "Most structures fall";
else
else if (richter >= 7.0)
if (richter>=7.0)
cout <<“Many buildings destroyed\n”; cout << "Many buildings
else
destroyed";
if (richter >=6.0)
else if (richter >= 6.0)
cout <<“Many building consi…\n”;
cout << "Many buildings …";
else
if (richter>=4.5)
else if (richter >= 4.5)
cout <<“damage to ..\n”;
cout << "Damage to …";
else
else
cout <<“No des…\n”;
cout << "Generally no damage";
Stroustrup/Programming
55
Implement
a menu selection, where program
prompt user to select diff. action based on
input:
Enter a simple arithmetic expression (+,-,*,/,%):
12+34
Result is: 36
Hint:
char op;
cin >> num1 >> op >> num2;
//test whether op is equal to ‘+’, ‘-’,’*’,’/’.
Stroustrup/Programming
56
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
57
The world’s first “real program” running on a storedprogram 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
58
What it takes
A loop variable (control variable); here:
Initialize the control variable;
here:
A termination criterion;
here:
terminate
Increment the control variable; here:
Something to do for each iteration;
i
int i = 0
if i<100 is false,
++i
here: cout << …
int i = 0;
while (i<100) {
cout << i << '\t' << square(i) << '\n';
++i ; // increment i
}
Stroustrup/Programming
59
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
60
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
61
int main()
{
int square(int x)
i=0;
{
while (i<100)
{
return x * x;
}
square(i)
i<100
}
}
i==100
Stroustrup/Programming
62
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
63
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);
int y = max(19, -27);
int z = max(20, 20);
Stroustrup/Programming
// x becomes 9
// y becomes 19
// z becomes 20
64
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
65
Vector
is the most useful standard library
data type
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
66
vector<int> v; // start off empty
v:
0
v.push_back(1);
v:
// add an element with the value 1
1
v.push_back(4);
(“the back”)
v:
1
// add an element with the value 4 at end
2
v.push_back(3);
(“the back”)
1
// add an element with the value 3 at end
v[0]
v:
4
3
Stroustrup/Programming
1
v[1]
v[2]
4
3
67
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
68
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
69
// “boilerplate” left out
vector<string> words;
string s;
while (cin>>s && s != "quit")
words.push_back(s);
// && means AND
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
70
// 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). Stroustrup/Programming
Our job as programmers is to choose
a simple
71
//
// 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
72
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
73
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
74
How
to deal with errors
Stroustrup/Programming
75