[PDF]

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„|…6‚0†d‡‰ˆŠ|‹Œ€ŽqˆO‹@‚00€6‡‰ˆ|‹'.q‚uƒ‘'†*‚g’|‚0“ƒ|‚'’k‘”|‚0•‹A€@…6Š|0€w€Ž–d„T‚
E|ˆ‹@‚—†˜‘^™‰Š|‚
…l‘|š‚q›œˆd’|‚'™‹P€6|‚S›”‘`€6|‚'›”‘^€6‡‰'‘™;€Ž–„T‚Wž ŸM€6|‚q‹@‚0€ˆ¡]…l‘`€6‡‰ˆƒ‘™Šƒ›u¢T‚0…@rational
‹l£*‘|’vq‚qƒ‘'†*‚W‹@|ˆoŒ
|ˆ`‡€q ‘¤¢T‚‚'¥dŠ|‡„|„T‚'’”Œ‡¦€6”‹@ˆ›œ‚wŠ|‹@‚'¡_Š|™
¡_Šƒ|0€@‡‰ˆƒ‘™‰‡€Ž–OŸ-‘^…6‡€@ƒ›œ‚€6‡‰W‘|’O…6‚'™‰‘^€6‡‰ˆƒ‘™ƒˆ˜„T‚0…l‘o§
€6ˆ˜…6‹0ƒ‡|„ƒŠ€W‘|’XˆŠ€@„ƒŠ€?£¨
© ˆX›œˆ˜€@‡†˜‘`€6‚—€6|‚g€"…l‘|‹@‡€6‡ˆe¡‰…6ˆ›ª‹"€@…@Šƒ€6‹z€@ˆX'™_‘^‹@‹@‚'‹«‡‰e€6|‡‰‹z‹@‚'€6‡‰ˆ,Ÿ‘|’4‡‰e„]‘^…"€6‡‰'Š|™_‘^…
€6|‚}‘^‹"„T‚'0€—ˆ¡¬‚'| ‘^„ƒ‹@Š|™_‘^€@‡‰ˆ]£
™‰‚0€—Š|‹«‹"€l‘^…@€nˆ˜­,E‡€64‘”€6|ˆŠ|š€—‚?®„T‚0…@‡‰›œ‚'€'¨œ¯dŠ„|„Tˆ‹@‚v–*ˆŠ
‘|’,‘™™€6|‚}¡_Š||0€6‡‰ˆƒ‘™‡€Ž–e€6ƒ‘^€nq‚œ]‘'†*‚œ’|‚0†*‚'™ˆ˜„T‚'’C‡‰€6ˆ°‘
ƒ‘'†*‚}„]Š€b€6|‚œ‹"€"…6Š|0€
|‡‰'‚œ™‰‡¦¢ƒ…6‘^…@–*¨R~²±1®‚0…6rational
'‡‹@‚¤³³R–*ˆŠCƒ‘'†*‚O‘^0€6Šƒ‘™‰™–e’|ˆ|‚}€6|‡‰‹'1¡_ˆ˜…u€6|‚}†*‚0…@–Z¢]‘‹@‡}†*‚0…6‹@‡‰ˆCˆ¡
€6|‚v€Ž–d„.‚
¡‰…@ˆ›µ´¶…@ˆš˜…l‘›µ· ‘^ƒ’C´1…6ˆš˜…l‘›¸··¨°¹Wˆot–*ˆŠƒ‘'†*‚œ‹@ˆ™‰’Z€6|‚}™‰‡¦¢ƒ…6‘^…@–
€6ˆv‘g'Š|‹"€@ˆ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‘`…@–°„|…6ˆo†‡‰’|‚'‹'3‘|’e‹"€l‘^…@€@‹zqˆ˜…@Âd‡‰|šœŒ‡€6J‡€ ¨gÃÀŠ€€6|‚'4‹"ˆ›œ‚
Š|„]™‚ ‘‹6‘;€S‡‰‹@‹@Š|‚'‹W'ˆ›œ‚Š|„3¨
¯dˆ›œ‚v'ˆ’|‚œ’ƒ‚†*‚'™‰ˆ˜„T‚'’‘`€u½W¾ ©
|‚'‚'’|‹—€6ˆR‡‰|‡€6‡‰‘™‰‡‰Ä'‚u‘
Issue 1: Initialization is cumbersome.
|‚0Å†‘^…6‡_‘^¢ƒ™‰‚
Œ‡¦€6R€6|‚u…6‘^€6‡‰ˆƒ‘™DdŠ|›g¢.‚0…
º
¡_ˆ˜…€6|‡‰‹'.€6|‚b„|…6ˆš˜…l‘›œ›œ‚0…E‡‰J?ƒ‘^…@š‚g›gŠ|‹"€
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‡_‘^™‰‡‰Ä'‚'‹ ¢]Š€q€6|‚«‘0€6Šƒ‘™.†‘™‰Š|‚zˆ¡ ›gŠ|‹"€s¢T‚„|…6ˆ§
© ƒ‚z’|‚''™_‘`…l‘^€6‡‰ˆ
†‡’ƒ‚0’}€6…6ˆŠ|š Qrational
! ‘^‹@‹@‡‰š|›œr‚';€6‹¶™_‘^€6‚0…'¨¶½W¾ © €6‚'™‰™|r–*ˆŠ}€6ƒ‘^€€6|‚0–vqˆŠ|™‰’g„|…6‚'¡_‚0r…s€6ˆ«‡‰|‡€6‡_‘^™‰‡‰Ä'‚
r
¡‰…6ˆ›p€6|‚—dŠ|›œ‚0…l‘`€6ˆ˜…W‘|’R’ƒ‚0ƒˆ›œ‡]‘`€6ˆ˜…S‡‰°ˆ|‚—šˆ]‘|’°–*ˆŠj…@‚ ‘™‰‡‰Ä0‚z€6ƒ‘^€W€6|‚0–O]‘'†*‚b‘u„Tˆ‡‰;€
|‚0…6‚˜¨k~|’ƒ‚0‚'’
‡‰¡q€6|‚}„|…6ˆš˜…l‘›œ›œ‚…b‘^€g½S¾ © ¡_ˆ˜…6š‚0€6‹uˆ|‚”ˆ¡S€@ƒ‚¤‘‹"‹@‡‰š|›œ‚'€@‹'
ƒ‘‹uŠ||’|‚§
r
“ƒ|‚'’O†‘™‰Š|‚gŸ-‘|’O–*ˆŠ°š‚€W€6ˆgƒ‘|’|™‰‚w€6|‚¢ƒŠ|š{…@‚0„Tˆ˜…@€6‹6£¨~¡D€6|‚z‹"€@…6Š|0€W‡‰‹q™_‘^…6š‚…«ŸM'ˆ|‹@‡‰’|‚0…q€6|‚
‚®‘›}„ƒ™‰‚wˆ¡
ˆO„]‘š‚ ³*£€6|‚«„|…6ˆ˜¢ƒ™‰‚0›$‡‰‹E‘^›}„]™‡“ƒ‚'’
¨
rational_vector_3
¾Œ–”™‰‚0š*‘™.†˜‘^™‰Š|‚zˆ¡
€6|‚€Æ–„T‚
›gŠ|‹"€S]‘'†*‚
‘ |ˆƒÄ0‚0…6ˆJ’ƒ‚0ƒˆ›œ‡]‘`€6ˆ˜… ¨RLjвƒ‘'†*‚”‹"€6‡„ƒŠ|™_‘^€6‚0’€@ƒ‡‹{‘^‹{‘^,‡‰;†˜‘^…@‡_‘€—rational
R
‡‰,´1…6ˆš˜…l‘^› · 1¢ƒŠ€
€6|‚0…6‚z‡‰‹S|ˆ{S‘'–¤ˆ¡P‚'|¡_ˆ˜…6'‡‰|šu€6|‡‰‹S‡‰†‘^…6‡_‘^€ ¨¶~M€W‡‰‹q„Tˆ‹@‹@‡¢ƒ™‰‚¡_ˆ˜…E‘–*ˆ|‚z€6ˆgW…6‡€6‚
Issue 2: Invariants cannot be guaranteed.
EP rational r ;
r.n = 1;
r.d = 0;
‘|’œ€6dŠ|‹À†d‡‰ˆ™_‘^€@‚S€6|‚ %#
@A\& Mf ˆ¡T€6|‚E€Ž–d„.‚˜€6|‚w'ˆ˜…"…6‚'0€6|‚'‹"‹sˆ¡.€6|‚w‡‰€6‚…6ƒ‘™ƒ…@‚0„|…6‚'‹@‚';€l‘^€6‡ˆ3¨
Ç ˆŠJ›œ‡š€w‘`…6šŠ|‚—€6ƒ‘^€w‡€ŒqˆŠ|™‰’°¢.‚b¥dŠ|‡€6‚—‹A€6Š„]‡’j€@ˆ”W…6‡€6‚

‘|’J‚†*‚'e€6|‚—„|…6ˆ§
r.d = 0
š˜…l‘›œ›œ‚…q‘^€E½W¾ ©  ‘
» €S¢T‚€6ƒ‘^€W‹"€6Š„ƒ‡‰’
¨¬ÃÀŠ€W‡‰R½W¾ © »¼‹S‘^„|„ƒ™‰‡‰ ‘`€6‡‰ˆ
€6|‚†˜‘^™‰Š|‚'‹Eˆ¡+…6‘^€6‡‰ˆƒ‘™
dŠ|›u¢T‚0…6‹”‘`…6‡‰‹@‚R¡‰…6ˆ› 0ˆ›}„]™‡‰ ‘^€6‚0’<'ˆ›}„ƒŠ|€6‘^€6‡‰ˆ|‹g‹@ˆ›œ‚0Œ|‚0…@‚R‚'™‰‹@‚R‡‰7€6|‚R„|…6ˆš˜…l‘›Rº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
'‡…@'Š|™_‘^€6‡‰ˆJŸ-‘š*‘^‡‰
d–*r.d
ˆŠ°š‚0€S€6ˆvƒ‘|’|™‰‚w€6|‚¢]Š|šg…6‚0„Tˆ˜…@€@‹l£¨
LjŠu€@ƒ‡|Ân‘^¢TˆŠ€+ƒˆo,¢.ˆ˜€6b‡‰‹@‹@Š|‚'‹10ˆŠƒ™’—¢T‚q‘’|’…6‚'‹@‹@‚0’g‡u€@ƒ‚Àƒ‚?®€P…6‚0™‰‚ ‘‹@‚sˆ¡€@ƒ‚¬…6‘^€6‡‰ˆƒ‘™
dŠ|›u¢T‚0…6‹”™‰‡¦¢ƒ…6‘^…@–*W‘|’/–*ˆŠ'ˆ›œ‚jŠ„E‡€67€6|‚e¡_ˆ™‰™ˆ`E‡‰|šZ‹@ˆ™‰Š€6‡‰ˆ
 4¾Œ‹O‘|ˆ˜€6|‚0…”„ƒ‡‰‚''‚Jˆ¡
¡_Š||0€6‡‰ˆƒ‘™‰‡¦€Æ–jˆ4€@ƒ‚g€Ž–d„T‚
D–*ˆŠZ’ƒ‚“]|‚v‘O¡_Š||0€6‡‰ˆk€@]‘`€—0…6‚'‘^€6‚'‹b‘”†˜‘^™‰Š|‚{ˆ¡¬€Ž–d„.‚
rational
¡‰…6ˆ› €Žqˆ{†‘™‰Š|‚'‹Sˆ¡+€Ž–d„T‚
¨
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 ;
}
Ljа€6|‚'j‘’†‡‹@‚b½W¾ © €6ˆœŠ|‹@‚«€6|‡‰‹E¡_Š||0€6‡‰ˆ°E|‚'|‚0†*‚0…Œ€6|‚0–OS‘€W€6ˆ}‡‰|‡€@‡_‘™‰‡‰Ä0‚wˆ˜…w‘‹@‹"‡‰š°€6ˆ
‘b…l‘^€6‡‰ˆƒ‘™YdŠ|›g¢.‚0… ¨ˆ˜…E‚®‘›}„ƒ™‰‚˜
rational r = create_rational (1 , 2);
qˆŠ|™‰’X‡ƒ‡¦€6‡_‘™‰‡Ä'‚ Œ‡€6
‡‰Xˆ|‚zšˆ|‘|’°‘^€S€6|‚‹6‘›œ‚w€6‡‰›œ‚w›”‘^Â*‚‹@Š…6‚€6ƒ‘^€q€6|‚z’ƒ‚0ƒˆ›œ‡ §
r
1/2
ƒ‘^€6ˆ˜…S‡‰‹S|ˆƒÄ0‚0…6ˆ¨
¯dŠ|?—‘q…6‚ ‘^€6‡ˆn¡_Š||0€6‡‰ˆz'‚0…@€6‘‡‰|™–w›”‘^Â*‚0‹3‹"‚'|‹@‚¡_ˆ˜…D‹"€@…@Šƒ€6‹D‡«š‚'|‚0…6‘™o¢]Š€T€6|‚¶€ŽqˆW‡‰‹"‹@Š|‚'‹
‘^¢Tˆo†*‚v’|ˆ
» €z…6‚ ‘^™‰™–Jšˆ°‘'S‘'–*¨ © ƒ‚g…6‚ ‘‹"ˆZ‡‰‹«€6ƒ‘^€z€6|‡‰‹z‹6‘¡_‚}…6‚ ‘^€6‡ˆ4 ‘4¢T‚{'‡…60Šƒ›u†*‚';€6‚'’
¢d–J|ˆ˜€Š|‹@‡‰|š¤‡€ ¨—~e¡:‘0€ T–*ˆŠ…«‘’†‡‰0‚g›œ‡š€w|ˆ˜€zƒ‘ †*‚b…6‚'‘lƒ‚0’k€6|‚g„|…6ˆš˜…6‘›œ›œ‚0…w‘`€z½W¾ © 
‘|’œ‚0†*‚'¤‡‰¡T‡€’|‡‰’
€6|‚S„ƒ…@ˆš˜…l‘›œ›œ‚0…›œ‡‰š;€¢.‚E€6ˆdˆn™_‘Ä0–OŸˆ˜…¬€6ˆˆ—‹"€6Š¢|¢Tˆ˜…6]£1€6ˆ—¡_ˆ™‰™‰ˆo ‡€ ¨¶~M€À‡‰‹
€6|‚0…6‚0¡_ˆ˜…6‚‹"€6‡‰™‰™ƒ„Tˆ‹@‹@‡¦¢]™‚W€6ˆbE…@‡€6‚
‘|’”¡_ˆ˜…6š‚0€W‘^¢.ˆŠ€s’ƒ‘^€l‘n›œ‚'›u¢T‚0…À‘‹@‹"‡‰š|›œ‚'€ 
‘|’°‡€W‡‰‹S‹"€6‡‰™™.„Tˆ‹@‹@‡¢ƒ™‰‚w€6ˆv‘‹@‹@‡š rational
€@ˆ
¨¬r;
ÃÀ‚'|‡‰|’X€6|‡‰‹q™‰‡‰‚0‹W‡‰X¡:‘0€E‘{›gŠƒlO™_‘^…6š‚0…S„Tˆ˜¢ƒ™‰‚'›R
0
r.d
‘‹q–*ˆŠR’|‡‰‹@'ˆo†*‚0…Wƒ‚?®€ ¨
¾Œ¡‰€6‚0…°]‘'†d‡‰|šUŠ|‹@‚'’ €6|‚k…l‘^€@‡‰ˆƒ‘™
dŠ|›u¢T‚0…6‹s™‡¢|…l‘^…@–v¡_ˆ˜…E‹@ˆ›œ‚Œ€@‡‰›œ‚˜½W¾ © ‘^„|„|…6ˆ*‘l|‚'‹s–*ˆŠOE‡€6O‘n…6‚'¥Šƒ‚0‹"€E¡_ˆ˜…W‘—†*‚0…6‹"‡‰ˆOE‡€6¤‘
™_‘^…@š‚0…+†‘™‰Š|‚À…l‘^ƒš‚˜‹@‡‰|'‚À€@ƒ‚–bƒ‘ †*‚Àˆ˜¢]‹"‚0…@†*‚'’u€6ƒ‘^€1‡‰;€6‚0…6›œ‚0’ƒ‡‰‘^€6‚1†˜‘^™‰Š|‚'‹P‹@ˆ›œ‚0€@‡‰›œ‚'‹
ˆ`†*‚…ƒˆ`n¨
LjŠ{…6‚''‘™‰™d€6|‚q€Ž–d„T‚
¡‰…6ˆ› ´P‘š‚ ³‘|’{…6‚'‘™‰‡‰Ä'‚¬€@]‘`€ˆ|‚s€6|‡‰|šw–*ˆŠv'ˆŠ|™‰’
extended_int
‚ ‘‹"‡‰™–u’|ˆ«‡‹€6ˆzlƒ‘|š‚S€6|‚q€Ž–d„T‚Sˆ¡YŠƒ›œ‚…l‘^€6ˆ˜…‘|’v’|‚'|ˆ›œ‡‰ƒ‘^€@ˆ˜…1¡‰…6ˆ›
€6ˆ
Issue 3: The internal representation cannot be changed.
int
unsigned int
³
‘ |’¤‹"€6ˆ˜…6‚Œ€6|‚w‹@‡š¤ˆ¡T€6|‚Œ…l‘`€6‡‰ˆƒ‘™ƒdŠ|›g¢.‚0…s‹@‚0„]‘^…6‘^€6‚'™–œ‘‹q‘n’ƒ‘^€l‘n›œ‚0›g¢T‚…¬ˆ¡T€Ž–d„T‚
¨¶¡_ˆ˜…
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
};
~M€W‡‰‹E‘^™‰‹@ˆgƒˆ˜€S€6ˆˆ{ƒ‘^…6’O€6ˆ{…6‚E…6‡€@‚€@ƒ‚z™‰‡¢|…l‘`…@–œ“ƒ™‰‚'‹
‘|’
€6ˆ{…@‚ ƒ‚'0€
rational.h
rational.C
€6|‡‰‹qlƒ‘|š‚n‡‰¤…6‚0„|…6‚'‹@‚0€l‘^€@‡‰ˆ
¨
ÃÀŠ€¬‹@|ˆ˜…@€6™¦–}‘¡‰€@‚0…¬–*ˆŠœƒ‘'†*‚Œ‹@|‡„|„T‚'’}€6|‚Wƒ‚/†*‚0…@‹@‡‰ˆ”ˆ¡Y–*ˆŠ…s™‰‡¢|…l‘`…@–u€6ˆb½W¾ © ŸM–*ˆŠ”ƒ‘'†*‚
‚0†*‚',‡‰|'™‰Š|’|‚'’²€6|‚”‹6‘¡_‚¤0…6‚'‘^€6‡‰ˆ²¡_Šƒ|0€@‡‰ˆ
¡‰…6ˆ› ‘^¢Tˆo†*‚O‡‰C€6|‚”ƒˆ˜„.‚”€@ˆ
…6‚'‹"ˆ™†*‚—‡‰‹@‹"Šƒ‚0‹ ‘|’ ‘^¢Tˆo†*‚o£|–*ˆŠR…6‚''‚'‡¦†*‚ucreate_rational
‘j‘|š˜…@–¤„]|ˆ|‚— ‘^™‰™D¡‰…@ˆ› €6|‚n›”‘ƒ‘š‚0›œ‚'€Sˆ¡
½W¾ © €6|‚W„|…6ˆš˜…l‘›œ›œ‚…1…6‚0„Tˆ˜…@€@‹À€6ƒ‘^€À‘™€6|ˆŠ|šv€6|‚Œ‘`„ƒ„ƒ™‰‡ ‘^€6‡‰ˆg'ˆ’ƒ‚W‹"€6‡‰™™ƒ0ˆ›}„]‡™‰‚'‹1Œ‡€@v€6|‚
|‚0 †*‚0…6‹@‡ˆ°ˆ¡D€6|‚«™‰‡¢|…l‘^…@–* #1!*-M#.\ qˆ˜…@‹E‘–d›œˆ˜…6‚
¾Œ¡‰€6‚0…”€l‘`‡‰|šZ‘4¥Šƒ‡lÂU™‰ˆdˆ˜ÂU‘^€œ€6|‚j‘^„|„ƒ™‰‡‰ ‘^€@‡‰ˆU'ˆ’ƒ‚S–*ˆŠ ‹@Š|’|’ƒ‚0ƒ™¦–U…6‚ ‘™‡‰Ä'‚XE]‘`€}€6|‚
„|…6ˆ˜¢ƒ™‰‚'› ‡‹ P€6|‚'ˆd’|‚w‡‰‹s'™Š|€"€6‚0…6‚'’”Š„¤Œ‡€6”‚®d„|…6‚'‹@‹@‡ˆƒ‹qˆ¡T€6|‚¡_ˆ˜…6
› ‘|
’ ‘‹
.n
.d
‡‰
rational r ;
r.n = 1;
r.d = 2;
¾ ™…@‚ ‘’–”€6|‡‰‹S„]‘^…"€6‡‰'Š|™_‘^…q„ƒ‡‰‚'0‚nˆ¡1'ˆ’ƒ‚«’|ˆd‚'‹Wƒˆ˜€Wqˆ˜…@ÂX‘–d›œˆ˜…6‚‘g…l‘^€@‡‰ˆƒ‘™
dŠ|›g¢.‚0…E‡‹E|ˆ`
Œ
…6‚0„|…6‚0‹@‚'€@‚'’4¢d– -&' ’ƒ‘^€l‘}›œ‚0›g¢T‚…6‹'Y¢ƒŠ€«€@ƒ‚”Ÿˆ™’Y£Œ‘`„ƒ„ƒ™‰‡ ‘^€6‡‰ˆR0ˆd’|‚{ˆ˜¢†‡‰ˆŠ|‹@™¦–R’|ˆd‚'‹z|ˆ˜€
‡‰|‡€6‡‰‘™‰‡‰Ä'‚}€@ƒ‚eŸ|‚0£b›œ‚'›u¢T‚0…gˆ¡Œ€Ž–d„T‚
¨ ¹Wˆo=–*ˆŠU…@‚'š˜…6‚0€œ|ˆ˜€g€6ˆ4ƒ‘'†*‚X„|…6ˆo†‡‰’|‚'’U€6|‚
¡_Š||0€6‡‰ˆX‡‰O€6|‚“|…6‹"€Sbool
„]™‰‘'‚˜º‡‰|’|‚'‚'’
€6|‚z‹"€l‘^€6‚0›œ‚'€
create_rational
rational r = create_rational (1 , 2);
qˆŠ|™‰’v‹A€6‡‰™‰™qˆ˜…@ÂYd‘^‹@‹@Š|›œ‡‰|šw€6ƒ‘^€¶–*ˆŠ}ƒ‘ †*‚W'ˆ˜…@…6‚00€6™–{‘’ƒ‘^„|€6‚'’{€6|‚W’|‚0“ƒ|‡€6‡‰ˆgˆ¡Y€6|‚S¡_Š|ƒ€6‡‰ˆ
€@ˆ¤’|‚ ‘^™PŒ‡€6R€6|‚b|‚0Å…6‚„ƒ…@‚'‹@‚';€l‘^€6‡‰ˆ
¨«ÃÀŠ€w€6|‚b„ƒ…@ˆ˜¢]™‚'›a‡‰‹›gŠƒlj›œˆ˜…6‚
create_rational
¡:‘^…"§M…6‚ ‘l|‡‰|šg‘|’X›”‘|‡‰¡_‚0‹"€6‹¬‡€@‹@‚'™‰¡
‡‰¤‚ ‘l°‘^ƒ’¤‚0†*‚0…"–Oˆ''Š…6‚'|'‚ˆ
¡ ˆ˜
… ‡¤€6|‚
.n
.d
‘^„|„ƒ™‰‡‰ ‘`€6‡‰ˆœ'ˆ’ƒ‚‹@‡‰|'‚w€6|‚’]‘`€l‘—›œ‚'›u¢T‚0…6‹¬ƒ‘'†*‚l]‘^ƒš‚0’O€6|‚'‡…q›œ‚'‘|‡‰|šœŸM€6|‚0–”›œ‡‰š;€¬‚0†*‚'
ƒ‘'†*‚—l]‘^ƒš‚0’°€6|‚'‡…W]‘^›œ‚'‹l£ ‡‰°™‰‚€@€6‡‰|š{½W¾ © ‘''‚0‹@‹ŒdŠ|›œ‚0…6‘^€6ˆ˜…W‘|’R’|‚'|ˆ›œ‡‰ƒ‘^€6ˆ˜…s€6…6ˆŠ|š
’ƒ‘^€l‘s›œ‚'›u¢T‚0…6‹T€6ƒ‘^€D‘^…@‚À‹"„T‚0'‡“ƒ€@ˆŒ‘q'‚0…@€l‘^‡‰«…6‚„ƒ…@‚'‹@‚';€l‘^€6‡‰ˆ
`–*ˆŠb‘^…6‚ƒˆo'ˆ›œ›œ‡€"€6‚'’w€6ˆW€@]‘`€
…6‚0„|…6‚0‹@‚'€6‘^€6‡‰ˆ
1‘|’Z–*ˆŠ ‘
» €—?ƒ‘|š‚}‡¦€nŒ‡¦€6|ˆŠ|€n‘‹"Âd‡‰|šR½W¾ © €6ˆRlƒ‘|š‚}‡€6‹n‘^„|„]™‡‰ ‘^€6‡ˆ
'ˆ’ƒ‚«‘‹qq‚'™‰™¶ŸMEƒ‡?¤€6|‚0–”Œ‡‰™™.…6‚'¡_Š|‹@‚˜ƒˆ¡+'ˆŠ…6‹"‚o£¨
ƒ‚0k€6|‚v½S¾ © ›”‘ƒ‘š‚'›œ‚';€E…6‚'‘™‰‡‰Ä'‚0‹z€6ƒ‘^€w€@ƒ‚g|‚0•…l‘^€6‡ˆ]‘^™PdŠ|›u¢T‚0…6‹ŒE‡€6k‚?®€6‚'|’|‚'’
†‘™‰Š|‚Œ…l‘|š‚‘^…6‚wŠ|‹@‚0™‰‚'‹@‹q¡_ˆ˜…s€6|‚'›R;€6|‚0–}€6‚0…@›œ‡‰ƒ‘^€6‚W€@ƒ‚w0ˆ€@…l‘^0€sŒ‡€@}–*ˆŠ3
¨ w‡‰‹6‘`„ƒ„.ˆ‡‰€6‚0’”‘‹
–*ˆŠ{‘^…6‚˜˜–*ˆŠg‹"€6‡‰™™;…6‚'‘™‰‡‰Ä'‚€6ƒ‘^€PŒƒ‘^€+–*ˆŠ{|‚'‚'’u€6ˆ‘'†*ˆ‡‰’u‹@Š|l{€@…@ˆŠ|¢ƒ™‰‚0‹P‡‰b€6|‚¬¡_Š€6Š…6‚q‡‰‹ '#1?9 23i
¡‰…@ˆ›
0)Y8:9;A!# ¬‘g›œ‚'l]‘^ƒ‡‹@›$€6ƒ‘^€ Æ(| €6|‚n‘^0€6Šƒ‘™
…6‚0„|…6‚'‹@‚0€l‘^€@‡‰ˆ°ˆ¡+€6|‚z€Æ–„T‚
rational
€6|‚X0Šƒ‹A€6ˆ›œ‚0… s‘^ƒ’ ‘^€{€6|‚X‹6‘^›œ‚¤€6‡›œ‚Oˆ˜­Y‚0…6‹v€6|‚O'Š|‹"€6ˆ›œ‚0… &'"2
&' ^'#
"9;"!#
iÆM#P(|"2T0#P(|'#
S‘'–‹Sˆ¡+qˆ˜…@Âd‡‰|šgE‡€6”…l‘^€6‡‰ˆƒ‘™TŠ|›g¢T‚…6‹'¨
~
 b‚'| ‘^„ƒ‹@Š|™_‘`€6‡‰ˆn‡‹+‘'†‘‡‰™_‘^¢ƒ™‰‚P€@|…@ˆŠƒšz€6|‚ÀŠ|‹@‚ˆ¡d'™_‘^‹@‹@‚'‹'˜‘|’nq‚‹A€l‘^…@€3¢d–«‚®„ƒ™_‘^‡‰|š
|ˆ`
EP €6ˆg|‡‰’|‚z€@ƒ‚…6‚0„|…6‚0‹@‚'€6‘^€6‡‰ˆ°ˆ¡+‘u€Ž–„T‚«¡‰…@ˆ›p€6|‚z'Š|‹"€6ˆ›œ‚0…'¨
4.3.2 Public and private
E‚0…@‚«‡‰‹W‘b„ƒ…@‚'™‰‡‰›œ‡‰ƒ‘^…"–
class
†*‚0…6‹@‡ˆ°ˆ¡
struct rational
€6ƒ‘^€q€l‘^Â*‚0‹E ‘^…@‚«ˆ¡P’ƒ‘^€6‘u|‡‰’|‡‰|š¨
class rational {
private :
int n;
int d ; // INV : d != 0
};
~ €6|‚Z‹6‘^›œ‚4S‘ – ‘^‹j‘
b‘
‘šš˜…6‚'š*‘^€@‚'‹R‹@‚0†*‚0…6‘™u’ƒ‡¦­.‚0…6‚0€j€Ž–d„T‚'‹j‡‰;€6ˆ7‘
|‚0 €Ž–„T‚˜s¢ƒŠ|€{€6|‚
Â*struct
‚0–qˆ˜…6’7‡‰|’|class
‡‰ ‘^€6‚0‹{€6ƒ‘^€ 9|00''4&' '& A "!# ›”‘'–²ˆd''Š… s…6‚'‘™¦§
class
‡‰Ä'‚0’X€6…6ˆŠ|šO€6|‚Â*‚0–dqˆ˜…@’ƒ‹
‘|’
¨
public
private
¾=’ƒ‘^€6‘J›œ‚'›u¢T‚0…u‡‹ 2
)3Vo8 A ‡‰¡E‘|’Uˆ|™–‡‰¡W‡€6‹g’ƒ‚0'™_‘^…l‘`€6‡‰ˆ²‘^„|„T‚ ‘^…6‹g‹@ˆ›œ‚0E|‚0…6‚O‘¡‰€6‚0…v‘
‹A„T‚''‡“ƒ‚0…'+‘|’kE‡€6eƒˆ
‹"„T‚'0‡“ƒ‚0…n‡e¢T‚0€Žq‚'‚03¨v~M€n‡‹ 2
& d9;@ ˆ˜€6|‚0…@Œ‡‹@‚˜¨
public:
private:
~k„]‘^…@€@‡‰'Š|™_‘^… Y‡‰¡€6|‚u'™_‘^‹@‹«’|‚0“ƒ|‡€6‡ˆCŸM‹@‚'‚œ¯d‚00€6‡‰ˆ
 ¨ ·¨ ³œ¢T‚'™ˆ`Å¡_ˆ˜…«€6|‚b„ƒ…@‚''‡‰‹@‚g›œ‚ ‘|‡‰|š”ˆ¡
€6|‡‰‹n€@‚0…6›¤£«'ˆ;€l‘‡‰|‹—|ˆ
‹"„T‚''‡¦“]‚… ¶‘™‰™¬’ƒ‘^€6‘X›œ‚'›u¢T‚0…6‹n‘^…6‚œ„|…6‡†‘^€6‚v¢–’ƒ‚0¡:‘Š|™€ ¨j~
'ˆ;€@…l‘‹"€']‘u‹"€@…@Šƒ€E‡‰‹S‘u'™_public:
‘‹"‹SEƒ‚…6‚—‘™™T’]‘`€l‘b›œ‚'›g¢.‚0…6‹q‘^…6‚z„ƒŠ|¢ƒ™‰‡Œ¢d–O’ƒ‚0¡:‘Š|™€ ¨ ~¡3‘n’ƒ‘^€l‘«›œ‚0›g¢T‚…À‡‰‹„ƒ…@‡†˜‘`€6‚˜d‡¦€s ‘||ˆ˜€À¢T‚‘^''‚'‹@‹"‚'’¤¢–œ'Š|‹"€6ˆ›œ‚…6‹À€6…6ˆŠ|š}€6|‚Œ›œ‚'›u¢T‚0…
‘'0‚'‹@‹nˆ˜„.‚0…l‘^€6ˆ˜…'¨u~¡¬‘œ’ƒ‘^€l‘œ›œ‚'›u¢T‚0…w‡‰‹„ƒŠ¢]™‡‰˜.€6|‚0…6‚{‘^…6‚u|ˆX‹"Šƒlk…@‚'‹"€@…6‡0€6‡‰ˆ|‹'
¨ E|’|‚0…zˆŠ…
‘^¢Tˆo†*‚z’ƒ‚“]|‡€@‡‰ˆOˆ¡
|€@ƒ‚z¡_ˆ™‰™‰ˆoŒ‡ƒšbE‡‰™‰™Y€6|‚0…@‚'¡_ˆ˜…6‚n|ˆ˜€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
~ u„Y‘`…@€6‡‰'Š|™_‘`… `€@ƒ‚q‘^‹@‹@‡‰š|›œ‚';€
¢T‚''ˆ›œ‚0‹P‡‰›}„Tˆ‹@‹"‡¢ƒ™‰‚WŸ%Œ|‡‰lb‡‰‹1šˆdˆ’]£^¢ƒŠ€‘^€¶‘nŸ%€6ˆdˆ;£
r.d = 0
|‡‰šZ„|…6‡‰'‚g|ˆ` –*ˆŠ…u'Š|‹"€6ˆ›œ‚0…b'‘|ƒˆ˜€—’ƒˆj‘^–d€@ƒ‡ƒš°E‡€6‘O…6‘^€6‡‰ˆƒ‘™dŠ|›g¢.‚0… 1‘|’‚0†*‚'
–*ˆŠ” ‘||ˆ˜€¬‡‰›}„ƒ™‰‚0›œ‚'€
d‹@‘ –*d‘‹–*ˆŠ”Š|‹@‚'’œ€6ˆn’ƒˆb‡¦€À‡‰”´1…6ˆš˜…l‘^› ··¨ ƒ‘^€Àq‚w‘`…6‚
operator+
‹"€6‡™‰™|™_‘6‡‰|𫇉‹‹"ˆ›œ‚SS‘'–{ˆ¡
‘''‚'‹"‹@‡‰|šn€6|‚E‚0ƒ'‘^„ƒ‹@Š|™_‘^€6‚'’{…6‚0„|…6‚'‹@‚0€l‘^€@‡‰ˆ
¨ © |‡‰‹¡_Šƒ|0€@‡‰ˆƒ‘™‰‡€Ž–
‡‰‹q„|…6ˆ`†d‡‰’|‚'’O¢–°‘u‹@‚'0ˆƒ’X ‘^€6‚'šˆ˜…"–Oˆ¡+'™_‘‹@‹S›œ‚'›u¢T‚0…6‹0ƒ‘›œ‚'™– Fe'FeV0'&Œ5)Y#1 A!#
¨
4.3.3 Member functions
‚0€Šƒ‹|ˆ`
^‘ ’ƒ’{€6|‚S›œ‡‹@‹@‡‰|šw¡_Š||0€6‡‰ˆƒ‘™‰‡¦€Æ–«€6ˆ
€6…6ˆŠ|šv›œ‚'›u¢T‚0…P¡_Šƒ|0€@‡‰ˆ|‹'¨
class rational
~M€nqˆŠ|™‰’k‹@‚'‚'›¸ƒ‘^€@Š|…6‘™€@ˆ°‹"€l‘^…"€nŒ‡¦€64‹6‘¡_‚v0…6‚ ‘^€@‡‰ˆ
D¢ƒŠ€—‹@‡‰|'‚{€6|‚0…6‚œ‘^…@‚v‹"„T‚0'‡“ƒv›œ‚'›u¢T‚0…
¡_Š||0€6‡‰ˆ|‹b…6‚'‹@‚…@†*‚'’<¡_ˆ˜…u€6|‡‰‹b„ƒŠ|…"„Tˆ‹@‚˜™‰‚0€uŠ|‹u“ƒ…@‹"€g‹@|ˆ`$€Žqˆ"š‚'|‚0…l‘™e›œ‚'›u¢T‚0…n¡_Š|ƒ€6‡‰ˆ|‹
€6ƒ‘^€{š˜…l‘;€v‹6‘^¡_‚°‘'0‚'‹@‹{€@ˆe€6|‚XŠ|›œ‚0…l‘^€6ˆ˜…{‘|’U’|‚'|ˆ›œ‡‰ƒ‘^€@ˆ˜…bˆ¡w‘R…l‘^€6‡‰ˆƒ‘™sŠ|›g¢T‚…OŸ%q‚˜»¼™‰™
’|‡‰‹@'Š|‹@‹g¢T‚'™‰ˆo Œƒ‘^€
‘|’
›œ‚ ‘U|‚0…6‚ºŒ‘|’U‡‰¡W–*ˆŠUqˆƒ’|‚0…{Œ;–²q‚O ‘7Š|‹@‚
*this
const
"!!#%$'&(*)+",-.0/.13246578,"190/0:;&#7<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/,&#4E&#DJ76L
‘ |’
¢T‚0¡_ˆ˜…6‚}€6|‚0–Z‘`…6‚œ’|‚''™_‘^…@‚'’u€@ƒ‡‹—‡‰‹b‘X‹A„T‚''‡_‘^™À¡_‚ ‘^€@Š|…@‚œˆ¡S0™_‘‹@‹—‹"'ˆ˜„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
‡‹E‘b†˜‘`…6‡_‘^¢ƒ™‰‚ˆ¡D€Ž–„T‚
rational
int n = r. numerator ();
int d = r. denominator ();
|¡_ˆ˜…E‚?®|‘›}„ƒ™‰‚˜€6|‚«'Š|‹"€@ˆ›œ‚0…S ‘X€6|‚'OE…6‡€@‚
// get numerator of r
// get denominator of r
Š|‹@‡‰|š«€@ƒ‚W›œ‚'›u¢T‚0…‘'0‚'‹@‹¬ˆ˜„T‚…l‘^€6ˆ˜…À‘‹À¡_ˆ˜…À’ƒ‘^€l‘›œ‚'›g¢.‚0…6‹'¨ © |‚E0Šƒ‹A€6ˆ›œ‚0… ‘œ ‘™™|€@ƒ‚0‹@‚W€Žqˆ
¡_Š||0€6‡‰ˆ|‹'.‹"‡‰|'‚—€6|‚0–J‘^…6‚b’|‚'0™_‘^…6‚'’
¨¾Œ'0‚'‹@‹‹"„T‚'0‡“ƒ‚0…6‹wƒ‘'†*‚u€@ƒ‚b‹@‘›œ‚—›œ‚ ‘|‡‰|š}¡_ˆ˜…
›œ‚'›u¢T‚0…q¡_Š||0€6‡‰ˆ|‹W‘‹S¡_ˆ˜…Œ’ƒ‘^€l‘u›œ‚'›upublic
¢T‚0…6‹ ¶‘b„|…6‡†‘^€6‚z›œ‚'›u¢T‚0…q¡_Š||0€6‡‰ˆ°'‘|ƒˆ˜€q¢T‚« ‘™‰™‚'’O¢–
€6|‚'Š|‹"€6ˆ›œ‚0… ¨ © |‡‰‹TÂd‡‰|’—ˆ¡‘0'‚'‹@‹+€@ˆS€6|‚…6‚0„|…6‚'‹@‚0€l‘^€@‡‰ˆn‡‰
‹ ƒ‚®‡¦¢]™‚˜^‹"‡‰|'‚€@ƒ‚'ˆ˜…@…@‚'‹"„Tˆ|’|‡‰|š
›œ‚'›u¢T‚0…1¡_Š||0€6‡ˆƒ‹¶ ‘^v‚ ‘‹"‡‰™–—¢T‚S‘’ƒ‘^„|€6‚0’{€6ˆz‘w|‚0<…6‚0„|…6‚'‹"‚'€l‘`€6‡‰ˆ
º‡¦€¶‡‰‹‘™‰‹@ˆ‹6‘¡_‚‹@‡ƒ0‚S‡¦€¶‡‰‹
|ˆ˜€s„Tˆ‹@‹@‡¦¢]™‚W€6ˆulƒ‘|š‚Œ€6|‚Œ†˜‘™Šƒ‚0‹sˆ¡3€6|‚w’ƒ‘^€l‘«›œ‚'›g¢.‚0…6‹€@|…@ˆŠƒšœ€6|‚w¡_Š||0€6‡‰ˆ|‹
‘|’
¨°¾E‹u‘Xš‚'|‚0…l‘™…6Š|™‰‚}ˆ¡s€6dŠ|›u¢31‘™‰™’ƒ‘^€l‘X›œ‚'›u¢T‚0…@‹nˆ¡S‘X'™_‘^‹@‹—numerator
‹@|ˆŠ|™‰’Z¢T‚
„|…6‡†‘^denominator
€6‚°ŸMˆ˜€6|‚0…@Œ‡‹@‚˜+–*ˆŠC‚'|'ˆŠ…l‘š‚v€@ƒ‚œ0Šƒ‹A€6ˆ›œ‚0…n€@ˆj‘''‚'‹"‹u€@ƒ‚v’]‘`€l‘X›œ‚'›u¢T‚0…6‹0DŒ‡¦€64€6|‚
Š|š™–”'ˆ|‹@‚'¥Š|‚'|'‚'‹Œ›œ‚';€6‡‰ˆ|‚'’¤‡‰R~‹@‹"Šƒ‚«·v‘`¢Tˆ`†*‚ £¨
~—ˆ˜…6’|‚0…D€6ˆE ‘^™‰™d‘q›œ‚'›u¢T‚0…3¡_Š||0€6‡‰ˆ
oq‚À|‚'‚'’u‘b‚?®„|…6‚'‹A§
‹@‡‰ˆjˆ¡1€6|‚—'™‰‘‹@‹Œ€Ž–d„T‚b¡_ˆ˜…wE|‡‰l°q‚ 9|00'' €6|‚b¡_Š||0€6‡‰ˆ
.‘^ƒ’R€6|‡‰‹E‚®„|…6‚'‹"‹@‡‰ˆCŸ-‘^„|„T‚ ‘^…@‡‰|š
¢T‚'¡_ˆ˜…@‚z€6|‚ £¬‡‰‹S‘ MFg238 A'9;8%8À9*&"\)]Fk'#
E|ˆ‹@‚w†˜‘™Šƒ‚›”‘'–”ˆ˜…S›”‘'–œ|ˆ˜€S¢.‚«›œˆ’ƒ‡¦“]‚0’”¢–
.
€6|‚z¡_Šƒ|0€@‡‰ˆ° ‘™™¨
‡€6|‡‰°‚ ‘^?R›œ‚0›g¢T‚…W¡_Š||0€6‡ˆ3€6|‚«™†˜‘^™‰Š|‚
…6‚'¡_‚0…6‹W€6ˆv€6|‡‰‹S‡‰›}„ƒ™‰‡‰'‡¦€¬ ‘™™+‘^…@šŠƒ›œ‚0€
‘|’¤‚®„ƒ™_‘‡ƒ‹¬€@ƒ‚z‘^„|„T‚'‘^…l‘|'‚wˆ¡
‡‰”€6|‚„.*this
ˆ‹"€6'ˆ|’|‡€6‡‰ˆ|‹¬ˆ¡
€6|‚w€Žqˆg›œ‚0›g¢T‚…s¡_Š|€6‡‰ˆ|‹
*this
‘^¢Tˆo†*‚˜¨k~M€{’|ˆ‚'‹uƒˆ˜€u‚?®„ƒ™_‘‡‰ZE–C‘,‘‹"€6‚0…@‡‰‹"‘^„|„T‚'‘^…6‹u‡‰
¶¢]Š€bq‚œŒ‡™‰™¬š‚0€b€6ˆj€6|‡‰‹
*this
™_‘^€@‚0… ¨
The implicit call argument and *this.
¾
Â*‚0–dqˆ˜…6’‘^¡‰€6‚0…n€@ƒ‚g¡_ˆ˜…6›”‘™‘^…@šŠƒ›œ‚0€™‰‡‰‹A€«ˆ¡¬‘¤›œ‚'›u¢T‚0…
const
¡_Š||0€6‡‰ˆX…@‚'¡_‚0…6‹S€6ˆ{€6|‚z‡‰›}„ƒ™‰‡‰'‡¦€s‘^…6šŠ|›œ‚';€
‘^ƒ’O€6|‚0…6‚'¡_ˆ˜…6‚z„|…6ˆ›œ‡‰‹@‚'‹s€6ƒ‘^€q€6|‚z›œ‚'›u¢T‚0…
Const member functions.
*this
*
EP ¡_Š||0€6‡‰ˆ” ‘™™.’|ˆd‚'‹s|ˆ˜€slƒ‘|š‚Œ€6|‚Œ†˜‘^™‰Š|‚bŸM…6‚0„|…6‚'‹"‚'€6‚0’O¢d–v€6|‚Œ†˜‘™Šƒ‚0‹sˆ¡
€@ƒ‚w’ƒ‘^€6‘n›œ‚'›u¢T‚0…6‹l£
ˆ¡
¨ k‚« ‘^™‰™
‹@Š|?j‘u›œ‚'›u¢T‚0…s¡_Š||0€6‡ˆR‘ !#
'EFe'FeV0'&w50)]#1 "!# ¨
*this
Member function call.
¨ © ƒ‚zš‚'|‚0…l‘^™D‹"–d€l‘o®Xˆ¡+‘g›œ‚0›g¢T‚…q¡_Šƒ|0€@‡‰ˆ° ‘™™T‡‰‹
nŸ 
¨¨¦¨ £
E‚0…@‚˜ ‡ ‹+‘b‚?®„|…6‚'‹@‹"‡‰ˆbˆ¡‘q'™_‘‹@‹3€Ž–d„T‚¡_ˆ˜…+Œ|‡‰lb‘S›œ‚'›u¢T‚0…
¡_Š||0€6‡‰ˆb ‘^™‰™‰‚'’ ‡‰‹«’ƒ‚0'™_‘^…6‚0’3
¨'¨0¨' ‘^…6‚{€@ƒ‚v ‘™‰™‘^…6šŠ|›œ‚';€6‹'P‘^ƒ’
‡‹«€6|‚v›œ‚0›g¢T‚…
.
‘'0‚'‹@‹”ˆ˜„T‚0…l‘`€6ˆ˜… ¨ ~  ›œˆ‹"€}'‘‹@‚'‹' ‡‰‹”‘7™†‘™‰Š|‚°ˆ¡w€6|‚R'™_‘^‹@‹}€Ž–d„T‚˜q€Ž–d„ƒ‡‰ ‘^™‰™–²‘
†‘^…6‡_‘^¢ƒ™‰‚¨
/‡¦€6|‡‰v€6|‚E¢Tˆ’–vˆ¡
‘n›œ‚0›g¢T‚…¡_Š||0€6‡ˆ
ˆ¡
‘
' ™_‘^‹@‹'‘;–œ›œ‚'›u¢T‚0…EŸ’ƒ‘^€l‘«›œ‚0›g¢T‚…¬ˆ¡
›œ‚'›u¢T‚0…¬¡_Š||0€6‡ˆY£ˆ¡
€@ƒ‚w‹@‘›œ‚Œ'™_‘^‹@‹s ‘”¢T‚‘'0f‚'‹@‹@‚'’
Œ‡¦€6|ˆŠ|€w‘œ„|…6‚“|® º
‡‰j€6|‡‰‹ ‘‹"‚˜Tq‚g‡›}„]™‡‰'‡€6™¦–¤‘''‚'‹"‹«‡€¡_ˆ˜…
¨—~eˆŠ…z‚®|‘^›}„]™‚˜
.
*this
€6|‚”‚®„|…6‚0‹@‹@‡‰ˆ
‡‰€6|‚œ…6‚0€6Š…6²‹"€l‘^€@‚'›œ‚'€—ˆ¡S€6|‚”›œ‚'›u¢T‚0…b¡_Š||0€6‡ˆ
…6‚'¡_‚0…6‹u€6ˆ
numerator
€6|‚w’ƒ‘^€l‘z›œ‚'›g¢.‚0n… ˆ¡
¨ © |‚w ‘^™‰™
€6|‚0…@‚'¡_ˆ˜…6‚w’|ˆd‚'‹¬
Eƒ‘^€Àq‚w‚®d„T‚'0€ ‡¦€
…6‚0€@Š|…@ƒ‹q€6|‚nŠ|›œ‚0…ln‘^€6ˆ˜…q*this
ˆ¡3€6|‚«…l‘`€6‡‰ˆƒ‘™.r.numerator()
Šƒ›u¢T‚0… ¨
r
‡€6|‡‰k›œ‚0›g¢T‚…¡_Šƒ|0€@‡‰ˆ|‹'Tq‚v ‘4‘™‰‹@ˆO‘''‚0‹@‹n›œ‚'›u¢T‚0…@‹w¡_ˆ˜…—ˆ˜€6|‚0…«‚®„|…6‚0‹@‹@‡‰ˆ|‹nˆ¡€6|‚
‹6‘›œ‚z'™_‘^‹@‹W€Ž–d„.‚«€6…6ˆŠ|š°€6|‚n›œ‚0›g¢T‚…E‘^''‚'‹@‹Eˆ˜„T‚0…l‘^€@ˆ˜…nŸ™‡Â*‚n‘g'Š|‹"€6ˆ›œ‚0…SqˆŠ|™‰’°’|ˆ}‡€l£¨¬¾Œ™‰™
‘'0‚'‹@‹@‚'‹€6ˆœ'™‰‘‹@‹w›œ‚'›u¢T‚0…6‹SŒ‡€@ƒ‡R›œ‚'›g¢.‚0…Œ¡_Š||0€6‡‰ˆ|‹Œˆ¡¶€6|‚b‹6‘›œ‚n'™_‘‹@‹Œ‘^…6‚ )Y#T&0 '& "'@( 
…6‚'š*‘`…6’|™‰‚'‹@‹uˆ¡WE|‚0€6|‚0…u€6|‚”›œ‚'›g¢.‚0…b‡‰²¥dŠ|‚'‹"€6‡ˆ,‡‰‹b„ƒŠ¢]™‡‰}ˆ˜…g„ƒ…@‡†˜‘`€6‚˜¨ © |‚
‘|’
public:
‹"„T‚0'‡“ƒ‚0…6‹W‘^…6‚zˆ|™–”…6‚'™‰‚0†‘;€E¡_ˆ˜…W€6|‚«'Š|‹"€@ˆ›œ‚0… ¢ƒŠ€E|ˆ˜€W¡_ˆ˜…Œ›œ‚'›u¢T‚0…q¡_Š||0€6‡‰ˆ|‹Sˆ¡
private:
€6|‚z'™_‘‹@‹S‡€6‹"‚'™‰¡-¨
X‚'›u¢T‚0…W¡_Šƒ|0€@‡‰ˆ|‹E‘^…@‚«‹@ˆ›œ‚€6‡‰›œ‚'‹s‘^™‰‹@ˆu…6‚'¡_‚0…@…@‚'’R€6ˆv‘^‹ Fk'-.!(; ˆ¡D€6|‚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…À€6ˆn‘™‰™‰ˆo7‹@‚0„]‘^…6‘^€6‚E0ˆ›}„]‡™_‘^€6‡‰ˆ
¨ © ƒ‡‹
qˆ˜…@Âd‹—™‰‡Â*‚g¡_ˆ˜…bˆ˜…6’|‡‰ƒ‘^…@–e¡_Š||0€6‡‰ˆ|‹'D‚®'‚„ƒ€n€6ƒ‘^€—‡‰‘¤›œ‚'›u¢T‚0…«¡_Šƒ|0€@‡‰ˆZ’|‚0“ƒƒ‡¦€6‡‰ˆkˆŠ€6‹"‡‰’|‚
ˆ¡Œ€6|‚°'™‰‘‹@‹v’|‚0“ƒ|‡€6‡ˆ3€6|‚X¡_Š||0€6‡‰ˆ<ƒ‘›œ‚O›{Š|‹"€g¢T‚°¥Šƒ‘™‰‡“ƒ‚'’CŒ‡€6²€6|‚°'™_‘‹"‹vƒ‘›œ‚˜¨7~
€6|‚u|‚ ‘’|‚0…z“]™‚
q‚uqˆŠ|™‰’j€6|‚'JE…6‡€@‚bˆƒ™¦–R€6|‚g’|‚'0™_‘^…l‘^€@‡‰ˆ|‹—Ÿ-‘‹Š|‹@Šƒ‘™PE‡€6|‡‰
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‡‰ˆ|‹EqˆŠ|™‰’R€6|‚'k‘^„|„T‚ ‘^…z‡‰j€6|‚u‹@ˆŠ…6'‚g'ˆd’|‚b“ƒ™‰‚
rational.C
Œ‡¦€6|‡‰Oƒ‘›œ‚0‹"„]‘'‚
Y‘|’X‘¡‰€6‚0…E‡‰|'™‰Š|’|‡‰|š
£q‘‹W¡_ˆ™™‰ˆ`E‹'¨
ifm
rational.h
int rational :: numerator () const
{
return n ;
}
int rational :: denominator () const
{
return d ;
}
4.3.4 Constructors
¾C'ˆ|‹"€@…6Š|0€6ˆ˜…+‡‰‹D‘W‹"„T‚0'‡_‘™*›œ‚'›u¢T‚0…3¡_Š||0€6‡‰ˆn€@]‘`€D„|…6ˆo†‡‰’|‚'‹3‹6‘¡_‚À‡‰|‡€6‡_‘™‡‰Ä ‘^€6‡ˆŒˆ¡'™_‘^‹@‹3†‘™‰Š|‚'‹0¨
© ƒ‚ƒ‘›œ‚Œˆ¡D‘—'ˆ|‹"€@…@Šƒ€6ˆ˜…S'ˆ‡‰|'‡‰’|‚'‹ÀE‡€6œ€6|‚ƒ‘›œ‚Œˆ¡
€6|‚z0™_‘‹@‹'‘|’ €@ƒ‡‹¬’|‡‰‹"€6‡‰|šŠ|‡‰‹@|‚'‹
'ˆ|‹"€@…@Šƒ€6ˆ˜…6‹S¡‰…6ˆ›=ˆ˜€@ƒ‚…W¡_Š||0€6‡ˆƒ‹/‡€q’|ˆd‚'‹S|ˆ˜€Eƒ‘'†*‚n‘b…6‚0€@Š|…@O€Ž–d„T‚]‘^ƒ’O'ˆ|‹@‚'¥Šƒ‚0€6™–¤|ˆ
…6‚0€@Š|…@g†‘™‰Š|‚˜¨1¾<'™‰‘‹@‹1Š|‹@Šƒ‘™‰™–nƒ‘‹¶‹@‚0†*‚0…l‘^™'ˆ|‹"€@…6Š|0€6ˆ˜…@‹';‘|’g€6|‚q'ˆ›}„ƒ‡‰™‰‚…D“ƒšŠ…6‚'‹¶ˆŠ€1Œ|‡‰l
ˆ|‚E‡‰‹›œ‚ ‘;€‡”‘zš‡†*‚0œ'ˆ€6‚?®€ŒŸMŠƒ‹"‡‰|š«€6|‚W…@Šƒ™‚'‹Àˆ¡Tˆo†*‚0…6™‰ˆ*‘^’ƒ‡ƒš…6‚'‹"ˆ™‰Š€6‡‰ˆ
*‹@‚'‚E€6|‚ ‚€l‘‡‰™‰‹
ˆ¡1¯d‚00€6‡‰ˆ ¨ £¨
© |‚«‹"–;€l‘`®Oˆ¡P‘u'ˆ|‹"€@…6Š|0€@ˆ˜…E’|‚0“ƒ|‡€6‡‰ˆ¤¡_ˆ˜…w‘u'™_‘^‹@‹ ‡‰‹W‘‹S¡_ˆ™‰™‰ˆoŒ‹'¨
Ÿ E‚0…@‚˜ ;'&
 
¨¨¨¦ Ÿ £?3¦¨ ¨¨¦ ¨?¨ ¨' Ÿ £
¨¦¨¨
£
‘^…6‚€6|‚n¡_ˆ˜…6›”‘^™
‘^…6šŠ|›œ‚'€@‹sˆ¡+€6|‚«0ˆƒ‹A€@…6Š|0€6ˆ˜… ¨~X€6|‚ M#TMA9;8 i
Ÿ £
`‘ …6‚«’ƒ‘^€6‘g›œ‚'›u¢T‚0…@‹'‘|’ ¨'¨'¨0 ‘^…6‚z‚®„|…6‚'‹"‹@‡‰ˆ|‹
ˆ¡E€Ž–d„.‚'‹{Eƒˆ‹"‚¤†‘™‰Š|‚'‹{ ‘U¢T‚¤'ˆ†*‚…@€6‚'’<€6ˆJ€6|‚O…6‚'‹A„T‚'0€6‡¦†*‚X’ƒ‘^€l‘R›œ‚'›u¢T‚0…u€Ž–d„T‚0‹'¨ © |‚'‹@‚
†‘™‰Š|‚'‹¬‘`…6‚WŠ|‹@‚0’}€6ˆn‡‰|‡€@‡_‘™‰‡‰Ä0‚À€6|‚E’ƒ‘^€l‘›œ‚'›u¢T‚0…6‹0˜¢T‚'¡_ˆ˜…6‚ ‡‹‚®‚''Š€6‚'’
‘^ƒ’v‡‰{€6|‚Wˆ˜…6’|‚0…
‡‰—Eƒ‡?«€6|‚¬›œ‚'›u¢T‚0…6‹D‘^…6‚’ƒ‚0'™_‘^…6‚0’b‡‰—€6|‚¬'™_‘^‹@‹'¨1~bˆ˜€6|‚0…Dqˆ˜…6’|‹'€6|‚¬ˆ˜…@’ƒ‚…P‡‰—€6|‚¬‡ƒ‡¦€6‡_‘™‰‡Ä'‚0…
‡‰‹—‡šƒˆ˜…@‚'’
+¢ƒŠ|€—‡€—‡‰‹nšˆdˆd’Z„|…l‘€6‡‰'‚g€6ˆRŠ|‹@‚}€6|‚œ’|‚''™_‘^…6‘^€6‡‰ˆ4ˆ˜…@’ƒ‚…uƒ‚…6‚œ‘‹—q‚'™™¨X~¡S‘X’ƒ‘^€6‘
›œ‚'›u¢T‚0…E‡‰‹w|ˆ˜€™‰‡‰‹"€6‚0’J‡J€6|‚b‡‰|‡€@‡_‘™‰‡‰Ä0‚0… ƒ‡€w‡‰‹w’|‚'¡:‘Š|™€A§-‡‰|‡€6‡‰‘™‰‡‰Ä'‚0’3¨E~J€@ƒ‚b0ˆƒ‹A€@…6Š|0€6ˆ˜…¢Tˆ’|–
q‚« ‘^R‹"€6‡‰™‰™Y‹@‚0€Œˆ˜…Wlƒ‘|š‚z€6|‚z†˜‘™Šƒ‚0‹Wˆ¡D‹@ˆ›œ‚ˆ¡+€6|‚«’ƒ‘^€6‘u›œ‚0›g¢T‚…6‹'¨
ˆ˜…Œ€6|‚n€Ž–d„T‚
]|‚0…6‚b‡‰‹E‘v'ˆ|‹"€@…6Š|0€@ˆ˜…Œ€6ƒ‘^€Œ‡ƒ‡¦€6‡_‘™‰‡Ä'‚'‹q‘{…l‘`€6‡‰ˆƒ‘™
dŠ|›u¢T‚0…Œ¡‰…@ˆ›
rational
€Žqˆv‡‰;€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
}
© ˆ{Šƒ‹"‚z€6|‡‰‹S'ˆ|‹"€@…@Šƒ€6ˆ˜…E‡°‘b†˜‘^…@‡_‘^¢ƒ™‰‚’|‚''™_‘^…6‘^€6‡‰ˆ
dq‚qˆŠ|™‰’X¡_ˆ˜…W‚®|‘^›}„]™‚ŒE…6‡€@‚
rational r (1 ,2); // initializes r with value 1/2
~°š‚'|‚0…l‘^™€6|‚n’|‚''™‰‘^…l‘^€6‡ˆ
kŸ 3¨¦¨¨¦ £
’|‚0“ƒ|‚'‹1‘S†‘^…6‡‰‘^¢ƒ™‰‚¤ˆ¡d€Ž–„T‚ ‘|’u‘^€D€6|‚¬‹6‘›œ‚¶€6‡‰›œ‚‡‰|‡€6‡‰‘™‰‡‰Ä'‚0‹T‡€D¢–— ‘^™‰™‰‡‰|šq€6|‚s‘^„|„|…6ˆ˜„|…6‡_‘^€6‚
'ˆ|‹"€@…@Šƒ€6ˆ˜…WE‡€6O ‘™‰™
‘^…@šŠƒ›œ‚0€6‹ ¦¨'¨'¨'
¨
© |‚«'ˆ|‹"€@…6Š|0€6ˆ˜…W ‘°‘™‰‹@ˆu¢T‚z ‘™‰™‰‚0’X‚®d„]™‡‰'‡€6™¦–”‘‹S‡‰
rational r = rational (1 , 2);
© ƒ‡‹1‡‰|‡€6‡_‘™‡‰Ä'‚'‹ |ˆ˜€¶’|‡…6‚'€6™–b¡‰…6ˆ›y€Žqˆz‡‰€@‚'š‚0…6‹'˜¢ƒŠ€¡‰…6ˆ›•‘{‚®„|…6‚'‹"‹@‡‰ˆvˆ¡|€Ž–d„T‚
r
rational
6€ ƒ‘^€”‡‰‹œ0ˆƒ‹A€@…6Š|0€6‚'’ ¢d–<€6|‚R‚®d„ƒ™‰‡‰'‡€}'ˆ|‹"€@…6Š|0€6ˆ˜…”'‘™‰™
ŸMEƒ‡? ‡‰‹œˆ¡€Ž–d„T‚
rational(1,2)
£¨
rational
4.3.5 Default constructor
~ ¯d‚'€6‡‰ˆ ¨ ¨Wq‚Jƒ‘'†*‚k‡‰;€@…6ˆd’|Š|'‚'’ €6|‚J€@‚0…6› (|5^9*)Y8¦-iÆM#TÆ9;8 ;9;"!#
‡‰|‡€6‡‰‘™‰‡‰Ä ‘`€6‡‰ˆv€6ƒ‘^€q€l‘`Â*‚'‹S„ƒ™_‘^'‚«‡X’|‚''™_‘`…l‘^€6‡‰ˆ|‹q™‰‡Â*‚
¡_ˆ˜…¤€6|‚JÂd‡‰|’ˆ¡
rational r ;
ˆ˜…S¡_Šƒ|’ƒ‘›œ‚';€l‘™Y€Ž–„T‚'‹'|’|‚'¡:‘Š|™€"§‡‰|‡€6‡_‘^™‰‡‰Ä ‘^€@‡‰ˆ{™‚ ‘'†*‚'‹S€@ƒ‚w†‘™‰Š|‚‡‰X¥Š|‚'‹"€6‡‰ˆOŠ|ƒ’|‚0“ƒ|‚'’
d¢ƒŠ€
_¡ ˆ˜…S'™_‘‹"‹¬€Æ–„T‚'‹'€@ƒ‚ (|5`9*).8 w0!#
'& )D @!& ‡‰‹q‘Š€6ˆ›”‘^€@‡‰ ‘™‰™¦–u ‘™‰™‰‚0’”€@ˆg‡ƒ‡¦€6‡_‘™‰‡Ä'‚S€@ƒ‚w†‘™‰Š|‚˜¨~¡
„|…6‚'‹@‚0€ €@ƒ‚’|‚'¡:‘Š|™€3'ˆ|‹"€@…6Š|0€@ˆ˜…P‡‰‹
€6|‚ÀŠ||‡‰¥dŠ|‚'ˆ|‹"€@…6Š|0€@ˆ˜…DE‡€6—‘^b‚'›}„|€Æ–¡_ˆ˜…@›”‘™;‘^…6šŠ|›œ‚'€
™‰‡‰‹A€ ¨
Ö,„|…6ˆo†‡‰’|‡‰|še‘e’|‚'¡:‘Š|™€{'ˆ|‹"€@…@Šƒ€6ˆ˜… Àq‚O ‘U€6Šƒ‹{›”‘^Â*‚¤‹@Š…6‚X€6ƒ‘^€{'™_‘‹"‹{€Ž–d„T‚¤†˜‘^™‰Š|‚'‹
‘^…6‚ 9;8 Qw9*f „|…6ˆ˜„T‚…6™–O‡‰|‡€6‡_‘™‡‰Ä'‚'’
¨s~R ‘^‹@‚bˆ¡P€6|‚—'™_‘^‹@‹
Ÿˆ˜…w‘^–R‘`…6‡€6|›œ‚0€6‡€Ž–„T‚o£
rational
’|‚'¡:‘Š|™€"§‡‰|‡€6‡_‘^™‰‡‰Ä ‘^€@‡‰ˆ,Œ‡¦€6/†‘™‰Š|‚
‹@‚'‚'›œ‹¤€6ˆ²¢.‚e€6|‚k'‘|ˆƒ‡ ‘™z?|ˆ‡‰0‚˜‘|’ |‚0…6‚k‡‹O€6|‚
0
'ˆ˜…@…@‚'‹"„Tˆ|’|‡‰|š{’|‚'¡:‘^Šƒ™¦€E'ˆ|‹"€"…6Š|0€6ˆ˜… ¨
// POST : * this is initialized with 0
rational ()
: n (0) , d (1)
{}
~X¡:‘€ q‚ FX).0 „|…6ˆo†‡‰’|‚z‘b’|‚'¡:‘Š|™€q'ˆ|‹"€@…@Šƒ€6ˆ˜…S‡‰¡Tq‚S‘^€q€6|‚'ˆ›}„ƒ‡‰™‰‚0…€6ˆv‘^''‚0„|€q€6|‚
’ ‚''™_‘`…l‘^€6‡‰ˆ
|
¨ © ƒ‡‹z›”‘`Â*‚'‹w'™_‘‹"‹€Ž–„T‚'‹‹6‘¡_‚0…z€6ƒ‘J¡_Š|ƒ’ƒ‘›œ‚0€l‘™D€Æ–„T‚'‹'
‹@‡ƒ0‚g‡¦€
rational r
‡‰‹S|ˆ˜€S„.ˆ‹@‹@‡¢ƒ™‰‚w€6ˆ{'‡…6'Š|›u†*‚'€W‘u'ˆ|‹"€@…6Š|0€@ˆ˜…E ‘^™‰™
‡‰X’|‚''™‰‘^…6‡‰|š{‘u†‘^…6‡_‘`¢]™‚˜¨
© |‚ ‘^…6‚0¡_Šƒ™*…6‚ ‘^’ƒ‚…DE‡‰™‰™˜|ˆ˜€6‡‰0‚¶€@]‘`€3€@ƒ‚…6‚›gŠ|‹"€
¢T‚‘n‚®0„T‚0€@‡‰ˆn€6ˆq€6|‡‰‹T…6Š|™‰‚3´1…6ˆš˜…l‘› · ‡‰{¯d‚'0€@‡‰ˆ
 ¨ 'ˆ;€l‘‡‰|‹+€6|‚¬’|‚'0™_‘^…l‘^€@‡‰ˆb‹"€l‘^€@‚'›œ‚'€
‘™¦€6|ˆŠƒšb‡u€@]‘`€+„|…6ˆš˜…l‘›R
rational r;
*
€6|‚€Ž–„T‚
‡‰‹+‘S‹A€@…6Š|0€PE‡€6|ˆŠ€3‘–«'ˆ|‹"€@…6Š|0€@ˆ˜…6‹'¨ © |‡‰‹+‡‰‹3‡‰b¡:‘€+€6|‚Àˆ|™–z‚®'‚0„|€6‡‰ˆ
rational
¡_ˆ˜…g‘°'™_‘^‹@‹—Œ‡€@ƒˆŠ€—‘–Z0ˆƒ‹A€@…6Š|0€6ˆ˜…6‹0¶€@ƒ‚œ’|‚'¡:‘^Šƒ™¦€b'ˆ|‹"€@…6Š|0€@ˆ˜…u‡‰‹—‡‰›}„ƒ™‰‡‰0‡€6™–°„|…6ˆo†‡’ƒ‚0’C¢–
€6|‚”'ˆ›}„ƒ‡‰™‰‚0…'¶‘|’²‡€u‹"‡‰›}„ƒ™–4’|‚'¡:‘Š|™€A§-‡‰|‡€6‡‰‘™‰‡‰Ä'‚0‹z€6|‚”’ƒ‘^€l‘°›œ‚'›u¢T‚0…@‹'ºÀ‡‰¡W‘°’ƒ‘^€l‘R›œ‚'›u¢T‚0…n‡‰‹
ˆ¡¶'™_‘‹"‹E€Ž–d„T‚˜]€6|‡‰‹E‡‰R€6Š…6j ‘^™‰™‰‹W€@ƒ‚b’|‚'¡:‘^Šƒ™¦€Œ'ˆ|‹"€@…@Šƒ€6ˆ˜…ˆ¡P€6|‚b'ˆ˜…@…6‚0‹"„Tˆ|’|‡‰|š}'™_‘‹"‹'¨ © ƒ‡‹
‚®'‚0„|€6‡‰ˆ4ƒ‘‹¢T‚'‚04›”‘’|‚b‹@ˆO€@]‘`€n‹"€"…6Š|0€6‹gŸMŒ|‡‰l $ƒ‘‹z‡‰||‚0…6‡€@‚'’e¡‰…@ˆ›H‡€@‹„|…6‚0'Š…6‹@ˆ˜…
S£s“|€S‡‰€@ˆ{€6|‚z'™_‘‹@‹S'ˆ|'‚0„|€Wˆ¡ b¨
4.3.6 User-defined conversions
sˆƒ‹A€@…6Š|0€6ˆ˜…6‹Œ‡€6vˆƒ‚Œ‘^…6šŠ|›œ‚'€„ƒ™_‘'–}‘z‹"„T‚'0‡_‘™]…@ˆ™‰‚+€6|‚0–}‘^…6‚ )Y'&oil(|rs#1(J0!#'d'&o0"!#
¨
ˆ˜…W€@ƒ‚z'™_‘^‹@‹
€6|‚n0ˆƒ‹A€@…6Š|0€6ˆ˜…
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Š|0€6ˆ˜…'
¢.‚''ˆ›œ‚'‹
int
rational
int
‘ A€Ž–d„T‚°E|ˆ‹@‚X†‘™‰Š|‚'‹œ ‘7¢T‚R'ˆ;†*‚0…@€6‚0’/€6ˆ
¨ © |‡‰‹v¡_ˆ˜…”‚®|‘›}„ƒ™‰‚O›œ‚ ‘|‹v€6ƒ‘^€
rational
q‚X'‘U„|…6ˆ`†d‡‰’|‚X‘j ‘™™E‘^…@šŠƒ›œ‚0€gˆ¡E€Ž–d„T‚
Œ|‚'|‚0†*‚0…œ‘J¡_ˆ˜…6›”‘^™S¡_Š||0€6‡ˆ<‘^…6šŠ|›œ‚';€{ˆ¡
€Ž–d„T‚
‡‹—‚®„.‚'0€6‚'’
º‡‰4€6|‚}‡‰›}„ƒ™‰‡'int
‡€'ˆ;†*‚0…6‹@‡‰ˆZ€6ƒ‘^€«€l‘^Â*‚'‹—„ƒ™_‘^'‚˜D€@ƒ‚v'ˆ†*‚0…"€6‡‰|š
'ˆ|‹"€@…@rational
Šƒ€6ˆ˜…‡‰‹Œ ‘^™‰™‰‚'’
¨ ‡€6jŠ|‹@‚0…A§-’|‚0“ƒ|‚'’e0ˆ†*‚0…6‹"‡‰ˆ|‹'.q‚bšˆœ¢T‚0–*ˆ|’J€@ƒ‚n‹@‚0€zˆ¡ '"9*#P(9*&0(
€6ˆ
£?]¢ƒŠ€w‡‰R'ˆ;€@…l‘‹"€E€6ˆ}€6|‚
0!'
# d'&o0"!#
€6ƒ‘^€w‘^…@‚n¢ƒŠƒ‡™€"§-‡4Ÿ™‰‡Â*‚z€6|‚—ˆ|‚—¡‰…6ˆ›
int
double
Ÿ‹@ˆ›œ‚€6‡‰›œ‚'‹q‡‰|'ˆ›}„ƒ™‰‚0€@‚o£¬‹"€l‘|’ƒ‘^…6’R'ˆ;†*‚0…6‹@‡ˆj…@Šƒ™‚'‹Œ‹"€6‡¦„]Š|™_‘`€6‚'’X¢–X€6|‚ •‹"€l‘|’ƒ‘^…6’
|q‚
›”‘^Â*‚w€6|‚…6Š|™‰‚'‹SˆŠ|…@‹@‚'™†*‚'‹0¨
© |‚0…@‚j‘^…6‚°›œ‚ ‘^ƒ‡ƒš¡_Š|™SŠ|‹@‚0…"§’ƒ‚“]|‚'’ 'ˆ;†*‚0…6‹@‡‰ˆ|‹v€@]‘`€œ ‘
» €{¢T‚°…6‚ ‘^™‰‡‰Ä'‚'’U¢–<'ˆ|‹"€@…@Šƒ?§
€6ˆ˜…6‹0¨ ˆ˜…u‚®|‘›}„ƒ™‰‚+‡‰¡¬q‚}S‘;€u‘X'ˆ;†*‚0…6‹@‡ˆ²¡‰…6ˆ›
€6ˆ
Pq‚} ‘
» €b‘’|’²‘
rational
double
'ˆ˜…@…@‚'‹"„Tˆ|’|‡‰|š°'ˆ|‹"€@…@Šƒ€6ˆ˜…—€6ˆ°€6|‚v€Ž–„T‚
1‹@‡ƒ0‚
‡‰‹«ƒˆ˜€b‘X'™_‘‹"‹n€Ž–d„T‚˜¨O±1†*‚'
double
'ˆ;†*‚0…6‹@‡‰ˆ|‹z€6ˆX‹@ˆ›œ‚g'™_‘^‹@‹z€Ž–„T‚ ›œ‡‰š€
|ˆ˜€z¢T‚{„Tˆ‹"‹@‡¢ƒdouble
™‰‚u‡‰k€6|‡‰‹S‘'– z‡‰¡ ‡‰‹n|ˆ˜€ "ˆŠG… €Ž–d„T‚{ŸM¢ƒŠ€E'ˆ›œ‚0‹W¡‰…6ˆ› ‘{™‰‡¦¢ƒ…6‘^…@–*‹6‘'–£ƒq‚« ‘||ˆ˜€Œ‹@‡›}„]™¦–”‘’|’R‘{0ˆƒ‹A€@…6Š|0€6ˆ˜…W€6ˆ ¨Y~X‹@Š|?
‹@‡€@Š]‘`€6‡‰ˆ|‹'q‚q‹@‡‰›}„ƒ™–«€6‚'™‰™ !)]& €Ž–d„.‚W|ˆo<‡€6‹1†‘™‰Š|‚'‹¶‹@|ˆŠ|™‰’{¢T‚q'ˆ;†*‚0…@€6‚0’v€6ˆ€6|‚S€l‘`…6š‚0€1€Ž–d„T‚¨
€@ˆ
;¡_ˆ˜…À‚?®|‘›}„ƒ™‰‚˜0ˆŠƒ™’v¢T‚S’ƒˆ|‚q€6…6ˆŠ|š}‘›œ‚'›u¢T‚0…
© ƒ‚S'ˆ;†*‚0…6‹@‡‰ˆœ¡‰…@ˆ›
rational double
¡_Š||0€6‡‰ˆO]‘^›œ‚'’
™‡Â*‚w€6|‡‰‹'¨
operator double
// POST : return value is double - approximation of * this
operator double ()
{
return double (n )/ d;
}
~7š‚'|‚0…l‘™MÀ€6|‚°›œ‚'›u¢T‚0…{¡_Š|ƒ€6‡‰ˆ
]‘^‹}‡‰›}„ƒ™‰‡‰'‡¦€—…6‚0€6Š…6<€Ž–d„.‚ ‘|’<‡‰|’ƒŠ|'‚0‹
‘OŠ|‹@‚…"§-’|‚0“ƒ|‚'’Z'ˆ;†*‚0…6‹@‡‰ˆ4€@ˆO€6|‚{€Ž–operator
„T‚ €6ƒ‘^€«‡‰‹«‘Š€6ˆ›”‘^€6‡ ‘™‰™–O‡‰;†*ˆ˜Â*‚'’4Œ|‚'|‚0†*‚0…«€6|‡‰‹z‡‰‹
|‚''‚'‹"‹6‘^…@–*¨
EP 4.3.7 Member operators
¾Œ™‰™ƒ¡_Š||0€6‡‰ˆƒ‘™‰‡¦€Æ–uˆ¡.…6‘^€6‡‰ˆƒ‘™ƒdŠ|›u¢T‚0…6‹€6ƒ‘^€q‚E]‘'†*‚Œ„|…6‚0†d‡‰ˆŠ|‹@™–u„|…6ˆo†‡‰’|‚'’œ€6…6ˆŠ|š "š™‰ˆ˜¢]‘™ ¡_Š||0€6‡‰ˆ|‹ŒŸ

¨'¨0¨l£u›gŠ|‹"€¬|ˆo[¢T‚Œ…@‚''ˆ|‹@‡‰’|‚0…6‚0’3d‹@‡‰|'‚Œ’|‡…6‚00€6™–}‘''‚'‹"‹A§
‡‰|š}€6|‚—’ƒ‘^€loperator+
‘{›œ‚'›g¢.‚0…6‹Soperator+=
‡‰‹Œ|ˆ”™‰ˆ|š‚0…E„Tˆ‹"‹@‡¢ƒ™‰‚˜¨E~ƒ‹A€6‚ ‘’
]q‚—E‡‰™‰™3Š|‹@‚—€6|‚—›œ‚'›u¢T‚0…W¡_Š|ƒ€6‡‰ˆ|‹
‘|’
¡_ˆ˜…W|ˆ§-›œˆd’|‡‰¡‰–d‡‰|šb‘'0‚'‹@‹W€@ˆ{€6|‚w…6‚0„|…6‚'‹"‚'€l‘`€6‡‰ˆ
|‘|’°‘u'ˆ§
numerator
denominator
‹"€@…@Šƒ€6ˆ˜…E¡_ˆ˜…W…6‚0€6Š…6|‡‰|š{‘u…@‚'‹@Š|™€ ¨¾Œ’|’|‡€6‡‰ˆ¤¡_ˆ˜…Œ‚®‘›}„ƒ™‰‚Œ€6|‚'°qˆ˜…@Âd‹W™‡Â*‚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…@‚'‹"€@…6‡0€6‡‰ˆ|‹'E€@ƒ‚…6‚4‘^…@‚k‹@ˆ›œ‚R€6|‡‰|š‹”€6ƒ‘^€Oq‚e ‘||ˆ˜€X’|ˆC„ƒ…@ˆ˜„T‚0…6™–
À
€6…6ˆŠ|š°š™‰ˆ˜¢]‘™
¡_Š||0€6‡‰ˆ|‹'¨À¾Œ‹Œ‘R‚?®|‘›}„ƒ™‰‚˜0ˆƒ‹"‡‰’|‚0…
¨ © |‡‰‹Wˆ˜„T‚0…6‘^€6ˆ˜…Wƒ‚0‚'’|‹W€6ˆ
lƒ‘|š‚”€@ƒ‚œ†‘™‰Š|‚œˆ¡W‘R…6‘^€6‡‰ˆƒ‘™dŠ|›g¢.‚0… P¢ƒŠ€b€6|‚0…6‚”‡‰operator+=
‹u|ˆJ‹A„T‚''‡“ƒ”›œ‚'›u¢T‚0…n¡_Šƒ|0€@‡‰ˆC€@]‘`€
‘™‰™ˆ`E‹gŠ|‹v€@ˆ4’|ˆk€6|‡‰‹'¨ k‚° ‘<ˆ|™–²‹@‡‰›gŠ|™_‘^€6‚}€@ƒ‚X?ƒ‘|š‚¤€6…6ˆŠ|š,€6|‚R‘’|’|‡€6‡‰ˆ,‘|’<‘
‘‹@‹"‡‰š|›œ‚'€ d™‰‡Â*‚w€6|‡‰‹'¨
// 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Š|0€6‹6£
‹@‡‰|'‚bq‚g“|…6‹A€«0ˆƒ‹A€@…6Š|0€«‘k‡€6‚0…A§
›œ‚'’|‡_‘^€@‚W…6‚'‹"Šƒ™¦€
Œ|‡‰lO‡‹¬‹@Š¢ƒ‹@‚'¥dŠ|‚';€6™–”'ˆ˜„ƒ‡‰‚0’¤¢]‘6œ‡‰;€6ˆ ¨~¤¡:‘0€'
S‘‹
a + b
a
operator+=
’|‚'‹@‡‰š|‚'’O€6ˆ}‘'†*ˆ‡‰’O‚®|‘€6™–”€6|‡‰‹q’|‚0€6ˆŠ…W€@]‘`€Sq‚«|‚'‚'’X€6ˆg€l‘^Â*‚z|ˆ`n¨
¾ ¢T‚0€"€6‚0…ŒS‘'–¤€6ˆœšˆ}‡‰‹E€@ˆv…6‚ ‘™‡‰Ä'‚
‘‹w‘u„ƒŠ|¢ƒ™‰‡n›œ‚'›u¢T‚0…S¡_Š||0€6‡‰ˆZŸ-‘ Fk'FJV''&
operator+
€l‘^‡ƒšw€6|‚s…6ˆ™‰‚sˆ¡ ¨ © |‡‰‹
!'2T'&9;@!& £?ƒ‘'†‡‰|šˆ|™–bˆ|‚q¡_ˆ˜…6›”‘™‘`…6šŠ|›œ‚'€sŸM¡_ˆ˜… £*‘^ƒ’
b
*this
a
™‰ˆˆ˜Â‹S‘‹S¡_ˆ™‰™‰ˆ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|‡‰z€6|‡‰‹+›œ‚'›u¢T‚0…
¡_Š||0€6‡ˆ3`€6|‚0…6‚‡‰‹+|ˆE„|…6ˆ˜¢ƒ™‰‚'› ‡‰u‘^''‚'‹@‹"‡‰|šE€6|‚À’ƒ‘^€l‘q›œ‚'›u¢T‚0…6‹
’|‡…6‚00€6™–*
‹@‡‰|'‚€6|‚¬‘0'‚'‹@‹+…@‚'‹"€@…6‡0€6‡‰ˆ|‹
’|ˆŒ|ˆ˜€P‘^„|„ƒ™–€6ˆŒ›œ‚0›g¢T‚…
¡_Šƒ|0€@‡‰ˆ|‹'¨ © |‡‰‹D†*‚0…@‹@‡‰ˆ—ˆ¡
operator+
*
‰‡ ‹‘‹‚ '‡‰‚';€«‘‹w€6|‚gˆ|‚b„|…6‚0†d‡‰ˆŠ|‹@™–°Š|‹@‚0’4¡_ˆ˜…

‘^ƒ’J‡€ ‘^k‡‰j€6Š…6J‚0†*‚'
struct rational
‹@‚0…"†*‚—‘‹E‘u¢]‘‹@‡‹S¡_ˆ˜…Œ‘g›œˆ˜…@‚z‹"Šƒ0'‡‰€W‡‰›}„ƒ™‰‚'›œ‚0€l‘^€@‡‰ˆvˆ¡
operator+
// POST : return value is the sum of a and b
rational operator + ( rational a , rational b)
{
return a += b;
}
LjŠ{›œ‡‰š€‘`…6šŠ|‚W€6ƒ‘^€‚0†*‚'
Prefer nonmember operators over member operators.
operator+
‹@|ˆŠ|™‰’”¢T‚''ˆ›œ‚w‘b›œ‚'›u¢T‚0…À¡_Š|ƒ€6‡‰ˆ¤ˆ¡
|‘|’¤‡‰|’ƒ‚0‚'’
d€6|‡‰‹¬qˆŠ|™‰’œ
„|…6ˆ˜¢]‘^¢ƒ™–
class rational
‘ ™‰™ˆ` ‘X‹"™‰‡‰š€@™–j›œˆ˜…6‚g‚ '‡‚'€b‡›}„]™‚'›œ‚'€6‘^€6‡‰ˆ
¨ © |‚0…@‚}‡‰‹nˆ|‚{‡‰›}„Tˆ˜…@€l‘^€w…6‚ ‘^‹@ˆZ€6ˆXÂ*‚'‚0„
€6|‡‰‹qˆ˜„T‚0…6‘^€6ˆ˜…Wš™‰ˆ˜¢]‘™€@ƒˆŠ|š
|‘|’X€6|‡‰‹qƒ‘‹q€6ˆv’|ˆgŒ‡€6OŠ|‹@‚0…"§’ƒ‚“]|‚'’X'ˆ†*‚0…@‹@‡‰ˆ|‹'¨
Œ‘'†‡‰|šu€6|‚«0ˆ†*‚0…6‹"‡‰ˆR¡‰…6ˆ›
€6ˆ
€@]‘`€Sq‚zš‚0€S€6…6ˆŠ|šX€6|‚z'ˆ|‹"€@…6Š|0€6ˆ˜…
int
rational
// POST : * this is initialized with value i
rational ( int i );
q‚n'‘R¡_ˆ˜…Œ‚®‘›}„ƒ™‰‚wE…6‡¦€6‚‚®„|…6‚'‹"‹@‡‰ˆ|‹Œ™‰‡Â*‚
ˆ˜…
ƒE|‚0…6‚
‡‰‹Wˆ¡D€Æ–„T‚
¨
r + 2
2 + r
r
rational
~œ'ˆ›}„ƒ‡‰™‰‡ƒšŒ€@ƒ‡‹'€6|‚E'ˆ›}„ƒ‡‰™‰‚…À‘^Š|€@ˆ›”‘^€6‡‰ ‘^™‰™–z‡‰|‹@‚0…@€@‹¬‘«0ˆ†*‚0…@€@‡‰|šn'ˆ|‹"€@…@Šƒ€6ˆ˜…¬ ‘^™‰™¨¶¹Wˆo—
ƒ‘'†‡‰|š
‘^‹b‘¤›œ‚0›g¢T‚…zqˆŠ|™‰’e…6‚'›œˆo†*‚g€6|‚{‹@‚''ˆ|’Z„Tˆ‹@‹@‡¦¢]‡™‰‡€Ž–Rˆ¡ÀW…6‡€6‡‰|š
¨
operator+
2 + r
– ‚0€ » ‹E“|…6‹"€w‹@‚0‚—Œƒ‘^€Œƒ‘^„|„T‚0ƒ‹SŒ|‚'
‡‰‹E'ˆ›}„ƒ‡‰™‰‚'’
¨s~¡
‡‰‹w‘g›œ‚'›g¢.‚0…
r + 2
operator+
¡_Š||0€6‡‰ˆ
€6|‚'
"›œ‚ ‘|%‹ r + 2
r. operator + (2)
~ k0ˆ›}„]‡™‰‡‰|šg€@ƒ‡‹'.€6|‚u'ˆ›}„ƒ‡‰™‰‚0…E‡‰|‹@‚0…@€6‹w€6|‚b'ˆ;†*‚0…6‹@‡ˆk¡‰…6ˆ›B€6|‚u ‘™‰™P‘^…6šŠ|›œ‚'€E€Æ–„T‚
€6ˆ—€6|‚Œ¡_ˆ˜…@›”‘™Y‘`…6šŠ|›œ‚'€€Ž–d„T‚
ˆ¡
‘|’”‚0†*‚0…@–€6|‡‰|šnqˆ˜…@Âd‹q‘‹¬‚®d„T‚'0€6int
‚0’3¨
rational operator+
||ˆ`q‚†*‚0… |qˆŠƒ™’X›œ‚ ‘
2 + r
2. operator + ( r )
Œ|‡‰l°›”‘`Â*‚'‹W|ˆ}‹"‚'|‹@‚nŒƒ‘^€@‹@ˆd‚0†*‚… ¨s~¡+q‚zE…6‡€@‚n‘u¢]‡]‘`…@–¤ˆ˜„T‚0…l‘^€@ˆ˜…Œ‘‹E‘g›œ‚0›g¢T‚…W¡_Š||0€6‡ˆ3
€6|‚'k€@ƒ‚b“|…6‹"€« ‘™™¶‘^…6šŠ|›œ‚'€ FO).' ¢T‚gˆ¡€6|‚u…6‚'‹"„T‚00€6‡†*‚g'™_‘‹"‹z€Ž–d„.‚˜¨g~›}„]™‡‰'‡€E'ˆ†*‚0…@‹@‡‰ˆ|‹
’|ˆ{|ˆ˜€Sqˆ˜…@”|‚0…6‚ ¶€6|‚0–¤ˆ|™–¤‘’ƒ‘^„|€q ‘™™D‘`…6šŠ|›œ‚'€6‹¬€@ˆ{¡_ˆ˜…6›”‘^™T‘^…6šŠ|›œ‚';€s€Æ–„T‚'‹Sˆ¡+'ˆ|0…@‚0€6‚
¡_Š||0€6‡‰ˆ|‹'T¢ƒŠ€w€6|‚0–J ‘||ˆ˜€w¢T‚{‚?®„T‚'€6‚'’k€6ˆ A“ƒ|’ ¤€6|‚u'™_‘^‹@‹wŒ|ˆ‹@‚
ƒ‘‹w€6ˆ”¢T‚
operator+
‘^„|„ƒ™‰‡‰‚'’
¨
4.3.8 Nested types
© ƒ‚…6‚”‡‰‹u‘X€6|‡…6’C ‘^€6‚0šˆ˜…@–Zˆ¡S'™_‘‹@‹b›œ‚0›g¢T‚…6‹'¶‘|’€6|‚'‹@‚¤‘^…6‚ #1 '@?(Ufo2T ¨ © ˆj›œˆ˜€6‡†‘^€6‚
6€ |‚'‹@‚]™‰‚€WŠ|‹W'ˆ›œ‚w¢Y‘^l¤€6ˆv~‹@‹@Š|‚—·{‘^¢Tˆo†*‚˜€6|‚nˆ|‚«0ˆƒ0‚0…6|‡‰|š{€6|‚z‡‰€@‚0…6ƒ‘™T…6‚0„|…6‚'‹"‚'€l‘`€6‡‰ˆ
ˆ¡w…l‘^€6‡ˆ]‘^™WŠƒ›u¢T‚0…@‹'¨~¡w–*ˆŠ<€6|‡‰Â<‘^¢.ˆŠ|€v'ˆ|‹@‚'¥Šƒ‚0€6™–Uƒ‡’ƒ‡ƒšJ€6|‚°…6‚0„|…6‚'‹"‚'€l‘`€6‡‰ˆ7ˆ¡‘
…l‘^€@‡‰ˆƒ‘™YŠƒ›u¢T‚0…q¡‰…@ˆ› €6|‚z0Šƒ‹A€6ˆ›œ‚0… d€@ƒ‚0¤–*ˆŠ¤„ƒ…@ˆ˜¢Y‘`¢]™¦–”‘™‰‹@ˆbS‘;€s€6ˆu|‡‰’|‚Œ€6|‚zŠ|›œ‚0…l‘^€6ˆ˜…
‘|’u’|‚'|ˆ›œ‡‰ƒ‘^€6ˆ˜…
€Ž–d„T‚˜¨1¾E‹P‡‰|’|‡‰ ‘^€6‚0’b‡‰b€6|‚¬‚®|‘^›}„]™‚˜^€6|‚'‹"‚¬€Æ–„T‚'‹1›œ‡‰š;€+‡€6‚0…@]‘^™‰™–zl]‘^ƒš‚
‘^ƒ’
D–*ˆŠZ‹A€6‡‰™‰™1„|…6ˆ›œ‡‰‹@‚b€6ˆ¤…6‚0€6Š…6
¢ƒŠ€n‡‰4€@ƒ‚g›œ‚'›u¢T‚0…z¡_Š||0€6‡‰ˆ|‹
numerator
denominator
§†‘™‰Š|‚'‹'¨
int
EP ¾ ¢T‚0€@€@‚0…q‹@ˆ™‰Š€6‡‰ˆ}qˆŠ|™‰’œ¢T‚w€6ˆ—„|…6ˆ›œ‡‹@‚Œˆ|™–œ‘n€Ž–„T‚ŒŒ‡€@¤0‚0…@€l‘‡¤„|…6ˆ˜„T‚…@€6‡‰‚'‹0¢d–”‹@‘ –d‡‰|š
¡_ˆ˜…R‚®‘›}„ƒ™‰‚R€6ƒ‘^€¤€6|‚4¡_Š|ƒ€6‡‰ˆ|‹
‘|’
…6‚0€6Š…6 ‘[‡‰€6‚0š˜…l‘™€Æ–„T‚
numerator
denominator
ŸŽ¯d‚'€6‡‰ˆ ¨ ¨¼³*£¨ © |‚'œ–*ˆŠœ ‘”‡‰€@‚0…6ƒ‘™‰™–ulƒ‘|š‚Œ¡‰…6ˆ› ˆ|‚Œ‡‰€@‚'š˜…l‘™|€Ž–d„T‚S€6ˆb‘n’|‡­Y‚0…6‚';€¬ˆ|‚
Œ‡¦€6|ˆŠ|€S‘^ƒ|ˆo–‡‰|šu€6|‚«0Šƒ‹A€6ˆ›œ‚0… ¨ © ‚'l||‡‰ ‘™™–*d€6|‡‰‹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¢T‚nŠ|‹@‚'’X¡_ˆ˜…Œ‚®‘›}„ƒ™‰‚w™‰‡Â*‚w€6|‡‰‹'¨
typedef rational :: rat_int rat_int ;
rational r (1 ,2);
rat_int numerator = r. numerator ();
rat_int denominator = r. denominator ();
// 1
// 2
4‚W‘™…@‚ ‘’–u‹@‚'‚Sˆ|‚Wˆ¡ƒ€6|‚S„|…6ˆ˜„T‚…@€6‡‰‚'‹1€6ƒ‘^€¶€6|‚S|‚'‹"€6‚'’{€Æ–„T‚
›{Š|‹"€ƒ‘'†*‚
rational::rat_int
‡‰Oˆ˜…6’|‚0…Œ¡_ˆ˜…S€6|‡‰‹s€6ˆ{qˆ˜…"Â.¨|
ˆ˜…W‚®‘›}„ƒ™‰‚˜d†‘™‰Š|‚'‹Sˆ¡+€Ž–d„T‚
›gŠƒ‹A€S¢.‚«'ˆ;†*‚0…@€6‡¦¢]™‚z€6ˆg‡€ ¨
int
¾ fo2T?(|5œ(|0 8_9*&09;"!# ‡‰;€@…6ˆd’|Š|'‚'‹S‘—|‚0 ƒ‘›œ‚w¡_ˆ˜…W‘¤‚®‡‹"€6‡‰|šb€Ž–d„T‚
‡‰;€6ˆ°‡€6‹«‹@'ˆ˜„T‚¨°~M€b’|ˆd‚0‹ #1!* ‡‰€@…@ˆd’|Š|'‚}‘X|‚0 €Ž–d„T‚˜¨X~Z¡:‘0€ P€@ƒ‚vƒ‚ ƒ‘›œ‚v'‘Z¢T‚}Š|‹@‚'’
‹"–dƒˆ;–›œˆŠ|‹@™–OŒ‡€@j€@ƒ‚uˆ™‰’Jƒ‘›œ‚—‡‰e‘™‰™+'ˆ€6‚?®€6‹'¨n~e€6|‚u‘^¢.ˆ`†*‚u'ˆ’ƒ‚
q‚b‹"‚'‚g€@ƒ‡‹Œ€ÆE‡‰'‚
Œ‡¦€6|‡‰O€6|‚—0™_‘‹@‹
ƒ€6|‚n€Ž–d„T‚'’|‚'¡¶’|‚''™‰‘^…l‘^€6‡ˆX‡‰;€@…6ˆd’|Š|'‚'‹Œ‘{|‚'‹"€6‚0’j€Ž–„T‚
.‘
rational
rat_int
|‚0Åƒ‘›œ‚«¡_ˆ˜…w€6|‚—€Æ–„T‚
¨~J€@ƒ‚n'Š|‹"€6ˆ›œ‚0…w0ˆd’|‚˜Y€6|‚b'™‰‘‹@‹'» ‹wƒ‚0‹"€6‚'’j€Ž–d„T‚œŸM€@]‘`€Œ ‘j¢T‚
‘'0‚'‹@‹@‚'’œŠ|‹@‡ƒšw€6|‚S‹@'ˆ˜„T‚qint
ˆ˜„T‚…l‘^€6ˆ˜… *‡‰¡|€6|‚q|‚'‹"€6‚'’{€Æ–„T‚q’|‚''™_‘^…6‘^€6‡‰ˆu‡‰‹1„ƒŠ¢]™‡‰o£D…6‚'0‚'‡†*‚'‹‘wƒ‚
Ÿ‹@|ˆ˜…@€@‚0…?£s]‘^›œ‚˜¨
~œ…6‚ ‘™¦§™‰‡‰¡_‚ 0ˆd’|‚˜€@ƒ‚…6‚w‘^…6‚Eƒ‚0‹"€6‚'’œ€Ž–d„T‚0‹sˆ¡Tƒ‚0‹"€6‚'’œ€Ž–d„T‚0‹¬ˆ¡T|‚'‹"€6‚'’œ€Ž–d„.‚'‹'¨ ¨0¨'‘|’
€Ž–d„T‚0]‘^›œ‚'‹S€@‚'|’°€6ˆvš‚0€W†*‚0…@–X™‰ˆ|š{’|Š|‚«€6ˆ{€6|‡‰‹'¨ © |‚«€Ž–d„.‚'’|‚'¡1›œ‚'lƒ‘|‡‰‹@›p‘™‰™‰ˆoŒ‹qŠ|‹W€@ˆ{Â*‚'‚0„
ˆŠ…E0ˆd’|‚z…@‚ ‘’ƒ‘^¢ƒ™‰‚˜¨
Typedef declarations.
4.3.9 Class definitions
4‚b|ˆoyƒ‘'†*‚b‹@‚'‚'J€6|‚—›”‘ƈ˜…Œ‡‰|š˜…6‚0’ƒ‡‚'€6‹Wˆ¡‘}'™_‘‹@‹0¨ˆ˜…6›”‘™‰™–*|‘}0™_‘‹@‹Œ’|‚0“ƒ|‡€6‡ˆ°ƒ‘‹Œ€6|‚
¡_ˆ˜…6›
³
class
º
−
¨¦¨¨ −
Œ|‚0…@‚ ‡‰‹g‘²‡‰’|‚'€@‡“ƒ‚0… ¨ © |‚”‹@‚'¥Šƒ‚0ƒ0‚Xˆ¡ »¼‹—›”‘'–4¢.‚¤‚0›}„ƒ€Ž–*¨e±‘^? ‡‹}‘ 9|0 'ZÆ2T0' rw'& Ÿ
ˆ˜…
£?sˆ˜…œ‘ Fe'FeV0'&<(|0 8_9*&09;A!# ¨ ¾
public:
private:
›œ‚'›u¢T‚0…D’|‚''™_‘^…6‘^€6‡‰ˆ—‡‹P‘E’|‚''™‰‘^…l‘^€6‡ˆ—‹"€l‘^€@‚'›œ‚'€D€6ƒ‘^€+€Ž–„]‡ ‘™‰™–z’|‚''™‰‘^…6‚'‹1‘W›œ‚'›g¢.‚0…+¡_Š||0€6‡ˆ3
‘O’ƒ‘^€6‘¤›œ‚'›u¢T‚0…'3ˆ˜…—‘O|‚'‹"€@‚'’Z€Æ–„T‚˜¨ sˆ™‰™‰‚'€6‡†*‚'™–*.€@ƒ‚0‹@‚œ‘^…6‚{ ‘™‰™‚'’ Fk0FeV'0&o ˆ¡À€6|‚}0™_‘‹@‹'
‘|’R€6|‚'‡…wƒ‘›œ‚0‹E›gŠƒ‹A€E¢T‚b‡‰’|‚';€6‡“ƒ‚0…6‹0¨W¾y0™_‘‹@‹w’|‚0“ƒ|‡€6‡‰ˆX‡‰€@…@ˆd’|Š|'‚'‹w‘v|‚0 €Ž–d„T‚˜.‘|’j€@ƒ‡‹
€Ž–d„T‚z‡‰‹S ‘™‰™‚'’°‘ 8_9;'{fo2T ƒ‘‹Wˆ˜„|„Tˆ‹@‚'’X€@ˆv‘u¡_Š|ƒ’ƒ‘›œ‚0€l‘™.€Ž–„T‚˜¨
¾ ›œ‚'›g¢.‚0…¬¡_Š||0€6‡‰ˆ¤’|‚0“ƒ|‡€6‡‰ˆ”‡‰‹q‘b’|‚''™_‘`…l‘^€6‡‰ˆ”‘^‹qq‚0™‰™¢ƒŠ€S‡‰¡T€6|‚'™_‘‹@‹s’|‚0“ƒ|‡€6‡ˆ¤’|ˆ‚'‹
|ˆ˜€g'ˆ€l‘^‡‰²€6|‚¤’|‚0“ƒƒ‡¦€6‡‰ˆˆ¡w‘R›œ‚'›u¢T‚0…u¡_Š||0€6‡‰ˆ
¶€6|‡‰‹u¡_Šƒ|0€@‡‰ˆ,›gŠ|‹"€g]‘'†*‚O‘J›”‘`€6lƒ‡ƒš
’|‚0“ƒ|‡€6‡‰ˆR‹@ˆ›œ‚Œ|‚0…6‚—‚0™‰‹@‚œŸ‹@‚0‚g¯d‚'0€6‡‰ˆ ¨ ·¨¼·*£¨Œ¾Œ™™+›œ‚'›u¢T‚0…W¡_Š|ƒ€6‡‰ˆJ’ƒ‚“]|‡€@‡‰ˆ|‹S€6ˆš‚€6|‚0…
¡_ˆ˜…6› €6|‚ '8:9;'uMFg238h0Fk'#
"9;A!# ¨
¾Œ–X›œ‚'›u¢T‚0…S’|‚''™_‘^…6‘^€6‡‰ˆ°ˆ¡¶‘g'™_‘‹"‹Œ‡‰‹E‹@‘‡‰’°€6ˆ}ƒ‘'†*‚ 8_9;'}^0!'2T ¨W~M€6‹W’ƒ‚0'™_‘^…"§
^‘ €6‡¦†*‚{…6‚'š‡ˆ4‡‰‹€6|‚}'™_‘‹"‹n’|‚0“ƒ|‡€6‡‰ˆ
¨ q™_‘^‹@‹n‹@0ˆ˜„T‚v’|‡­Y‚0…6‹n¡‰…@ˆ› ™‰ˆ ‘™¶‹@'ˆ˜„T‚XŸŽ¯d‚'0€6‡ˆ ¨¨¼·*£
‡‰jˆ|‚u‘‹"„T‚00€ ¨ © ƒ‚—„.ˆ˜€6‚'€@‡_‘™+‹"'ˆ˜„T‚bˆ¡‘}›œ‚'›u¢T‚0…W’ƒ‚0'™_‘^…l‘`€6‡‰ˆR‡‰‹Œ|ˆ˜€ˆ|™–O€6|‚—„Y‘`…@€wˆ¡1€6|‚
'™_‘^‹@‹¬’|‚0“ƒ|‡€6‡‰ˆ A¢.‚'™‰ˆo
 «€@ƒ‚E’ƒ‚0'™_‘^…l‘`€6‡‰ˆ
;¢ƒŠ€¬‡¦€s‹"„]‘|‹À€6|‚ QS.!*8: '™_‘^‹@‹¬’|‚0“ƒ|‡€6‡‰ˆ
 9*#P( €6|‚
¡_ˆ˜…6›”‘™‘^…6šŠ|›œ‚';€—™‰‡‹"€6‹—‘^ƒ’Z¢Tˆ’|‡‰‚'‹—ˆ¡S‘™‰™›œ‚'›u¢T‚0…«¡_Š|ƒ€6‡‰ˆ’|‚0“ƒƒ‡¦€6‡‰ˆ|‹'¨O~C‹"ƒˆ˜…"€ ¶‘X'™_‘^‹@‹
›œ‚'›u¢T‚0…q ‘^X¢T‚zŠƒ‹"‚'’ "‚0†*‚0…@–Œ|‚0…6‚ }‡‰O€@ƒ‚z'™_‘^‹@‹'¨
~¡3€Žqˆu'™_‘^‹@‹s’|‚0“ƒƒ‡¦€6‡‰ˆ|‹¬¡_ˆ˜…6›$’|‡‰‹ ƈ‡‰;€s’|‚''™_‘`…l‘^€6‡†*‚W…6‚'š‡‰ˆ|‹';€6|‚0…6‚‡‰‹s|ˆb„ƒ…@ˆ˜¢]™‚'› ‡‰¤Š|‹@‡‰|š
€6|‚z‹6‘›œ‚ƒ‘›œ‚¡_ˆ˜…E›œ‚'›u¢T‚0…@‹sˆ¡+¢Tˆ˜€6O'™_‘‹@‹"‚'‹'¨
Class Scope.
4.3.10 Random numbers
4‚Eƒˆo/]‘'†*‚‘™™ƒ€6|‚W›œ‚ ‘|‹€6ˆ«„]Š€¬€@ˆš‚0€6|‚0…s‘«'ˆ›}„ƒ™‰‚0€6‚W‘|’œŠ|‹@‚'¡_Š|™.‡‰›}„ƒ™‰‚'›œ‚0€l‘^€@‡‰ˆbˆ¡.€6|‚
€Ž–d„T‚
‘‹W‘g0™_‘‹@‹W‡‰ b
º|¢]Š€W‹@‡‰|'‚q‚nƒ‘'†*‚—‘™¦…6‚ ‘’–”‹@‚'‚0R›œˆ‹"€Sˆ¡+€6|‚«|‚'0‚'‹@‹6‘^…"–
rational
'ˆ’ƒ‚À‡‰{¯d‚'0€6‡‰ˆ
¨ ‘|’u‡‰—€6|‡‰‹P‹@‚00€6‡‰ˆ
q‚¬™‚ ‘'†*‚À€6|‚s¡_Š|™‰™d'™‰‘‹@‹1‘‹P±1®‚0…6'‡‰‹"‚ _*
‘|’b'ˆ€6‡dŠ|‚
|‚0…6‚zŒ‡€6O‘u¡‰…6‚'‹@R'™‰‘‹@‹q€6ƒ‘^€Eƒ‘‹W‘u™‰‡€@€6™‚Œ›œˆ˜…6‚‚'€@‚0…@€l‘‡ƒ›œ‚0€q‡‰°‹A€6ˆ˜…6‚˜¨
´™‰‘ –d‡‰|šbš*‘›œ‚'‹sˆ”€6|‚'ˆ›}„ƒŠ|€@‚0…¬qˆŠ|™‰’œ¢T‚w„|…6‚0€@€Ž–}¢Tˆ˜…@‡‰|š—Œ‡€6|ˆŠ€s‹@ˆ›œ‚wŠ|„|…6‚'’|‡‰0€6‘^¢ƒ‡‰™¦§
‡€Ž– ‘bl|‚'‹@‹q„ƒ…@ˆš˜…l‘›$‹@|ˆŠ|™‰’¤ƒˆ˜€W‘™¦S‘ –d‹s'ˆ›œ‚wŠ„XE‡€6”€6|‚z‹@‘›œ‚wˆ™‰’¤›œˆ`†*‚'‹q‡‰”…6‚ ‘^0€6‡‰ˆ”€6ˆ
–*ˆŠ…w‹6‘›œ‚«ˆ™‰’R›œˆo†*‚'‹'.‘^ƒ’R‡e‘^j‘0€6‡‰ˆRš*‘^›œ‚˜ƒ€@ƒ‚n‚'|‚'›œ‡‰‚'‹S‹@|ˆŠ|™‰’jƒˆ˜€Œ‘™S‘'–‹S„Tˆ˜„JŠ„k‘`€
€6|‚n‹@‘›œ‚z€@‡‰›œ‚z‘|’R™‰ˆd ‘`€6‡‰ˆ
¨À~Rˆ˜…@’ƒ‚…E€6ˆœ‘^?|‡‰‚†*‚—Š||„|…6‚0’ƒ‡0€l‘^¢ƒ‡‰™‰‡¦€Æ–*;€6|‚«„|…6ˆš˜…l‘^›p€Ž–d„ƒ‡‰'‘™‰™–
Š|‹@‚'‹E‘ &09*#P(|!F #T)YFJV''&{\'#1'&09;@!& ¨ © |‡‰‹q€6‚0…6›p‡‰‹S›œ‡‰‹@™‰‚'‘’|‡‰|š;€6|ˆŠ|š
‹@‡‰|'‚z€6|‚«Šƒ›u¢T‚0…@‹
‘^…6‚‡‰”…6‚ ‘^™‰‡€Ž–œš‚'|‚0…l‘`€6‚'’°‘^''ˆ˜…6’|‡‰|šb€6ˆg‹@ˆ›œ‚Œ“®‚'’¤…6Š|™‰‚˜‡‰O‹@Š|l°‘—S‘'–œ€6ƒ‘^€s€6|‚0– 9 22T?9*& €6ˆ
¢T‚…l‘|’|ˆ›R¨ÃÀŠ€E¡_ˆ˜…W›”‘–œ„ƒŠ…@„Tˆ‹"‚'‹«ŸM‡‰|'™‰Š|’|‡‰|šbš*‘›œ‚'‹l£€6|‡‰‹q‡‰‹W0ˆ›}„]™‚0€6‚'™–}‹@Š '‡‰‚0€ |‘|’
q‚z ‘™‰™
‹@Š|lRdŠ|›u¢T‚0…6‹ 23')3(|!&09*#P(|!F ¨
¾ "‹ ‡‰›}„ƒ™‰‚Œ‘|’¤Œ‡‰’|‚'™–;§-Š|‹@‚'’œ€6‚0?||‡‰¥Šƒ‚wˆ¡3š‚0€@€@‡‰|šu‘u‹"‚'¥dŠ|‚'|'‚
dŠ|›u¢T‚0…6‹3‡‰‹T€6|‚ 8 % #19*&—!#.\& )+'#
Æ9;8ƒFe -.!( ¨ ‡†*‚'b‘ FO).8 ¦238"'&

Linear congruential generators.
ˆ¡„ƒ‹@‚0Šƒ’|ˆ˜…l‘^ƒ’|ˆ›
a
EP ‘ ! x1 , x2 , . . .
¶‘ Fe!(*).8).
‘^ƒ’C‘ (
m ˆ¡Dƒ‘^€6Š…l‘™
dŠ|›u¢T‚0…6‹q’|‚0“ƒ|‚'’X¢–O€6|‚…6Š|™‰‚
c
xi = (axi−1 + c)
›œˆd’
m,
© ƒ‚z‹@‚'¥Š|‚'|'‚

c = 187,
x1 , x2 , . . .


dŠ|›u¢T‚0…+š‚'|‚0…l‘^€6ˆ˜…
m = 28 = 256,


knuth8
˜’|‚0“ƒ|‚'’b¢d–n€@ƒ‚À¡_ˆ™‰™‰ˆoŒ‡‰|š
x0 = 0.
ˆ¡DdŠ|›u¢T‚0…6‹s€6ƒ‘^€Sq‚«š‚€E¡‰…6ˆ›

1™‰‚0€—Šƒ‹n'ˆ|‹@‡‰’|‚0…—€6|‚œ‹@‚0¥dŠ|‚'|'‚
i > 0.
¾U‹@›”‘^™‰™*‚®|‘›}„ƒ™‰‚‡‰‹3€6|‚À„ƒ‹@‚'Š|’|ˆ˜…l‘|’|ˆ›
„]‘^…l‘›œ‚€6‚0…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…6‚0„T‚'‘^€6‹S‡€6‹@‚'™¡Ÿ‡Xš‚'|‚0…l‘^™€6|‚w„T‚0…6‡‰ˆ’X ‘^°|‚0†*‚0…S¢T‚«™ˆƒš‚…
€6ƒ‘
£?¨vÃÀŠ€zŠ|€6‡™P€6|‡‰‹w„Tˆ‡‰€'3‡¦€z‘^„|„T‚ ‘^…6‹€6ˆ”¢T‚u„ƒ…@‚0€@€Ž–j…l‘|’|ˆ›µŸ-‘™€6|ˆŠ|še‘¤'™ˆ‹@‚0…z™‰ˆdˆ˜Â
…6‚0†*‚'‘™‰m
‹s€6ƒ‘^€S‡€q‡‰‹q|ˆ˜€q…l‘|’|ˆ› ‘^€W‘™‰™º’ƒˆu–*ˆŠ°’|‡‰‹@0ˆ`†*‚0…W‘b‹"€@…@‡Â‡‰|šu‹@‡‰šOˆ¡D|ˆ…l‘|’|ˆ›œ|‚'‹@‹ `£¨
~Xˆ˜…6’|‚0…S€6ˆu›”‘^Â*‚w€6|‚›”‘š|‡€6Š|’|‚Eˆ¡
€6|‚z…6‘|’ƒˆ›$Š|›g¢T‚…6‹s‡‰|’|‚0„T‚'|’|‚'€S¡‰…6ˆ›$€6|‚›œˆd’§
Š|™‰Š|‹'‡€W‡‰‹q'ˆ›œ›œˆ”„ƒ…6‘0€6‡‰0‚€@ˆ #1!& Fe9;8; €@ƒ‚zdŠ|›u¢T‚0…6‹S‹@ˆg€6ƒ‘^€q€6|‚0–°‘`…6‚z…@‚ ‘™
dŠ|›u¢T‚0…6‹S‡‰
€6|‚z‡‰€6‚…@†˜‘^™
¨
[0, 1)
´¶…@ˆš˜…l‘› · u¢T‚'™‰ˆo'ˆ;€l‘‡‰|‹¬€6|‚w’|‚0“ƒ|‡€6‡‰ˆ”ˆ¡D‘—'™_‘‹"‹
‡‰¤ƒ‘›œ‹"„]‘'‚
¡_ˆ˜…Sš‚'§
random
‚0…l‘`€6‡‰|šƒˆ˜…@›”‘™‰‡‰Ä'‚0’u„ƒ‹@‚0Šƒ’|ˆ˜…l‘^ƒ’|ˆ›ÅŠƒ›u¢T‚0…@‹¶‘'ˆdˆ˜…@’ƒ‡ƒšw€6ˆ
€6|‚q™‰‡‰|‚ ‘^…¶0ˆƒš˜…@Šƒ‚0€6ifm
‡_‘^™›œ‚0€6|ˆd’
¨

© ƒ‚…6‚œ‡‰‹u‘°'ˆ|‹"€@…@Šƒ€6ˆ˜…b€6ƒ‘^€u‘™™‰ˆ`E‹«€6|‚œ'Š|‹"€@ˆ›œ‚0…—€6ˆR„|…6ˆo†‡‰’|‚v€6|‚}„]‘^…l‘^›œ‚0€6‚0…6‹
a, c, m, x0
‘|’e‘v›œ‚'›u¢T‚0…Œ¡_Š||0€6‡ˆ
€6ˆ”š‚0€Œ€6|‚—…6‚'‹A„T‚'0€6‡¦†*‚g|‚®d€‚'™‰‚'›œ‚0€w‡j€@ƒ‚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ƒ‘^€ »¼‹Œ–}‡€6‹s’|‚''™‰‘^…l‘^€6‡ˆ}‡‰‹
© |‚¡_Š||0€6‡‰ˆ
operator()
]Œ|‡‰lJ‘’|›œ‡€@€6‚'’|™–”™ˆdˆ˜Â‹E‘{¢ƒ‡€w¡_Š||–£T‘|’j‡€Œˆo†*‚0…6™ˆ*‘’|‹Œ€6|‚ 50)]#1 "!# 9;8%8
operator()()
!'2T'&9;@!& ‹@‚'‚ © ‘^¢ƒ™‰‚w³b‡‰œ€6|‚w¾E„|„T‚'|’|‡¦®.¨¶~Oš‚'|‚0…6‘™‡‰¡ —‡‰‹q‘¤‚®d„ƒ…@‚'‹@‹@‡‰ˆ¤ˆ¡3‹@ˆ›œ‚Œ'™_‘^‹@‹
€Ž–d„T‚Œ|‡‰l°ƒ‘‹q€6|‚z›œ‚'›g¢.‚0…q¡_Š|ƒ€6‡‰ˆ
operator
ŸŽ£Ÿ  ¨¦¨¨¦ £
€6|‚' u ‘X¢.‚«Š|‹@‚'’R™‡Â*‚z‘g¡_Š||0€6‡‰ˆ1€6|‚n‚?®„|…6‚'‹@‹"‡‰ˆ
nŸ  ¨¦¨¨ £
‡‰‹
‚'¥Šƒ‡¦†˜‘™‚'€T€6ˆW‘s ‘™‰™ˆ¡€6|‚¶›œ‚'›u¢T‚0….¡_Š||0€6‡ˆ
Œ‡¦€6z‘^…6šŠ|›œ‚';€6‹ ¦¨'¨'¨' ¡_ˆ˜…S€6|‚n‚®d„ƒ…@‚'‹@‹@‡‰ˆ ¨ 4‚zŒ‡‰™‰™Y‹@‚'‚n‹"ŠƒlR ‘^™‰operator()
™‰‹q‡‰°´1…6ˆš˜…l‘^› · ‘|’°´1…6ˆš˜…l‘›=· ¢.‚'™‰ˆo—¨
E‚0…6‚R‡‹}€6|‚°‡‰›}„ƒ™‰‚'›œ‚';€l‘^€6‡ˆCˆ¡w€6|‚R'™‰‘‹@‹
‡‰<Œ|‡‰l<q‚°‹@‚0‚J|ˆo
random
operator()
Š„T’ƒ‘^€6‚'‹}€@ƒ‚°†‘™‰Š|‚°ˆ¡€6|‚R’ƒ‘^€l‘k›œ‚0›g¢T‚…
€6ˆZ¢T‚°€6|‚°…6‚'‹"„.‚'0€6‡†*‚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¢T‚0…«š‚'|‚0…l‘^€6ˆ˜…@‹n‘^…@‚{ˆ˜¢|€l‘‡ƒ‚0’k‡‰e‚®|‘€6™–j€6|‡‰‹S‘ –*¨
d
…6‚0€@Š|…@ƒ‹„ƒ‹@‚'Š|’|ˆ˜…l‘|’|ˆ› Š|›g¢T‚…6‹‡
ˆ˜…¬‚®‘›}„ƒ™‰‚˜˜€6|‚qq‚'™‰™¦§MÂ|ˆoŒvš‚0ƒ‚…l‘^€6ˆ˜…
drand48
[0, 1)
‘'0ˆ˜…6’|‡‰|šg€6ˆg€6|‚z„]‘^…6‘›œ‚0€6‚0…@‹
a = 25214903917,
c = 11,
m = 248 ,
‘|’j‘{‹"‚'‚'’jlƒˆ‹"‚'J¢–O€@ƒ‚n'Š|‹"€6ˆ›œ‚0… ¨”~M€Œ‡‰‹W'™‰‚ ‘^…W€6ƒ‘^€Eq‚«|‚'‚'’J‘{™_‘`…6š‚n›œˆ’ƒŠ|™‰Š|‹s€6ˆ}ˆ˜¢|€l‘^‡‰
‘uŠƒ‹"‚'¡_Š|™Dš‚'|‚0…6‘^€6ˆ˜… ‹@‡ƒ0‚
‡‹E‘OŠ„ƒ„.‚0…W¢.ˆŠƒ|’O¡_ˆ˜…W€6|‚zdŠ|›u¢T‚0…Sˆ¡+’|‡­Y‚0…6‚';€EŠƒ›u¢T‚0…@‹q€@]‘`€
m
q‚z ‘X„Tˆ‹"‹@‡¢ƒ™–”š‚0€W¡‰…6ˆ›$€6|‚«š‚0ƒ‚…l‘^€6ˆ˜… ¨ © ƒ‡‹S›œ‚'‘|‹q€@]‘`€
¡‰…6ˆ›=‘^¢Tˆo†*‚«‡‰‹q…l‘^€@ƒ‚…E‘
knuth8
€6ˆo–¤š‚'|‚0…l‘^€6ˆ˜…'¨
E‚…6‚W‡‹‘š*‘›œ‚À€@]‘`€–*ˆŠv'ˆŠ|™‰’g„ƒ™_‘'–bE‡€6u–*ˆŠ|…¡‰…6‡‰‚0ƒ’gŒ|‡‰™‰‚
S‘‡€@‡‰|š{¡_ˆ˜…Œ‘{’|‚'™_‘'–*‚'’R€@…l‘^‡‰
¨¬±‘lJˆ¡P–*ˆŠR‡ƒ’|‚0„.‚'|’ƒ‚0€6™–”W…6‡€6‚'‹S’|ˆ`Ej‘R‡‰;€6‚'š‚0…W¢T‚0€Žq‚'‚'
‘^ƒ’ ¨ © ƒ‚0°€6|‚ndŠ|›u¢T‚0…6‹S‘^…@‚n'ˆ›}„]‘^…6‚0’3¨~¡+€6|‚0–X‘^…6‚«‚'¥dŠƒ‘™M|€@ƒ‚zš*‘›œ‚‡‰‹E‘g’…l‘'—¨À~¡+€6|‚
1
dŠ|›u¢T‚06…6‹¶’|‡­Y‚0…¶¢d–gˆ|‚˜;€@ƒ‚s„ƒ™_‘'–*‚0…Œ‡€@g€6|‚S‹@›”‘™‰™‚0…1dŠ|›u¢T‚0…¶š‚0€@‹ 9 ¡‰…6ˆ›Å€6|‚Sˆƒ‚qŒ‡¦€6
€6|‚z™_‘^…6š‚0…SŠƒ›u¢T‚0…'¨~¡3€6|‚z€Žqˆ{dŠ|›g¢.‚0…6‹q’|‡­.‚0…S¢d–”€Žqˆgˆ˜…E›œˆ˜…6‚€6|‚z„ƒ™_‘'–*‚0…SŒ‡€@¤€6|‚z™_‘^…6š‚…
dŠ|›u¢T‚0…«š‚0€6‹ T ¡‰…6ˆ›ª€6|‚{ˆ|‚gŒ‡€6J€6|‚v‹@›”‘^™‰™‰‚0…Šƒ›u¢T‚0…'¨{LjŠ4 ‘e…6‚0„T‚ ‘`€n€6|‡‰‹zŠ|€6‡‰™
€6|‚€@…l‘‡‰X‘^…@…6‡¦†*‚'‹«ŸMˆ˜…EŠ|€@‡‰™Tˆ|‚«ˆ¡+–*ˆŠO…6Š|ƒ‹WˆŠ€Wˆ¡+ ‘‹@
ƒ‘|’X|ˆ˜„T‚'¡_Š|™‰™¦–”‡€ »¼‹s–*ˆŠ…Œ¡‰…@‡‰‚'|’]£¨
~¡¬–*ˆŠZ€6|‡‰Âk‘`¢TˆŠ€—|ˆ` €6ˆX„ƒ™_‘'–J€6|‡‰‹zš*‘›œ‚˜+‡¦€ »¼‹z|ˆ˜€—ˆ˜¢d†d‡‰ˆŠ|‹«E]‘`€«€6ˆX’ƒˆ
¨ w|‚v€6|‡‰|š
 ¬–*ˆŠe‹"ƒˆŠ|™‰’R|ˆ˜€ŒW…6‡€6‚n’ƒˆoŒ°€@ƒ‚b‹@‘›œ‚nŠƒ›u¢T‚0…Œ‡‰R‚0†*‚0…@–R…@ˆŠƒ|’
Y‹"‡‰|'‚
ˆ˜¢d†d‡‰ˆŠ|‹']€6|ˆŠ|š
€6|‚'v–*ˆŠ…À¡‰…6‡‰‚'|’}¥Šƒ‡lÂd™–g™‰‚ ‘^…@ƒ‹1€6ˆ«‚®„ƒ™‰ˆ‡¦€€@ƒ‡‹¢–gW…6‡€6‡ƒš’|ˆoŒœ‘dŠ|›u¢T‚0…¶€6ƒ‘^€¢T‚ ‘^€6‹¶–*ˆŠ…
dŠ|›u¢T‚0…zŸM¢–O’|‚'‹"‡‰š°ˆ¡D€@ƒ‚zš*‘›œ‚˜€@ƒ‡‹S‡‹E‘™¦S‘ –d‹s„Tˆ‹@‹@‡¢ƒ™‰‚ £¨
LjŠ ‹@|ˆŠƒ™’€6|‚0…6‚'¡_ˆ˜…6‚‘^’ƒ’ ‹"ˆ›œ‚kŠ|„ƒ…@‚'’|‡‰0€l‘^¢ƒ‡‰™‡€Ž–U€6ˆ,–*ˆŠ…Rl|ˆ‡‰'‚'‹0¨pLjŠ 'ˆŠ|™‰’
¡_ˆ˜…
‚®‘›}„ƒ™‰‚˜.‹@‚00…6‚0€6™¦–R…6ˆ™‰™1‘}’|‡‰'‚u‡‰J‚0†*‚0…"–J…@ˆŠƒ|’e‘|’JW…6‡€6‚b’|ˆoŒj€6|‚udŠ|›g¢.‚0…w€6ƒ‘^€w‡€‹"ƒˆoŒ‹0¨
The game of choosing numbers.
7,7851 &) ,J? J]^G?G!5J /E?%)COD
&#7
+D$<<4N?%
/.?%!(&NI,*&#7 )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&#7]J$'?NU9. ) \0/0DL
·
ÃÀŠ€Œ±P®‚…6'‡‰‹@‚ o …@‚0†*‚ ‘™‰‹S€6ƒ‘^€q–*ˆŠ…E¡‰…6‡‚'|’° ‘R‚®d„ƒ™‰ˆ‡€s€6|‡‰‹S‘‹Sq‚'™‰™¨
LjŠR›{Š|‹"€S‹@ˆ›œ‚'|ˆo “]|‚0€@Šƒ|‚z–*ˆŠ|…W…l‘|’|ˆ›=l|ˆ‡‰'‚0‹'ƒ¢ƒŠ€Œ|ˆo k~Rˆ˜…@’ƒ‚…E€6ˆ}‚?®„T‚0…@‡‰›œ‚'€
Œ‡¦€6,’|‡­Y‚0…6‚';€v’|‡‰‹"€"…6‡¢ƒŠ€6‡‰ˆ|‹'1–*ˆŠU’|‚''‡‰’|‚¤€6ˆk’|‚0“ƒ|‚X‘^ƒ’,‡‰›}„ƒ™‰‚'›œ‚';€u‘J0™_‘‹@‹
€6ƒ‘^€Œ…@ˆ™‰™‰‹W€@ƒ‚b’|‡‰0‚b‡‰j‹@Š|?e‘vS‘'–X€6ƒ‘^€E€6|‚—„ƒ…@ˆ˜¢Y‘`¢]‡™‰‡€Ž–¤¡_ˆ˜…dŠ|›g¢.‚0… €6ˆœ'ˆ›œloaded_dice
‚—Š„J‡‰‹w‚'¥Š]‘^™
i
€6ˆZ‘j„|…6‚'‹"„T‚0'‡“ƒ‚'’U†‘™‰Š|‚
Ÿ-‘e¡:‘‡¦…}’|‡‰'‚O]‘^‹
¡_ˆ˜…œ‘™‰™
£¨ © |‚'U–*ˆŠ
pi = 1/6
. . , 6}
'ˆŠ|™‰’Z™‰‚€b’|‡­.‚0…@‚'€b™ˆ*‘’|‚'p’Zi ’|‡‰'‚'‹n„ƒ™_‘'–4‘š*‘‡‰|‹"€«
‚ ‘lCˆ˜€6|‚0… 1‘|’i‡‰4€6{1,
|‡‰‹«. S
‘ –k’|‡‰‹@'ˆo†*‚0…u‹@Š|‡€"§
‘^¢ƒ™‰‚z„ƒ…@ˆ˜¢Y‘`¢]‡™‰‡€6‡‰‚0‹q€@ˆ}Š|‹@‚u‘š*‘‡‰|‹"€S–*ˆŠ…w¡‰…6‡‰‚0ƒ’ŸME|ˆ}‡‰‹W¢–X€6|‚nS‘'–Xƒˆ˜€Œ‹"€6Š|’–‡‰|šv0ˆ›}„]Š€6‚…
‹@'‡‚'|'‚o£¨
´¶…@ˆš˜…l‘›a· ‹@|ˆ`E‹w‘u‹@Š|‡€l‘^¢ƒ™‰‚z'™_‘‹"‹E’|‚0“ƒ|‡€6‡‰ˆJŸM€6ƒ‘^€W‡‰°€6Š…6X…@‚'™‰‡‰‚'‹WˆX€6|‚n0™_‘‹@‹
random
‰¡ …6ˆ› ‘^¢Tˆo†*‚˜wŒ‡€@ €6|‚eƒˆ˜…@›”‘™‰‡‰Ä ‘`€6‡‰ˆU€6ˆC€6|‚e‡‰;€6‚0…@†‘™
£¨ 4‚eE‡‰™‰™Œš‚€X€6ˆC€6|‚e'™‰‘‹@‹
[0, 1)
‡‰›}„ƒ™‰‚'›œ‚0€l‘^€@‡‰ˆ°Ÿ-‘|’¤€6|‚«›œ‚ ‘^ƒ‡ƒšuˆ¡3€6|‚«’ƒ‘^€l‘u›œ‚'›u¢T‚0…6‹6£‡‰R´1…6ˆš˜…l‘›p· ¢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‡_‘^™‰‡‰Ä'‚b€6|‚œ™‰ˆ*‘’|‚'’’|‡‰'‚¶q‚œƒ‘'†*‚}€6ˆR„|…6ˆo†‡‰’|‚}€6|‚}„|…6ˆ˜¢]‘^¢ƒ‡‰™‰‡€@‡‰‚'‹
p
,
.
.
.
,
p
1
5
P5
£?
‘|’e€6|‚b…l‘|’|ˆ›adŠ|›u¢T‚0…š‚'|‚0…6‘^€6ˆ˜…€6ƒ‘^€‡‰‹Œ¢T‚0‡‰|š¤Š|‹@‚0’e€6ˆO‘0€6Šƒ‘™™–X…6ˆ™p™+6€6|=‚
1 − i=1 pi
’|‡‰'‚˜¨1¾Eš*‘‡‰
;q‚Wˆ`†*‚…6™‰ˆ*‘’
€6ˆn…6‚ ‘^™‰‡‰Ä'‚S€6|‚E¡_Š||0€6‡‰ˆƒ‘™‰‡¦€Æ–uˆ˜¡.…6ˆ™‰™‰‡‰|š€6|‚Œ’|‡‰'‚Wˆƒ0‚˜¨
operator()
EˆoC’ƒˆSq‚‡›}„]™‚'›œ‚'€]€6|‡‰‹3¡_Šƒ|0€@‡‰ˆƒ‘™‰‡€Ž– k‚„]‘^…@€@‡€6‡‰ˆ€6|‚‡€6‚0…"†˜‘™
‡‰€6ˆ …6‡‰š€A§-ˆ˜„T‚'
[0, 1)
6
‡‰;€6‚0…@†‘™‰‹'E|‚0…6‚z‡‰€6‚…@†˜‘^™ ƒ‘‹S™‰‚'|š˜€6
i
p1
pi
p3
p2
p1 + p 2
0
p4
x
p5
p6
p1 + p 2 + p 3
1
Šƒ‹"‡‰|šbˆŠ|…qš‚0ƒ‚…l‘^€6ˆ˜… ¨~¡
€6|‚wdŠ|›u¢T‚0…
© |‚'¤q‚w’…l‘' ‘—dŠ|›u¢T‚0… ‘^€s…l‘|’|ˆ› ¡‰…6ˆ›
x
[0, 1)
€6ƒ‘^€Dq‚¬š‚0€Pq‚0…@‚À€@…6Š|™–z…l‘|’|ˆ›R`€@ƒ‚0g‡¦€+qˆŠ|™‰’b‚'|’uŠ„u‡‰b‡‰€@‚0…@†‘™ Œ‡¦€6—„|…6ˆ˜¢]‘^¢ƒ‡‰™‰‡€Ž–w‚®‘0€6™¦–
i
¨BE|’|‚0…¶€6|‚W‘‹@‹@Š|›}„|€6‡‰ˆb€6ƒ‘^€ˆŠ…¶„]‹"‚'Š|’ƒˆ˜…6‘|’ƒˆ›•Šƒ›u¢T‚0…@‹P¢T‚'ƒ‘'†*‚E™‰‡Â*‚¬…6‘|’ƒˆ›•Šƒ›u¢T‚0…@‹
pi
‡‰X‘g‹@Š|‡€6‘^¢ƒ™‰‚ŒS‘'–*|q‚€6|‚0…6‚0¡_ˆ˜…6‚«’|‚'0™_‘^…6‚ ‘‹q€6|‚«ˆŠ€60ˆ›œ‚zˆ¡3…6ˆ™‰™‰‡ƒš—€@ƒ‚z’|‡‰'‚z‡‰¡P‘^ƒ’Oˆ|™–”‡‰¡
i
‚'|’|‹WŠ„R‡°‡‰€@‚0…@†‘™ ¨ © ƒ‡‹S‡‹S€6|‚z ‘‹@‚«
‡‰¡P‘^ƒ’Oˆ|™–¤‡‰¡
x
i
p1 + . . . + pi−1
x < p1 + . . . + pi .
 ‡‰‹n‚®„ƒ™_‘‡ƒ‹«€6|‚}’ƒ‘^€l‘X›œ‚'›u¢T‚0…@‹
¨'¨0¨'
Ÿ%q‚}’|ˆ3» €b|‚'‚'’
© |
p_upto_1
p_upto_5
Ÿ
£W‘|’
Ÿ
£@£¨ © ƒ‚n'ˆ|‹"€@…6Š|0€6ˆ˜…Œ‡‰j´¶…@ˆš˜…l‘›a· ‹@‡‰›}„ƒ™–”‹@‚0€@‹Œ€6|‚'‹@‚—p_upto_0
›œ‚'›u¢T‚0…@‹
¡‰…6=ˆ› 0 €6|‚W’ƒ‘^p_upto_6
€l‘w„|…6ˆo†‡‰’|‚'=
’
1‘|’v€6|‚E‡‰›}„ƒ™‰‚0›œ‚'€l‘`€6‡‰ˆ—ˆ¡
Š|‹@‚'‹€6|‚'›t‡}‚®|‘^0€6™–u€6|‚
S‘'–”€6ƒ‘^€qS‘‹W‚0†‡‹@‡‰ˆ|‚'’X¢–¤€@ƒ‚„|…6‚0†d‡‰ˆŠ|‹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ˆ«’|‡­Y‚0…6‚';€À™‰ˆ*‘^’ƒ‚0’{’|‡‰'‚0‹€6ˆ“ƒ|’}ˆŠ€E|‡‰lvˆ|‚q‡‰‹¢.‚0€@€6‚0…‡‰g€6|‚
W
š*‘›œ‚Œˆ¡3l|ˆdˆ‹@‡‰|šudŠ|›u¢T‚0…6‹0¨¶´¶…6ˆš˜…6‘› · ’|ˆ‚'‹¬€6|‡‰‹'‘^‹@‹@Š|›œ‡‰|š—€6ƒ‘^€¬–*ˆŠX‘^…6‚Š|‹@‡‰|šg‘—™‰ˆ*‘’|‚'’
’|‡‰'‚—€6ƒ‘^€W„|…6‚'¡_‚0…6‹z™_‘^…@š‚0…ŒŠƒ›u¢T‚0…@‹'T‘|’R–*ˆŠ…¡‰…6‡‰‚'|’JŠƒ‹"‚'‹‘}™‰ˆ*‘’|‚'’j’|‡‰'‚n€@]‘`€w‹"€l‘'–‹w›œˆ˜…@‚—‡‰
€6|‚n›œ‡’ƒ’|™‰‚¨À~M€W€6Š…6|‹ŒˆŠ€W€6ƒ‘^€E‡‰X€6|‡‰‹W‹@‚0€@€@‡‰|š|–*ˆŠ°E‡‰°‡‰O€6|‚—™‰ˆ|š{…6Š|
|¢]Š€Eƒˆ˜€S¢d–X›{Š|l
Ÿ 9
ˆk‘ †*‚…l‘š‚u„T‚0…z…6ˆŠ|ƒ’]£¨—±1®‚0…6'‡‰‹"‚ ·”?ƒ‘™™‰‚'|š‚'‹Œ–*ˆŠk€6ˆ”“ƒ|’e€6|‚u¢T‚'‹"€z™‰ˆ*‘’|‚'’
’|‡‰'‚€6ƒ0.12
‘^€q–*ˆŠ°'ˆŠ|™‰’X„.ˆ‹@‹@‡¢ƒ™–”Š|‹@‚z‡‰X€6|‡‰‹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€@‡‰›œ‚'‹'˜q‚ES‘^€À€@ˆ—š˜…l‘;€¬|ˆ|›œ‚'›g¢.‚0…¡_Šƒ|0€@‡‰ˆ|‹¬‘'0‚'‹@‹¬€6ˆ—€6|‚W‡‰€6‚…"§
d
ƒ‘™…6‚0„|…6‚0‹@‚'€6‘^€6‡‰ˆgˆ¡Y‘Œ0™_‘‹@‹'¨ © –d„ƒ‡‰ ‘™d¡_Šƒ|0€@‡‰ˆ|‹1¡_ˆ˜…E|‡‰lg€6|‡‰‹1›”‘`Â*‚'‹1‹@‚'|‹@‚W‘^…6‚s€6|‚s‡‰§3‘|’
ˆŠ€@„ƒŠ€wˆ˜„T‚0…l‘`€6ˆ˜…6‹
‘^ƒ’
¨z~ƒ’|‚'‚0’3]E…6‡€@‡‰|š}ˆŠ€wˆ˜…w…6‚ ‘’|‡‰|šœ‡‰;€6ˆ}€6|‚
operator<<
operator>>
‡‰;€6‚0…6ƒ‘™…6‚0„|…6‚'‹@‚0€l‘^€@‡‰ˆˆ¡‰€6‚'²…@‚'¥dŠ|‡…6‚0‹b‹@ˆ›œ‚{ÂdƒˆoŒ™‚'’|š‚}ˆ¡S€@ƒ‡‹n…6‚0„|…6‚'‹"‚'€l‘`€6‡‰ˆZ€6ƒ‘^€bšˆ‚'‹
¢T‚0–*ˆ|’XEƒ‘^€Sˆ˜€6|‚0…E¡_Š||0€6‡ˆƒ‹S|‚'‚'’
¨
4‚¬'‘|ƒˆ˜€D…6‚ ‘‹"ˆ]‘`¢]™¦–«W…6‡€6‚
‘^ƒ’
‘‹P›œ‚0›g¢T‚…6‹¶ŸMŒ;–n|ˆ˜€ `£^¢ƒŠ€
operator<<
operator>>
q‚q ‘{›”‘^Â*‚¬€6|‚'‹@‚q¡_Š||0€6‡‰ˆ|‹ 50& A'#P(; ˆ¡|€6|‚S0™_‘‹@‹'¨1¾E‹‘w¡‰…6‡‚'|’3;‘Œ¡_Š||0€6‡‰ˆgƒ‘‹¶Š||…@‚'‹"€@…6‡0€6‚'’
‘'0‚'‹@‹s€6ˆb€6|‚E„|…6‡†‘^€6‚w'™‰‘‹@‹s›œ‚'›u¢T‚0…6‹0¨1~M€s‡‰‹s'™‚ ‘^…¬€6ƒ‘^€À€6|‚ 8:9;0 ›gŠƒ‹A€s’|‚''™_‘^…@‚‘n¡_Š|ƒ€6‡‰ˆœ€6ˆ
¢T‚g‡€6‹¡‰…6‡‰‚0ƒ’
3‘|’k|ˆ˜€z€6|‚uˆ˜€6|‚0…«S‘'–e‘^…6ˆŠ||’
T‹@‡‰|'‚g‡€ » ‹€@ƒ‚g'™_‘^‹@‹w€6ƒ‘^€z]‘^‹z€6ˆ”„|…6ˆ˜€6‚'€n‡€@‹
„|…6‡†‘0–*
‘|’J|ˆ˜€w€6|‚b¡_Šƒ|0€@‡‰ˆ
¨ ˆ˜…6›”‘^™‰™–*]‘ 50& "0#P(C(| 8_9*&09;"!# ‡‰‹‘}›œ‚'›u¢T‚0…Œ’|‚'0™_‘^…l‘^€@‡‰ˆ
ˆ¡D€@ƒ‚«¡_ˆ˜…6›
Friend functions.
friend
−
º
© ƒ‡‹S’|‚'0™_‘^…l‘^€@‡‰ˆ”›”‘^Â*‚'‹¬€6|‚…6‚'‹"„T‚00€6‡†*‚¡_Š||0€6‡‰ˆX‘u¡‰…@‡‰‚'|’Xˆ¡3€6|‚z0™_‘‹@‹S‘|’Xš˜…6‘€6‹S‘0'‚'‹@‹q€6ˆ
‘ ™‰™
’ƒ‘^€l‘b›œ‚'›u¢T‚0…@‹'dŒ|‚0€@ƒ‚…W€6|‚0–O‘^…@‚«„ƒŠ¢]™‡‰wˆ˜…E„|…6‡†‘^€6‚¨ ˆ˜…S€6|‚«'™‰‘‹@‹
|q‚z'ˆŠ|™‰’
rational
…6‚0W…6‡€6‚€6|‚
‹"‚'0€6‡‰ˆ°‘‹E¡_ˆ™‰™ˆ`E‹S€6ˆv’ƒ‚0'™_‘^…6‚«‡‰§À‘|’RˆŠ|€"„]Š€Wˆ˜„T‚0…l‘`€6ˆ˜…6‹W€@ˆv¢T‚n¡‰…@‡‰‚'|’|‹
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“ƒ|‡€6‡ˆvˆ¡Y€6|‚'‹"‚Eˆ˜„T‚0…6‘^€6ˆ˜…6‹'q‚W ‘}€6|‚'œ‘^''‚'‹@‹€6|‚WŠƒ›œ‚…l‘^€6ˆ˜…‘|’}’|‚'|ˆ›œ‡‰ƒ‘`§
€6ˆ˜…¶€6…6ˆŠ|š
‘|’
‘‹1q‚SŠ|‹@‚'’v€6ˆz’|ˆ«‡¦€¶‡‰œ¯d‚'€6‡‰ˆ ¨ ¨¨1~¡ƒ„Tˆ‹@‹@‡¦¢]™‚˜¡‰…6‡‰‚'|’{’ƒ‚0'™_‘^…l‘`€6‡‰ˆ|‹
.n
.d
‹@|ˆŠ|™‰’}¢T‚E‘ †*ˆ‡’ƒ‚0’3‹@‡‰|'‚S€6|‚0–}'ˆ›}„|…6ˆ›œ‡‹@‚s‚'| ‘^„ƒ‹@Š|™_‘^€@‡‰ˆ
º;¢ƒŠ€¬‹@ˆ›œ‚€6‡‰›œ‚'‹'˜€@ƒ‚–}‘^…@‚ŒŠ|‹@‚'¡_Š|™
‡‰Oˆ˜…6’|‚0…E€6ˆg‹6‘'†*‚nŠ|||‚''‚'‹"‹6‘^…@–X›œ‚'›g¢.‚0…s¡_Š||0€6‡‰ˆ|‹'¨
4.3.12 Goals
¾q€q€6|‡‰‹q„Tˆ‡‰;€ d–*ˆŠ°‹"ƒˆŠ|™‰’k¨'¨'¨
Dispositional.
£}¢T‚«‘^¢ƒ™‰‚z€@ˆ{‚®d„ƒ™_‘‡‰¤€6|‚z„ƒŠ…@„Tˆ‹@‚zˆ¡1‘u'™_‘‹"‹W‡‰ bº
£œŠ|ƒ’|‚0…@‹"€l‘|’X€6|‚«ƒ‚ ‹A–€6‘0€6‡‰'‘™3‘|’°‹@‚'›”‘;€6‡‰ ‘^™.€6‚0…6›œ‹W‘‹@‹@ˆ'‡_‘^€@‚'’OE‡€6 •'™‰‘‹@‹@‚'‹0
‡‰X„]‘^…@€6‡'Š|™_‘^… 9|0 '{A2T00¼rw'&o  Fe'FeV0'&w50)]#1 "!#
|‘^ƒ’ 0!#
'& )D @!&o º
·*£œŠ|ƒ’|‚0…@‹"€l‘|’X€6|‚z'™_‘‹"‹@‚'‹
ifm::random
‘|’
ifm::loaded_dice
‡‰X’|‚0€l‘^‡‰™¨
~X„]‘^…@€6‡'Š|™_‘^… ;–*ˆŠR‹@|ˆŠƒ™’O¢T‚«‘^¢ƒ™‰‚w€6ˆX¨0¨ ¨
Operational.
Ÿ £œ“ƒ|’¤‹"–;€l‘0€6‡ ‘™.‘^ƒ’¤‹@‚'›”‘^€6‡‰'‘™Y‚0…"…6ˆ˜…6‹q‡‰¤‘—š‡†*‚'¤'™_‘‹"‹s’ƒ‚“]|‡€@‡‰ˆ”‘|’O‡›}„]™‚'›œ‚'€6‘`§
€6‡ˆ3º
Ÿ
£”’|‚'‹"0…6‡¢T‚†‘™‰Š|‚z…6‘|š‚n‘|’O¡_Šƒ|0€@‡‰ˆƒ‘™‰‡€Ž–œˆ¡1‘b€Ž–d„T‚zš‡†*‚'O¢d–O‘g0™_‘‹@‹S’|‚0“ƒƒ‡¦€6‡‰ˆ
º
Ÿ z·*£¤‘^’ƒ’O¡_Š|ƒ€6‡‰ˆƒ‘™‰‡€Ž–}€@ˆ}‘uš‡†*‚'°'™‰‘‹@‹q€6…6ˆŠ|šX›œ‚'›u¢T‚0…q¡_Š||0€6‡‰ˆ|‹'º
Ÿ W;£œW…6‡€6‚‹@‡›}„]™‚Œ'™_‘‹"‹@‚'‹EˆO–*ˆŠ|…WˆoŒ
º
Ÿ
£œqˆ˜…"¤E‡€6O‘|’R‘^…6šŠ|‚«‘^¢TˆŠ€q„ƒ‹@‚'Š|’|ˆ˜…l‘|’|ˆ›pŠ|›g¢T‚…6‹'¨
4.3.13 Exercises
'& !A(|”9n5).8M83MFg238h'Fe'#
"9;"!#/!65—&09;A!#P9;8P#T)YFeV0'&oœ9;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;'xŒV 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¼5—9*#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¶'& &'!&o—M#-.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~›}„ƒ™‰‚'›œ‚0€q‘OˆŠ€@„ƒŠ|€Wˆ˜„T‚0…6‘^€6ˆ˜…S¡_ˆ˜…W€@ƒ‚«'™_‘‹"‹
Clock
¨
Ÿ «·*£
& M@R9œ2
&'!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!)Y2
).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%8—0'&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