#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)  // проверка на 0
		cout << "ошибка: введите отличный от нуля знаменатель" << endl;
	else
		znam = b;

	str = new char[50];
	strcpy(str,"Konsrurctor c parametrami");
}

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];       //распределение памяти при инициализации строки параметром //+1 - остаток на 0 байт
    strcpy(str,a);
}

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