[PDF]

! "
#
$
'
(
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
double pow (double b, int e)
)
{
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b;
e = -e;
}
for (int i = 0; i < e; ++i) result *= b;
return result;
}
%
&
!
// Prog: callpow.C
// Define and call a function for computing powers.
#include <iostream>
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
double pow (double b, int e)
{
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b;
e = -e;
}
for (int i = 0; i < e; ++i) result *= b;
return result;
}
int main()
{
std::cout
std::cout
std::cout
std::cout
std::cout
return 0;
}
<<
<<
<<
<<
<<
pow( 2.0, -2) << "\n"; // outputs
pow( 1.5, 2) << "\n"; // outputs
pow( 5.0, 1) << "\n"; // outputs
pow( 3.0, 4) << "\n"; // outputs
pow(-2.0, 9) << "\n"; // outputs
0.25
2.25
5
81
-512
(
)
(
*
,
!
+
(
-
#
+
"
.
+
#+
"
+
&+
!
/
" 0/
#
!
// PRE:
)
(
)
)
#
+
.
1
e >= 0 || b != 0.0
1
&+
(
#
2
&
)
3 #
1
&
2
#
// POST: return value is b^e
4 (
&
+
5
6
(
5
)
)
+
(
*
*
*
5
*
)
+
(
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
+
#
7
&
double 1
1
!
8
*
5
)
(
5
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
(
+
:
*
&
&
+
.
9
(
)
// PRE:
e >= 0 || b != 0.0
// POST: return value is b^e
9
#
double pow (double b, int e)
1
2
{
assert (e >= 0 || b != 0.0);
1
assert
double result = 1.0;
9
// der Rest ist wie vorher...
...
}
5
&
1
bool
!
5
5
1
*
+
+
8
!
// PRE:
&
5
,
,
"
-&
-
#include <cassert>
5
+
9
e >= 0 || b != 0.0
1
+
#
!
// PRE:
9
e >= 0 || b != 0.0
double pow (double b, int e)
double pow (double b, int e)
{
{
#
9
assert
double result = 1.0;
// der Rest ist wie vorher...
// der Rest ist wie vorher...
...
...
5
%<
&
<&%=
bool
1
!
=&>&%)
5
&
1
"
:
*
%
@
5
}
)
5
@
1
+
assert (e >= 0 || b != 0.0);
assert
double result = 1.0;
}
;
&+
// POST: return value is b^e
assert (e >= 0 || b != 0.0);
?"
1
+
6
// POST: return value is b^e
%
+
@
bool
&
+
9
!
*
%
*
%
@
@
int foo (int x)
int foo (int x)
double pow (double b, int e)
{
{
{
)
return x;
"
}
"
int bar (int x)
&
5
{
return x;
...
}
}
int bar (int x)
int main ()
{
{
return x + 1;
return x + 1;
}
...
}
pow (2.0, -2)
5
%@
9
<& 9
%<&
>&
%)
!
=&
>& 9
}
"
5
! %@ % 1
)
2
!
&
+
& #
?1
?1
)
#?1
5
+
%@
A?1
A> A?1
?1
5
+
5
+
#
5 +
B
pow (2.0, -2)
5
double pow (double b, int e)
{ // b = 2.0; e = -2;
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b;
e = -e;
}
for (int i = 0; i < e; ++i)
result *= b;
return result;
}
5
1
5
"
#
5
+
5
5
!
(
"
return 9
?"
+
#1
C
+
5
+
#
pow (2.0, -2)
#
pow (2.0, -2)
double pow (double b, int e)
{ // b = 2.0; e = -2;
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b; // b = 0.5;
e = -e;
// e = 2;
}
for (int i = 0; i < e; ++i)
result *= b;
return result;
}
i==0
double pow (double b, int e)
{ // b = 2.0; e = -2;
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b; // b = 0.5;
e = -e;
// e = 2;
}
for (int i = 0; i < e; ++i)
result *= b; // 0.5
return result;
}
5
+
5
+
#
pow (2.0, -2)
i==1
5
#
pow (2.0, -2)
double pow (double b, int e)
{ // b = 2.0; e = -2;
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b; // b = 0.5;
e = -e;
// e = 2;
}
for (int i = 0; i < e; ++i)
result *= b; // 0.25
return result;
}
double pow (double b, int e)
{ // b = 2.0; e = -2;
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b; // b = 0.5;
e = -e;
// e = 2;
}
for (int i = 0; i < e; ++i)
result *= b; // 0.25
return result; // 0.25
}
+
#
%@ !
pow (2.0, -2)
5
+
?"
/=D
double pow (double b, int e)
{ // b = 2.0; e = -2;
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b; // b = 0.5;
e = -e;
// e = 2;
}
for (int i = 0; i < e; ++i)
result *= b; // 0.25
return result; // 0.25
}
( +
%@ 1
?"
&
2
@ "
// POST: "(i, j)" has been written to standard output
void print_pair (int i, int j)
(
{
std::cout << "(" << i << ", " << j << ")\n";
}
int main()
{
print_pair(3,4); // outputs
}
(3, 4)
(
return
5 "
o
o
5
!
>
'
5
+
E
F
2
5
%@ void (
5
?"
@ void
4"
1
1
5
?1
4"
#
<
int main() {
double b = 2.0;
int e = -2;
std::cout << pow(b,e); // outputs 0.25
std::cout << b;
// outputs 2
// outputs -2
std::cout << e;
return 0;
}
#
&+
return;
return 9
2
+ &
+ &
>
C
+
!?
b
e
(
!
?
+&
! main
#
8
"
5
(
+
#
int f (int i)
{
int i = 5; // ungültig; i versteckt Argument
return i;
}
=
4"
4"
#
8
"
5
=
(
#
8
"
5
+
&
=
(
+
&
#
#
int f (int i)
{
{
int i = 5; // ok; i ist lokal zum Block
}
return i; // das formale Argument
}
int f (int i)
{
{
int i = 5; // syntaktisch ok, aber schlechter
}
// Stil
return i; // das formale Argument
}
4"
4"
#
%
&
+
(
4"
#+
&
# double pow (double b, int e)
#include<iostream>
int main()
{
std::cout << f(1); // Fehler: f undeklariert
return 0;
}
int f (int i) // Gültigkeitsbereich von f ab hier
{
return i;
G
4"
E
#
+
#
#include<iostream>
int f (int i); // Gültigkeitsbereich von f ab hier
int main()
{
std::cout << f(1); // im Gültigkeitsbereich, ok
return 0;
}
int f (int i)
{
return i;
}
int f (…) // Gültigkeitsbereich von f ab hier
{
g(…) // f ruft g auf, aber g ist undeklariert
}
int g (…) // Gültigkeitsbereich von g ab hier
{
f(…) // g ruft f auf, ok
}
E
+
#
int g (…); // Gültigkeitsbereich von g ab hier
int f (…) // Gültigkeitsbereich von f ab hier
{
g(…) // f ruft g auf, ok
}
int g (…)
{
f(…) // g ruft f auf, ok
}
H
4
%
( +
,
+
! "
!
4
#
#
H
I
// input
H
*
)
// POST: return value is the sum of all divisors of i
std::cout << "Find perfect numbers up to n =? ";
//
unsigned int n;
std::cin >> n;
that are smaller than i
unsigned int sum_of_proper_divisors (unsigned int i)
1
H
.
.
.
{
unsigned int sum = 0;
// computation and output
for (unsigned int d = 1; d < i; ++d)
std::cout << "The following numbers are perfect.\n";
if (i % d == 0) sum += d;
for (unsigned int i = 1; i <= n ; ++i) {
return sum;
// check whether i is perfect
}
4
E
unsigned int sum = 0;
for (unsigned int d = 1; d < i; ++d)
// POST: return value is true if and only if i is a
if (i % d == 0) sum += d;
//
if (sum == i)
perfect number
bool is_perfect (unsigned int i)
std::cout << i << " ";
{
}
return sum_of_proper_divisors (i) == i;
}
#
H
)
+
int main()
{
&+
// input
+
std::cout << "Find perfect numbers up to n =? ";
unsigned int n;
5
std::cin >> n;
E
// computation and output
std::cout << "The following numbers are perfect.\n";
& +
for (unsigned int i = 1; i <= n ; ++i)
if (is_perfect (i)) std::cout << i << " ";
std::cout << "\n";
return 0;
}
E
5EB <JKL
H 2
#+
*
#"
1
4
+
+
8
*
#+ "
+ H
6
5+
+
&+
H
H
6
3
2
,
-+
2
2
// PRE: [first, last) is a valid range
// POST: *p is set to value, for p in [first, last)
void fill (int* first, int* last, int value) {
// iteration by pointer
for (int* p = first; p != last; ++p)
*p = value;
}
'
2
value
#
5+
E
int main()
{
int a[5];
fill (a, a+5, 1); // a == {1, 1, 1, 1, 1}
return 0;
}
( +
#
#include <algorithm>
int main()
{
int a[5];
std::fill (a, a+5, 1); // a == {1, 1, 1, 1, 1}
return 0;
}
I
I
+ pow, fill,...
"
&
'
+
!
2
H #5
I
#5
callpow2.C#
5
#include <iostream>
#include "pow.C"
return 0;
}
<<
<<
<<
<<
<<
pow.C#
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
double pow (double b, int e)
{
double result = 1.0;
if (e < 0) {
// b^e = (1/b)^(-e)
b = 1.0/b;
e = -e;
}
for (int i = 0; i < e; ++i) result *= b;
return result;
}
I
7
// Prog: callpow2.C
// Call a function for computing powers.
int main()
{
std::cout
std::cout
std::cout
std::cout
std::cout
E
#5
o
5
#include
#
#
B
pow.C
callpow2.C
!
5
pow( 2.0, -2) << "\n"; // outputs
pow( 1.5, 2) << "\n"; // outputs
pow( 5.0, 1) << "\n"; // outputs
pow( 3.0, 4) << "\n"; // outputs
pow(-2.0, 9) << "\n"; // outputs
!
0.25
2.25
5
81
-512
"
'
!
'+
"
I
7
o
#
I
7
pow.C
"
g++ -c pow.C
?
+
5
M'
"
+
! pow.C
:
"
main
pow.o
#
&
!
pow
C
3
I
#
// Prog: callpow3.C
// Call a function for computing powers.
return 0;
}
<<
<<
<<
<<
<<
pow( 2.0, -2) << "\n"; // outputs
pow( 1.5, 2) << "\n"; // outputs
pow( 5.0, 1) << "\n"; // outputs
pow( 3.0, 4) << "\n"; // outputs
pow(-2.0, 9) << "\n"; // outputs
o
#
callpow3.C
"
+
g++ -c callpow3.C
?
#include <iostream>
#include "pow.h"
int main()
{
std::cout
std::cout
std::cout
std::cout
std::cout
pow.h:
I
7
callpow3.C:
5
+
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
double pow (double b, int e);
! pow
"
I
7
&
pow.o 6
pow
callpow3.o
0.25
2.25
5
81
-512
5
! pow
E
I
"
&
M'
"
callpow3.o
&
"
+
I
#
8
I
#
pow.o
"
!
M'
callpow3.o
8
callpow3.o
pow.o
"
+
5
"
I
I
#
callpow3
"
! pow
I
! N
8
"
o
I
5
"
! pow
#( "
pow.C N
+
! pow.o M '
*
(
(
N
)
! "
I
"
! pow
I
5
"
! pow
2
*
5
+
!
3
B
I
!
#(
"
N
I
,
M
5 N
-E + #
! "
1
4
+
pow
,
I
>
-E + #
(
,
#
-
math.h
exp
math.C
log
@
sin
!
I
2
#
)
E
!
:
// math.h
// A small library of mathematical functions.
namespace ifm {
// PRE: e >= 0 || b != 0.0
// POST: return value is b^e
double pow (double b, int e);
....
double exp (double x);
...
}
!
"
)
?
std::pow, std::fill
1
std::sqrt
O=
P
=&
>& <G
%
std::sqrt
O=
&+
!
unsigned int d;
for (d = 2; n % d != 0; ++d);
P
=&
>&
Q G
&+
!
%
unsigned int bound =
(unsigned int)(std::sqrt(n));
unsigned int d;
for (d = 2; d <= bound && n % d != 0; ++d);
)
for 5 +
d <= bound
#n
% d
== 0
&
std::sqrt
O=
P
=&
>&
Q G
%
&+
!
unsigned int bound =
(unsigned int)(std::sqrt(n));
unsigned int d;
for (d = 2; d <= bound && n % d != 0; ++d);
)
for 5 +
d > bound
#
%
P
=&
>&
QG
&
%
0 #
&
std::sqrt
// Program: prime2.C
// Test if a given natural number is prime.
#include <iostream>
#include <cmath>
int main ()
{
// Input
unsigned int n;
std::cout << "Test if n>1 is prime for n =? ";
std::cin >> n;
// Computation: test possible divisors d up to sqrt(n)
unsigned int bound = (unsigned int)(std::sqrt(n));
unsigned int d;
for (d = 2; d <= bound && n % d != 0; ++d);
// Output
if (d <= bound)
// d is a divisor of n in {2,...,[sqrt(n)]}
std::cout << n << " = " << d << " * " << n / d << ".\n";
else
// no proper divisor found
std::cout << n << " is prime.\n";
RQ #
return 0;
}
!
!
E
E
prime2.C *
&
z.B. std::sqrt(121)==10.998
o
o
bound == 10
d == 11
2
! for
5
#121 is prime.
o
o
!
E
"
4
+
4
?"
,
E
B
222E
&
*
SDT
6
"
&
-
* &
" std::sqrt
B
222
E
SDT
&
9
1
1
+
+
&&U&V
Also: std::sqrt(121)==11
prime2.C
B
222
E
SDT