// File Rational.h
// Definition of a Rational number class

#include<iostream>

class Rational
{
public: // Member functions

    // Default constructor
    Rational();

    // Default constructor with arguments
    Rational (int, int);

    // Default constructor with single integer argument
    // Rational (int);
    // ** Lab 10

    // Set a value
    void set_value (int, int);

    // Return numerator 
    int numer ( ) const;

    // Return denominator 
    int denom ( ) const;

    // Display a rational number
    void display_rat ( ) const;

    // Get a rational number
    void get_rat ( );

    // Add with a rational number
    Rational add_rat (Rational) const;

    // sub_rat, mul_rat, div_rat
    // ** Lab 10

    // Friends (PP 585-590)

    // Returns the sum of two rational numbers
    //** Example of operator overloading
    friend Rational operator + (Rational, Rational);

    // -, *, /, ==, >, >=, <, <=
    // ** Lab 10

private:

    // Data members (attibutes)

    int num;
    int den;

    // Private member functions

    // Returns the gcd two integers
    int gcd (int, int);

};

//===========================================

// File Rational.cpp
// Implementation of the Rational number class

// #include "Rational.h"
// #include<iostream>
// Using namespace std;

// Member functions

// Default constructor
Rational::Rational ()
{
    num = 0;
    den = 1;
}

// Default constructor with arguments
Rational::Rational (int a, int b)
{    
     int g = gcd(a, b);
     num = a/g;
     den = b/g;
}

// Default constructor with single integer argument
// Rational (int);
// ** Lab 10

// Set a value
void Rational::set_value (int a, int b)
{  
     int g = gcd(a, b); 
     num = a/g;
     den = b/g;
}

// Return numerator 
int Rational::numer ( ) const
{
     return den;
}

// Return denominator 
int Rational::denom ( ) const
{
     return num;
}


// Display a rational number
void Rational::display_rat ( ) const
{
    std::cout << num << " / " << den;
}

// Get a rational number
void Rational::get_rat ( )
{
    // stub
    // ** Lab 10
    set_value(0,1);
}

// Add with a rational number
Rational Rational::add_rat (Rational rat2) const
{
    int num2 = rat2.numer(), den2 = rat2.denom();
    Rational addRat (num * den2 + num2 * den, den * den2);
    return addRat;
}

// sub_rat, mul_rat, div_rat
// ** Lab 10

// Returns the sum of two rational numbers
Rational operator + (Rational rat1, Rational rat2)
{
    return rat1.add_rat(rat2);
}

// -, *, /, ==, >, >=, <, <=
// ** Lab 10

// Returns the gcd of two integers
int Rational::gcd (int a, int b)
{
    // stub
    // ** Lab 10
    return 1;
}


//===========================================

// File: testrat.cpp
// Tests the Rational number class
// ** Lab 10: Test all member functions and friends
// Driver program to test add_rat and operator +

// #include "Rational.h"
// #include<iostream>
// using namespace std;

int main ( )
{

    Rational rat1(1,2), rat2(3,5);
    Rational rat;

    rat = rat1.add_rat(rat2);

    std::cout << "\n\n";   
    rat.display_rat ();
    std::cout << "\n\n";

    rat = rat1 + rat2;

    std::cout << "\n\n";   
    rat.display_rat ();
    std::cout << "\n\n";


    return 0;
} // end main



