Sol4 1
Sol4 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;
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;
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;
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;
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 }