[PDF]

/@
R
.=
.C 5 3 >
= 1
=
3 /6 ^ A5
36 F 1
/
C 0=
/
.6
1
/6
/
. 05
@B6
7:
6
7A K
>
6
4 0=
.5
B
781
>
/
01
3=
/
.6 5
=
A
3 /1
Issue 3: The internal representation cannot be changed.
YF
int
.=
B31
3 A=
C7:
=
0 C G1
3
C1
>
36 F
B1
=/
. 5 G6
:= F 7 /
>=
= / /=
]1
. 05
>
/
0
85
1 A5
8
26
88
.B 5
K
A1 G C.1
;,C ; /
K
/6
rational r;
0
r.d
. >1
S=
> B1
C
36 F
extended_int
.=
3 /6
=
C31
7
5
: >5 8
468 8 / A5
A
31 26
. 8
O1 8
5
K / GA1
/6
=
88
B. 5
7A
6
. >6
5 . >5
=: 0 .86 5
W 3 . = /5
31 / 1= ^1 ^ A5
= 6 / 5 36 1
@ AA . K 9
B6 7.: F
/5
0
9= 6 / 5
@K= .:
.5
1
M 3 /=
.6
01 . 5
1
31 @ A
=
; B6
.86 C=
.=
\1
=>
85 8
/
/ .81
0=
/
01
/ 81
/ 6F
8
=
05 3
8 8
C1
8= : /3
/5
1: F 7
C1
31 8 /
= .5
C=
/ B1
\1
.6: 5 .1
3=
8
731
.= ; A
G
/
0=
: G1 7 /
/
3: 5 / 01
/
01
/9
47C 6
>1
.
6
.1 88 5
/1 71
JC5
> 8
9
r
.F
01
AA
/@ ;
/
3
A 8
71 A5
3= 3= G
. @3
B1 6 F
3
.8: 5 86
1
/ C1
@ 01 / 5
4 0= ; C1
1 X
6 Y
G M
4381 2=
1 236
> =
/ :
0= 01
/
. 5 @86
3 /1 7
9
C1 5
>= 5 / 0
=
4 /1 3I1
=
A
71 718
8 /
86 36 F
C1 4 =
/5 1
C1 38
846 .6 5
31 9
5
96 m = / 0
=
P
7:
=
3 /6
.
V
9
01
3
C G1
7
/
.6 5
=
.A
3=
/
/5
0
=5
GA1
3=
.
91
/1 5 4
>1
36 F 4 >1
/ 1
0
; 8 5 A6
/ 21
01 >
=
236 /
B3= XY
M
C .1
C31 1
.: 5 8 >
/6
3 0= . 55
B1 = / 5
A
C7 ^1 5
=
8/
6
C1:
P6
6_
18 5
K3 X
Y
36 l M
O1 /6
= 7
81
C /
2 A1
; 8 05
7.: F
/
.6 5
9
. 01
41
31
/
@ 01
9
.=
/
/6
.5
5
= /5
^ 1 A5
36
=
88
B. 5
/6
C G1
7
/ 7
.6 5 / 01
= .
. A 4=
>
=
3=
/
01
/6
/6
A1
/5
X
Y
M
ZE
AA
=
/
8: W
VC31
8 /=
> &
3 %
/8 [ K
9 36 L
K H
. \5 X
9B MY
/5 8 5
0 .5
K /5 /5
=5
] A
7/ @A
/ 0=
. 01 @22
86 9
C1 / 05
;8
.=
=:
78
5
>1 = 7.: F
.8= 6 / 5
/ .
88 5 = A
71 /@ 5
:8
6 / 0=
C1 /
/
01
K 72 A
5
3= G
@3
4236
2 A1
7.
7/
2
1
4 0=
8
01
21:
=
/
/ 6/
01
F
8 /3 .1:
:7 =
/ 28
7 A=
/
.6 5
; H
A1
.= /
= > 78
AA 8 /=
/ 3
01 6 /
7.: F 9 N
/ /5
.6 5 = 0
=
A
/@ 5 / 06
/ 7B
0= 0
9 / O1 /
1
21
4 0= 3 5
1 C1
.
4 >1 K /
1
A6 P
21 72
> 26
. 5 81
/6 @6
= 7
F
/ .: 5
01 1
/@ A
21 3= G5
3
K@
-.
OQ
36 F 3:1
5
C 81
S36 R
R
3B= @6
7
C 4 0=
T 1
.= =:
> /
7=
6 S3 @ AA
B3=
>6
C .1
TT /
0
<;8 5
9 U6 6 F
3
@6
/
7 4 01
4 0= 31
1 @
86 G=
A :8 5
>
/ 4
01 31
A5 8
3= G .6 5
@3 6
.= E
>
.5
23=
: /5
7 A=
3
8
.5
/
0
85
81:
6 /5
.
A=
881
3 /6
6 M ; .8 5
C6 2
4 / 5 7= /
= .
/1 >
6
/ 7
01 /
/3 27
.= L
K /H
85
/
.6 5
36 F
C
8 /3
7:
8/
: /6
G1
I1
/5
0
>1
/9
-.
01
8
F
A5
3= G
3
;@
3
C G1
7
.
=
46
/ =
01 .
A /@ @6 >
71 21
86
7:
6
F
/@
C
1
21
; 72
K @6 9
5
7 /0
>1 /
. ? 01
1 6
= AF
A6
7.: F 9. 5
/ B
.6 5 86
/ 7A
0= /
/: k.6 5
31
=
/1 8 Y
8 .=
4= 6
= / 01
A
71 3
6 25
F 1:
/@ 1
21 6
C
4231
/
8A 65
/ 78
01 /9
C= 6
/ 81:
01
/
C= .6 5
: / 5 <;8
= 9
A
/@ 1
21 4 0=
1
D
E/ >1
01 . ?
81 1 >
/6 =
3= F .1
9
/
.6 5 8 /3
= :
.A 7/
7 /@
C G1 21
3
8H
.=
9>
1 9
4 0= 06
1 81
8 4
9 06 = A
. 71
.7: F
/
.6 5
=
36 F /@ A5
.6
3= E
/5
0
C1
: /5
.= ;
31 >
A=
/
.6 5
=
6A
231
J=
7 AF
7.: F
/
.6 5
=
A5
781
86
C1
75
2
21
9>
/@
.
3=
B1
: /5
=. C6
9 06
rational
6
=
1:
1
=
4 G6
3
:
3: 5
6 _ 7 A=
7 6 /5
/ .
. 05
=E
= \ B=
G6 . 5
7/ ; @
6
9 06 7
B1
G6 /
/ /6
0
88 5 . 0=
71 >
8: A1
6 /
7 A 01
> G
G1 7
= B3
1
31 >> 26
3
881 8 /
K H
L
. >5
/
01
.
O1
31 /
= A1
81
6
/F
01
3=
/
.6 5
=
A
4.3.1 Encapsulation
21
73
/5
>
@G
.
6
/
78
.5
B
K /5
-.
=: F
; /
@6
73
=
4>
:5
C5 1
B0 C
/ B5
G1 / 0
/66 .6
/
^@ A= 4 0=
1
3
36 E 1=:
6 /6 01
8/ >
7 / 01
G
3. G6 236
H B3
/6 =
6F C
A C1
9 A6 3=
/5 /
X
/- Y
85 ; M
9
G1
7 /=
2
C
6
:
.B 5
1
>
/6
/
.6 5
8
@C=
31
; 78 A
/ . /5
01
=
C 5 ^1
8 /= 36
\1 >1
.
73 F 6
/ C
3 01 .= 5
236 3 /6
2= 8 5
B= C
/1 @2 A
8
.5 @G
8 /1
= C5
8
6 > /=
F ; \1
G1 =
.5 .
B9 . >5
/5 = A
A6
3= 0> 9
9 .5
. 4B
36 F =
A
C 71
88
=
/6
0
21
rational
C G1
r
/ .=
31 01 41 >
361 F .1
8 / 5F
AA5 / 5
26 >5
88 ; >
5
GA1 / 01
/6 23
9 6
3 B3=
/1 5 C
3C1
r
.=
8 / = >1 F
A=
/1 J 7
K 3 . / A5
X = / 55
Y
M A
/1 ^1 5
A
@6 A ; 8
7 7G
/ /
0= /
/ 01
/ =:
@ 01 /
9 7=
6 4A
7A =
> A
231 716
31 F F
/6
. 5 C78
5 /
= / 5 G1
^1 A5 23
J6
C.1
r
=
88
=
B. 5
#
/
0 65
.
r
@86
7
7B
01
rational r ; // default - initialization of r
r.n = 1;
// assignment to data member
r.d = 2;
// assignment to data member
6 _ 4B31
7
.
01
M
1/2
3 A=
.
5
>
/ : >1
36 0 A=
3=
>1
rational
8
@ A5
>6
85
: /6
. 0=
B1
/
01
/@
1 >1
/
4
rational r
21
B=
4A
=
A
71
6
F
/
01
; RH
/
01
236
GA1
C
8= 5
C
2A
5
1?
K >
-.
C
36 F
; > 7C1
5F 3=
/ 3 /6
01
=
236 .
>
B3= >1
.
6
C
C31 C. 5
= = /6
/ 3
X .5
Y
M .6
1
36 F
B1 ; B6
8 / .=
.6 >
1 @
6 6
F 7
/ 31=
01
= ^ A5
88 1
B. 5 / 0=
C.1 //
01
; 8/ @
4 0=
0= 1
8 =
7. 26
J >1 . 5
/
K
31 01
rational
1=
Issue 2: Invariants cannot be guaranteed.
A1
B1
2=
rational_vector_3
.6
F
.?
1
4>
=
A
71
.= E
@6 >
7
B1
/
/6
. 0=
>A1
/
01
G
7B
31
236
/
K 8H
L
-F
/
01
8 /3
7:
/
85
3 A=
B31
:E
.6
85
3 >1
/
01
Issue 1: Initialization is cumbersome.
r
@. Y
6
2 A1
C
=
O1
rational
C C
7
; T 8 /
G 4 0=
7/ 1
/ =
31 01 .6
.
5 ^1
.8 36
6
9 >1
@ = .6
6
F .C 5
.1 =
63: F 3 /6
K
.5
B 6_
/ 7
0
8 5 4 0=
.4 5 1
3= 8 /
.= 5 2 5
K / 7 A=
/1
/- >
85 /
26 8 05
88 =
5
GA1 =8
.
36 F 4. 5
.= =
@ 6 3= 5
. .
1 /
/6 . 5
9
3 6 S3
/1 5 B3
=
8
7
6_
C
/ B5
X = /0
: MY 3B
.= 71
/ W / 0=
G1 /
/ 9 /5
0=
/ 6
8/ 7 A
72 >
5 G1
> I
] 7
7 / /1 5
. 5 8/
7
X 25
Y >
M
8= W 9 /6
2 35
2: A /1
=5
/
.6 5
=
C31
C
B3=
r.d = 0
.5 ;
/
/ 4 01 ; =
01
= .
236 71 A 41 >
B3= 86 .1
VC 3= F /
01
/ .6 / 5
01 = J 236
81 A
81 A
1
31 01
$ $
,+
% #
# C K
2
7 /=
/
.6 5
8
86
9C1
2: A
=5
/1
>:
6
C
6
C:
36 F
18 5
3=
3
C G1
7
.
% % ) $ "
# * &
'
( '$ /1
A=
/@
01
01
01
6
/.
0
>
a
.5
3. /1
=
31 A
231
.81
/=
6. / 5
e
e
b
cj
i
gh
fb
d
c
F
b
/
F
`
6
88
/
/
' rational r ;
r.n = 1;
r.d = 0;
1
31:
36
: 01
; 21
K
/
%
/
65
478
.=
!
" # $ 4.3 Classes
r.d
rational
int
// PRE : d != 0
// POST : return value is n/d
rational create_rational ( int n , int d ) {
// somehow check here that d != 0
rational result ;
result .n = n ;
result .d = d ;
return result ;
}
rational r = create_rational (1 , 2);
1/2
unsigned int
=
GA1
A= 5
A=
6
01
/
0
,
1
+
+
#
# #
2
+
(
.
1:
781
9
+
(
(&
>
@0
.=
9
'(+ $
(+
#
#
@6
97
.6
3 >1
.=
5F
;
0
.
.7: F
6 /5
3
C G1
C1
7B
/
36 0
3 K8
C G1
C1
G
7/
8.: 5
1
/
31 01
3=1
8
21:
: 5?
class rational
(&
+
-
# 01
V31
/6
>6
/5
>
0=
9/
1
3=1
K TT
C
B3=
6 S3
.5
@86
7
781
;
H
5
;
>1
88
1
=::
01
6F
A
9 A6
.5
9B
5
AA
/
31 01
361 F
.
6
/:
6
C
k2 A1 5
/
85
7
: GA
; 5
/
31 01
3=1
.
6
8
7:
31 0
8 /3
:5
/
.6 5
K8
.
3 >1
6
73
2
3
C G1
/=
C1
>=
6
. ? 231
=
/ 5 /6
.6 5 K 3
6
F = -F
1
=
4 G6
;
- /3
=F =
8
>= ; /
/= =
8 /3
C1 7:
C G1 /
3 8= 5
:
85
243 8 A=
= 5 98
/1 01
3
: / 5 1=
=. A
. A>=
6
/ /=
G1
=:: C1
1 C G1
881 3
> 38=
@: G 1
2
78 7 G
/6 : A5
C31 @ G
8 >1
/
36 0 = F
7B K 7 / A
0 /
01
C1
C G1
3
:
.6
/ -.
0
8 5 2=
/13 3
: /5
C: H 7
3 A=
.6 ;
/= 5F
.5 /
01
.8 :
6 A=
88
>1
.?
/5
8 65
21: .
5 81 E
31 ? 1
= : P1
AA /
65
>= .
/= K K T
C1 R
C G1 G1
3 9 A6
8
3=1 36 F
/
423 5 01
= 23
/1 1:
@ G 81 5
F
>1
= F C1=
7 A .. 5
K /
B
-. 6
;
@A
31
=
@6
7
8
7
>
. >1
^1 5
Y />
>= 36 0
8 /= 7
21:
B
0
5 C1
13 ? C / 01
;
G1 \1
.= 3 @9
85
9 > 36
/5 $ 8 >
. 0 6 5
F
.=
=
> .
.6 >
@A
8 5F
21: 5
5 8/ K
31 ? : >1
. 5 A=
3
G1 = /
/9 6 5
11 .
=
K. 2
2
1
/ - 3=
58 8
86
9C1
6 01
3
/ 1
39 01 = F
/1
5 3
K 81 =
^A
> 15
9
0=
/
;
/
= 01
8
.=
;
/@
-.
=
01
:
;
/1
/@
21
A
>5
13 N
1.
/
481
31=
8
1
B=
BB3
=
=
/
8
31 . /6 5
J=A =
; 73
6:
@C=
>
.5
: >5
=
/1
8
/
0=
/
36
@9 \1
8=
G =8
7 / C1
/ 9
01 =
@
; 21
.
91
/ /0
:5 5
] 8 8=
7 / 0= 86 A
8 . .
3 06 B1 6
@ / A .3 5 //6
= 1 6
F 3
3 /1 21 3 0=
@6 .81
>
7 /= /6
4 0= 6 / 5 931
1 K. 3
8
/1 5
05
/
2
01
21
A5
>
/
3= G
01
.
@3
91
4
A1 ?
8
31
8
2
2: A 2
.6 5
5= 06
6
.
@6 F
6. / 5 1:
: =
6 AA 36 F 73
.=
>1 36 F C 3 AG5
>
8 / C = 3=
: AA5 / 4 G6 @
6 01 1 /6
C C= . 5 X
25 . / Y
A1 = 01 M
@E
9 8 B1
/6
06 6
31
/ 5 .C1 21 7
0
1: m
/ 6 / /6 4 0=
01 F
1
/
31
486 A
1
88 5
71
8
.=
>
=
4 G6
1
41
.1
.: 5
01
A
7
236
>1
>
B3=
/
01
C
8=
C31
1: F
31
31
236
=
/
8 / ; @ H .6 5
/ 6
0= 7 F
= / 31: 7.:
/ A 41 6 / 5
06 1 5 .
7B =
0 .
/ .=
01
= @B3
X
kY
M
/
4
@
A5
31
.C 5
3=
231
8= 5
311 F
\1
>=
05
F
. >5
KB
/=
6
8:
0=
3=1
/=
/
/
8
.6 5
6
struct rational
+
'( (
,
#( *
+
#
.
C1=
=
/
.8
96
3
C G1
7
/5
O1 0
231
88
.6 5
86
F
/
01
36 F
C
YF 1
3 /1 38
/= .6 5
. \5 6 F
B= /
I 01
A5
7: 5 3= G
3
\ ;@
6 A6 = \ / / 9%
01
= 36
2 8\
2: A =
= 5 @.
/
.6 5 C36
: 1
6 >1
4
.
91
class
'
+
*
const
;
@8=
6
=
.A
.
6 /5
3=
=
k1
C36
public:
(&
/
1 >6
=
2: A
=5
/
.6: 5
6
>1
6
4G
65
7
@8 A
2
21: 5
1
6
:F
6
>1
1 >6
.8
6
9/
36
=\
@.
GA1
kC 5
8
/
: 01
6
>1
8: 5
A
7/
/13
1
>
7
92
. 5 32
6
public
#'
;
C.1
2 A1
operator+
'( >
01
>
5
01
01
G
6E
A
>H
> 8
/ .
5
/
7/
3
;<8
C G1
C1
/=
class rational
(
#
&'
*this
.=
/
A C5
/6 .88 5
8 B
3 /= 7.: F
9/ /
65
/ 5 .=
0
8= /@ A5
1: F
31 /6
=
/
.6 5
73=
/
C
/
-.
0 23=
23: : / 5
k1 5 7
A=
. ;3
96 /
@6 = 01
73: 88 5
B.
78 C1
/6 .
C31 /
:
.=
.
6
/ : G1
>6 6
.@= C1
8
/ 5
. 05 C26
9B 88 5
/ 5 GA1
=0 9 E
3= : 0
/ 5
.6 5 05
= 8
. A B66
7 ; >H
C G1
3 7G
=/
.= /
=
41 > /6 E
1. 6
B
05
>1
>=
>
@G
H @>
/
0
85
23=
: /5
7 A=
3
31 YA
=
public:
&
/
=
>
6
@6
7:
.=
.
.7: F
/ C1
.6 5 C
G1
.5 3
6
/ F
01 /@
3 ? 21
8/
2: A=
V1 K
. 5 U6
9
1 >1 @
; > 6
/ 73
01 1
8 /= B31
/1 . /
C.1 6
/
/ /6
4 0=
1
4236
/1
.81
231
31
struct
!
$#
0=
C.
=
78
.
96
8 5 8 /5
A
4236 : AA=
5 \
>1 . 5
> B
@G 85
= 86
81: C1
.6 9 =
: > @6
= F
/1 =::
B36 1
@ 8
6 .8 5
:F B
A= /
88 1 01
.:
C1 =
C G1 28
3 7 A=
;<8 /1
.
= 3>
C1 231
@A 1
81
. /=
$ 6 /5
K .
M05
8 F
7.
K :
/
.6 5
=
A
/@ 5
;
5
.5
5
= /5
A^ 5
1
/
01
.E
91
class
G1
/E
C5
B
0
41 /
1.
@ 01
B
.5
/6
7A
>
8/
6
9 AA
36
\
=
88
7
C. 5
B
/
0=
@6 /
7
4 0=
1:
336
1:
@ /A
=
>=
2 /1
>
/
01
>1
.?
/5
.6 5
6
F
/
01
7.: F
/
.6 5
9
class
()
&'( %
+
(
+1
$
$
8
9 A6
9
rational
+&
! &
+&
( (&(
(
.
- !"
&
0
#(
# /
>
35
C1=
.
B1
. 0=
1:
.d
1
/
01
8
4 0=
3
C G1
C1
>
1 5F = >1
8/ A
8 9
5
81 / / 5
AF / 0
. 5 01
1=: .
91
=. 0 31
41 > 231
1 .81
@3 /=
6: /
: 65
.
731 K
.: ]
1 7/
6 /
F 01
236
GA1
36 C
85
C7:
.5 0
/ C36
01 1
C.=
.
B=
3J = F
31
:=
. 05
rational r = create_rational (1 , 2);
9/
6
7A
>
811
>
;
=
2: A
=5
/
.6: 5
6
>1
.8: 5
1
/
01
>=
/=
2
create_rational
#
>1
>
/
01
35
.
=
C1
k8 H
.5
A1
/
. /5
B
X
Y
=:: M
1
8
.8
7
C31
=
3 /6
.=
>
. >1
6
C. 5
=
3 /6
/
36 0
7B
0
B1
. 0=
1:
4 0=
.n
. /1
/5
O1 0
>=
create_rational
78
Y
C1
/=
bool
/ .7 F
0= :
/ /
B3= .6 5
. 8
/ 31
8= 81
1 F 43
=:: 1
1 6 >F
88 3
/6 / 0
/ 85
01 2
. 73
7 26
8
3C1= ; 1
A1
3 /6 /
=. 78
> 3?
8
. >1 8 /
6 06
C. 5 9
= /9
3 /6 6
6 B1
=F .
3= 31=
/ A
.6 5
= C1
.A C
7 3 G1
C G1
3 7.: F
9 E 6 /5
1 .
WA
A 8
M
X
/=
.81
231
31
C
AA .6 / 5 3 G1
9E ; 8
: 05 .= / 0=
0 > =/
/ @ 6 31
@ 01 7: 8
9 = 21:
. :5
A5
31 A /: W ?
/6
7 F . 0= =:
; 81 B1 31
6
: F 5 /=
6 9/ .5
73 / 5 31
81
23
KLH 06 1
7 / .81
=
8 /=
. \5 6 / 5
B ;.
X @6
Y
M 7=
/6: 31
.
96
. 0= :
B1 6
5 C
8= / C 5
/
2 /1
2: A >
= 5 /6
/ /
.6 5 / 0=
1
98
=
>1
rational r ;
r.n = 1;
r.d = 2;
>
8: 5
/
31 /
=
^ 1 A5
8
/
0=
/
/
01
.
19
3=
/
.6 5
=
.A
7
C G1
3
98
C.1
B1
=
01
.C=
. 01
6
.d
A
:
rational.C
#(
/
B1
.
3=
71
=
.n
(
@6
7
4
=
8 / 31
A3 A5
1= 781
A1
^1 A5 88
6
/ 3F
0=
9 / / 01
0= ,;C
@6 / / 01
@
7. /1
11 3
> C
/6 .= 5
4= /1
6 /
5
> : 01
8
7: .6
0 /3
6 /3 =:
7G 9/
A1 5
/
.8 5 @ 0
6
/ K7
01
7 / F 8= 5
(
731
2
26
85 .5
3 F /1
6 =>
C ( 8
;
@6
7=
31
struct rational {
unsigned int n ;
// absolute value of numerator
unsigned int d ;
// absolute value of denominator
bool is_negative; // sign of the rational number
};
(+&&
;<8
.=
9>
1
8
3 /=
/
@G
O1
2 A=
.5
B
881
:F
781
7B
/
36 0 K
=
85
4=
.
9F
36
. \5 ;
9B
/5
3= 0
/
.6 5
=
.A
7
C G1
3
8
86
/ : 01 78 k /6 C31 =
C1:
.=
. 0=
=> 5
/ 8
/ C
01 /
0=
8= /
C1 / 5 C1 / 01
6 =:
31 N /
8 7=
/ 3A
: 01 1
23
78 181
/6 .
/=
3C1 6 / 5
.
6
F
/
01
/@
21
create_rational
6 /5
7 A=
28
;1
.:
-.
@=
9
rational.h
A5
8
/
>
K
6
21
3
C G1
C1
/@
K
01
/@
05
: 01
/6
C31
78
C
/
36 F
21
/=
/
.6 5
6
=F
.81
231
>1
31
/
9 06
/6
R
36 F
F
\1 01
/
k 05 B.8 5
8
6
F
/
01
3=
/
.6 5
=
.A
7
C G1
3
81
23=
=
/1
@A
=
8=
>=
/=
31 /6
C
2 A1
.=
=
O1
bool
4.3.2 Public and private
class rational {
private :
int n;
int d ; // INV : d != 0
};
private
private:
rational r ;
r.n = 1;
// error : n is private
r.d = 2;
// error : d is private
int i = r. n ; // error : n is private
r.d = 0
4.3.3 Member functions
e
e
b
cj
i
gh
fb
d
c
b
a
C.1
*this
>
/
01
F
36 F
63 F C=
1 =A
236 3B
7
C 5 C1
81 .
8 /
/ A5
0= 8
/ 6/
/ =F
01
C1 C1
C G1 C G1
3 3
31 01
/
3 /1
;
*this
/6
8
B1
/
/
05
5
AA
G
=
J8
>
.
*this
*this
8 \ 16
A5
\1 7 /
36 F / 01
36 C1
. >5 C
=
@3 3 G1
F
7.: F 7.:
/
/ 65
.6 5 .
;<8 >1
O1: . ?
1 /5
2 / .6 5
/ <;8
0= . 5
/ 6
.5 3
= 3 >1
C1 = /6
C G1 AA6
3 9
7.: F 281=
/ 3=
.6 5 : /1
>1 6
.? C
2
/ 5 A= 5
.6 5 6 / 5
6 K.
7/
85 M
>1 8 05
73:
numerator
86
denominator
36
;
>
ifm
rational.h
class rational {
public :
// POST : return value is the numerator of * this
int numerator () const ;
// POST : return value is the denominator of * this
int denominator () const ;
private :
int n;
int d ; // INV : d != 0
};
5
/
01
>=
:
A=
>=
/=
06 <;88
7 / .=
= @
/5
/1
8 /=
/
.5
/
0
8: 5
=
; 81
9
1
6/ C 5
F 2
/ : A5
01 / 5
@A
C1 =::
C G1 1
3 88
5
7.: F 6 / F
3
/
.6 5
C.1
73.
31
/ V
01
31 F
8
/6
31
;
K
-.
2 A1
C
=
O1
73
6
F
E
f
7.: F / 05
.5
/
.6 5 / 01
6 H G6
F
/ @>
01 6
8= = F
C1:
C1
A= C
:88 3 G1
.= 7. F
:
G1
=:: .6 / 5
1
881 6
F
> =
3
C G1
6
C1
3
C G1
C1
3
.6 5 O21 C1
? C G1
.5 3
88
O1
231
01
/ 9
*this
numerator
7 AF
/6
781
G1
9/
6
7A
K T
K`
/
.6 5
/
.
: P1
. 5 C1
I C
71 3 G1
8/ F
.6 5 7.:
/
8 5 .6 5
2 86
7G
: A5 F
/
36 01
8=
423 5 C1
= :
K /1 A=
88
M 3=1
01
K
.= F > ; /5
. 05
3
98
C G1
C1
A=
3.7
31
/1 5
/ 5 8 /=
88 . 05 / 01
. C1
/@
21 C1 7 C G1
/ C C1 3
36 0 3 G1 3= 6
/6
7B 7.: F 36 F
0
/ 6 /5 /F
01 . 01 K
;8 3
C1 9 = M
1 / 01
C G1 : .6 5 :
3 .= = A = A
=:: = . A
1 86 A 7
88 =: C G1
6 : 3
231 1 K
= 88
3 /6 C1
/
A5 E C G1
\1 3
31 01
=: 8
361 F
36 F
78 6
/6 /
1 >6
01
3C1 O31
98
9
0=
6 23
9/
7A 1
8
1
> 86 5
O1
>6 .
21:
/ 5 H 86
k/
F
/
YA 01
/5
A
C1:
8=
3
Access to members within member functions.
35
5
6/
F
Member functions and modularization.
8
A=
88
: /6
8
881
1
=::
9
*this
23
C G1
C1
3
/9
AA
/
n
01
>A1
9F
01
/
3 01
/
01
6
88
B3=
31
6
81
/
. 01
n
/
88
A=
01
=
:
.=:
C31
M
F
36 F
O1
=
C
2
; A1
/
: 01
78
/6
C31
:
.=
;
21
6
=5
GA1
K
4
=5
GA1
3=
-.
A=
88
: 01
/@
/
F
2: 5
=
@ AA
=
; 21
/@
85
.=
4A
=
A
71
6
88
85
.=
O1
231
.6 5
6
=: F
h 8 A=
=3 8 /@
1 21
/ 6F
: 01 93
=
AA : 05
3= = 0
B
7 C1
.C1 C
;<8 / 3 G1
.= 7. F
:
>
6 /5
8 5 .:
/ =
01 AA1
C1 >
C G1
3 C6 ;K
8 /: KK
= ;
81
;8
/6
K3
31 A=
8 5 31 : >1 ; 1
= ; >
231
6
88
1
=::
K;
KK
;
K
h
H
E
C G1
C1
.7: F
/
.6: 5
=
AA
85
3
A
=F
6
O /=
01
@.8
31=
B.1
M
Member function call.
-.
private:
5
18 / 8
F.7 K AF 2:1
:
5
31 ?
/
8=
.6 5
31
8
3=1
.6
@A
86
31
C1
4 A1
/5
C1
.=
8=
/
36 F
86 A
31
/
: 01
331 F
1
78
/6
>
/6
C
1
=
;3
8
G
7/
.
6
/
6
36 F
F
/
C1
: 01
C G1
A=
3
8K 8
7.: F
/
.6 5
86
3
C G1
1
: 01
/
/6
78
: 01
K8
3
C G1
C1
/=
// get numerator of r
// get denominator of r
9
5
31 ?
8
4 0=
1
/
01
8=
C1
C1=
.
.5
B
36 F
8
21:
88
1
:: Y
>=
/@
85
4=
3=
-F
class rational {
public :
// POST : return value is the numerator of * this
int numerator () const
{
return n;
}
// POST : return value is the denominator of * this
int denominator () const
{
return d;
}
private :
int n;
int d ; // INV : d != 0
};
/ 6F
01
C1 01 / 01
8 = :
2=: >1 A=
1 3 8
? 8
k H A1 >1
.?
/5
.6 5
;
/
01
9 F
1 .7:
9
6 6 /5
7A .
> .
/ =
. 01 C1
9
3 C
/1 5 78 /
.6 G1
@A I
/ 7=
01 A5
: >1 1 ?
>
3= A= 9 5
/ /0
.6 5 /
8 : 01
=E
8 A=
78 88
7= .=
9 A C1
K
/5
. 05 -.
.
11
1
.=
.
.
O1
231
;9
K
.7: F 7.8 5
/ B
.6 5 / 01
<;8
.8: 5 C1
1 C
/ 3 G1
@ 01 =::
3=1 18
86
: >1 21
3
31 A= = /6
> 3=
8
36 F
rational
9
7
9/
1
7.: F
6 /5
3
C G1
C1
= AA
=
: /6
/ C1
78 C3 G1
/6
C31 7.: F
6 /5
M .
05 8
8 =
. \5 86 F
6> 3
=:: F >=
/=
1
88 C1
/6 C
/ 3 G1
01 k
31 8
=
231
23
4
.81 = 5
/= /1
/
.6 5 C1
85 C
O1 m 3 G1
5 F
GA1 7.:
/
.:8 5 .6: 5
1 =
/ .
: 01 .6
63 /
31 : G1
8
2.6 = A
A1
. >5 @ >
B G
: 01
public
.=
const
=>
3 >1
36
-.
= .
423 5 . 6 C1
= > / C
26 G1
/1
88 3
6E
5
GA1 .7: F
/
39 01
/6: 6 / 5 K
.
5
; 81 K . 0= 8:=
@6
Y B1 .
71 8= / 1=
.: B1 4 01 8 5
6 .1 = @ A
73= 3= 71 A G1
=
B1 3 A 86 >=
7
F
/ A1 / 2
: 01 6 01 /1
>
F
78 / >= /6
/6 7 0 /= =
.
K H C31 ; C G C1 91
/6 = A C 31
=:: A 3 G1 231
>= 8
1 /= / .81
36 0
88
/=
/ C1 7 6 / 5
01 C B V.
0
;
>= 3 G1 /
/= 86 01 / 55
7. F 8=
C1 =: F : 86 A
C G1 A= .6 / 5 8=
3 8
1
;<8 88 8 ; F
9 06
.8: 5
/5 7 A
1
0
/ >G1
/5
01
85
7
@B: A
.6
I81
7.1
:
1
8
C.1
/
.6 5
1
>
.5
-8
8
71
=T
4 G6
1
int n = r. numerator ();
int d = r. denominator ();
/ 36
@9 \1
@0
.=
=
8
3 /1
85
=\
2
21=
3
8
.5
9
01
The implicit call argument and *this.
7
B
3
Y
Const member functions.
5
.5
2 A=
/
G1 86 5
.
361 F 6
F
5
.7:
2 A= / 0 / / 01 / F
. 5 .1 5 .6 5
: 01
8 =: : H A=
=
/
01 0 A 8= 5 8
= C1 K A . 8 /@
2
21
21= C
6 F
3= 3 G1
93
.: F
1 7.:
: 05
6 /
9 0
F .6 5
;
% 1
/
01
.5 4A
/ =A
01 71
9 /
26
06 01
:8 /
841 7.: F
.6 3
= /
A 65
>5 11 F
7
1 ;.
6. / 5 3
=
8
@C= .
86 /6
>
F /
36 /
/ 05
0
01 8
85
@C= O 1
/9 C 5
. 23
6 2: A
6 1
5
/ 88
5
C1 : /
G1 .6 5
C G1 = A
C6 = E
3 =A
3
>5 2
7. F B7
1 ? 21=
/6 5 C1
> 3
. .
@G .5
8 /
B
O1 >
.=
>
/
>
A=
3
8H
e
b
cj
fb
d
i
C G1
c
e
b
a
C1
gh
6
; 21
O1
2 A=
.5
1
>
.5
:8
88
:F
6
371
1= F
/
=5
A
21:
8
8= 5
0
85
3 A=
k1
: >1
F .7: F
/
.6 5
K :
=
1: AA
= 1 >6
AA 8
8 .
7: 6: /
= 0 0=
.
C1 B1
C G1 /
3 4 01
=
7.: F A
71
/
.6 5 31 E
= 23
181
.
/1
>
@ G
$ /
4 01
=A
71
86
K /F
01
>=
/=
6
.=
K T 6 G1 F
KLR H 31
/
@ 01
3=1
K
/
.6 5
: P1
d
5
=/
2: A
C
5
/-
O1 /
6
.8
1 >6
A= =
G6
3K /1 41
K
r
31 F
8
/6
/
01
31
.
.7: F
6 /5
n
*this
.
r.numerator()
r
public:
// PRE : d != 0
// POST : * this is initialized with numerator / denominator
rational ( int numerator , int denominator)
06
/6
/
0
85 K
. 05 37
k
/ A1
0=
/ 6 S3
236 B3
=
B3=
C
,;C T
7B
/A
rational r;
=
/
.6 5
21
26 6 / 5 =: F
88 . ; /
9
5
1
A1 G
: /6
3: 5
23
47C K 46
.1 M >1 5
=: / 8 05 =
>1
.6 C= = F
8 /3 8: \1 7 A
:
7: A= 6 /
/63 8 .
: 8 8 /3
= /@ 7:
AA 21
. 5 8 3 /6
8=
: >1 1 F 9 5F
3 1
A=3
/
. 5 . 0= 9=
.
B=
4 7. F //
3= >= : 01
=5
6
GA1 .C1 C
/= 2 A1 5
A 3
/@ /6
21 =:
;8 :
1
.8: 5 2
1 //
/ 5 01
C
/
.5
5
= /5
^ 1 A5
8=
3=
/
.6 5
= K
.A
7
C G1
3
36 F
/
781
31
8=
71
=
/@
06
F
;
K
:
8
>1
=F
7A
/:
.6
8 /3
7:
3 /6
B
. >5
2.6
1
336
3=1
K;
KK
E
E
fH
f
; H
k
A5 32
=F K 8 / 181
]
@
.
J 7 /A ; /
. 5 #' 4236
/
5 01
= / 5 23 5
>1
^ = A5 6 . >5
=F
2
1
B
/ 3 =
7: A
/
.6 5 @ A
6
9 . 5 >1
.
=
F
8 /3
/5 /5
4 0 = A5 7 /: A
:
7
^
5
= 1 6
A K > .
3 /6
71
8
85
-.: : /3
/
7
01
811 = /6
3
81 ;
7.I
C8 6 9
5
7:1
/6 / F 1:
01 =
.6
G1 : .
8 /3
/ 8 A= / 0
7:
: 01 8 78
3 /6
.=
C=
9
.6:
\1
/5
=5
0
8
.=
A: 6 E 731
1
3
: 06 5 .= / 0=
C
2 /@
; 1 @= /:
=. 3 A=
36 F
5
> / 0 88
C=
C1 /@
A
31 01 : / 5 21
3=
4
B
7
8 5 /@ = A
C.1
/ 21 71
01 ; H 8
/
>1
A
71 3= f
8: 1
.= >=
/=
: G1 C1
6
4. C
G1
31 3
C1 /1 <;8=
C G1 /6 > .
>
3
<;8 / G1 3 01 361 F 18
21:
4 / 5 K;K
1 K;
5
O81 >= 1: /= 7 /1 C1
; > C G1
.= 3 3= f
> /@ 1
. 5 21 O 1
/ K 8 23
01
1
63 M 8
68 5
01
.
3 >1 81 8
=
21 K;
98 KK
6
> 481
A
/6
.5
5
= /5
^ 1 A5
/
01
>=
/=
4
/
h
-.
01
/
F
(
3 /6
7:
8 /3
.6
: 01
/
86 /
C.1
7
B
01
36 F
C=
A
3=
3=1
36: F 36 l
A= F
88 7.
/@ >=
21 C.1
;<8 /=
/ A
01 /@
<;218
>1
= F
J7
. / A5
= / 55
^= A5
5 /
=8 .6 5
7 /6 A1
4=
C= 1
: /5 8
= / 01
@: AA 4
=
= A
AA1 71
> .5
/6 I
. 5 71
5 8
= / 5 .6 / 5
A^ 5
1 7.
/ >1
4 01 . ?
= 1
A ; >
K 71 G
-F 7 /
K
;
KK
;K
1
31
;
K;
KK
E
fH
f
K;
KK
F
. 5 -.
5
= / 5 : P1
A^ 5
= 6 /5
/ .
.6 5 K
/ K
0= ;
/ 9
/= 1
\1
8 4 0=
2: A= 1
1 .5
. 5 6 /3
: >1 7: >
1
3= A= >
/ /
.6 5 01
8 3 /1
A5
\1 C
( 36 F
/
01
. \5
6>
;
E
;
; H
k
h
ch
c
c
c
H
E
36 F
=:
A=
88
c
8= 5
8
6F
A
9 A6
K8
0=
73.
31
=
1
4 0=
6
1 >6
8
.8
.
M
/@ ;
/
/
/5
@ /A
.
6
7.1
I81
.6
:>
; 21
.=
/ 8 05
:8 5 . 55
6 /
KLH . = A5
8 /3 ^1 5
7: 8
/1 .6
> /
@ G 3 >5
/ 1:
01 /
O1 @ A
3F
2: A 6
5 C
/: 5 6 /9
.6 . 5
8 /3 /1
7: B31
3: /6 ; 8
G
= 7/
AA 36 F
C=
.
O1
231
88
.6 5
9E 6
: 05 /@ F
0 21
86 5
F
/@
21
/
/
.7: F
6 /5
3 01
C6
8
36 F
3 /6
7:
8 /3
:
6
/ .
=
A
71
K
/
.5 :
= Y
4B 5 8 A=
.1: 78
8
.6 7= A
/1O @ A
/ 0=
E 8
78 481
.5 1
B 3=
/ :A
01
3 .6
7 A1 8 /3
86 7:
46 F 3 /6
31 <;8=
.
= A6 >
. >5 / 01
B3 :6
1
86 C
A
7 / 2 A1 5
3
.6 5
;
?
811 B73
1
/ 86
01
7/
1 9
/= : 05
5
8A 0
.
C1=
31
37
8 5 4.
6
F .1
M : P1
01 6 / 5
@.8 .
O /= K K H
6 L
=: F
.6
8 /3
7:
3 /6
>1
.?
/5
.6 5
6
M :Y
01 6
. .
= 8
/3
C1 7:
6 /6
=: F 3
85
.6 =
8 /3 281:
7: = 5
3: /6 A
6 C1
.: 5 C G1
5 3
>1 F
98 7.:
/
/ 5 .6 5
0
/ /
01 0=
. /
= 23
C1 4 6
6 5
F >1
/ 8
: 01 8=1
F
A=
88 . 55
/
.= = A5
^= 5
>
/
/ .6 5
05 6
8 :
> F
8 5 A=
. / 5 488
B =
75 A
8 71
01
8 K8
01
8=
C1
/5
=>
/
/
C1
.
/@ F
=c
21
>1
.?
1
8
4=
3=
=5
GA1
6
.5
5
= /5
^ 1 A5
h 85
K
/
@: G
=
A
. A5
B
/
01
=
2
236
23
=5
/1
M 8 /3
: 01 7:
.6 3 /6
8 /3 9
7: : / 05
3: /6 =
AA
.= 3=
= B
86 A 7C1
.
: G1 8 /
= AA1 O1 > 2: A
5 ;
5 K
@ / A KK;
=
8 . 5 :
.6
4.3.4 Constructors
-.
0=
3 /6
7:
8 /3
.6
=:
85
31 01
8 5 9. 5
B.6 5 : 0
31 5
0
> / 01
G
7 / C1
/5 C
8 5 3 G1
B66 8=
31
>
23=: : >1
A=
: / 5 31
1 >
/6 . 5
/
781 : 01
/ 8 A=
01 K 8
: >1 -.
6
3= A= /
01
/ 3
.6 5 9 6
3
36 >
>13 <;8
/
01
31 01 36
= 3 >1
98 . 5
1 /
AA 01
-F . 5
= = / 55
>= ^ A5
/= 31
K;
KK
;
h
c
H
E
01
/
.6 5
3= A=
: >1
; A
/
31=
B.1
-.
;
9
6
1
7A
>
36 F
O1
=
C
2 A1
9
3
/1 5
9
.5
4=
3=
=5
GA1
: >1
3= A=
/
.6 5
3 /6
7:
8 /3
.6
/
0
8: 5
6M
781
int rational :: numerator () const
{
return n ;
}
int rational :: denominator () const
{
return d ;
}
5 : >1
6 A=
/ 3=
;
3
5 ;
.8
6
/
5 A5
AA 8 /1
18 >
/
36: . 5
/
01
. 0= . 5
B1 / 5
/ = A5
4 01 ^1 5
= ;3
A
71 / 5
86 8 5
F >1
86 = F
C1 J 7 / A
6 .5
F
/ = / 55
01 A
>= ^1 5
/= K >
C1 -.
C G1 : / 01
3 6
8 .
8 /3
K
7:
/63
G6
@>
C G1
C1
;
9
F
B
9
K8
=H
8
6F
AA6
.: 5
A
7
. >5
3 /1
=>
.=
/5
. 05
.
=
C1
8
2=:
1
01
/
.5
B=
=E
A1 ?
>1
.?
/5
.6 5
98
6
7A
>
/
. 01
=
2
21=
3
.5
/
01
86
73:
1:
6
>1
B
. 05
C=:
M
rational.C
.8
rational.h
.5
: P1 M
/ : 01
.6 5 =
3
K 1
: 7F
A
.6 3=1
/=
. 5 3 >1
8 9
/ 5
01 . AA
: >1 6:
/5
3= A= 1
/ / 0=
.6 5 /
8 /= / 01
3
/1 1
C.1 C7
/ 8/
G1
.=
O1:
/9
rational
. 5 36 l ;
9
/1
B31 / 01 1:
K 8 /@ .=
21 8 /
6
ifm
{
: n ( numerator) , d ( denominator)
}
// somehow check that d != 0
rational r (1 ,2); // initializes r with value 1/2
rational r = rational (1 , 2);
r
rational(1,2)
rational
rational
4.3.5 Default constructor
rational r ;
0
rational
// POST : * this is initialized with 0
rational ()
: n (0) , d (1)
{}
rational r
T
e
e
b
cj
i
gh
fb
d
c
b
a
/@
0=
5
/
GA1
5
/=
>=
05
5
O1 >
=:
@ /A
/
0
85
>1
/6
73
/
0=
9/
1
.
11
>
/6
/=
5 \1
.
C1 9 6
K
/= C G1 K
\. 5 3
B 7.: F
;
/
01
36 .6 / 5
A1
6 =E
F
K 9 . /1 5
M $
= J3
05 8
8
*this
@ /A
8
31: >5
6
/6
>
M
= >5 9 8
/1 6
31 3
8 8\
7A G
/ 7/
85
.5
9 1:
: 05 1 5
0 ./
85 :E
8 6
7 .
I81 G 8 5
>1
7.1 3
A=
@: / A 3B1
3
6
21 5 8 /3
:
> 7/
G=: ; 8 H
\
. 5 .8: 5
/6 1
9
1
-. 3 ?
=: F 8 /:
/ .6
8 /3
7:
/
.=
a
C1
01
1
4=
Y B.
85
a + b
/
operator+
G1
6 F ; H //1
3
A
9 A6 4 0= 9
K 8 . 5 @=
B6 /6
.
@ A B6
.6 8 5
1 /6
36 F 31=
C= ^ A5
A 1
3=
B
7
C.1
/
E
36 F =
8
; H =
.= 27
> : GA
8
=
8\ b
B
C. 5
=::
1
8
.8 5
236
6
.8
31 01
.
.7: F
6 /5
3
C G1
// POST : return value is double - approximation of * this
operator double ()
{
return double (n )/ d;
}
/5
. 05
/
0
85
C1
double
C1
3=
31 01
86
01
7 A1
3
\1
/
C1
C1
/ 5 68 E 1
8
.: 5 6 / 0=
C1=
3
7
C
; . 81 2 3= /
5 . 5 4 A1 1
9 F B 1 A /1 G
1 7F K 8 H 7
8 J A5
9 A
. /= . / 5
.= J 7381
3 >= A E
=: / >1
: > \1 5
6. . ?
6
4 1
4. / 01
31 6 >:
31 .6
8
8
.6 5 4.1
.6 5 31
3
3
6F
36 F 8
65
7 A1 C
.
C 8
8
8/
/
5
0=
2 /6
/:
7 A=
/1
.=
>
/6 / W
@G
G1
; H
/
31
G
01
=
7/
.: 5
; ^ 1 A5
9
1: >
.6
8
@G
. /= = /3
.= :
8
W .6
3 >= //6
=/ 8
;
/3
>
> :
9 /
=> J7
1 01
36 l
O1
=
C
2 A1
rational
double
>1
8
8 26
.6 5 .
8 . >5
/6 B:
86 .6
C1: 8 /3
:
A= 7
88 3 /6
/@ /6
21 /
01
c
/@
C5 2
B 1
0
./
6
/
G1 ;
26 .:8 5
88 1
5
GA1
.5
/
05 8 5
9 8 .6
=@k /
=:
5F A=
c 88
5
.8 /@
6 21
/ K
6 4Q
73 .1
M
C=
double
3 /6
1 K8
:
336
int
21
/@
rational
:8 5
= 5
A1 A O81
K >
21:
5
/1
/ V>
0
781 . 5
3J /
>1 01
.? 5
1 C
: > 2: A5
.46 /: 5
6
31 4.
6.8 5 31
;<8 .68 5
9
1 /
B6 0=
/
/=
@6 G1 \1
. 8
> 2
/ : A=
01 ; 1
81 /
6 / : 01
F 4.6
1
3
. /5
B
3 /6
7:
8 /3
:
.6
9
.=
1:
>1
/@
06
5 18
4
9
21
=
3J
781
>1
8= 5
\1
A5
/6
>6
8
78
=
AA6
7:
8 /3
.6
8:
3 >1
: G1
/
.
/6
;3
K
=
4 01
B1
. 0=
:
/
A
8
C1
6
05
G=
0
7.
7/
]
3 >1
A :=
.7: F :1
/ 88
.6 5 31
8 8 /3
:5
8= Y 6 / 5
. .
O1 <;8
= /
C 31 01
2 A1
: 3=
.6 1
8 5 86
3 >1 C1
/
. 05
B8
/
0=
9/
M 1:
0
86 5 .=
.
321= 6 /
3 /6 >6
. 23
11 6
8 > 231
/6 @ A
B A6
7B
/
36 0
operator+=
71
/ 6
0
K 8 K 85 =F
3
1: = / K
.6 5
.= =
A
.6 .
@A 7
C
8 5 3 G1
C7 ; ;
A= G
/1 7 /
/ / 01
: 01 31
5
. 0= .8
6
B1
/ 8
36 0 21:
:5
7B ? K
0 C1
/
01
= C3 G1
>
> F
/ 5 7.:
.6 5 /
65
.= .
>= /
. / 0=
/
; /
C.1
B. 5 9
88
=
. 01
41
31 K =
36 F M05
8
C= 6 F
A 3
7.: F O1=
/
.6 5 C2 A1
3=
B C1=
7 .
C.1 8
/
6 / 0=
F /
05
.?
1
=: = : >
6
= 71 A 4.
AA 8: 31
3= .= 86 5
.
B
7 G1 3
C.1 : 6 F
6
6 / 4. C
F 31
/@ /1 /6
21 >
/6
4236
9
int
6 A6
6
:
31
4.
rational
rational
int
: / 5 2: A5
= /5
@ AA 31
4. 5 73 /
6 .
\1 /@
9 > 21
. 01
4 1 .=
31 . >5
/ >
0 :
8 5 71
85 8
C
8
0=
\1
/ ;
0
K 8 5 36 F
O1
=
C
2
; : A1
6
7A
>
G1
. >6
1
/
36 0
7B
=0
C1
C G1
3
A5
rational double
operator double
/6
8 5 /@
/
7= 21
6. / 5 G E
<;98 7 /:
6
1
8 5 C18
C 3F
@2 A 6
/1 C=
A
A A5
3= G
3
/@ ; @
21 @8=
9 06 ; 9 H
5 1:
48 / =
= ..
A
71 6 /
8 8
8 5
06 C
7 A @2 A
> =
: G1 >
6 >
4. =:
6
31 .
/1 8 /3
> :
/6 7 /6
/ 3
01 /6
3 /= K c
B1 -.
/
/@ 8:
2K 1 7
0
double
C=
.
7.: F
6 /5
3
C G1
C1
operator
7 /6
01
; A
/
.7: F M01
:
/ 6
.6 5 4.
. 31
=
8
C1 .6 5
> 3F
6
C
// POST : * this is initialized with value i
rational ( int i)
: n ( i ) , d (1)
{}
;
/
/
8= 5
21
>1
.?
1
>:
6
4.
31
8
.6 5
/6
/
01
31=
B.1
-.
;
A=
88
36 l
/
: 01
3 /6
7:
8 /3
.6
: 01
21:
8
=
/
*
K =5
36 A
k A1
/
@ 01
3=1
( @
2 A=
C.1
7
/ B
/5
0
.6
1
3=
.6 8 /3
7:
3 /6
98
4.3.6 User-defined conversions
8 /3
G :
/ 5 7 /6
. A1 3
B/ 6F
@k 0 33
H 1
/
73.
.5
B=
31
8
7
K /A
Y
>
>5
6. / 5
36 F
O1
=
C
2 A1
/
. 01
9
36
8\
A5
\1
/
0
85
.= E
>
: G1
6
C1
8
=
.=
C6
/@
/
0
85
.5
/
73.
:
=
A
8A
/
01
>1
=F
7A
/:
.6
8 /3
7:
3 /6
6
F
/
: 01
336
1
8
2.6
; 21
88
A=
:F
6
/ 36 F /
01
=: /@
C 8 A= 21
25 8
A1 9
;3 5
=. /
06
> 7/ 5
/ 5 .= 8=
8 5 @: 8
C 6 : /3
@2 A . 7
8 9/
>1 /3
= F 7: / 5
06
J 7 / A 3 /6 7
/
;
<
8
=
.5
5 / @.
= / 5 01 :6
^1 A5 >1 .
8 = F 8 /3
/ 7 A 7:
01 /: /6
6
>= . 3
/= 8 /3 K 8
: M
C1 7 /6 8 05
C G1 3 .8 55
5
V38 8 5 =: F
C
5
/
= F 2: A5 /
01
5
>= @ / A .6
/=
236 @O1 A
C1 4 :
5 1
C G1 >1 2
3 > 6 /5
k.
85 @G
6
: 01
7.: F YAA
/ 6 / 5 .7: F
01 .
>= 8 6 / 5
/= E .=
A
C1
/@ 5
6
C G1
3 ; 3= F
8
/
5
.6 5
.8
=
6
.A
. A6
7
C
B31
;K 3 G1
26 KK 8
88 H / 0=
5
GA1 C 9 /
78 1
-. .6 / 4 0=
8 /1 9 1
=
> G1 23
9 31: 41
1 6 65
9 . 7
8
AA5 8 >1 5 @ A
781 31 4236
/ ; > 5
01 .:8 5 >1
>
C1 1 /
30
C G1 31: >5 6
7B
3
@ /A 0
7.: F =: B :
/ 1 A6
.6 5 J 8 G= A
8 8
B
.5
. >5
/8 5 B:
321: 8 A=
K8
73 M
386 8 05
>
@ 5F K
.5
B=:
:
1 ;
88
/6
/
01
31
231
.81
/=
/
.6 5
;
=.
=: >
6
J.
J
36 F
.
.6
>
C
0=
8
.5
3 01
/1 5
>
36 F
O1
H :1
/? 2
. 5 6 /5
/6 .
/ 0=
: 01 8
A= 1 G1
.
:88
6. C=
:
1 >1
2 / 86
6
F / 0=
/
K 8: /3
7
8/
9E
: 05
0
denominator
C
F 3 G1
;
3J
781
=
int
.8: 5
1
/
01
=::
1
8
381
8 /3
:5
/
.6 5
8
>6
.
6
=/
88=
1
1:
rational
numerator
2
@2 A
/6
C1
C G1
3
7.: F
/
.6 5
K8
M
4 8 05
31
8
.6 5
6
K
@3
.
rational
4.3.7 Member operators
operator+ operator+=
// POST : return value is the sum of a and b
rational operator + ( rational a , rational b)
{
int rn = a. numerator () * b. denominator () +
a. denominator () * b. numerator ();
int rd = a. denominator () * b. denominator ();
return rational ( rn , rd );
}
// POST : b has been added to a ; return value is the new value of a
rational & operator += ( rational & a , rational b)
{
return a = a + b ;
}
operator+=
a
// POST : b has been added to * this ; return value is
//
the new value of * this
rational & operator += ( rational b)
{
n = n * b.d + d * b. n;
d *= b.d ;
return * this ;
}
operator+
e
e
b
cj
i
gh
fb
d
c
b
a
7/
numerator
denominator
01
8
/
01
/@
21
.5
6 /3
>
7:1
8=
.
91
.
=
C1
36 F
.=
O1
85
. /5
B
'
Y
.5
36
3 >1
36 F
/
0
85
/6
9
36
K \
36 l
O1
=
C
2
; 4 A1
=
A
71
86
F
/@
21
/@
21
31 A
=
@>
811
.6
1
6
F
/
01
236
231
1 /5
8
/
0=
/
/
01
.
1
8 /1
>
=
1
31
/6
/5
GA1
C7
8
5
K / /
4 0=
1
4
: G1
8/
.6
C7
rational::rat_int
int
0=
rational
int
.
>1
.?
5
6 /5
.5
/6
5
8/
C6 :86
7
@ 8 A K 21
9
/5 /
0 >6
/ 1
01 8
6 A
. > . 5
=
/3
C1 6
:
.5 7>
= 1
: AA .=
.6 9 1
O /1
/@
K 8 / 21
K
-.
-.
/
01 =: F
= ; /
4 G6 /
1: 01
6 .1
9
; >1 .
9 =
1
811 C1:
=
/ .
05
8 G1
/9
:
k1 5 781
>
@.8
6
@.
/6
.=
/
0
:8 5
; >1
6
3C1:
78
: -.
G1
>
36 F
O1
=
C
2 A1
A5
\1
/
0
K 85
781
/6
/
0=
: 01
3 /6
7:
8 /3
.6
7B
/
0
/
36 0
/
9/
1
B1
6_
/
0=
41 /
.1
71
B
C5
B
/0
3=
7
>
/: 5
73.
41
.1
G1
/
.=
>
/
31
5
231
236
.5
/=
: /0
1 /5
;8
@G
8=
/@ @. 5
21 B
.5
/1
B3=
A
.=
73.
31
/@
9
21
C5
81
.6
@A
=
9
6
.7: F 7 A
/ >
.6 5 G1
8 /6
236
86
A
7/
.6 5
3 /1
Y
.5
/
.=
k ;=
.
E 36 F
O1
=
C
2 A1
/
0=
/
/
01
/ 5 : P1
06 6 /
7/ .5
=.
. KK @6 L
R
.5 K H
B M
/ . 01
: 01 @
6
78 7:
/6 =
C1 .
K 3 .5
/1
: M1 3.
=
.: 0 @ AA
=5 :
A 0=
; @A .
/ B1
0
8: 5 36 F
=.
C6
G1 .1
.5
. >6 /1
1
= B3=
8 A
6 F /@
A
9 A6 21
K 8 /6
=
>5
311 N
.
/
.6
1
9
:
81
8= 5
15
G= . /
85 =
8 8
36 F / 01
= 6
.
C36 1
1 23
8 41
7:: 6 5
.5 7
/ @8 A
5
C 781
2 A1
>
C.1 36 F
/=
/
.6 5
6
F
8=
=
1
4381
denominator
88
A=
9
typedef rational :: rat_int rat_int ;
rational r (1 ,2);
rat_int numerator = r. numerator ();
rat_int denominator = r. denominator ();
A
; @A
=:
.
91
.
C
36 F
4= .5
B
/
: 01
6
4.
31
8
.6 5
/ =A 8
0
06
86 5 9 A6 7
A
=
>
231
= 8 A : G1
/63 B 5 6
/0
B A6 @ A C1=
G= C6
; A 31 C1
/ 1 C
06 : G1
7B 1 5 3
; 0 . 7.: F
.= / 5 /
65
> C .
/ 2 A1 6
0
8 5 C1 F
0= .
8 /=
/6 6 / 5
.
>6 K
9
M
/ 5 3 01
0 1 ;
7
J 381 86 5 .=
>1 .1 . >5
. ? 5 >1
1
1
: > C26 ; >
6. 3 /
4 /= 0
. 5
31 3 / 9 8
8 1 6
.6 5 = 7
K 8 .86 A>
/6 236
G=
1 \1 G
2 @A
numerator
C=
.5
B31
>
.1 5
/8
6
=: F
A=
K 88
36 l
GA1
1
Typedef declarations.
36
>=
=
3 06
=:
8E :
3 K
C G1
C1
=
2 + r
C=
K
>1
4.3.8 Nested types
31
/@
operator+
/5
-.
= 3 /1 881 = . 05
1 3
C1 J = A . H > C1 / 01
8 A5 = 7.8 5 6 F :
. /1 1 F C1 B 3 A=
/ / 01 88
> K
01
/6 :8 /@
:
6
B1 6
/4
21 21
1 ; >1
6
@3 /
231 K ; /
01
= -. 01
. A6 31
/6
B 3=1
; 3 / 01 /@
> .
5F : 21
71 1
/ 7 >1
/6 8 /1
01
. 8 /6 : >1 F
/ >
1
05 /@
8 /1 3C1 A=
K8
: 3=
21
>
M 86
/@ 6 6 / 5
01
21 ; >1 .
/@ .1 F
.5
: >1 / 01 /3
21 8 /1
: 6
>1 >
3= A= A= : >
F /@
/ 88 71
C1: 21
.6 5 .8 W 8=
8
1
. 0= 6 F
8 5 8 .1
58 .1
2 /1 8 /1
7G >
C= 8 /1
: A5 /@ >
AA6 >
31: H 21 /@
9 /@
E 21
8 21
41 5 / 0=
78 <;K8
1
/6 KK
8= = /:
;
.
.
=
1 \1 .
91 G1 ; =
2 >
2.1
r. operator + (2)
6
6
73:
operator+
K
r + 2
/
3 /6
6M
85
operator+
C6
4 /5
=
/1
K 25
A1
K >
-F
C
6
:8 5
.=
1:
rational
.
01
;
. 01
9
// POST : * this is initialized with value i
rational ( int i );
811
=
>1
>
operator+
36 F
O1
=
C
2 A1
9
3
/1 5
C1 C O 1
25
C G1 3 A1 23
3 = 1
9 7 886 5
6 /6 .
7 A C= 8
31 > : / 5 A\1 5
=
4C6 @ AA
1 .5
/ 381 6
01
/ 3
81: 8=:
.6 4.6
> 1 ;9
26 3 /
88 . 5 31 01
5
G5 B:6
A5 .
/@
85
6 8 /3 6
F9 7: /@ F
3 /6 21
5 3
. / 5 :=
B K AA
9 U6
; K
4 0= : -.
.5 6
B C
25
. A5
B
/
0
<;8 5
= /
8= : 01
6
r
C31
7
.
/
>
.
C1=
6
7A
.7: F @0
/
.6 5
; 1
/ /W
. 01 38 ?
8/
811
9
C1= 0=
. /
8 0=
2
2.1
98
2 + r
'
3=1
81
/
9 06
41
1
;3
9
;
: -.
/ 6
01
C
36 F 2 A5
C= . 5
A B
3= / 0
B <;8 5
7
C.1 / 01
:
/ 6
/@
21 C2
5
3 A1
.5
381
/
6 8
F / 01
:
6
4.
31
8
.6 5
.= 3 F
6
41 >
13 C /
@ 01
/ :
. 05 = A
A
9B 3=
63 B
7
8= \ .C1
O81 /
/@
21: 21
/1
>
/6
r + 2
05
01
3
;<8
.=
C G1
C1
88
A=
:F
6
/ 9
: 05
/ 0
01 C=
3 ? \1
8 /: .8
= 6
AA 81
3= .81
B 9
7
C.1 0=
/ 86 /
41
1
3
K
G1 6 91 F
F
/ 93
01 5
31 /1
8 =
21: G
4 / 5 .= 5
1: @3
6
A=
88 231=
/@ /6
3
K 21 =
- 8=
C
2: A C1
5
/: 5 C G1
6 3
4. F
31 .7:
8 /
.6 5 .6 5
8 ;
. 01
rational
r + 2
@ GA
=
86 A
9
.=
/
/6
/
@
/
3 05
>:
=
/1
B36
=
= F
.7: . >6
2A
1 5 6 /5 6
K > . 9/
<;8 36
G
7 / \01
/ k31
@: 01
/
01
.= @
. 6
6 .
/ @A
G1 =
O1 >=
21: 2: /
/1 = A
> =A
/6 3B
7
. ? C.1
>
8/
/ /6
: 01 6 F
A= 3
88 C=
9 =A
3
06 B
81 7
C.1
/
/@
21
86
0= : F
8 .6:
/6 3
1
G1 /1
2
rational
1
G=
@6
7
236
. 01
C31
/
K
M
85
31 01
int
operator+
4 0=
;
/6
: 01
78
C
36 F
3
C G1
6 /
3= F 81 01
/ ;
.6 5 A1
= /
. A 78:
7 6
C G1 C1
3
8 : G=
- \
@6 F /6
7 88
/ 71
. 05 T
=
= \ 4 G6
G6 1
7 /: ; /
01
.6 6
I81 .1:
7.1 .6:
@ / A 31
.
05 . 5
. >5 B /
B 01
/ .5
01
31 3. /1
231 = A
3
.81 1
/= 231
6. / 5 .81
6 /= /
65
=F .
Prefer nonmember operators over member operators.
class rational
36 F 1 C .6
9
int
7
/
.6 5
=
.A
3=
// POST : return value is the sum of a and b
rational operator + ( rational a , rational b)
{
return a += b;
}
G .=
>
= . 5 . >1
A / 6
71
K 8 01 C
.5
C1 =
/6
C G1 3
3 /@
21
7.: F K
/6 5 8 Y
. .5
8 : >5
=
/1
. >5
/
01
.= O 1
=
>
C
2
; A1
/
01
81
/@
;
@ 6 21
7 8
8/ C 5
AA5 B / 0
236 . 5
/1
C 5 3.=
81 A
/6 @: A
31 0=
/ .
73. B1
;
J4
2 + r
struct rational
operator+
class rational {
public :
// nested type for numerator and denominator
typedef int rat_int ;
...
// realize all functionality in terms of rat_int
// instead of int , e.g .
rational ( rat_int numerator , rat_int denominator ); // constructor
rat_int numerator () const ;
// numerator
...
private :
rat_int n;
rat_int d ; // INV : d != 0
};
// 1
// 2
int
2. operator + ( r )
rat_int
4.3.9 Class definitions
`
e
e
b
cj
i
gh
fb
d
c
b
a
>6
Linear congruential generators.
>1
5
a
K
C1 ;
; 8H
/
0
85
:8 5
6
C
2 A1
/1
@A
8
7:
.1 5
; /
.=
>
B=
B
.: 5 E
A
7
. >5
8
81
operator()
namespace ifm {
// class random : definition
8
a, c, m, x0
4 /5
1
.
O1
1/
A1
C.1
/
.5
/
01
I81
.71:
1 ;
.?
/5
.6 5
6
=: F
A=
88
random
xi
// Prog : random .h
// define a class for pseudorandom numbers .
1
2=:
ifm
36 F
J B.1
G
7/
.8: 5
1
9
1
4 0=
1
=
31 A
=
@>
81
.1
V
\1
01
>1
01
>6
6
/
F
/5
01
/
J>
C6
C
8
.5
>1
2.1
. >1
/
36 F
3
C G1
7
C.
3=
.
7
B.
C=
/
/6
>
5
/=
/
.6 5
6
F
/
01
C.1
2 A1
C
7 AF
781
.=
/
AA
. 0=
/
36 l
8A
/ KLH C
0=
/ ] 31 01
/5 7 / 6
5
.
.8 7. ;
6 /5 /
3= / / A 01
. 05 I81
8
>6 26 71
.
C= . 5 :1
/
;
3
=/
V AA = / 5 211
=
>6 2 /
@6 231= 8 5
/
7 8 /6 81 A
F
:8 >5
E
46 G1 . 5
13 23 B.1
= 1 / 31
8 /3 3 /@ ; = A
5 = /
. \5 . 01
B >6 21
8 C 3
B. 5 = E 6 5
6 /A : >
. F 06 .=
.6 7B .
3= 0 4 1
. =: 1
>6 A6 3
G1
C. 381 A6
1
88 6 A6 .
KLH \ B31
1=
431
/1
2 A1
C
6
=:
3 01
B1
7/
2
/
;
;
=
88
;
9
>
.5
/
: 01
A=
K 88
1
3 01
41 1
@3
781
G1
;
;
K
KK
;K
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
:
36 F A=
C= 88
A >1
3= . ?
B /5
7 65
C.1 .
/ G1
A
8 / 5 9 A6
8= .
/
> 01
G6 : >1
1 >5 A=
86 3=
/
= F .6 5
AA ;
C1 7 / G
C G1 / 5
3 28=
.
7.: F 8
/ / 01
.6 5
#
>1 . ? : / 5 A=
.6 5 88
8 >1
-. . ?
8 6 / 55
3 06 ; .
/ =:
A= / 88 01
;
K
:
A=
C G1
6
A=
88
21
6
A=
F
:=
:8
.
88
6 /5
>1 3
. ? : >1
/ 5 A=
.6 5 3=
88
C1
85 .Y
/ @
01
=
4 /5
1
31
B6 5
.
3 A=
: >1
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
>5 8 5
31 N =8 5
= 38 F >
/ 6 /6
.6 5 C 0=
4
5 : A6
.8 = 1
6 A
/ : .6 86 @ A 21 / E 01 : P1 K 23= 6 / 5 /. 8
6/
: >1
F KK A=
/
01 T H J 3
3
C G1
C1
.5
.6
1
=
8
21:
K /
M
01
26
. /1
= /5
:8 A
6
21
6
=F
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
.
>1 6
/:
.
?
C 5 6
/ 6 /5 .
01 . /=
86 . 5
C1 / 01
9
3 01 >1
11 . ?5
A 6 / 5
81 .
E 6
811 = F
K : P1
/ C1
.6 5 C
G1
K 3
K T 7. F
K TH :
L
6 /5
AYA ; .
C1 / 0
5
C G1 8
3 7.: F
7.: F 6 / 5
.
/
.6 5 C
7
>1 8 /
. ? 4 0=
/5 1
.6 5 =
8
/6 C=
B1 : /
/ . 05
3 01 B
36 F
/@
'
86
=
:8 5
=
A1 A
=>
21
8
1 >6
;
2
26
8= 5 18 K
: >1 /6 >
3= A= =
/ 7. F
.6 5 >=
=
98 .C1
1 /=
; AA A
G /@
7 / K 21
5F
/
01:
A=
88
>1
.?
;
/5
.6 5
>1
.? ;
/5
.6 5
.
.7: F
6 /5
3
C G1
C1
Y
;
;
;
;
;
;
;
;
;
;
;
;
;
;
187 206 249 252 151 138 149 120 243 198 177 116 207 130 77
240 43 190 105 236 7 122 5 104 99 182 33 100 63 114 189 224 155
174 217 220 119 106 117 88 211 166 145 84 175 98 45 208 11 158
73 204 231 90 229 72 67 150 1 68 31 82 157 192 123 142 185 188
87 74 85 56 179 134 113 52 143 66 13 176 235 126 41 172 199 58
197 40 35 118 225 36 255 50 125 160 91 110 153 156 55 42 53 24
147 102 81 20 111 34 237 144 203 94 9 140 167 26 165 8 3 86 193
4 223 18 93 128 59 78 121 124 23 10 21 248 115 70 49 244 79 2
205 112 171 62 233 108 135 250 133 232 227 54 161 228 191 242 61
96 27 46 89 92 247 234 245 216 83 38 17 212 47 226 173 80 139
30 201 76 103 218 101 200 195 22 129 196 159 210 29 64 251 14
57 60 215 202 213 184 51 6 241 180 15 194 141 48 107 254 169 44
71 186 69 168 163 246 97 164 127 178 253 32 219 238 25 28 183
170 181 152 19 230 209 148 239 162 109 16 75 222 137 12 39 154
37 136 131 214 65 132 95 146 221 0 187
;
;
36 F . >1 ?
C1 6 / 55
C G1 .
3 86 F
86 3
F C
G6 >5
8
: / 0 .6 5
A= /
881 : >1
K 8 A=
3=
4 /5
1
31
B6 5
.
<;8
/
31 01
5
.8
6
236
GA1
C
.5
78
.5
B
C1
.
C1
-F C
/9 G1
6: 3:
=
A= .
C1
/
01
>
/=
;3
C G1
>=
C1
=
: >1
3= A=
3
C G1
C1
8
/
0=
05
85
8
/
9/
1
B1
/
36 F
C
3
C G1
7
.F
6
1
:
01
7.1
I81
M
36
/
.6 5
= 5
8 / . =8
G1 18
: >1
5 /1
. >1 /@ > 3= A=
/5
21 6 / 5
31 ? K .
8
6 8 /=
: Y : AA1 /1
A= 4 C1
88 1 / 5 .
/
>1 ; @ A /
. ? / / 0=
/ 5 01 /@
.6 5 81= 2: 5
. 5 31 =
: A
6 /3 = @ A
> A : >1
7:1 A1 > A=
31
8=
. 8=
9 1 $ C1
/@ 6 C
21 F 3 G1
/
.= : 01 .7: F
>
/ A= .6 / 5
0 8
8 5 <;8 ;
35
.
=
C1
8
C7
.=
9
31 01
36
*
5
/5
private:
Y
K8
3 /1
C1
=
23=
; H 36 8 W
=
@C=
G1
$ 1
C
2
K /@
: Q=
0
K
01
6
1
:
E I81
7.1
M
F
1?
K3
. >1
c
8= 5 8 5
=
. .
;
Y
7
>6
3 /6
31=
B.1
3
C G1
7
C.
.
3= >6
281
01
85
/
O1 AA
=
C
2 A1
C=
8
>1
.?
1
>
@G
/
01
6F
A
9 A6
.5
B
knuth8
C8
/6
C=
3 >1
36
/6
C1=
. 5 .8
C6
18 5 8
6/
= / F
. 01
:> .
1:
.6 1
. / 5 88=
71 @3
-.
01
=
1
4 0=
8=
01
C6
V
>
K
KK
6
.=
.F
=
/
73= ; =
.A
7 C G1 3 8
>1
.?
1
>
@ G .=
/ >
01 =
3 7 A1 c
3 >1
01
1
.71:
I81
/
85
.6
78:
/
e
e
b
cj
i
gh
fb
d
c
b
A1
;
a
R
x0
.5
.
=
/
01
7: AF
A
A=
88
=
O8 Q
31:
1
96
.
/
m = 28 = 256,
21:
G1 K
.5
8
/
01
>1
T
1
A=
88
:
8=
=
21
1
c = 187,
31
/=
:
.6
9 A6
C
B3=
6 S3
/ 7A
01 7
.5 ; 8
5
43 /1 / 5
= 8:
A 6
C
C.6
32=:
: /5
1
/6
/
01
.
7
C G1
3
8
86
/
0=
/
/
@ 01
3=1
31
=
.A
7
C G1
3
8
.5
.
/@
x1 , x2 , . . .
m,
/
1
M 3=
. /5
58 B.
=: 36
.6 C= A
8 /3 ^1 5
7: >
2
3 /6 81
/ 7 >6
0= 3=
=/ .
A >6
9 A6
8 C.
/ 7
: 01 C G1
78 38
/6 =:
6
C31 36
/6 . >5
2436 B /6
5 /
>1 01
/ .1 A5
01 =
3
23= :6
= .
C1 B3
3 /1 7.1
8 = /5
A
C1
/
06
K >
31 01
. >5
/
0
85
81:
6 /5
.=
4= A1
;9
K
>1
.5
: P1
/
.6 5
6
:
xi = (axi−1 + c)
/
/@
2: 5
=
@ AA
C
B3=
A 32
> 6
4C6 B3=
1
;<8 C8
.= 06
> 7
. 5 . A>
=. 6
/
:= 9= A
/6 5 @=
. :
8
B= 6
; C1 C1
/ 72
01 9
1. 5
1 /0
C1 5 / 01
8 8=
8
06 C1
7A 6
. > A>
6
= / 4C6
9A 1
8
@= . 5
8 31
26 =:
2 6 /5
7 .
2=
/ /6
S 9
@ A= 5
. 5 /0
B =
B= 31 F
C1 8: 0
8
.6 A=
/ 88
: 01 / 0=
6 /
C 0=
2 8=
7 /1
3
9 / A5
6 / A1
7A
> C36
G1 1
1
231 .
/1
//@ 3
/=
.5
3 G6
. 5 .C1
9B . / 5
/5 8
06 /6
7 / K 31
86
C1
7.
231
: >5
/=
J GA5
31 01
a = 137,
m
B1
01
236
/
4 1 05
1
7.
231
: >5
/=
G5
A5
/@
>
01
88
k /@ 5
=:
4.3.10 Random numbers
c
/6
/6
=:
3 >1
36
-.
8=
C
/ 5 16
/
.6 5
=
: A6
.=
C1
C1
8=
/ @6
01
73
x1 , x2 , . . .
01
=
F .
/ =>
01
K C1
C G1
3
7.: F
/
.6 5
6
K
. >5 B K /6
86 M0
C1 8 5
O ? 3 /1
1 C
3> 85
7 A1 C
85
. 5 = A1
8 >
7: . 5
;B
=0
9 / 06
@= 7B ;
/ ; 0
0= 8
/ .: 5
/ 1
@ 01 /
01
.
7C
G1
/6 38
36
$
=:: > %
/1
8=
781
public:
@J A
7
81
>
: /1
K .0
I
45 5
71
.1 6
= F
B1
//
. 5
B=
I81
.71:
; 1
C=
@.
237
26
8
3
C G1
/@
.5
31
=
A5
3=1
]
7 / .B1
63 F 31
=
G1
−
85
8
/
01 Y
8
C 5
2 A1
=
.
% >
9
7
AA .
>6
3=
8
7: K C
.0
=
1:
rational
3
9
Class Scope.
C G1
7
F
−
C.
.
3= >6
7
281
6
class
i > 0.
x0 = 0.
m
[0, 1)
-$
&
(
unsigned int
*
#
+
#
-
*
'
$
+ $
'
(
'(
#
+
#
(
+
#
+
&
6_
7:
6
7A
; >
36 F
K
1
/6
/
B
/
. 05 K
.
K >6
0=
6 ;
6/
4G
65
7
98
.
/5
8W
05
7
C G1
3 K
3B1 8
. >5
7 31 N
C G1
@G
K 3 .6
-F ; 1
/ /
01 01
/9
6 2 A=
. @1
7 93
C G1 5
3 /0
8 /
>5 01 K
31 N 8
C=
@ G AA1
/9 3
6 .
7
36 C
G1
C36 3
B
1
;1 / ;
/ 8
01 2 A= l
@1 3 3F
9 6
/5 C /
0 01
/ 6
01 . K
1
3 A= 9
B31 / 5
0
3 A=
01
/ .
9
=
/5
> .5
B
6F
M 3=
. 01
/ >1 A=
01 @
. 1
7 /3 >
C G1 =
3 K .5
8
3=1 : Q=
:
6 60
C @F
23= 6
1 7
> .5
-F >1
/ 2.1
@ 01 >1
3=1 . /
I1 @9 A
7= 3 5
A /1
/ 8
01 >6
9
B= .
C1 .=
8= 5 . 5
/1
3= > B31
9
G1
-F /9
/ .11
01
.=
88
.6 5
/
0=
/
>
/5
@6 0
73
3F
.1 5
9>
05
A1
9
@
@6 /
7:
6
7A
2 A=
C1
B=
8= 5
311 h
ch
H
K
3 /6
@ /6
B.1
31=
K
0=
/
.
.7: F
6 /5
3
C G1
01
C1
8
.=
1:
M=
=
781
G6
0 .7
85 >
C1= 36 F
.
8 / 01
/ .
0=
/ 7
C G1
3
6
M
7F
26 B1 A
88 .1
5 3
@ GA =
/6
B1 ; 3
/ 8
36 F .: 5
1
C
/
01 5
8
B.1 .=
13
= 72
3 /6 231
9
;
K
811
;
knuth8
A1
3=
0=
=>
9/
1
.
11
/
8: 5
/-
@G
/
: 01
78
/6
C31
.81
06
:>
811
=>
.=
36 F
F A=
>5 3
13 N B1
C= .1 C6
4 G6 . / >
1 7 77 A
8
5
38= C G1 /6
3 6
/ 8
3 01 / 0= /= G
= / .5
K
9
GA1 : 0
5
R
.5 =0
/ C>
01 5
/
Y /1
2 @ >A
2.1
A6
O >5 6
8\
-. =
B.1 / G5
31= 7. F
A @.
5F ; H
.=
>
5
8= 5 46 /
. 1
O1 3 A6
231 =
>
88 8 /
6. 5 01
6 F
86 C1: A= 88 ;
.
01
0=
.7: F
6 /5
M
.5
6
73:
=
81
/E
0=
/W
98
@0
5
8/
: >1
3= A=
/
.6 5
85
8/
C.1
7
B
3=
6
.8
%
>6
8
6
>6
6
8
3=1
/ 3 /6
31=
B.1
3
C G1
7
C.
.
/= G
3= >
C.6
@A
781
C
@:
.=
.=
.5
1
>
.5
C. O1
7 =:
C G1 @ / A
3
8 /
. 5 05
98
=
K@
3 >6
7
281
73.
31
36 l
O1
. >5 =
B C2
/6 ; A1
/ /
01 01
23= 91
= J AA
C1 .6 \
3 /1 9.
8
B.1
31=
3 /6
36
=::
%
drand48
+
! {0, . . . , 232 −1}
double
1- B=
8
/
C G1
.5 3
3= B1
43 5 8 /
1 8 36 E l
7. 36 F
/5
A C
.6 /
1 01
6 6
@ 6 F .1
9
73 5
7. / 0
86 / 01
7/ 8
6 C=
:F A
= 3 A1
8 .
0
.= 7C
> 3 G1
06 K
21 6 _
7F :
@ AA 7=
.
/ W5 3
@86 1
21
73 = /
3F /
.1 5 8 05
> H 7.
/5
A
= /3
7
01
O1
321
k.
.7: F
6 /5
K;
;KK
E
: 05
0
m
; C1
@
2 A=
/6
@6
7
/
. 05
=\
G6
7/
9 06
-F
01
/ .
\1
=
A5
>
c
EH
/@
Program 35:
#
+
#
'+
31
81:
@ /A
36
A
=A
: >5
1
.5
41
1
@3
36
7.
>
.=
9>
3
/1 5
9 >6
.
/
01
.
7
C G1
3
/
0=
/
/5
8
9 06
K8
;
/ 6
@6 4 G
65
73 7
3 F <;8
.1 5 / 06
I> 7
kB
7: 5 0
@
@ \A 6
A1 78
3.= 06
8 7 A>
/6 .
O1 6
/
2 A6 93
/ 5 /1 5
/
0 >6
85 9
@G .
9 /
3 01
5
. / 5 8=
B C1
9 >6 .
. 7
= C
. 3 G1
7 .5
C G1 41
3 1
/ @3
0=
/ 36
= G1 7.
/ ; >
@86 .8 5
:
73 1
. 01
h
H
G1
781
:
.=
9
21
c = 11,
2
( +
'
2 +
6 _ C G1
7 3
8 @E
06 G
7 A >1
> 8
/ B. 5
31 01 6
F
361 F /
01
= B=
>
> C1
86 ;
/
C1 05
8
.7 8= 5
231 9 A
: >5 @ =
/= 8
G5 268
A
/@ 5 8 G5
A1
/6 L
K H
@6
73:
: 06 5
1
8
7
.
h
/
The game of choosing numbers.
# +1
+
$
2 A1
C
=
O1
E
. 01
a = 25214903917,
.
.
random
(+1
,
'
8/
/5
0
1
+
;
KK
C.1
7
B
3=
operator()()
+
(
(
(
// Prog : random .C
// implement a class for pseudorandom numbers .
(&
xi
operator()
#
random
'
x_i
# include < IFM / random .h >
operator()
9
K;
;KK
operator
operator()
;K
5
47 5
=
. A1
/
/6
=:
=
6 AA
/F
01
C1
C G1
3
7.: F
/
.6 5
I81
Program 34:
'+
>=
private :
const unsigned int a_ ; // multiplier
const unsigned int c_ ; // offset
const unsigned int m_ ; // modulus
unsigned int xi_ ;
// current sequence element
};
} // end namespace ifm
(
72
36 F
/
7.1
1
: /1 31 01
O1
1 8
6 / 85
23
F 01
/ 4 / 01 18
01 =
8
A 5 .6 5
K 71 C
6 2 A1 F
/ C1 K 01 .
/=
>= / 91 /= .6 5 5
6 AA
C1 F 811
C G1 / 01 :8
3 : 7
A= : 0
88 = A
8A
/6
.5
G1
S3
/ . 5 36
B=
01
31 9
8 : C
21: 05 T
4 / 5 9 0 .=
1 1 >
.
O1 811 6 S3
B3
1 / 9 06 =
A1
C`
T
.C1
G1
/
.5
9 A6
K
/
01
I81
// POST : return value is the next pseudorandom number
//
in the sequence of the x_i , divided by m
double operator ()();
class random {
public :
// POST : * this is initialized with the linear congruential
//
random number generator
//
x_i = ( a * x_ {i -1} + c ) mod m
//
with seed x0 .
random ( unsigned int a , unsigned int c ,
unsigned int m , unsigned int x0 );
namespace ifm {
// class random : implementation
random :: random ( unsigned int a , unsigned int c ,
unsigned int m , unsigned int x0 )
: a_ ( a ) , c_ (c ) , m_ (m ) , xi_ ( x0 )
{}
double random :: operator ()()
{
// update xi acording to formula ,...
xi_ = ( a_ * xi_ + c_ ) % m_ ;
// ... normalize it to [0 ,1) , and return it
return double ( xi_ ) / m_ ;
}
} // end namespace ifm
[0, 1)
m = 248 ,
6
e
e
b
cj
i
gh
fb
d
c
b
a
private :
// p_upto_i is p1 + ... + pi
const double p_upto_1 ;
const double p_upto_2 ;
const double p_upto_3 ;
const double p_upto_4 ;
const double p_upto_5 ;
// the generator ( we store an alias in order to allow
// several instances to share the same generator)
ifm :: random & g;
return value is the outcome of rolling a loaded
dice , according to the probability distribution
induced by p1 ,... , p6
int operator ()();
36 F
=0
E
/ C/ = H
0= 01 .
9 / >= >
= /=
8
4.1 236
4
86 55 5
. >1 E
1 ; >
> =
@G . L
K HH
/ />
01 01 M01
5 :
4231 C .6
2
A1
65
8
78 C.1 7: /3
I1
/= /6
7= 6 / 5 3
6 /5 . . 5
K . 6 F 6 S3
B3=
@=
9
01
\1
.
>6
A5
p_upto_5
3
5
J B /0
6
2.1
K
.5
/6
.5
9 ; =H
1
46 .
>
31 /
A6= 01
3
> .=
>6
C.
7
C G1
/6 3
31 B1
= .1
^ 1 A5 3=
/6
/ 3
01 /
7.: F / 0=
/ 85
.6 5 G1
= .5
A
/@ 5 B
6 781
36 F >
A /6
. A5 =:
B /
/ 7=
01
A
: >5 @ A
1 36
.6: AA
1 / 01
B= Y
1
: >5
operator()
C.
>
.6 7C
@ A G1
5F 38
3=
1
4 0=
01
.5
43 /1
=
A
/
/5
/
.6 5
23=
1
96 K
>6
9
1
5 ;
C
2 A1
C.1
/
/
0
85
7.: F
/
.6 5
=
A
/@ 5
[0, 1)
.=
i
5F
G1
8
p5
.5
O1
=:
@ /A
/
01
C
/
operator()
8
p_upto_1
3
x
C G1
7
p4
781
p_upto_6 = 1
C.
p3
T
85 9 E
C 1
@2 A
>6
81 .
8 / . /W
/ 1
01 1
81 >
C1
C G1
3
8
>6
x
.
3= >6
p1 + p 2
7
281
73
.5
43 /1
=
; 8A
9
31 01
.5
43 /1
=
A
0=
8
. A1
B/
0
k
i
;
p1 + . . . + pi−1
0=
8
8=
5
1?
4>
=
A
71
8
21:
/6
231
=
=E
=F
35
: >5
1
0=
8
36 F
=
AA
01
A
0=
01
G=
3
C G1
7
.
G5
A
/@ 5
36 F
236
/
/
/
1
.5
8
7:
=0
: >5
8A
/
@=
9
0=
36 /
;
1
/6
>1
01
G=
8
/
5
G5
A5
1 /5
236
4236
1
4 0=
9
.5
5
= /5
A^ 5
1
/
01
= A6
>1
>
: >5
1
6M
E
6
K H C1
L
7
M 2
. 01 I81 5
@6
7=
7 A
: /6
;
%
C.1
/
5
/5
0 6_
>5 7
311 N C
. 78
/ 86 /
>
8 /3 5 C1
5 06
G 9
7/
.6 5 .1 ?
8
@6 7. /
1
7 @6
: >1 73
5 3
>1 .=
/6 >6
>1 C:
. ? 06
1 :5
.= <;18
> G
5
C 7/
2 A1 06
9
C.1
-.
=: / 6
3
A= >1
88 3
/6
O1
231
/ 9
Program 36:
C
KK
;K
x
8
/
0
6/
p2
3
88
p1
2/
.6 5
C
7
01
[0, 1)
/
01
36
.
/5 8
0 06
/ 9
T
75
/=
. ^C= A5 G
. 5 = : A1
B6 6 / 5 A=
F . 8
/ /6 8
01
>1
>= / 01 . ?5
/=
/
. 5 .6 5
C1 43 /1 E
C G1 = / 0=
3 A /
.5
8H
.5
/
K H 73.
L
S36
31
B3= 1 1 A5
9
C 5 .86
T AA
/
G1 B1 / : 01
A69 /6
A=
K
/ 88
: 01
A=
88
.= E
>
/
01
C1=
C
B3=
6 S3
= :6
1. 5 GA1 7
:
A
1 32 >
K H 6 / A1
L
G=
G5 1 >5
A5 3 N
1 / 5 .1
8 /
/6 A6
=
781 >1
= >
B= : >5
.5 1
8 8
@6 / 2
A=
73 @=
3 F B=
.1 5 . 5
> 8
9 E 1=: /
06 0
6
85 /
@ G 3 01
/ ;=
01 .
9 >
=@ . 5
. /
6 0
/ 5
8 / 98
7 =
@> @
. 5 : >5
B: 486
6 1
C 3
2 8
7 /1 J 7 5
3 /
:8
i=1
=
3 >1
pi
.
/
0=
9/ M
1 . 01
B1 9
9/ 1
311 3= >
9
/3 =
@7 A .
3= 7
. C
>6 3 G1
;,C =
/ /
. 01 3.=
5
9 / >6
6 C
7 A 36 F
>
.1 C
>
72
.5 ;
. 5 7.8 5
43 /1 B6
= 73
A
9 B.1
/ 5 31=
0
236 3 /6
K
G= G5 / F
A
/@ 5 01
O1 .
=: 7
C
@ / A 3 G1
// Prog : loaded_dice.h
// define a class for rolling a loaded dice .
P5
C G1
K
C=
5 36 F
4 G6
/= ; 1
/
.6 5 9
C.1
2 A1
C
1−
.5
=
>8 78
72 /= 5
. 5 GA1
. 5 9=
43 /1 ; @
= 91
A
K
/
01
M 31
05 6 F
8 31
85
/ : >1
: 01 A=
= 31
81
5F =
.= 8 /
> 01
.6 6
@ A 7: /
5F 6
C1
6
36 F
A
. A5
B
/
01
: >5
1
.1
loaded_dice
C1
05
O81
2 A=
.5
8
/
01
>=
/=
M
namespace ifm {
// class loaded_dice : definition
class loaded_dice {
public :
// PRE : p1 + p2 + p3 + p4 + p5 <= 1
// POST : * this is initialized to choose the number
//
i in {1 ,... ,6} with probability pi , according
//
to the provided random number generator; here ,
//
p6 = 1 - p1 - p2 - p3 - p4 - p5
loaded_dice ( double p1 , double p2 , double p3 , double p4 ,
double p5 , ifm :: random & generator);
# include < IFM / random .h >
i
pi = 1/6
// POST :
//
//
unsigned
pi
i
{1, . . . , 6}
8A
/
0=
@6 /
73
3F
.1 5
:>
.=
O1
2 A6
/5
/
0
8= 5
98
1
K AA
1=
431
]
7/
OQ
31:
81 5
};
} // end namespace ifm
pi
p 1 , . . . , p 5 p6 =
pi
6
random
p6
p1 + p 2 + p 3
1
[0, 1)
i
i
x < p1 + . . . + pi .
p_upto_0
// Prog : loaded_dice.C
// implement a class for rolling a loaded dice .
# include < IFM / loaded_dice.h >
namespace ifm {
// class loaded_dice : implementation
loaded_dice:: loaded_dice
( double p1 , double p2 , double p3 , double p4 , double p5 ,
ifm :: random & generator)
: p_upto_1 ( p1 ) ,
p_upto_2 ( p_upto_1 + p2 ) ,
p_upto_3 ( p_upto_2 + p3 ) ,
p_upto_4 ( p_upto_3 + p4 ) ,
p_upto_5 ( p_upto_4 + p5 ) ,
g ( generator)
e
e
b
cj
i
gh
fb
d
c
b
a
T
b
cj
i
e
gh
return 0;
$
%
%
Program 38:
}
/6
.? ;
>
/
01
G1
8/
= A6
>1
>
B1
@86
7
0=
A
. A1
T:
781
# include < iostream >
# include < IFM / loaded_dice.h >
// output the result :
std :: cout < < " Your total payoff is "
< < your_total_payoff < < "\n ";
5
@ GA
88
>
26
.5
/
0
85
B=
K C1
K
.6
4=
31=
B1
231
36
7.
KL> H
OQ
31:
81 5 ;
@6 /
7:
6
7A
l
0=
// Prog : choosing_numbers.C
// let your loaded dice play against your friend ’s dice
// in the game of choosing numbers .
B3=
/9
6 S3
C G1
3
K8
7
B.
6
/
1
: >5
e
// now simulate 1 million rounds ( the train may be very late ...)
int your_total_payoff = 0;
for ( unsigned int round = 0; round < 1000000; round ++) {
your_total_payoff += your_payoff ( you () , your_friend ());
}
4.3.11 Details
/6
/
01
.5
3J /1
88
1
:
8=:
.
.7: F
6 /5
3
C G1
C1
./
.6
P6
.
B3=
/6
/
/5
C1
;<8
9
1
9
.=
C1
6 .
7 / 3= A
2 1
7 / 23
6 1
81
321= .
/=
3 /6 6 / 5
8 .
6
=: F
A=
K 88
.= @ : M
> 2= 5
A
7.: F
/
.6 5
8
6F
-. 93
1 >1 : 05
>
9 /0
3 05
5
. /5 8
B6 C=
\1
7/ 8
63 .81
31 81
= 3=
. >5 1
B / 01
.5 J.5
/6
=
/ .
01 >
Friend functions.
/
8
B61
/
0=
K
6
/F
: 01
A= .=
K 88 >
8= Y
3F
.1 5
; > =
= 8
7.: F C1
/ C
.6 5 3 G1
8
0= 9 E
8 @0
7.3 .
1 6
8 /3 /
:5 ; H
/1 G
> 7/
3 01
0=
C=
.=
.
.=
1: \1 6
/ 3/
01 1
18 =86
.
7.: F =
/6 5 @ GA
. 9
8 3
/1 5
@6 G1
.
6/
9>
.5
3. /1
=
31 A
231
.81
/=
6 /5
operator<<
operator>>
/
.6 5
: >1
3= A=
3
C G1
C1
A
; @A
=
;
8= 5
K
36 l
C=
7.: F
/
.6 5
F 423
/ =: 5
01
;@
36 F =
.
C >
.
6
/
/
01
;
G1
=::
5/ 18
8 8
3 F /6
.1 5 /
> 01
.= 423 5
. > = /1
6 :
/ A=
/ 8
01
6 8
/ C1
3 01 C
9 3 G1
@= K 8
3=6 /:5
7. 8 A1
> 3=
.8: 5 /
1 / 0=
/5 /
8 W 01
/
: 01 A=
88 C
7
/ 8/
0= : >1
/
0= A=
8 31
/6 =
236 7.: F
: /1 6 / 5
/ .
5
8 / /6
9
1:
/
operator>>
.7: F .
/ 6
.6 5 . /1 F
.8 3I1
11
> 73 5
1
8
86
C1
.\ K
96
A1
B1 > ;
6
F
/
05
381
231
.81
/=
6. / 5
operator<<
6
// POST : return value is the payoff to you ( possibly negative ) ,
//
given the numbers of you and your friend
int your_payoff ( unsigned int you , unsigned int your_friend)
{
if ( you == your_friend) return 0;
// draw
if ( you < your_friend ) {
if ( you + 1 == your_friend ) return 2; // you win 2
return -1;
// you lose 1
} // now we have your_friend < you
if ( your_friend + 1 == you ) return -2; // you lose 2
return 1;
// you win 1
}
88
1
:
/6
8=: /
A=
.
B3=
.=
88
/
: 01
01
>
F
8
21:
31
/
8
4 /5
1
7.: F
/
.6 5
=
3F
.1 5
6>
V
\1
/
.6 5
−
C=
3 A=
: >1
8
=
05
friend
M
int main () {
// the random number generator; let us use the generator
// ANSIC instead of the toy generator knuth8 ; m = 2^31;
fb
// your friend ’s strategy may be to stay more in the middle
// and use the distribution (1/12 , 2/12 , 3/12 , 3/12 , 2/12 , 1/12)
double q = 1.0/12.0;
ifm :: loaded_dice your_friend (q , 2* q , 3* q , 3* q , 2* q , ansic );
C` .
T / A6
=
1 >6 >1
8 >
/ :>
0 5
; 85 1
= 8
88 /6
7 .?
C. 5
>
B 6
/ 7/
0= 9
@ 6 / : 05
7= .6 0
31 1
78 8 5
. 5 G1
B= //1
3
= A6 . 5
>1 / 01
>
>5
311 N
6
1
23=
6
C
:F @
6
6 06 7:
.8 5 .=:
9 U6
C1
B=
/ : >5
01 1
C 5 / 0=
> /
A1 > 23
1
-/ 1 F
/ 38
.73 3 A=
86 B1
3
7/ .
/ 7
0=
/ C
. 5 3 G1
8
/ ;=
05 .
8 >
81 @6
/
. / 5 73
B 3F
@6 1 5
.
97 >
. 5 781
. 5 8=
/ A6
01 =
>1
. A6 >
B3 : >5
7. 1
/
G 0=
7/ /
. 8 /=
6 @
/
@G 8
C6
C7: 31
.5
0
E
0.12
d
// your strategy may be to prefer larger numbers and use
// the distribution (1/21 , 2/21 , 3/21 , 4/21 , 5/21 , 6/21)
double p = 1.0/21.0;
ifm :: loaded_dice you (p , 2*p , 3* p , 4* p , 5* p , ansic );
%
Program 37:
c
b
a
ifm :: random ansic (1103515245u , 12345 u , 2147483648u , 12345 u );
unsigned int loaded_dice :: operator ()()
{
double x = g ();
if ( x <= p_upto_1 ) return 1;
if ( x <= p_upto_2 ) return 2;
if ( x <= p_upto_3 ) return 3;
if ( x <= p_upto_4 ) return 4;
if ( x <= p_upto_5 ) return 5;
return 6;
}
} // end namespace ifm
{}
( * '
% + ,+ # % + ( ( + int
/6
=
4B 5
.1:
A=
88
/
36 0
7B
0
C1
C G1
3
7.: F
/
.6 5
V8
/@
: >1
/@
>
A
5
V
>1
.?
/5
.6 5
88
=
G1
/6
GA1
A=
8
881
: 01
/
>
>
01
@.8
91
.
/
>
: /=
* : /
; =5
.= A
$ >
81
.
A=
Clock
4.3.13 Exercises
double
/6
GA1
V
O1
2 A=
.5
/
01
2
73
26
81
6
=: F
A=
88
.5
G1
' ' + ' $ #
%
%
% ( $
E EH H $ (
<;8
881
:
C.=
: / 5
=
A
; 3 /1
=.
C
> 8=
886:
= 5
. 5 /1
>
>1
9
/= V 5
/
K A5
0
.=
ifm::loaded_dice
5
>
.
8 /=
3 >1
=
H
.5
; /
@6
7
8
06
7A
KK >
K
26
/
0
85
/Y
4.3.12 Goals
>
K
KK
06
7A
8
;3
@6
7
7 A=
: /5
23=
-.
8 /=
3 >1
7.
H
H
E
8
06
3 /6
*
void Clock :: time ( unsigned int & h ,
unsigned int & m ,
unsigned int & s )
{
h = h_ ;
m = m_ ;
Clock :: Clock ( unsigned int & h ,
unsigned int & m ,
unsigned int & s )
: h_ ( h ) , m_ ( m ) , s_ ( s )
{}
void Clock :: tick ()
{
h_ += ( m_ += ( s_ + = 1 ) / 6 0 ) / 6 0 ;
h_ %= 24; m_ %= 60; s_ %= 60;
}
=
/
/
>
C. 5
J=
6
. >1
.=
3 /6
C31
7
.
88
1
=::
. 01
.=
1:
;8
9
=
3 /6
F
# include < iostream >
class Clock {
Clock ( unsigned int h , unsigned int m , unsigned int s );
void tick ();
void time ( unsigned int h , unsigned int m ,
unsigned int s );
private :
unsigned int h_ ;
unsigned int m_ ;
unsigned int s_ ;
};
' ,+
%
+ #
%
$
& is_bool() const
'
01
6
81
01
231
/
%
6
01
&
+ $
%
'$
,+
'
#
Z
Tribool
( .
/
>1
.?
5
6 /5
-.
Exercise 108
%
7 A 3 /0
> 6
G1 7
4= B 0
6
5
>1 .=
; > >
.8: 5
1 =
/ 98
@ @ 01 1
: 7
C1 6 81
C G1 C23 /6 >
3 6 >6
7.: F C81 5 / 5
/ .1 . 5
.6 5 := : P1
K8 2 /
8 65
7 A= .
6 /5 K V. KK G
7 / -F
86 268
C1 8 G5
/ 5 ; A1
C1 3 F
; 8 .1 5
/
@ 01 : >>1
=3
1 3 A=
=
781 6 / 5
.
7 AF 8
.5
36
3 >1
/6
48=
1
7..
1:
1
8
38=
class rational {
private :
friend std :: ostream & operator < < ( std :: ostream & o , rational r );
friend std :: istream & operator > > ( std :: istream & i , rational & r );
int n ;
int d ; // INV : d != 0
};
C.1
J /=
2 A1
C
.=
.
A=
>1
.?
5
6 /5
@G
=:
88
A=
4B 5
.1
21
.7: F
/
.6 5
=
A
/@ 5
6
=F
.=
B1
.
3=
71
=
4 G1
38
7.
.5
23=
: /5
7 A=
3
H
E
E
TH
$ + '
)
$
$
'$
'
' 3 =
F 91 A
/ 3 A>=
: 01 /1 5 /=
A= /
K 88 01 C1
C G1
3
<;8
9
81: 01
/ / 01
.6 5 3
= / 01
8 @
6F =
A 3
9 A6 1
8 27
/6 : G
A5
: >1 6
3
31 A= 23
4
J.5 =5
/1
.= K
6
6> 3l
7/ /
2 : 01
7/
6 A=
231 88
=
3 /6
8
/6
;
G1 9
3 F 1:
.1 5 6
7
8 > A>
6
rational
+
'
$
96
V.
.
@6
73
86
A=
881
:
.7: F
/
.6 5
=
A5
>
>
6 /5
V. . ?
>
@.8
: /=
: /5
=
A
.=
>
81
C.=
: /5
=
A
331
63
8
.5
=
4B 5
.1:
TH
ifm::random
/1 5
85
2 A1
C
3
=
EH
Dispositional.
Exercise 107
9\
/5
0
.=
>
3=
B7
1
=
G6
7/
281
7
3= >6
.
>6
C.
7
C G1
3
K8
36
9
EH EH TEH EH
Operational.
9
.n
' ' + #
$ '$ !
$ +, private
.d
bool
Exercise 109
e
e
b
cj
i
gh
fb
d
c
b
a
`
Exercise 113
$
%
E % H
' Exercise 112
$ # " $
' '
%
* %
$ $ % $
( $
unsigned int
http://banach.lse.ac.uk/form.html
ansic
%
#
% #
$
# ,+
$ %
% *
+ % $ +
+ $ $ ! %
+ %
+ E
$ H
%
ansic
%
% %
# ,+ ' ) # +
$
<IFM/window>
(0, 0) (512, 0)
(256, 512)
#
' %
%
%
*
$
'
$ # %
[
' +
# ' K
/
GH
TH
E
36 F
/
: 01
A=
88
3 /6
7/
6
231
=
2
7/
6
.=
C.1
2 A1
C
-
Clock
%
#
random_triangle.C
t
#
E H
*
$
$
'
% ifm::wio
Exercise 111
m = 231
' Exercise 110
'
+
# ( $ ( $
%
+
( %
' %
+ '
%
E %
+
H (
}
s = s_ ;
int main () {
Clock c1 (23 , 59 , 58);
tick ();
unsigned int h ;
unsigned int m ;
unsigned int s ;
time (h , m , s );
std :: cout < < h < < " : " < < m < < " : " < < s < < " \ n " ;
}
return 0;
t
t
4.3.14 Challenges
Hint:
http://www.inf.ethz.ch/personal/gaertner/cv/lecturenotes/ra.pdf
`
e
e
b
cj
i
gh
fb
d
c
b
a
R