///////////////////// fraction.h //////////////////////////////
// include guard see: http://e...content-available-to-author-only...a.org/wiki/Include_guard
#ifndef FRACTION_H_INCLUDED_
#define FRACTION_H_INCLUDED_
#include <iosfwd> // forward declaration of std::ostream
struct fraction
{
fraction( int numerator = 1, int denominator = 1 ) ;
fraction( double v ) ;
static const fraction zero ;
static const fraction one ;
static int precision() ;
// ...
private:
int num ;
int den ;
void normalize() ;
friend std::ostream& operator<< ( std::ostream& stm, const fraction& f ) ;
};
#endif // FRACTION_H_INCLUDED_
///////////////////// fraction.cpp //////////////////////////////
//#include "fraction.h"
#include <iostream>
const fraction fraction::zero(0,1) ;
const fraction fraction::one(1,1) ;
int fraction::precision() { return 1000000 ; }
static unsigned int hcf( unsigned int a, unsigned int b )
{
if( b == 0 ) return a ;
else return hcf( b, a%b ) ;
}
static int make_pos( int a ) { return a<0 ? -a : +a ; }
void fraction::normalize()
{
bool positive = ( num >= 0 ) == ( den >= 0 ) ;
num = make_pos(num) ;
den = make_pos(den) ;
int h = hcf(num,den) ;
if( h == 0 ) h = 1 ;
num /= h ;
den /= h ;
if( !positive ) num = -num ;
}
fraction::fraction( int numerator, int denominator )
: num(numerator), den(denominator) { normalize() ; }
fraction::fraction( double d ) : den( precision() )
{ num = int( d * precision() ) ; normalize() ; }
std::ostream& operator<< ( std::ostream& stm, const fraction& f )
{
if( f.num < 0 ) stm << '-' ;
return stm << '(' << make_pos(f.num) << '/' << f.den << ')' ;
}
///////////////////// fraction.cpp //////////////////////////////
//#include "fraction.h"
#include <iostream>
int main()
{
fraction a( 24, 36 ) ; std::cout << a << '\n' ; // (2/3)
fraction b( -24, -36 ) ; std::cout << b << '\n' ; // (2/3)
fraction c( 24, -36 ) ; std::cout << c << '\n' ; // -(2/3)
fraction d( -24, 36 ) ; std::cout << d << '\n' ; // -(2/3)
fraction e( -24, -36 ) ; std::cout << e << '\n' ; // (2/3)
fraction f( 0, -36 ) ; std::cout << f << '\n' ; // (0/1)
fraction g( 36, 0 ) ; std::cout << g << '\n' ; // (1/0)
fraction h( 0, 0 ) ; std::cout << h << '\n' ; // (0/0)
fraction i( 1.25 ) ; std::cout << i << '\n' ; // (5/4)
fraction j( -1.25 ) ; std::cout << j << '\n' ; // -(5/4)
fraction k( 1.252868 ) ; std::cout << k << '\n' ; // (313217/250000)
fraction l( 1.2500009999 ) ; std::cout << l << '\n' ; // (5/4)
}