///////////////////// 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)
}
