#include <iostream>
#include <string>
#include "rational.h"

using namespace std;

Drobi::Drobi()
{
	chisl = 1;
	znam = 1;
    str = new char[50];
    strcpy(str,"Строка инициализирована");    //инициализация строки по умолчанию
}

Drobi::Drobi(int a,int b)
{
	chisl = a;
	if(b == 0)
		cout << "ошибка: введите отличный от нуля знаменатель" << endl;
	else
		znam = b;

	str = new char[50];
	strcpy(str,"Строка инициализирована");
}

Drobi::Drobi(Drobi& a)
{
	chisl = a.chisl;
	znam = a.znam;
	str = new char[strlen(a.str)+1];
	strcpy(str,a.str);
}

/// нахождение наибольшего общего делителя рекурсивным алгоритмом Эвклида
int Drobi::GCD(int a,int b)
{
    if(a < 0) a = -a;
    if(b < 0) a = -b;

    if((a == 1) || (b == 1))
		return 1;
    else if ((a == 0) || (b == 0))
        return a + b;
	else if (a == b)
		return a;
	else if(a > b)
		return GCD(b,a-b);
	else 
		return GCD(a,b-a);
}

void Drobi::Norm()
{
	int t = GCD(chisl,znam);
    chisl = chisl / t;
	znam = znam / t;

}

Drobi Drobi::Sum(Drobi a)
{
	Drobi c;
	c.chisl = chisl * a.znam + znam * a.chisl;
	c.znam = znam * a.znam;
	
	c.Norm();

	return c;
}

Drobi Drobi::Dif(Drobi a)
{
	Drobi c;
	c.chisl = chisl * a.znam - znam * a.chisl;
	c.znam = znam * a.znam;
	
	c.Norm();

	return c;
}

Drobi Drobi::Mult(Drobi a)
{
	Drobi c;
	c.chisl = chisl * a.chisl;
	c.znam = znam * a.znam;
	
	c.Norm();

	return c;
}

Drobi Drobi::Div(Drobi a)
{
	Drobi c;
	c.chisl = chisl * a.znam;
	c.znam = znam * a.chisl;
	
	c.Norm();

	return c;
}

void Drobi::PrintNumber()
{
    if (GCD(chisl,znam) == znam)
        cout << chisl / znam << endl;
    else
        cout << chisl << "/" << znam << endl;
}

int Drobi::getChisl()
{
    return chisl;
}

char* Drobi::getStr()
{
    return str;
}

void Drobi::setStr(const char* a)
{
    str = new char[strlen(a)+1];       //распределение памяти при инициализации строки параметром
    strcpy(str,a);
}

Drobi Drobi::operator +(Drobi a)
{
	Drobi c;
	c.chisl = chisl * a.znam + znam * a.chisl;
	c.znam = znam * a.znam;
	
	c.Norm();

	return c;
}

Drobi operator -(Drobi a, Drobi b)
{
	Drobi c;
	c.chisl = a.chisl * b.znam - a.znam * b.chisl;
	c.znam = a.znam * b.znam;
	
	c.Norm();

	return c;
}

Drobi Drobi::operator ++()
{
	chisl = chisl + znam;

	return (*this);
}

Drobi Drobi::operator ++(int k)
{
	Drobi c(*this);
	chisl = chisl + znam;

	return c;
}

int Drobi::printNum()
{
	int i = strlen(str);
	
	return i;
}

Drobi::~Drobi()
{
    delete [] str;          //освобождение памяти, используемой строкой str
}