4.3 Classes
"!#$%#
&'!(*)+ ,-./0!#1"234!657 8:9;0 <9;79*#=?>@'#
0A!#B!65C-.
'& )D E!#10"23.5&'!FHG1 "!#JIDKMLKONP!)RQSM8M8T8:9*& #U9V0!).W(9;"9X'#19 230)Y8:9;A!#
9;Z9[(*M'M#.\)]'%#.\X5^9;)]&',!65 8_9;' `Kab5?9;)Y&'4FJ9;cd ef`2TeMFg238h i
Fe'#
"9;"!#
jFk!&'e^9l5^9*#P(Omnl>;AVo8:KpNP!)QqM8M8Prs&o'g8h?9*& #t 8_9;''u5^9;)]&'
V fj5^9;)Y&0v5!&e&09;"!#P9;8w#T)]FeV'0&o0xX9*#P(7-.'#y0kQz![0!F{238: @U'8:9;'^ J%#
!#T#10 A!#<QSM-k&09*#P(|!F #T)YFJV''&}\'#1'&09;A!#PK
4.3.1 Encapsulation
~e@b|
60d|qO@006|'.qu'*g|0|'k|0A@
6|0wdT
E|@^|
l|qd|'P6|S`6|'^6';TW M6|q@0¡]
l`6u¢T0
@rational
l£*|vqq'*W@|o
|`q ¤¢T'¥d||T'¦6@w|@'¡_|
¡_|0@O-^
6@6W|O
6'^6T0
lo§
6
60|W|X@?£¨
© X@`66|g"
l|@6e¡
6ª"@
@6z@X'_^@@'«e6|z@'6,|4e]^
"6'|_^
6|}^"T'0¡¬'| ^@|_^@]£
0|«"l^
@n,E646||?®T0
@''¨¯d|T@v*
|,6|}¡_||06e6^nq]'*|0*'T'C6°
'*}]b6|""
6|0
|'¦¢
6^
@*¨R~²±1®0
6rational
'@¤³³R*C'*O^06e||}6|'1¡_
u6|}*0
@Z¢]@}*0
6@C¡
6|vd.
¡
@µ´¶
@
lµ· ^C´1
6
l¸··¨°¹Wot*'*@Z6|}¦¢
6^
@
6vg'|"@rational
0
º0'»¼q
W½S¾ © "¿ 9;A!#P9;8À%#
cM#.\OÁ6#1K £?¨À½S¾ © W|@_{^|d¦6
6|g¡_|0@X@]`z@g¢|
l`
@°|
6o|''3|e"l^
@@zq
@Âd|6J ¨gÃÀ6|'4"
|] 6;S@@|'W'|3¨
¯dv'|*'T'`u½W¾ ©
|''|6R|6Ä'u
Issue 1: Initialization is cumbersome.
|0Å^
6_^¢
¦6R6|u
6^6Dd|g¢.0
º
¡_
6|'.6|b|
6
l0
EJ?^
@gg|"
r
1/2
E
@6
rational r ; // default - initialization of r
r.n = 1;
// assignment to data member
r.d = 2;
// assignment to data member
|'¡:|"§|6_^Ä'' ¢]q6|«06.|z¡ g|"s¢T|
6§
© z|''_`
l^6
0}6
6| Qrational
! ^@@|r';6¶_^60
'¨¶½W¾ © 6'|r*}6^6|0vq|g|
6'¡_0r
s6«|6_^Ä'
r
¡
6p6|d|0
l`6
W|R0]`6
S°|]|°*j
@ Ä0z6^W6|0O]'*buT;
|0
6¨k~|0'
¡q6|}|
6
l
b^g½S¾ © ¡_
606u|¡S@¤"@|'@'
u|||§
r
|'O|g-|O*°W6g||w6|¢|{
@0T
@66£¨~¡D6|z"@
6|0Wq_^
6
«M'|@|0
q6|
®}w¡
O] ³*£6|«|
6¢0$E^}]'
¨
rational_vector_3
¾0*.^|z¡
6|ÆT
g|"S]'*
|Ä00
6J0]`6
¨RDz'*"6|_^60@{^{^,;^
@_rational
R
,´1
6
l^ · 1¢
6|0
6zS|{S'¤¡P'|¡_
6'|u6|S^
6_^ ¨¶~MWqT@@¢¡_
E*|z6gW
66
Issue 2: Invariants cannot be guaranteed.
EP rational r ;
r.n = 1;
r.d = 0;
|6d|Àd_^@S6| %#
@A\& Mf ¡T6|Ed.6|w'
"
6'06|'"s¡.6|w6
6
@0|
6'@';l^63¨
Ç Jw`
6|6^wq|°¢.b¥d|6A6]j@W
66
|J*'e6||
6§
r.d = 0
l
q^E½W¾ ©
» S¢T6^W"6
¨¬ÃÀWR½W¾ © »¼S^| `6
6|^|'E¡+
6^6
d|u¢T0
6`
6@R¡
6 0}] ^60<'}|6^6|g@0|0
@R'@R76|R|
6
lRºE@0@
'}l^6+ n
6'@|}Ä'0
@n|'|^6
1"}n¢{"l^Â**^v}`E|E|
@n¢T^@@|'}6
*6|"l`Â*S¡_
@@
¬|
6]*^6'|"6'}¡.¢T'z@
l'Ev¡
6
0
'
@'|_^6J-*^
d*r.d
°0S6v||w6|¢]|g
60T
@@l£¨
Çu@|Ân^¢T+o,¢.6b@@|'10¢Tq|
6'@@0gu@À?®P
60 @s¡@¬
6^6
d|u¢T0
6¦¢
6^
@*W|/*'jE676|e¡_`E|Z@6
4¾O|6|0
''J¡
¡_||06¦Æj4@gdT
D*Z]|vO¡_||06k@]`0
6'^6'b^|{¡¬d.
rational
¡
6 q{|'S¡+dT
¨
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 ;
}
ǰ6|'j@b½W¾ © 6|@«6|E¡_||06°E|'|0*0
6|0OSW6}|@_Ä0w
w@"°6
b
l^6Yd|g¢.0
¨
E®}
rational r = create_rational (1 , 2);
q|X¦6_Ä' 6
X|z||°^S6|6w6w^Â*@
66^q6|z0 §
r
1/2
^6
SS|Ä00
6¨
¯d|?q
6 ^6n¡_||06z'0
@6|w^Â*03"'|@¡_
D"@
@6D«'|0
6o¢]T6|¶qW"@|'
^¢To*v|
» z
6 ^J°'S'*¨ © g
6 "Z«6^z6|z6¡_}
6 ^64 4¢T{'
60u*';6'
¢dJ||@|¤ ¨~e¡:0 T*
«0gw|z *b
6'l0k6|g|
6
60
w`z½W¾ ©
|0*'¤¡T|
6|S
@
l0
;¢.E6dn_Ä0O
¬6"6¢|¢T
6]£16¡_o ¨¶~MÀ
6|0
60¡_
6"6T@@¦¢]W6bE
@6
|¡_
60W^¢.s^ln'u¢T0
À@"|'
|°WS"6.T@@¢w6v@@ rational
@
¨¬r;
ÃÀ'||X6|q0WX¡:0E{glO_^
60
ST¢'R
0
r.d
q*R|@'o*0
W?® ¨
¾¡60
°]'d|U|@' 6|k
l^@
d|u¢T0
6s¢|
l^
@v¡_
E@@½W¾ © ^||
6*l|'s*OE6On
6'¥0"E¡_
W*0
6"OE6¤
_^
@0
+|À
l^@|'À@b *À¢]"0
@*'u6^1;60
60^61^|'P@0@'
`*
`n¨
Ç{
6''d6|qdT
¡
6 ´P ³|{
6'Ä'¬@]`|s6||w*v'|
extended_int
"u|«6zl|S6|qdTS¡Y
l^6
|v|'|^@
1¡
6
6
Issue 3: The internal representation cannot be changed.
int
unsigned int
³
|¤"6
66|w@¤¡T6|
l`6d|g¢.0
s@0]^
6^6'qn^ln0g¢T
¬¡TdT
¨¶¡_
bool
®}wÂ*6| struct rational {
unsigned int n ;
// absolute value of numerator
unsigned int d ;
// absolute value of denominator
bool is_negative; // sign of the rational number
};
~MWE^@gS6{^
6O6{
6E
6@@z¢|
l`
@'
|
6{
@ '0
rational.h
rational.C
6|ql|n¤
60|
6'@0l^@
¨
ÃÀ¬@|
@6¦}¡@0
¬*'*@||T'}6|W/*0
@@¡Y*
s¢|
l`
@u6b½W¾ © M*'*
0*',|'||'²6|6¡_¤0
6'^6²¡_|0@
¡
6 ^¢To*OC6|.@
6'"*@"0 | ^¢To*o£|*R
6'''¦*ucreate_rational
j|
@¤]|| ^D¡
@ 6|n0'S¡
½W¾ © 6|W|
6
l
1
60T
@@À6^À6||v6|` ^6g'W"60}]'1@v6|
|0 *0
6@°¡D6|«¢|
l^
@* #1!*-M#.\ q
@ÂEd
6
¾¡60
l`Â|Z4¥lÂUdÂU^6|j^| ^@U'S* @||0¦U
6 Ä'XE]`}6|
|
6¢' P6|'d|ws'|"60
6'¤6®d|
6'@@q¡T6|¡_
6
|
.n
.d
rational r ;
r.n = 1;
r.d = 2;
¾
@ 6|S]^
"6'|_^
q'0n¡1'«|d'WWq
@ÂXd
6g
l^@
d|g¢.0
EE|`
60|
60@'@'4¢d -&' ^l}0g¢T
6'Y¢«@Y£` ^6R0d|{¢|@¦R|d'z|
|6Ä'}@e|0£b'u¢T0
g¡dT
¨ ¹Wo=*U
@'
60|g64'*X|
6o|'U6|
¡_||06XO6||
6"Sbool
]'º||''
6|z"l^60'
create_rational
rational r = create_rational (1 , 2);
q|vA6q
@ÂYd^@@||w6^¶*} *W'
@
6006{^|6'{6|W|0|6g¡Y6|S¡_|6
@¤| ^P6R6|b|0Å
6
@'@';l^6
¨«ÃÀw6|b
@¢]'aglj
6
create_rational
¡:^
"§M
6 l||g|X|¡_0"6¬@@'¡
¤ l°^¤0*0
"O''
6'|'
¡
¤6|
.n
.d
^| `6'@|'w6|]`l'u¢T0
6¬'*l]^0O6|'
q'||M6|0;¬0*'
'*l]^0°6|'
W]^'l£ °@6|{½W¾ © ''0@d|0
6^6
W|R|'|^6
s6
6|
^ls'u¢T0
6T6^D^
@À"T0'@q'0
@l^«
6
@'@';l^6
`*b^
6o'"6'w6W@]`
60|
60@'6^6
1|Z*
» ?|}¦n¦6||n"Âd|R½W¾ © 6Rl|}6n^|] ^6
'«qq'¶ME?¤6|0.
6'¡_|@¡+'
6"o£¨
0k6|v½S¾ © '';E
6'Ä'0z6^w@g|0
l^6]^Pd|u¢T0
6E6k?®6'||'
|
l|^
6w|@0'@q¡_
s6|'R;6|0}60
@^6W@w0@
l^0s@}*3
¨ w6`.60
*{^
6*g"6;
6'Ä'6^P^+*{|''u6'*u@|l{@
@|¢0Pb6|¬¡_6
6q '#1?9 23i
¡
@
0)Y8:9;A!# ¬g'l]^@$6^ Æ(| 6|n^06
60|
6'@0l^@°¡+6|zÆT
rational
6|X0A60
s^ ^{6|X6^¤6OY0
6v6|O'|"60
&'"2
&' ^'#
"9;"!#
iÆM#P(|"2T0#P(|'#
S'S¡+q
@Âd|gE6
l^6T|g¢T
6'¨
~
b'| ^@|_`6n+'_^¢P@|
@z6|À|@¡d'_^@@''|nqAl^
@3¢d«®_^|
|`
EP 6g||z@
60|
60@'6^6°¡+uT«¡
@p6|z'|"60
'¨
4.3.2 Public and private
E0
@«Wb
@'^
"
class
*0
6@°¡
struct rational
6^ql^Â*0E ^
@«¡P^6u|||¨
class rational {
private :
int n;
int d ; // INV : d != 0
};
~ 6|Z6^4S ^j
b
6'*^@'R@0*0
6u¦.0
60jdT'j;67
|0 Ts¢|{6|
Â*struct
0q
67||class
^60{6^ 9|00''4&' '& A "!# '²d''
s
6'¦§
class
Ä'0X6
6|O6|Â*0dq
@
|
¨
public
private
¾=^6J'u¢T0
u 2
)3Vo8 A ¡E|U|¡W6g0'_^
l`6²^|T ^
6g@0E|0
6O¡60
v
AT''0
'+|kE6e
"T'00
ne¢T0q'03¨v~Mn 2
& d9;@ 6|0
@@¨
public:
private:
~k]^
@@'|_^
Y¡6|u'_^@«|0|6CM@'¯d006
¨ ·¨ ³¢T'`Å¡_
«6|b
@''@g ||¡
6|n@0
6¤£«';l||
"T''¦]
¶¬^6X'u¢T0
6n^
6|
6^6v¢0¡:| ¨j~
';@
l"']u"@
@ESu'_public:
"SE
6T]`lb'g¢.0
6q^
6z|¢¢dO0¡:| ¨ ~¡3n^l«0g¢T
À
@`6d¦s ||À¢T^'''@"'¤¢'|"6
6À6
6|}6|'u¢T0
'0'@n.0
l^6
'¨u~¡¬^l'u¢T0
w¢].6|0
6{^
6u|X"lk
@'"@
606|'
¨ E||0
z
^¢To*z]|@O¡
|@z¡_obEY6|0
@'¡_
6n|W'}
class rational
rational r ;
r.n = 1;
// error : n is private
r.d = 2;
// error : d is private
int i = r. n ; // error : n is private
~ uY`
@6'|_`
`@q^@@|';
¢T''0P}T@"¢W%|lb1d]£^¢^¶n%6d;£
r.d = 0
|Z|
6'g|` *
u'|"60
b'|j^d@°E6O
6^6d|g¢.0
1|0*'
* ||¬}0'
d@ *d*|@'6nb¦À´1
6
l^ ··¨ ^Àqw`
6
operator+
"6|_6Â|«"SS'{¡
'''"@|n6|E0'^@|_^6'{
60|
6'@0l^@
¨ © |¡_|0@
q|
6`d|'O¢°u@'0X ^6'
"O¡+'_@S'u¢T0
60' Fe'FeV0'&5)Y#1 A!#
¨
4.3.3 Member functions
0|`
^ {6|S@@|w¡_||06¦Æ«6
6
6|v'u¢T0
P¡_|0@|'¨
class rational
~Mnq|k@''¸^@|
6@°"l^
"n¦646¡_v0
6 ^@
D¢@|'{6|0
6^
@v"T0'v'u¢T0
¡_||06|b
6'@
@*'<¡_
u6|b|
"T@0u|u
@"g@|`$q"'|0
le'u¢T0
n¡_|6|
6^{
l;v6^¡_°'0'@{@e6|X|0
l^6
{|U|'|^@
b¡wR
l^6s|g¢T
O%q»¼
|@'|@g¢T'o ^
|
U|0
6º|U¡W*Uq|0
{;²qO 7|@
*this
const
"!!#%$'&(*)+",-.0/.13246578,"190/0:;<57,6=>&(@?BA*/0C?D=*0/'7,E7,F G/?%!(!H/.")D/E?%197I,J?'57,J;4E!K?G7,76L
M?G4EN+O?G4N4667,7P78HQ646&SRJ0/07;1T?NUV?%!#7,WX46465Y/P&(Z788/.54E,7N+[AJ5Y\$]T$'&!(!]57,T?@46!#?D77;$'JEJE^CE/P,0/0T?/0T?%_U
?G4N4667,7`/.N7a/,E&#DJ76L
|
¢T0¡_
6}6|0Z`
6|''_^
@'u@bXAT''_^À¡_ ^@|
@¡S0_@"'T¶®d]|'Z
d
¯d'0@ ¨ ·¨¼³*£¨
n
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
};
~¡
r
Eb`
6_^¢¡DT
rational
int n = r. numerator ();
int d = r. denominator ();
|¡_
E?®|}6|«'|"@0
S X6|'OE
6@
// get numerator of r
// get denominator of r
|@|«@W'u¢T0
'0'@¬T
l^6
ÀÀ¡_
À^l'g¢.0
6'¨ © |E0A60
|@0@Wq
¡_||06|'."|'6|0J^
6b|'0_^
6'
¨¾'0'@"T'00
6w'*u@b@ ||}¡_
'u¢T0
q¡_||06|WS¡_
^lu'upublic
¢T0
6 ¶b|
6^6z'u¢T0
q¡_||06°'|q¢T« 'O¢
6|'|"60
¨ © |TÂd|¡0''@+@S6|
60|
6'@0l^@n
®¦¢]^"|'@'
@
@'"T|||
'u¢T0
1¡_||06¶ ^v "¢TS^|60{6zw|0<
60|
6'"'l`6
º¦¶@6¡_@0S¦¶
|sT@@¦¢]W6ul|6|0s¡36|w^l«'g¢.0
6@|
@6|w¡_||06|
|
¨°¾EuX'|0
l
6|}¡s6d|u¢31^lX'u¢T0
@n¡SX'_^@numerator
@||Z¢T
|
6^denominator
6°M6|0
@@+*C'|'
lv@0A60
n@j'''"u@v]`lX'u¢T0
60D¦646|
|'|@'¥|'|''';6|'¤R~@"«·v`¢T`* £¨
~
6|0
D6E ^dq'u¢T0
3¡_||06
oqÀ|''ub?®|
6'A§
@j¡16|'@dTb¡_
wE|l°q 9|00'' 6|b¡_||06
.^R6|E®|
6'"@C-^|T ^
@|
¢T'¡_
@z6| £¬S MFg238 A'9;8%8À9*&"\)]Fk'#
E|@w'
S'|S¢.«¦]0¢
.
6|z¡_|0@° ¨
6|° ^?R0g¢T
W¡_||0636|«^|
6'¡_0
6W6v6|S}'¦¬ +^
@0
|¤®_¬@z^|T'^
l|'w¡
6|.*this
"6'||6|¬¡
6|wqg0g¢T
s¡_|6|
*this
^¢To*¨k~M{|'uu?®_ZEC,"60
@"Â^|T'^
6u
¶¢]bq¬0b6j6|
*this
_^@0
¨
The implicit call argument and *this.
¾
Â*0dq
6^¡60
n@g¡_
6^
@0A«¡¬¤'u¢T0
const
¡_||06X
@'¡_0
6S6{6|z}'¦s^
6|';
^O6|0
6'¡_
6z|
6@'s6^q6|z'u¢T0
Const member functions.
*this
*
EP ¡_||06 .|d's|sl|6|^|bM
60|
6'"'60O¢dv6|0s¡
@w^6n'u¢T0
6l£
¡
¨ k« ^
@|?ju'u¢T0
s¡_||06R !#
'EFe'FeV0'&w50)]#1 "!# ¨
*this
Member function call.
¨ © z'|0
l^D"dlo®X¡+g0g¢T
q¡_|0@° T
n
¨¨¦¨ £
E0
@ +b?®|
6'@"b¡q'_@3dT¡_
+|lbS'u¢T0
¡_||06b ^' «0'_^
603
¨'¨0¨' ^
6{@v ^
6|';6'P^
«6|v0g¢T
.
'0'@T0
l`6
¨ ~ "}'@'' 7|°¡w6|R'_^@}dTqd ^²
^
6_^¢¨
/¦6|v6|E¢Tv¡
n0g¢T
¡_||06
¡
' _^@';'u¢T0
E^l«0g¢T
¬¡
'u¢T0
¬¡_||06Y£¡
@w@'_^@s ¢T'0f'@@'
¦6||w|
6|® º
j6| "Tqg}]'6¦¤'''"«¡_
¨~e
z®|^}]
.
*this
6|®|
60@@
6|
606
6²"l^@''¡S6|'u¢T0
b¡_||06
6'¡_0
6u6
numerator
6|w^lz'g¢.0n
¡
¨ © |w ^
6|0
@'¡_
6w|d'¬
E^Àqw®dT'0 ¦
60@|
@q6|n|0
ln^6
q*this
¡36|«
l`6.r.numerator()
u¢T0
¨
r
6|k0g¢T
¡_|0@|'Tqv 4@O''0@n'u¢T0
@w¡_
6|0
«®|
60@@|n¡6|
6z'_^@Wd.«6
6|°6|n0g¢T
E^'''@ET0
l^@
nÂ*ng'|"60
Sq|°|}l£¨¬¾
'0'@@'6'@w'u¢T0
6S@R'g¢.0
¡_||06|¡¶6|b6n'_@^
6 )Y#T&0 '& "'@(
6'*`
6|'@u¡WE|06|0
u6|'g¢.0
b²¥d|'"6,b¢]}
g
@`6¨ © |
|
public:
"T0'0
6W^
6z|
6'0;E¡_
W6|«'|"@0
¢E|W¡_
'u¢T0
q¡_||06|S¡
private:
6|z'_@S6"'¡-¨
X'u¢T0
W¡_|0@|E^
@«@6's^@u
6'¡_0
@
@'R6v^ Fk'-.!(; ¡D6|z'_@0¨
Access to members within member functions.
~¤6|w"|
6¦
6¬¡+¯d'0@¤·¨ ¨ ¬q|¢T|@0¡_.@
@
6'WÀ6|S'g¢.0
¡_|0@}|0|6|'v
6|0
À6no7@0]^
6^6E0}]_^6
¨ ©
q
@ÂdÂ*g¡_
b
6|^
@e¡_||06|'D®'n6^¤'u¢T0
«¡_|0@Z|0¦6k6"|
¡6|°'@v|0|636|X¡_||06<O{|"g¢T°¥'C6²6|°'_"v¨7~
6|u| |0
z]
quq|j6|'JE
6@b¦R6|g|'0_^
l^@|-|@PE6|
rational.h
'"]0
£ Member functions and modularization.
ifm
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
};
·
-^*
© u^@?|||0|6|Eq|R6|'k^|T ^
zj6|u@
6'g'd|b
rational.C
¦6|O0"]'
Y|X¡60
E|'|||
£qW¡_`E'¨
ifm
rational.h
int rational :: numerator () const
{
return n ;
}
int rational :: denominator () const
{
return d ;
}
4.3.4 Constructors
¾C'|"@
6|06
+DW"T0'_*'u¢T0
3¡_||06n@]`D|
6o|'36¡_À|6_Ä ^6¡'_^@3|'0¨
© ¡D'|"@
@6
S'|'|'ÀE66|¡
6|z0_@'| @¬|"6||@|'
'|"@
@6
6S¡
6=@
W¡_||06/q|d'S|E'*nb
60@|
@OdT]^O'|@'¥06¤|
60@|
@g|¨1¾<'@1|@n¶@0*0
l^'|"@
6|06
@';|g6|q'}
D
6'¶1|l
|E ;z*0'6?®M"|«6|W
@'À¡To*0
6*^
6'"6
*@'E6| l
¡1¯d006 ¨ £¨
© |«";l`®O¡Pu'|"@
6|0@
E|0|6¤¡_
wu'_^@ WS¡_o'¨
E0
@ ;'&
¨¨¨¦ £?3¦¨ ¨¨¦ ¨?¨ ¨' £
¨¦¨¨
£
^
66|n¡_
6^
^
6|'@s¡+6|«0A@
6|06
¨~X6| M#TMA9;8 i
£
`
6«^6g'u¢T0
@'| ¨'¨'¨0 ^
6z®|
6'"@|
¡Ed.'{E"¤|'{ U¢T¤'*
@6'<6J6|O
6'AT'06¦*X^lR'u¢T0
udT0'¨ © |'@
|'¬`
6W|@0}6n|@_Ä0À6|E^l'u¢T0
60¢T'¡_
6 ®''6'
^v{6|W
6|0
E?«6|¬'u¢T0
6D^
60'_^
60b6|¬'_^@'¨1~b6|0
Dq
6|'6|¬
@
P6|¬¦6_Ä'0
@'
+¢|nddZ|
l6'g6R|@}6||''_^
6^64
@
u
6q'¨X~¡SX^6
'u¢T0
Ew|"60JJ6|b|@_Ä00
ww|'¡:|A§-|6Ä'03¨E~J@b0A@
6|06
¢T|
q« ^R"6Y@0
Wl|z6|z0W¡D@¡+6|«^6u0g¢T
6'¨
6|ndT
]|0
6bEv'|"@
6|0@
6^¦6_Ä''q{
l`6
d|u¢T0
¡
@
rational
qv;6'0
@'¨
¦¨¨ ¨'
£
// PRE : d != 0
// POST : * this is initialized with numerator / denominator
rational ( int numerator , int denominator)
EP : n ( numerator) , d ( denominator)
{
// somehow check that d != 0
}
© {"z6|S'|"@
@6
E°b^
@_^¢|''_^
6^6
dqq|X¡_
W®|^}]E
6@
rational r (1 ,2); // initializes r with value 1/2
~°'|0
l^6|n|''^
l^6
k 3¨¦¨¨¦ £
|0|'1S^
6^¢¤¡dT |u^D6|¬6¶6|6Ä'0TD¢ ^|q6|s^||
6|
6_^6
'|"@
@6
WE6O
^
@06 ¦¨'¨'¨'
¨
© |«'|"@
6|06
W °@u¢Tz 0X®d]'6¦S
rational r = rational (1 , 2);
© 1|6_Ä'' |¶|
6'6b¡
6yqz@'0
6'¢¡
6{®|
6'"@v¡|dT
r
rational
6 ^0A@
6|06' ¢d<6|R®d'}'|"@
6|06
'
ME? ¡dT
rational(1,2)
£¨
rational
4.3.5 Default constructor
~ ¯d'6 ¨ ¨WqJ'*k;@
6d||'' 6|J@0
6 (|5^9*)Y8¦-iÆM#TÆ9;8 ;9;"!#
|6Ä `6v6^ql`Â*'S_^'«X|''_`
l^6|qÂ*
¡_
¤6|JÂd|¡
rational r ;
S¡_|';lYT''||'¡:|"§|6_^Ä ^@{ '*'S@w|X¥|'"6O||0|'
d¢
_¡
S'_"®T''@ (|5`9*).8 w0!#
'& )D @!& q6^@ ¦u 0@g¦6_Ä'S@w|¨~¡
|
6'@0 @|'¡:|3'|"@
6|0@
P
6|À||¥d|'|"@
6|0@
DE6^b'}|ơ_
@;^
6|'
A ¨
Ã,|
6o||ee|'¡:|{'|"@
@6
ÀqO U6{^Â*¤@
6X6^{'_"{dT¤^|'
^
6 9;8 Qw9*f |
6T
6O|6_Ä''
¨s~R ^@b¡P6|'_^@
w^R`
66|06To£
rational
|'¡:|"§|6_^Ä ^@,¦6/|
@''¤6²¢.e6|k'| z?|0| |0
6kO6|
0
'
@
@'"T|||{|'¡:^¦E'|""
6|06
¨
// POST : * this is initialized with 0
rational ()
: n (0) , d (1)
{}
~X¡: q FX).0 |
6o|zb|'¡:|q'|"@
@6
S¡TqS^q6|'}0
6v^''0|q6|
''_`
l^6
|
¨ © z`Â*'w'_"T'6¡_0
z6J¡_|0lDÆT''
@0g¦
rational r
S|S.@@¢w6{'
6'|u*'Wu'|"@
6|0@
E ^
X|''^
6|{u^
6_`¢]¨
© | ^
60¡_*
6 ^
DE|60¶@]`3@
6g|"
¢Tn®0T0@n6q6|T
6|3´1
6
l · {¯d'0@
¨ ';l|+6|¬|'0_^
l^@b"l^@''
¦6|bu@]`+|
6
lR
rational r;
*
6|T
+SA@
6|0PE6|3«'|"@
6|0@
6'¨ © |+3b¡:+6|À|z®'0|6
rational
¡_
g°'_^@@Z0A@
6|06
60¶@|'¡:^¦b'|"@
6|0@
u}06°|
6o0C¢
6|'}0
'¶|²u"}4|'¡:|A§-|6Ä'0z6|^l°'u¢T0
@'ºÀ¡W°^lR'u¢T0
n
¡¶'_"EdT]6|ER6
6j ^W@b|'¡:^¦'|"@
@6
¡P6|b'
@
60"T|||}'_"'¨ ©
®'0|64¢T'04|b@O@]`n""
6|06gM|l $z||0
6@'e¡
@H@|
60'
6@
S£s|S@{6|z'_@S'|'0|W¡ b¨
4.3.6 User-defined conversions
sA@
6|06
66v^
6|'_'}z"T'0_]
@+6|0}^
6 )Y'&oil(|rs#1(J0!#'d'&o0"!#
¨
W@z'_^@
6|n0A@
6|06
rational
// POST : * this is initialized with value i
rational ( int i)
: n ( i ) , d (1)
{}
s«"0
"§-|0|'¤'*
6@¡
6
6
¨PE||0
¬6|'|"@
6|06
'
¢.'''
int
rational
int
AdT°E|@X|' 7¢TR';*0
@60/6
¨ © |v¡_
®|}O |v6^
rational
qX'U|
6`d|Xj E^
@0g¡EdT
|'|0*0
J¡_
6^S¡_||06<^
6|';{¡
dT
®.'06'
º46|}}'int
';*0
6@Z6^«l^Â*'_^'D@v'*0
"6|
'|"@
@rational
6
^'
¨ 6j|@0
A§-|0|'e0*0
6"|'.qb¢T0*|J@n@0z¡ '"9*#P(9*&0(
6
£?]¢wR';@
l"E6}6|
0!'
# d'&o0"!#
6^w^
@n¢"§-4Â*z6||¡
6
int
double
@6'q|'}0@o£¬"l|^
6R';*0
6@j
@'"6¦]|_`6'X¢X6| "l|^
6
|q
^Â*w6|
6|'S|
@@'*'0¨
© |0
@j^
6° ^¡_|S|@0
"§]|' ';*0
6@|v@]`
» {¢T°
6 ^Ä''U¢<'|"@
@?§
6
60¨
u®|}+¡¬q}S;uX';*0
6@²¡
6
6
Pq}
» b|²
rational
double
'
@
@'"T|||°'|"@
@6
6°6|vT
1@0
«bX'_"ndT¨O±1*'
double
';*0
6@|z6X@g'_^@zT
|z¢T{T"@¢double
uk6|S' z¡ n| "G
dT{M¢E'0W¡
6 {¦¢
6^
@*6'£q« ||@}]¦|R{0A@
6|06
W6 ¨Y~X@|?
@@]`6|'qq@}«6' !)]& d.W|o<61|'¶@||{¢Tq';*0
@60v66|Sl`
601dT¨
@
;¡_
À?®|}0v¢TS|q6
6|}'u¢T0
© S';*0
6@¡
@
rational double
¡_||06O]^'
Â*w6|'¨
operator double
// POST : return value is double - approximation of * this
operator double ()
{
return double (n )/ d;
}
~7'|0
lMÀ6|°'u¢T0
{¡_|6
]^}}'¦
606
6<d. |<||'0
O|@
"§-|0|'Z';*0
6@4@O6|{operator
T 6^««6^6 O;*Â*'4|'|0*0
«6|z
|'''"6^
@*¨
EP 4.3.7 Member operators
¾¡_||06¦Æu¡.
6^6d|u¢T0
66^qE]'*|
60d|@u|
6o|'6
6| "¢] ¡_||06|
¨'¨0¨l£ug|"¬|o[¢T
@''|@|0
603d@|'|
6006}'''"A§
|}6|^loperator+
{'g¢.0
6Soperator+=
||0
ET"@¢¨E~A6
]qE3|@6|'u¢T0
W¡_|6|
|
¡_
W|§-d|¡d|b'0'@W@{6|w
60|
6'"'l`6
||°u'§
numerator
denominator
"@
@6
E¡_
W
606
6||{u
@'@| ¨¾||6¤¡_
®}6|'°q
@ÂdWÂ*z@z|X¢T''0
b¢]¦W'|6£ // 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 );
}
à °||
°0''@X
@'"@
606|'E@
64^
@k@R6||6^Oqe ||X|C
@T0
6
À
6
6|°¢]
¡_||06|'¨À¾R?®|}0"|0
¨ © |WT0
6^6
W0'|W6
l|@|¡WR
6^6d|g¢.0
P¢b6|0
6operator+=
u|JAT'''u¢T0
n¡_|0@C@]`
`Eg|v@4|k6|'¨ k° <|²@g|_^6}@X?|¤6
6|,6|R||6,|<
@"|' dÂ*w6|'¨
// 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 ;
}
© q
"Âw¢|z| '';g'|@|0
z_^
@0
z"@
6|066£
@|'bqg|
6A«0A@
6|0«k60
A§
'|_^@W
6'"¦
|lO¬@¢@'¥d|';6'0¤¢]6Â;6 ¨~¤¡:0'
S
a + b
a
operator+=
|'@|'O6}'*O®|66|q|06
W@]`Sq«|''X6gl^Â*z|`n¨
¾ ¢T0"60
S'¤6}E@v
6 Ä'
wu|¢n'u¢T0
S¡_||06Z- Fk'FJV''&
operator+
l^Âw6|s
6s¡ ¨ © |
!'2T'&9;@!& £?'||b|q¡_
6`
6|'sM¡_
£*^
b
*this
a
ÂSS¡_o'¨
// 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 ;
}
6|z6|+'u¢T0
¡_||063`6|0
6+|E|
6¢' u^'''@"|E6|À^lq'u¢T0
6
|
6006*
@|'6|¬0''@+
@'"@
606|
||P^|60g¢T
¡_|0@|'¨ © |D*0
@@¡
operator+
*
'';«w6|g|b|
60d|@°|@04¡_
^J ^kj6
6J0*'
struct rational
@0
"*Eu¢]@S¡_
g
@z"0'W}'0l^@v¡
operator+
// POST : return value is the sum of a and b
rational operator + ( rational a , rational b)
{
return a += b;
}
Ç{`
6|W6^0*'
Prefer nonmember operators over member operators.
operator+
@||¢T''wb'u¢T0
À¡_|6¤¡
||¤|0'
d6|¬q|
|
6¢]^¢
class rational
` X"@j
6g ''b}]''6^6
¨ © |0
@}n|{}T
@l^w
6 ^@Z6XÂ*'0
6|qT0
6^6
W¢]@|
||X6|qq6v|g6O|@0
"§]|'X'*0
@@|'¨
'|u6|«0*0
6"R¡
6
6
@]`Sqz0S6
6|X6|z'|"@
6|06
int
rational
// POST : * this is initialized with value i
rational ( int i );
qn'R¡_
®}wE
6¦6®|
6'"@|Â*
E|0
6
W¡DÆT
¨
r + 2
2 + r
r
rational
~'}@'6|E'}
À^|@^6 ^z|@0
@@¬«0*0
@@|n'|"@
@6
¬ ^¨¶¹Wo
'|
^b¤0g¢T
zq|e
6'o*g6|{@''|ZT@@¦¢]R¡ÀW
66|
¨
operator+
2 + r
0 » E|
6"w@0^^|T0S|'
E'}'
¨s~¡
wg'g¢.0
r + 2
operator+
¡_||06
6|'
" |% r + 2
r. operator + (2)
~ k0}]|g@'.6|u'}0
E|@0
@6w6|b';*0
6@k¡
6B6|u P^
6|'EÆT
66|¡_
@Y`
6|'dT
¡
|0*0
@6||nq
@Âdq¬®dT'06int
03¨
rational operator+
||`q*0
|qX
2 + r
2. operator + ( r )
|l°`Â*'W|}"'|@n^@@d0*
¨s~¡+qzE
6@nu¢]]`
@¤T0
l^@
Eg0g¢T
W¡_||063
6|'k@b|
6"« ¶^
6|' FO).' ¢Tg¡6|u
6'"T006*g'_"zd.¨g~}]'E'*0
@@|
|{|Sq
@Â|0
6 ¶6|0¤|¤^|q D`
6|'6¬@{¡_
6^T^
6|';sÆT'S¡+'|0
@06
¡_||06|'T¢w6|0J ||w¢T{?®T'6'k6 A| ¤6|u'_^@w|@
w6¢T
operator+
^|'
¨
4.3.8 Nested types
©
6uX6|
6C ^60
@Z¡S'_@b0g¢T
6'¶|6|'@¤^
6 #1 '@?(Ufo2T ¨ © j6^6
6 |'@]W|W'w¢Y^l¤6v~@@|·{^¢To*6|n|«000
6||{6|z@0
6T
60|
6'"'l`6
¡w
l^6]^Wu¢T0
@'¨~¡w*<6|Â<^¢.|v'|@'¥06UJ6|°
60|
6'"'l`67¡
l^@Yu¢T0
q¡
@ 6|z0A60
d@0¤*¤
@¢Y`¢]¦@bS;s6u||6|z|0
l^6
|u|'|^6
dT¨1¾EP|| ^60bb6|¬®|^}]^6|'"¬ÆT'1;+60
@]^zl]^
^
D*ZA61|
6@b6¤
606
6
¢n4@g'u¢T0
z¡_||06|
numerator
denominator
§|''¨
int
EP ¾ ¢T0@@0
q@6}q|¢Tw6|
6@|nT@¤00
@l¤|
6T
@6'0¢d@ d|
¡_
R®}R6^¤6|4¡_|6|
|
606
6 [60
lÆT
numerator
denominator
¯d'6 ¨ ¨¼³*£¨ © |'* @0
6ul|¡
6 |@'
l|dTS6bn|Y0
6';¬|
¦6||S^|o|u6|«0A60
¨ © 'l|| *d6|q O¢T«||«W¡_`E'¨
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
};
~°'|"@0
S'd|6|q O¢Tn|@'X¡_
®}wÂ*w6|'¨
typedef rational :: rat_int rat_int ;
rational r (1 ,2);
rat_int numerator = r. numerator ();
rat_int denominator = r. denominator ();
// 1
// 2
4W
@ u@'S|W¡6|S|
6T
@6'16^¶6|S|'"6'{ÆT
{|"'*
rational::rat_int
O
6|0
¡_
S6|s6{q
"Â.¨|
W®}d|'S¡+dT
gAS¢.«';*0
@6¦¢]z6g ¨
int
¾ fo2T?(|5(|0 8_9*&09;"!# ;@
6d||''S|0 w¡_
W¤®"6|bdT
;6°6«@'T¨°~Mb|d0 #1!* @
@d||'}X|0 dT¨X~Z¡:0 P@v v'Z¢T}|@'
"d;|@O@j@uJe+'6?®6'¨n~e6|u^¢.`*u'
qb"'g@ÆE'
¦6|O6|0_@
6|ndT'|'¡¶|''^
l^6X;@
6d||''{|'"60jT
.
rational
rat_int
|0Å«¡_
w6|ÆT
¨~J@n'|"60
w0d|Y6|b'@'» w0"6'jdTM@]` j¢T
'0'@@'|@w6|S@'Tqint
T
l^6
*¡|6|q|'"6'{ÆTq|''_^
6^6u1¢]o£D
6'0'*'w
@|
@@0
?£s]^¨
~
6 ¦§¡_ 0d|@
6w^
6E0"6'dT0s¡T0"6'dT0¬¡T|'"6'd.''¨ ¨0¨'|
dT0]^'S@'|°6v0W*0
@X|{||«6{6|'¨ © |«d.'|'¡1'l|@poq|W@{Â*'0
E0d|z
@ ^¢¨
Typedef declarations.
4.3.9 Class definitions
4b|oy'*b@''J6|Æ
|
60'6W¡}'_@0¨
6*|}0_@|0|6°6|
¡_
6
³
class
º
−
¨¦¨¨ −
|0
@ g²|'@0
¨ © |@'¥00X¡ »¼'4¢.¤0}*¨e±^? } 9|0 'ZÆ2T0' rw'&
£?s
Fe'FeV0'&<(|0 8_9*&09;A!# ¨ ¾
public:
private:
'u¢T0
D|''_^
6^6PE|''^
l^6"l^@''D6^+] z|''^
6'1W'g¢.0
+¡_||063
O^6¤'u¢T0
'3
O|'"@'ZÆT¨ s'6*'*.@0@^
6{ ' Fk0FeV'0&o ¡À6|}0_@'
|R6|'
w0EgAE¢Tb|';60
60¨W¾y0_@w|0|6X@
@d||''wv|0 dT.|j@
dTzS '° 8_9;'{fo2T W|T@'X@vu¡_|0l.T¨
¾ 'g¢.0
¬¡_||06¤|0|6qb|''_`
l^6^qq0¢S¡T6|'_@s|0|6¤|'
|g'l^²6|¤|0¦6¡wR'u¢T0
u¡_||06
¶6|u¡_|0@,g|"g]'*OJ`6l
|0|6R@|0
60@@0g¯d'06 ¨ ·¨¼·*£¨¾+'u¢T0
W¡_|6J]|@|S66|0
¡_
6 6| '8:9;'uMFg238h0Fk'#
"9;A!# ¨
¾X'u¢T0
S|''_^
6^6°¡¶g'_"E@°6}'* 8_9;'}^0!'2T ¨W~M6W0'_^
"§
^ 6¦*{
6'46|}'_"n|0|6
¨ q_^@n@0Tv|Y0
6n¡
@ ¶@'TX¯d'06 ¨¨¼·*£
j|u"T00 ¨ © .6'@_+"'Tb¡}'u¢T0
W0'_^
l`6R||O6|Y`
@w¡16|
'_^@¬|0|6 A¢.'o
«@E0'_^
l`6
;¢¬¦s"]|À6| QS.!*8: '_^@¬|0|6
9*#P( 6|
¡_
6^
6|';"6^Z¢T|'¡S'u¢T0
«¡_|6|0¦6|'¨O~C"
" ¶X'_^@
'u¢T0
q ^X¢Tz"' "0*0
@|0
6 }O@z'_^@'¨
~¡3qu'_^@s|0¦6|¬¡_
6$| Æ;s|''_`
l^6*W
6'|';6|0
6s|b
@¢]' ¤|@|
6|z6¡_
E'u¢T0
@s¡+¢T6O'_@"''¨
Class Scope.
4.3.10 Random numbers
4Eo/]'*6|W |6«]¬@06|0
s«'}06W||@'¡_|.}'0l^@b¡.6|
dT
Wg0_@W b
º|¢]W@|'qn'*¦
6 @'0R"S¡+6|«|'0'@6^
"
rational
'À{¯d'06
¨ |u6|P@006
q¬ '*À6|s¡_|d'@1P±1®0
6'" _*
|b'6d|
|0
6z6Ou¡
6'@R'@q6^EWu@6
6'@0
@l0q°A6
6¨
´ d|b*'s6|'}|@0
¬q|¢Tw|
60@}¢T
@|6|s@w||
6'|06^¢¦§
bl|'@q
@
l$@||¤W¦S ds'wXE66|z@w¤`*'q
6 ^066
*
w6«Ro*''.^Re^j06R*^@n'|''S@||jS'STJk`
6|n@z@z|Rd `6
¨À~R
@
E6^?|*|||
600l^¢¦Æ*;6|«|
6
l^pd'
|@'E &09*#P(|!F #T)YFJV''&{\'#1'&09;@!& ¨ © |q60
6pS@'||;6||
@|'z6|«u¢T0
@
^
6
6 ^'|0
l`6'°^''
6||b6g@®'¤
6|O@|l°S'6^s6|0 9 22T?9*& 6
¢T
l||R¨ÃÀE¡_
W
@T"'«M|'|||b*'l£6|qW0}]06'}@ '0 ||
qz
@|lRd|u¢T0
6 23')3(|!&09*#P(|!F ¨
¾ " }|¤|';§-|@'60?||¥w¡30@@|uu"'¥d|'|'
d|u¢T0
63T6| 8 % #19*&!#.\& )+'#
Æ9;8Fe -.!( ¨ *'b FO).8 ¦238"'&
Linear congruential generators.
¡@0|
l^|
a
EP ! x1 , x2 , . . .
¶ Fe!(*).8).
^C (
m ¡D^6
l
d|u¢T0
6q|0|'X¢O6|
6|
c
xi = (axi−1 + c)
d
m,
© z@'¥|'|'
c = 187,
x1 , x2 , . . .
d|u¢T0
+'|0
l^6
m = 28 = 256,
knuth8
|0|'b¢dn@À¡_o|
x0 = 0.
¡Dd|u¢T0
6s6^Sq«E¡
6
10n'|@|0
6|@0¥d|'|'
i > 0.
¾U@^*®|}36|À@'||
l||
]^
l60
6'¨
a = 137,
x0
6|q
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
T¨ ¨'¨
37 136 131 214 65 132 95 146 221 0 187
6=|0
@«
6|z@'¥d|'|'z
60T'^6S6@'¡X'|0
l^6|wT0
6X ^°|0*0
S¢T«
6
£?¨vÃÀz|6P6|wT'3¦z^|T ^
66¢Tu
@0@j
l||µ-6||e¤'@0
zdÂ
60*'m
s6^Sqq|q
l|| ^Wºu*°|@0`*0
Wb"@
@Â|u@O¡D|
l|||'@ `£¨
~X
6|0
S6u^Â*w6||6||E¡
6|z
6|$|g¢T
6s||0T'||'S¡
6$6|d§
||'Wq'
6060@ #1!& Fe9;8; @zd|u¢T0
6S@g6^q6|0°`
6z
@
d|u¢T0
6S
6|z6
@^
¨
[0, 1)
´¶
@
l · u¢T'o';l|¬6|w|0|6¡D'_"
¤"]'
¡_
S'§
random
0
l`6|
@Ä'0u@0|
l^|Åu¢T0
@¶'d
@w6
6|q| ^
¶0
@06ifm
_^06|d
¨
©
6u°'|"@
@6
b6^u`E«6|'|"@0
6R|
6o|v6|}]^
l^060
6
a, c, m, x0
|ev'u¢T0
¡_||06
606|
6'AT'06¦*g|®d''0wj@b"'¥d|'|'
operator()
¡D@
¨
xi
// Prog : random .h
// define a class for pseudorandom numbers .
namespace ifm {
// class random : definition
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 );
// POST : return value is the next pseudorandom number
//
in the sequence of the x_i , divided by m
double operator ()();
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
Program 34:
2
&'!\*
&09*#P(|!FJK_
s|g^
6|';6À¤
s "g%6^ »¼}6s|''^
l^6}
© |¡_||06
operator()
]|lJ|@6'|dÂE{¢w¡_||£T|jo*0
6*|6| 50)]#1 "!# 9;8%8
operator()()
!'2T'&9;@!& @' © ^¢w³b6|w¾E|T'||¦®.¨¶~O'|0
6¡ q¤®d
@'@@¤¡3@'_^@
dT|l°q6|z'g¢.0
q¡_|6
operator
£ ¨¦¨¨¦ £
6|' u X¢.«|@'RÂ*zg¡_||0616|n?®|
6'@"
n ¨¦¨¨ £
'¥¦'T6Ws ¡6|¶'u¢T0
.¡_||06
¦6z^
6|';6 ¦¨'¨'¨' ¡_
S6|n®d
@'@@ ¨ 4zY@'n"lR ^operator()
q°´1
6
l^ · |°´1
6
l=· ¢.'o¨
E0
6R}6|°}'';l^6C¡w6|R'@
<|l<q°@0J|o
random
operator()
T^6'}@°|°¡6|R^lk0g¢T
6Z¢T°6|°
6'".'06*R|®d''
0<6|
x_i
@'¥|'|'¡D@
¨
xi
// Prog : random .C
// implement a class for pseudorandom numbers .
# include < IFM / random .h >
EP 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
Program 35:
2
&0!0\*
&09*#P(|!FJK
°e'|X"'k
l||
|u¢T0
«'|0
l^6
@n^
@{¢|l0ke®|6j6|S *¨
d
60@|
@@'||
l|| |g¢T
6
¬®}6|qq'¦§MÂ|ov0
l^6
drand48
[0, 1)
'0
6||g6g6|z]^
6060
@
a = 25214903917,
c = 11,
m = 248 ,
|j{"''jl"'J¢O@n'|"60
¨~MW' ^
W6^Eq«|''J{_`
6n||s6}¢|l^
u"'¡_|D'|0
6^6
@0
EO.0
W¢.|O¡_
W6|zd|u¢T0
S¡+|Y0
6';Eu¢T0
@q@]`
m
qz XT"@¢0W¡
6$6|«0
l^6
¨ © S'|q@]`
¡
6=^¢To*«q
l^@
E
knuth8
6o¤'|0
l^6
'¨
E
6W*À@]`*v'|g_'bE6u*|
¡
60g|
S@|{¡_
{|'_'*'R@
l^
¨¬±lJ¡P*R|0.'|06W
66'S|`EjR;6'0
W¢T0q''
^ ¨ © 0°6|nd|u¢T0
6S^
@n'}]^
603¨~¡+6|0X^
6«'¥dM|@z*Eg
l'¨À~¡+6|
1
d|u¢T06
6¶|Y0
¶¢dg|;@s_'*0
@g6|S@0
1d|u¢T0
¶0@ 9 ¡
6Å6|Sq¦6
6|z_^
60
Su¢T0
'¨~¡36|zq{d|g¢.0
6q|.0
S¢dqg
E
66|z_'*0
S@¤6|z_^
6
d|u¢T0
«06 T ¡
6ª6|{|g6J6|v@^0
u¢T0
'¨{Ç4 e
60T `n6|z|6
6|@
lX^
@
6¦*'«M
E|@T|«¡+*O
6|WW¡+ @
|X|T'¡_|¦ »¼s*
¡
@'|]£¨
~¡¬*Z6|Âk`¢T|` 6X_'J6|z*+¦ »¼z|¢dd|«E]`«6X
¨ w|v6||
¬*e"|R|W
66no°@b@nu¢T0
R0*0
@R
@|
Y"|'
¢dd|']6||
6|'v*
À¡
6'|}¥lÂdg ^
@16«®¦@¢gW
66|od|u¢T0
¶6^¢T ^6¶*
d|u¢T0
zM¢O|'"°¡D@z*@SE¦S dsT@@¢ £¨
Ç @|6|0
6'¡_
6^ "k|
@'|0l^¢U6,*
Rl|''0¨pÇ '|
¡_
®}.@00
606¦R
61}|'uJ0*0
"J
@|e|JW
66b|oj6|ud|g¢.0
w6^w"o0¨
The game of choosing numbers.
7,7851 &) ,J? J]^G?G!5J /E?%)COD

+D$<<4N?%
/.?%!(&NI,* )C6E/0?.G/ 57&)
32
D 5*/4E!K?G7,7
L "&)9?%!(!QJB46"1 Hunsigned
5*.?,&("7<%^Cint
E/ J {0,aU .HQ. . , 2 −1} ?%J=@78&(1\5*!K?,&)P, 19X=Y5!#\DHQ0/E?,D/
double
&(W?P75*&.?%Arandom
!# $'?NUT]J$'?NU9. ) \0/0DL
·
ÃÀ±P®
6'@ o
@0* S6^q*
E¡
6'|° R®ds6|SSq'¨
ÇR{|"S@'|o ]|0@|z*|
W
l||=l|'0'¢|o k~R
@
E6}?®T0
@'
¦6,|Y0
6';v|""
6¢6|'1*U|''|¤6k|0|X^,}'';uJ0_@
6^
@W@b|0bj@|?evS'X6^E6|
@¢Y`¢]¤¡_
d|g¢.0
6'loaded_dice
Jw'¥]^
i
6Zj|
6'"T0''U|
-e¡:¦
}|'O]^
¡_
£¨ © |'U*
pi = 1/6
. . , 6}
'|Zb|.0
@'b*|'pZi |''n_'4*|"«
lC6|0
1|i46{1,
|«. S
k|@'o*0
u@|"§
^¢z
@¢Y`¢]60q@}|@u*|"S*
w¡
60ME|}W¢X6|nS'X"6||v0}]6
@''|'o£¨
´¶
@
la· @|`Ewu@|l^¢z'_"E|0|6JM6^W°6
6X
@''WX6|n0_@
random
¡
6 ^¢To*w@ 6|e
@Ä `6U6C6|e;60
@
£¨ 4eEX6C6|e'@
[0, 1)
}'0l^@°-|¤6|« ^u¡36|«^lu'u¢T0
66£R´1
6
lp· ¢T'o¨
// Prog : loaded_dice.h
// define a class for rolling a loaded dice .
# include < IFM / random .h >
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);
// POST :
//
//
unsigned
return value is the outcome of rolling a loaded
dice , according to the probability distribution
induced by p1 ,... , p6
int operator ()();
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;
EP };
} // end namespace ifm
Program 36:
2
&0!0\*38:!9(|( (*A0K
© j|6_^Ä'b6|*|'|'¶q'*}6R|
6o|}6|}|
6¢]^¢@'
p
,
.
.
.
,
p
1
5
P5
£?
|e6|b
l||ad|u¢T0
'|0
6^6
6^¢T0|¤|@0e6O06X
6p+66|=
1 − i=1 pi
|'¨1¾E*
;qW`*
6*
6n
6 ^Ä'S6|E¡_||06¦Æu¡.
6|6||'W0¨
operator()
EoCSq}]'']6|3¡_|0@ k]^
@@66|60
"
6
6A§-T'
[0, 1)
6
;60
@'E|0
6z6
@^ S'|6
i
p1
pi
p3
p2
p1 + p 2
0
p4
x
p5
p6
p1 + p 2 + p 3
1
"|b|
q0
l^6
¨~¡
6|wd|u¢T0
© |'¤qw
l' d|u¢T0
^s
l|| ¡
6
x
[0, 1)
6^Dq¬0Pq0
@À@
6|z
l||R`@0g¦+q|b'|uub@0
@ ¦6|
6¢]^¢w®06¦
i
¨BE||0
¶6|W@@|}|6b6^
¶]"'|
6|u¢T0
@P¢T''*EÂ*¬
6|u¢T0
@
pi
Xg@|6^¢S'*|q6|0
60¡_
6«|'0_^
6 q6|«60z¡3
6@z|'z¡P^O|¡
i
'||WR°@0
@ ¨ © SS6|z @«
¡P^O|¤¡
x
i
p1 + . . . + pi−1
x < p1 + . . . + pi .
n®_«6|}^lX'u¢T0
@
¨'¨0¨'
%q}|3» b|''
© |
p_upto_1
p_upto_5
£W|
£@£¨ © n'|"@
6|06
j´¶
@
la· @}@0@6|'@p_upto_0
'u¢T0
@
¡
6= 0 6|W^p_upto_6
lw|
6o|'=
1|v6|E}0'l`6¡
|@'6|'t}®|^06u6|
S'6^qSW0@|'X¢¤@|
60d|W'¥^6
¨ operator()
// 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)
{}
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
Program 37:
2
&'!0\* 3
8h!9(|?( (*"0^K
¹ o<*} }0}Y`
6¬q«|Y0
6';À*^0{|'06|}E|lv|q¢.0@60
g6|
W
*¡3l|d@|ud|u¢T0
60¨¶´¶
6
6 · |'¬6|'^@@||6^¬*X^
6|@|g*|'
|'6^W|
6'¡_0
6z_^
@0
u¢T0
@'T|R*
¡
6'|J"'}*|'j|'n@]`w"l'w
@
6|n|¨À~MW6
6|W6^EX6|W@0@@||*°E°O6||{
6|
|¢]ES¢dX{|l
9
k *
luT0
z
6|]£¨±1®0
6'" ·?'|'*k6|e6|u¢T'"z*|'
|'60.12
^q*°'|X.@@¢|@zX6|q*¨
// Prog : choosing_numbers.C
// let your loaded dice play against your friend ’s dice
// in the game of choosing numbers .
# include < iostream >
# include < IFM / loaded_dice.h >
// 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
}
int main () {
// the random number generator; let us use the generator
// ANSIC instead of the toy generator knuth8 ; m = 2^31;
EP ifm :: random ansic (1103515245u , 12345 u , 2147483648u , 12345 u );
// 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 );
// 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 );
// 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 ());
}
// output the result :
std :: cout < < " Your total payoff is "
< < your_total_payoff < < "\n ";
return 0;
}
Program 38:
2
&0!0\*¶ .!!*0M#.\ #T)]FeV0'&o^K
4.3.11 Details
¯ 0@''qES^À@
l;¬||'g¢.0
¡_|0@|¬'0'@¬66|W6
"§
d
60|
60@'6^6g¡Y0_@'¨ © d d¡_|0@|1¡_
E|lg6|1`Â*'1@'|@W^
6s6|s§3|
@wT0
l`6
6
^
¨z~|'03]E
6@|}w
w
6 ||;6}6|
operator<<
operator>>
;60
6
60|
6'@0l^@¡6'²
@'¥d|
60b@{Âdo'|}¡S@n
60|
6'"'l`6Z6^b'
¢T0*|XE^S6|0
E¡_||06S|''
¨
4¬'|D
6 "]`¢]¦«W
66
^
P0g¢T
6¶M;n| `£^¢
operator<<
operator>>
qq {^Â*¬6|'@q¡_||06| 50& A'#P(; ¡|6|S0_@'¨1¾Ew¡
6'|3;¡_||06g¶||
@'"@
606'
'0'@s6b6|E|
6^6w'@s'u¢T0
60¨1~Mss' ^
¬6^À6| 8:9;0 gAs|''_^
@n¡_|66
¢Tg6¡
60
3|k|z6|u6|0
«S'e^
6||
T@|'g » @g'_^@w6^z]^z6|
66'n@
|
60*
|J|w6|b¡_|0@
¨
6^*] 50& "0#P(C(| 8_9*&09;"!# }'u¢T0
|'0_^
l^@
¡D@«¡_
6
Friend functions.
friend
−
º
© S|'0_^
l^@^Â*'¬6|
6'"T006*¡_||06Xu¡
@'|X¡36|z0_@S|X
66S0''@q6
^lb'u¢T0
@'d|0@
W6|0O^
@«¢]w
E|
6^6¨
S6|«'@
|qz'|
rational
60W
666|
"'06°E¡_`ES6v0'_^
6«§À|R|"]WT0
l`6
6W@v¢Tn¡
@'||
private
¡D@«'_"'¨
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
};
~}6|W|0|6v¡Y6|'"ET0
6^6
6'qW }6|'^'''@6|W
l^6
|}|'|`§
6
¶6
6|
|
1qS|@'v6z|«¦¶¯d'6 ¨ ¨¨1~¡T@@¦¢]¡
6'|{0'_^
l`6|
.n
.d
@||}¢TE *03@|'S6|0}'}|
6@s'| ^@|_^@
º;¢¬@6''@}^
@|@'¡_|
O
6|0
E6g6'*n|||'''"6^
@X'g¢.0
s¡_||06|'¨
4.3.12 Goals
¾qq6|qT; d*°"|k¨'¨'¨
Dispositional.
£}¢T«^¢z@{®d_¤6|z
@T@z¡1u'_"W bº
£||0
@"l|X6|« A606'3|°@';6 ^.60
6W@@'_^@'OE6 '@@'0
X]^
@6'|_^
9|0 '{A2T00¼rw'&o Fe'FeV0'&w50)]#1 "!#
|^ 0!#
'& )D @!&o º
·*£||0
@"l|X6|z'_"@'
ifm::random
|
ifm::loaded_dice
X|0l^¨
~X]^
@6'|_^
;*R@|O¢T«^¢w6X¨0¨ ¨
Operational.
£|¤";l06 .^¤@'^6'Y0
"
6
6q¤*'¤'_"s]|@|O}]''6`§
63º
£|'"0
6¢T|z
6|n|O¡_|0@¡1bdTz*'O¢dOg0_@S|0¦6
º
z·*£¤^O¡_|6}@}u*'°'@q6
6|X'u¢T0
q¡_||06|'º
W;£W
66@}]'_"@'EO*|
Wo
º
£q
"¤E6O|R^
6|«^¢Tq@'||
l||p|g¢T
6'¨
4.3.13 Exercises
'& !A(|9n5).8M83MFg238h'Fe'#
"9;"!#/!65&09;A!#P9;8P#T)YFeV0'&o9;v9k 8_9;'ufo2T'xw9*#P(
@ '"K.zf`2.n'.!)Y8:(!b0&{9;8M8
9*& -Fe "u!'2T'&9;@!&o"%#1 8)D(*M#.\u%#
iE9*#P(O(|'&''Fe'#
x
9*#P(g-.n9*& M-.'F°An9;'0h\#TFk'#
- xP&' 8_9;"!#P9;83!'2T'&09;@!&ox¬9;WQ 8M8
9;W%#
iS9*#P(!).2
)Y9*#P(
).^'&oi?(|rs#1?(j0!'
# 0&o0"!#
¦50&'!F
9*#P(@!
K ub9*#ZM'# d9*& Æ9*#
xÀM¬'.!).8_(.!*8_(
int
double
-Y9;-.}M#
@0& #P9;8À&'"2
&'''#
"9;"!# {#1!& Fe9;8?
( @0O9;8¦
! À>'&0'R
L d
K 1!&R9;8M8-.
50)]#1 "!#P9;8f{f]!){2
&'! A(|0x¬(|0'Æ(|zQS. -.0&«M'.!)Y8:(V0&'9;8?(OV'f}Fk'FJV''&50)]#1 "!#
0x
Exercise 107
EP ! &kV f#1!#TFe'FeV0'&b50)]#1 "!#
^KÀ.e 8:9;0O'.!)Y8:(²9;8¦^!4Y9QJ94#1 '@?(#T)YFe'&09;@!&49*#P(
(|'#1!FOM#P9;@!&<fo2T<@!y9| AX²Fk!&'°m«?>;ÆV 8f;xZ9*#P( -.'&'<0.!).8_( V'/9Å0!#'0&o0"!#
z·*£ ;£
50)]#1 "!#O50&'!F d9;8)+'¤!65g-gfo2TK
Exercise 108
94'8:9;'xV f
¿ 'Qq& M@v-.{'& )+'
Tribool
-Y9;Wf!)ZY9Q(|X 8:!'2T?(°M# À
>'&''M %#
@!
9 U
FJ9;cM#.\X-.O(9;"9XFk'FJV''&o2
& ,d9;@'x
V[
9((*%#.\k!& &' A2T!#P(*%#.\k9|0 'W50)Y#1'"!#
0x
[9((*%#.\¤9*#²9|00''5)Y#1 A!#
-Y9;&' )Y& #
«& )+z¼59*#P(X!#
8 f 5«-.
is_bool() const
d9;8)+gu#1!*W)]#
c#1!Qq#Txz9*#P(
( [
9((*%#.\X)Y'&oi?(|Mrs#1(4!#''&o0A!#
W5&'!F
9*#P(°@!°-.vf`2T
bool
K
W;£
Exercise 109
9
À%#P(j9;8M8¶'& &'!&oM#-.s5^!*8M8:!QqM#.\2
&'!\&09*FeK À_>X-.'F
9*#P(j(| '& ÆV'u-.s5)Y#1 A!#
i
;9 8f/!65°-.jfo2T
x}V fJ2
&'!A(*%#.\R2
&' il9*#P(J2.!*'@0!#P(*M"!#
5!&j-.jFe'FeV0'&
Clock
£? £
5)Y#1 A!#
^K
# include < iostream >
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;
}
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_ ;
};
void Clock :: time ( unsigned int & h ,
unsigned int & m ,
unsigned int & s )
{
h = h_ ;
m = m_ ;
³
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;
}
¢Y£O~}'0qO@|WT0
6^6
S¡_
W@«'_"
Clock
¨
«·*£
& M@R92
&'!0\&09*F
@!eMFX)Y8:9;@-.w5^!*8M8:!QqM#.\j&09*#P(|!F
random_triangle.C
2
&'! 'b\&09 23A9;8M8f|K w!#
0A(|0&¤9«r>(°& A9*#.\*8:
9*#P(4'.!!*9*# 9*&V'&09*& f 0&o@?>!65
t
t
9;¤9J0"9*&oM#.\}2T!%#
"KvÁ6# ?9| Z'@"2
x« .!!*O9;¤9j#1?>¬2T!%#
w-.}FXÆ( 2T!M#
nV0 Q0'#[-.
')]& &''#
À2T!%#
z9*#P(k9 ")Y#T 5!& FX8 f ¤&09*#P(|!F°8fJ 8:0 @?( '&o@?>C!65 K
t
À.°0MFO).8_9;"!# 9;}?9| <'@"2 (*&09*QS°-.4')]& &''#
E2T!%#
M#
@!U
9
M#P(|!QwK ¶X-.
QqM#P(|!Qa!V 0'
(|rs#1?(ZM#
5^!&¤\&09 23"?9;8!)Y2
).xb9*#P(U'.!!*
ifm::wio
<IFM/window>
-.e& A9*#.\*8:eQqM- 0&o"0'
x
xv9*#P(
K 1J-.e&09*#P(|!F #T)]FeV0'&
(0, 0) (512, 0)
(256, 512)
\'#10&09;@!&
50&'!F
&'!0\&09*F K «zV'Æ\M#TxE-.z2
&0!0\&09*F '.!).8_(O&'9(XM#/9°0?(5^!&
ansic
-.u&09*#P(|!F¸#T)]FeV'0&{\'#10&09;@!&O9*#P(O-.u#T)YFJV''&¤!65b0%FX).8_9;"!#C'@A23b@!u2.'&-5!& FJK 1!&
£
@ '%#.\v2
)]&@2T!* 0xq8: -.v0MFO).8_9;"!#C& )Y#O5!&O9V0!).n
L x ¤'@"23^K
Exercise 110
!#
0Æ(|'&O-.¤\0#1'&09;@!&
).^(eM#
&'!\&09*F
KRGTM#1X-.¤Fk!^(*).8).
Exercise 111
ansic
!0&-mn!QB¼5
31 x}-.eM#
@'& #P9;8b0!Fg2
)."9;A!#
C!65J-.e\'#1'&09;@!&ZQq8%80'&o"9*%#
8 f
m = 2
V -Z9*&'J).?(U@!²&'"2
&' ^'#
9;8 )D ^K Æ2
@J-0x{-.e )D'#10,!65
d
unsigned int
23')3(|!&09*#P(|!F #T)YFJV''&ov!F{2
)Y@(RV f¤-.«\'#1'&09;@!&uu0!& &00 w9*#P(R0!%#1'A(|'«Qq-XM-
£
Fe9;-.0Fe9;"?9;8¬(|rs#TA!#PK À>o238_9*M#U-M
ÀM#P(Å9 8:!9(|?(y(*"<-Y9;kV'?9;-U-.°5^9*%&/(*A0U%#$-.,\9*Fe[!65 .!!*0%#.\
£
#T)YFJV''&o`K b}9°-.0!& f?>'&0'^K Exercise 112
4.3.14 Challenges
Y9;¬M«-.{V' 's8:!9(|?(R(*"0À5!&E238_9*f%#.\-.n\d9*Fkv!65g .!!*M#.\}#T)]FeV0'&o
0!)Y8:( & f[@!9 22
&'!^>;MFJ9;@Z-.U(*0& AV )Y"!# ?> 2T'& MFe'#
i
"9;8M8f;xb!&O^!Fk .!Qp0!Fg2
).@"K M# !&0(|'&O@!urs#P(9k)Y"9V 8h-.!&' "?9;8sFk!(| 8x
Hint:
?9*&' j5!&j-.j@'& F ;'&'!*i")YF \9*Fe ox!&4(*%&'0 -8f,\!C@!C-.Z0!& &0 A2T!#P(*%#.\/'Y9 23i
@'&w%#
K w#10
http://www.inf.ethz.ch/personal/gaertner/cv/lecturenotes/ra.pdf
f!)[YQ9 «5!& FO).8_9;@(C-.{2
&0!Vo8h0F 9;j9 ;'&'!*i")YF \9*Fk'xnf]!) 9*# !*K8 O).M#.\{5!&
£
?>|9*Fg238hv-.{QV iAM#
@0&-5^9|0
Exercise 113
4M-²(*'& ÆV ).A!# µNP!)
http://banach.lse.ac.uk/form.html
EP
© Copyright 2026 Paperzz