0% found this document useful (0 votes)
3 views9 pages

Sol4 1

Uploaded by

vijay
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views9 pages

Sol4 1

Uploaded by

vijay
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9



Solution to Exercise 108.


            !#"" !%$&'"   )(*++, -./0'13240 !# ! !#"!5
6+  -7!8" $&:9;!/'   +"!=<3$>9?@!#" A  "3B CEDGF+H + + +!-RQ*S HT+
0 I6J6KML+KONP?K 1 J
" !72U@VW0 '  A!-X" T"@Y7!YZ,Y[$""\9?]!#,YZ) 9;@^`_a0 '  A!-b"
2I I
"TYc:deYZ,YR1O $&:9;!/f /'+Yg-)h6! " "\ij +!-k" `"\9?8'  "'
Tribool I
+!-l",  " Ym"Z  j-,0  " " ,e"n"  1

o
p // Prog : T r i b o o l . C
q // imp , ements three - valued logic
r
s # include < iostream >
tu # include < cassert >

v struct Tribool {
w // INV : value in {0 , 1 , 2}
oyx // 0 = false , 1 = unknown , 2 = true
zo o unsigned int value ;
oyp };
oyq
o{r // PRE : val in {0 , 1 , 2}
oys // POST : return value is a T r i b o o l with the c o r r e s p o n d i n g value
oytu Tribool tribool ( unsigned int val )
o {
oyv assert ( val <= 2);
yo w Tribool result ;
zp x result . value = val ;
Ap o return result ;
pzp }
pzq
p*r // POST : r e t u r n s x AND y
pzs Tribool operator && ( Tribool x , Tribool y )
pztu {
p Tribool result ;
pzv if ( x . value < y . value )
zp w result . value = x . value ;
zq x else
Aq o result . value = y . value ;
qzp return result ;
qzq }
q*r
qzs // POST : r e t u r n s x OR y
qztu Tribool operator || ( Tribool x , Tribool y )
q {
qzv Tribool result ;
zq w if ( x . value > y . value )
r\x result . value = x . value ;
ro else
r\p result . value = y . value ;
r\q return result ;
rzr }
r\s
r\tu // POST : T r i b o o l value is w r i t t e n to std :: cout
r void print ( Tribool x )
r\v {
\r w if ( x . value == 0) std :: cout < < " false ";
szx else if ( x . value == 1) std :: cout < < " unknown " ;
sAo else std :: cout < < " true ";
szp }
szq
s*r int main ()
{
   

szs
zs tu // print 3 x 3 truth table for AND
s for ( int x_val = 0; x_val < 3; ++ x_val ) {
szv Tribool x = tribool ( x_val );
zs w for ( int y_val = 0; y_val < 3; ++ y_val ) {
zt x Tribool y = tribool ( y_val );
At o print ( x && y );
tzp }
tzq std :: cout < < " \ n " ;
t*r }
tzs std :: cout < < " \ n " ;
tztu
t // print 3 x 3 truth table for OR
tzv for ( int x_val = 0; x_val < 3; ++ x_val ) {
tzu w Tribool x = tribool ( x_val );
ux for ( int y_val = 0; y_val < 3; ++ y_val ) {
uo Tribool y = tribool ( y_val );
up print ( x || y );
uq }
ur std :: cout < < " \ n " ;
us }
uztu std :: cout < < " \ n " ;
u
uv
w }
return 0;

Solution to Exercise 109.


5Y7A"X!",e+    !#"" !c jic! ++,5!7"@+!/ 1
unsigned int {0, . . . , 6}
2;--"!7" !k Y8i7--?"5'+, @+!-k"! ?"`  ,"Y7j-,#"j1$j," +0 "!.0 ,-
! !0    +&%  - ji  ,e" "0 !/." ++, T+!- "!j!/n"Z  ," Y7j-,'" ,e"
I
";' Y X"" "5!E" Y7 -" ,e"A+0 "!8  ,"?0 ,-75! / ")(z!-7"   $&'
!'";    !#" + '+,+*)1@ 8 )0 Y7T"' Y 9?] Y8i.+--
unsigned int I 7
"`"hA" ', $&' 9? ,e"A+0 "b"  0 !-7!-,#"  /,6 +!#"   - " i  -85 "G
++, +!- Y7#-," "fYc!  ! -/.   !0 '1 c$&:9;!/k/'+Y - h!  "c"\i#
I I
+!-k" "\9?8' "'  +!-R"@,  @" Ym"  #-,0  "]--" !l+!-lA," +0 "!
Z_7 I
"+1

o
p # include < iostream >
q
r struct Z_7 {
s // INV : value in {0 , 1 , 2 , 3 , 4 , 5 , 6}
tu };
unsigned int value ;

v
w // POST : return value is the sum of a and b
oyx Z_7 operator + ( Z_7 a , Z_7 b )
zo o {
oyp Z_7 result ;
oyq result . value = ( a . value + b . value ) % 7;
o{r return result ;
oys }
oytu
o // POST : return value is the d i f f e r e n c e of a and b
oyv Z_7 operator - ( Z_7 a , Z_7 b )
yo w {
zp x Z_7 result ;
Ap o result . value = (7 + a . value - b . value ) % 7;
return result ;


pzp
pzq }
p*r
pzs int main ()
pztu {
p Z_7 a ;
pzv Z_7 b ;
pzw
qzx // print table for a d d i t i o n
qAo for ( unsigned int a_val = 0; a_val < 7; ++ a_val ) {
qzp for ( unsigned int b_val = 0; b_val < 7; ++ b_val ) {
qzq a . value = a_val ;
q*r b . value = b_val ;
qzs std :: cout < < ( a + b ). value < < " " ;
qztu }
q std :: cout < < " \ n " ;
qzv }
qzw std :: cout < < " \ n " ;
r\x
ro // print table for s u b t r a c t i o n
r\p for ( unsigned int a_val = 0; a_val < 7; ++ a_val ) {
r\q for ( unsigned int b_val = 0; b_val < 7; ++ b_val ) {
rzr a . value = a_val ;
r\s b . value = b_val ;
r\tu std :: cout < < ( a - b ). value < < " " ;
r }
r\v std :: cout < < " \ n " ;
\r w }
szx std :: cout < < " \ n " ;
sAo
szp }
return 0;

?]$&:9;!/Z/'+Y 5"" +Y7 " Y7`" T ,e"!k" 8"


Solution to Exercise 110.
!)d " de 0  '1

o
p // P r o g r a m : r a t i o n a l . C
q // Define and use o p e r a t i o n s on r a t i o n a l n u m b e r s .
r
s # include < iostream >
tu // the new type R a t i o n a l
v struct Rational {
w int n ;
oyx int d ; // INV : d != 0
zo o };
oyp
oyq // POST : return value is the sum of a and b
o{r Rational operator + ( Rational a , Rational b )
oys {
oytu Rational result ;
o result . n = a . n * b . d + a . d * b . n ;
oyv result . d = a . d * b . d ;
yo w return result ;
zp x }
Ap o
pzp // POST : return value is the d i f f e r e n c e of a and b
pzq Rational operator - ( Rational a , Rational b )
p*r {
pzs Rational result ;
pztu result . n = a . n * b . d - a . d * b . n ;
p result . d = a . d * b . d ;
return result ;
   

pzv
zp w }
zq x
Aq o // POST : return value is the p r o d u c t of a and b
qzp Rational operator * ( Rational a , Rational b )
qzq {
q*r Rational result ;
qzs result . n = a . n * b . n ;
qztu result . d = a . d * b . d ;
q return result ;
qzv }
zq w
r\x // POST : return value is the q u o t i e n t of a and b
ro // PRE : b != 0
r\p Rational operator / ( Rational a , Rational b )
r\q {
rzr Rational result ;
r\s result . n = a . n * b . d ;
r\tu result . d = a . d * b . n ;
r return result ;
r\v }
\r w
szx // POST : return value is true if and only if a == b
sAo bool operator == ( Rational a , Rational b )
szp {
szq return a . n * b . d == a . d * b . n ;
s*r }
szs
sztu // POST : return value is true if and only if a != b
s bool operator != ( Rational a , Rational b )
szv {
szw return !( a == b );
tzx }
tAo
tzp // POST : return value is true if and only if a < b
tzq bool operator < ( Rational a , Rational b )
t*r {
tzs // here we have to watch out for signs
tztu if ( a . d > 0 && b . d > 0 || a . d < 0 && b . d < 0)
t // no sign r e v e r s a l in m u l t p l y i n g by a . d and b . d
tzv return a . n * b . d < a . d * b . n ;
tzu w else
ux // sign r e v e r s a l
uo return a . n * b . d > a . d * b . n ;
up }
uq
ur // POST : return value is true if and only if a <= b
us bool operator <= ( Rational a , Rational b )
uztu {
u return a < b || a == b ;
uv }
w
vzx // POST : return value is true if and only if a > b
vAo bool operator > ( Rational a , Rational b )
vzp {
vzq return b < a ;
v*r }
vzs
vztu // POST : return value is true if and only if a >= b
v bool operator >= ( Rational a , Rational b )
vzv {
vzw return a > b || a == b ;
wzx }
wAo
wzp // POST : a has been w r i t t e n to o
 "

wzq
w*r std :: ostream & operator < < ( std :: ostream & o , Rational a )
wzs {
wztu return o < < a . n < < " / " < < a . d ;
w }
wzv
wzw // POST : a has been read from i
oyxzx // PRE : i starts with a r a t i o n a l number of the form " n / d "
oyxAo std :: istream & operator > > ( std :: istream & i , Rational & a )
oyxzp {
oyxzq char c ; // s e p a r a t i n g character , e . g . ’/ ’
oyx*r return i > > a . n > > c > > a . d ;
oyxzs }
oyxztu
oyx int main ()
oyxzv {
oyxzw // input
ozoyx std :: cout < < " Rational number r :\ n " ;
ozozo Rational r ;
ozoyp std :: cin > > r ;
ozoyq
ozo{r std :: cout < < " Rational number s :\ n " ;
ozoys Rational s ;
ozoytu std :: cin > > s ;
ozo
ozoyv // test the o p e r a t i o n s
ozoyw std :: cout < < " Sum is " << r + s << " .\ n " ;
oypzx std :: cout < < " Differenc e is " << r - s << " .\ n " ;
oypAo std :: cout < < " Product is " << r * s << " .\ n " ;
oypzp std :: cout < < " Quotient is " << r / s << " .\ n " ;
oypzq std :: cout < < " r == s ? " << ( r == s ) << " .\ n " ;
oyp*r std :: cout < < " r != s ? " << ( r != s ) << " .\ n " ;
oypzs std :: cout < < " r < s ? " << (r < s) << " .\ n " ;
oypztu std :: cout < < " r <= s ? " << ( r <= s ) << " .\ n " ;
oyp std :: cout < < " r > s ? " << (r > s) << " .\ n " ;
oypzv std :: cout < < " r >= s ? " << ( r >= s ) << " .\ n " ;
oypzw
oyqzx }
return 0;

$j   ,e"!c" de)0    1


Solution to Exercise 111.
"=",e! ,e"=""=!Gi  j,   E9?' ,+" $&:9;!/
Solution to Exercise 112.  operator+
/'+Ym ++,"  G"@0 0 ' -!/f" "`0 +  -A"!0 " !c!k"` Yc+>"5""@/G !M1

o
p # include < iostream >
q
r struct e x t e n d e d _ i n t {
s unsigned int u ; // the a b s o l u t e value
tu };
bool n ; // the sign ( true means n e g a t i v e )

v
w // POST : return value is the sum of a and b
oyx // || a > b || a <= b
zo o // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
oyp // ( a ,+)+( b , + ) | | ( a +b ,+)
oyq // ( a ,+)+( b , -) || ( a -b ,+) || (b -a , -)
o{r // ( a , -)+( b , + ) | | ( a -b , -) || (b -a ,+)
oys // ( a , -)+( b , -) || ( a +b , -)
oytu e x t e n d e d _ i n t operator + ( e x t e n d e d _ i n t a , e x t e n d e d _ i n t b )
o {
e x t e n d e d _ i n t result ;
   

oyv
yo w if ( a . n == b . n ) {
pzx result . u = a . u + b . u ;
pAo result . n = a . n ;
pzp }
pzq else
p*r if ( a . u > b . u ) {
pzs result . u = a . u - b . u ;
pztu result . n = a . n ;
p }
pzv else {
zp w result . u = b . u - a . u ;
zq x result . n = b . n ;
Aq o }
qzp return result ;
qzq }
q*r
qzs // POST : return value is - a
qztu e x t e n d e d _ i n t operator - ( e x t e n d e d _ i n t a )
q {
qzv a.n = !a.n;
zq w return a ;
r\x }
ro
r\p // POST : return value is the d i f f e r e n c e of a and b
r\q e x t e n d e d _ i n t operator - ( e x t e n d e d _ i n t a , e x t e n d e d _ i n t b )
rzr {
r\s return a + ( - b );
r\tu }
r
r\v // POST : return value is the p r o d u c t of a and b
\r w e x t e n d e d _ i n t operator * ( e x t e n d e d _ i n t a , e x t e n d e d _ i n t b )
szx {
sAo e x t e n d e d _ i n t result ;
szp result . u = a . u * b . u ;
szq result . n = ( a . n || b . n ) && !( a . n && b . n ); // XOR
s*r return result ;
szs }
sztu
s // POST : a has been w r i t t e n to o
szv std :: ostream & operator < < ( std :: ostream & o , e x t e n d e d _ i n t a )
szw {
tzx if ( a . n ) o < < " -" ;
tAo return o < < a . u ;
tzp }
tzq
t*r // POST : a has been set to i
tzs void set ( e x t e n d e d _ i n t & a , int i )
tztu {
t if ( i < 0) {
tzv a . u = - i ; a . n = true ;
tzu w } else {
ux a . u = i ; a . n = false ;
uo }
up }
uq
ur // now test it
us int main () {
uztu extended_int x;
u extended_int y;
uv for ( int i = -1; i < 2; ++ i )
w for ( int j = -1; j < 2; ++ j ) {
vzx // set x to i
vAo set ( x , i );
vzp set ( y , j );
std :: cout < < " x = " < < x < < " , y = " < < y < < " \ n " ;


vzq
v*r std :: cout < < " x + y = " < < x + y < < " \ n " ;
vzs std :: cout < < " x - y = " < < x - y < < " \ n " ;
vztu std :: cout < < " x * y = " < < x * y < < " \ n " ;
v }
vzv }
return 0;

 "@,,  "`$&:9;!/  ' " 0 ,e" <


Solution to
 d+0Exercise "Yc"0113. 

Y7'" !
$  "+!--k0 !# A!

  %" " 6`$ Yc"0 #,+" %$&'" "\9? 6Y7 "  1
2  
* ($ $ * ($ $ *
 * ($
I
I

(S,E)
* ( $ *
I
I
($ $ *
I
0 * (  $ * ( $ * ( $ $ *
I I I
- * ($ $ * ($ $ *
I I (S,E)
 * ($ $ * ($ $ *
$*
(S,P)
(  * ($ $ *  I I
( $ *
I I I
2  A".Yc"0ac!-0 " -a! -M1 ?cY8 Z"". *    n" ,  * 0+*c  
+Yf/,, ,j- *%    "  ,e *%   "Z2),$ *%+Yf6/,, 1
I

Solution to Exercise 114.


o
p // Prog : g e o m e t r y . C
q // d e f i n e s basic 3 d g e o m e t r y o p e r a t i o n s on points ( rotations ,
r // p r o j e c t i o n s ) , and uses them to rotate a cube
s
tu # include < IFM / window >
# include < iostream >
v # include < cmath >
w
oyx // 2 d points
zo o // - - - - - - - - -
oyp struct point2 {
oyq double x ;
o{r double y ;
oys };
oytu
o // 3 d points
oyv // - - - - - - - - -
yo w struct point3 {
zp x double x ;
Ap o double y ;
pzp double z ;
pzq };
p*r
pzs // r o t a t i o n s
pztu // - - - - - - - - -
p // POST : return value is p r o t a t e d around the x - axis by alpha ( r a d i a n s )
pzv point3 rotate_x ( point3 p , double alpha )
zp w {
zq x point3 r ;
Aq o double cosa =
double sina =
std :: cos ( alpha );
std :: sin ( alpha );
  

qzp
zq q r.x = p.x;
q*r r . y = cosa * p . y - sina * p . z ;
zq s r . z = sina * p . y + cosa * p . z ;
zq tu return r ;
q }
qzv
zq w // POST : return value is p r o t a t e d around the y - axis by alpha ( r a d i a n s )
r\x point3 rotate_y ( point3 p , double alpha )
ro {
r\p point3 r ;
r\q double cosa = std :: cos ( alpha );
rzr double sina = std :: sin ( alpha );
r\s r . x = sina * p . z + cosa * p . x ;
r\tu r.y = p.y;
r r . z = cosa * p . z - sina * p . x ;
r\v return r ;
\r w }
szx
sAo // POST : return value is p r o t a t e d around the z - axis by alpha ( r a d i a n s )
szp point3 rotate_z ( point3 p , double alpha )
szq {
s*r point3 r ;
szs double cosa = std :: cos ( alpha );
sztu double sina = std :: sin ( alpha );
s r . x = cosa * p . x - sina * p . y ;
szv r . y = sina * p . x + cosa * p . y ;
szw r.z = p.z;
tzx return r ;
tAo }
tzp
tzq // p r o j e c t i o n
t*r // - - - - - - - - - -
tzs // PRE : v . z != p . z
tztu // POST : return value is p r o j e c t i o n of p onto the plane z = 0 ,
t // with r e s p e c t to view point v
tzv point2 project ( point3 p , point3 v )
tzu w {
ux double t = p . z / ( v . z - p . z );
uo point2 r ;
up r . x = p . x - t * ( v . x - p . x );
uq r . y = p . y - t * ( v . y - p . y );
ur return r ;
us }
uztu
u // line d r a w i n g
uv // - - - - - - - - - - - -
w // POST : draws a line from the p r o j e c t i o n of p to the p r o j e c t i o n
vzx // of q with r e s p e c t to v i e w p o i n t v , and with offset o
vAo void draw_line ( ifm :: Wstream w , point3 p , point3 q , point3 v , point2 o )
vzp {
vzq point2 p2 = project ( p , v );
v*r point2 q2 = project ( q , v );
vzs w < < ifm :: Line
vztu ( int ( p2 . x + o . x ) , int ( p2 . y + o . y ) , int ( q2 . x + o . x ) , int ( q2 . y + o . y ));
v }
vzv
vzw int main ()
wzx {
wAo // c o n s t r u c t a cube
wzp point3 cube [8];
wzq int size = 200;
w*r int i = 0;
wzs for ( double x = - size /2; x <= size /2; x += size )
wzt for ( double y = - size /2; y <= size /2; y += size )
for ( double z = - size /2; z <= size /2; z += size ) {


u
w
wzv cube [ i ]. x = x ;
zw w cube [ i ]. y = y ;
oyxzx cube [ i ]. z = z ;
oyxAo ++ i ;
oyxzp }
oyxzq
oyx*r // open window
oyxzs ifm :: Wstream w ( " Rotate cube : press x , y , z or q to quit " );
oyxztu
oyx // d r a w i n g loop
oyxzv double alpha = 0.1; // r o t a t i o n angle
oyxzw point3 v ; // v i e w p o i n t
ozoyx v . x = 200;
ozozo v . y = 200;
ozoyp v . z = 1000;
ozoyq point2 o ; // offset
ozo{r o . x = 250;
ozoys o . y = 250;
ozoytu for (;;) {
ozo // draw all the 12 dube edges
ozoyv w . clear ();
ozoyw draw_line ( w , cube [0] , cube [1] , v , o );
oypzx draw_line ( w , cube [0] , cube [2] , v , o );
oypAo draw_line ( w , cube [0] , cube [4] , v , o );
oypzp draw_line ( w , cube [1] , cube [3] , v , o );
oypzq draw_line ( w , cube [1] , cube [5] , v , o );
oyp*r draw_line ( w , cube [2] , cube [3] , v , o );
oypzs draw_line ( w , cube [2] , cube [6] , v , o );
oypztu draw_line ( w , cube [3] , cube [7] , v , o );
oyp draw_line ( w , cube [4] , cube [5] , v , o );
oypzv draw_line ( w , cube [4] , cube [6] , v , o );
oypzw draw_line ( w , cube [5] , cube [7] , v , o );
oyqzx draw_line ( w , cube [6] , cube [7] , v , o );
oyqAo w < < ifm :: flush ;
oyqzp
oyqzq // wait for k e y s t r o k e
oyq*r int key = w . get_key ();
oyqzs // we assume ASCII e n c o d i n g
oyqztu switch ( key ) {
oyq case ’x ’:
oyqzv for ( int i =0; i <8; ++ i )
oyqzw cube [ i ] = rotate_x ( cube [ i ] , alpha );
o{r\x break ;
o{r o case ’y ’:
o{r\p for ( int i =0; i <8; ++ i )
o{r\q cube [ i ] = rotate_y ( cube [ i ] , alpha );
o{rzr break ;
o{r\s case ’z ’:
o{r\tu for ( int i =0; i <8; ++ i )
o{r cube [ i ] = rotate_z ( cube [ i ] , alpha );
o{r\v break ;
o{r\w case ’q ’:
oyszx return 0;
oysAo break ;
oyszp default :
oyszq break ; // do n o t h i n g
oys*r }
oyszs }
oysztu
oys return 0;
oyszv }

You might also like