Реализация абстрактных типов данных с помощью классов С++, страница 3

        else if(f1.znak == true && f2.znak == true)

            return TFrac(-(f1.chislitel + f2.chislitel), f1.znamenatel);

        else if(f1.znak == false && f2.znak == true)

            if(f1.chislitel < f2.chislitel)

                return TFrac(-(f1.chislitel - f2.chislitel),f2.znamenatel);

            else return TFrac(f1.chislitel - f2.chislitel, f1.znamenatel);

        else

                //f1.znak == true && f2.znak == false

            if(f1.chislitel < f2.chislitel)

                return TFrac(f1.chislitel - f2.chislitel, f1.znamenatel);

            else return TFrac(-(f1.chislitel - f2.chislitel), f1.znamenatel);

    }

        //Иначе

    else

    {

        //Приводим дроби к общему знаменателю и проводим выше описанныедействия

        if(f1.znak == false && f2.znak == false)

            return TFrac((f1.chislitel * f2.znamenatel) + (f2.chislitel * f1.znamenatel), (f1.znamenatel * f2.znamenatel));

        else if(f1.znak == true && f2.znak == true)

            return TFrac(-((f1.chislitel * f2.znamenatel) + (f2.chislitel * f1.znamenatel)), (f1.znamenatel * f2.znamenatel));

        else if(f1.znak == false && f2.znak == true)

            if((f1.chislitel * f2.znamenatel) < (f2.chislitel * f1.znamenatel))

                return TFrac(-((f1.chislitel * f2.znamenatel) - (f2.chislitel * f1.znamenatel)), f1.znamenatel * f2.znamenatel);

            else return TFrac((f1.chislitel * f2.znamenatel) - (f2.chislitel * f1.znamenatel), f1.znamenatel * f2.znamenatel);

        else

                //f1.znak == true && f2.znak == false

            if((f1.chislitel * f2.znamenatel) < (f2.chislitel * f1.znamenatel))

                return TFrac(-((f1.chislitel * f2.znamenatel) - (f2.chislitel * f1.znamenatel)), f1.znamenatel * f2.znamenatel);

            else return TFrac((f1.chislitel * f2.znamenatel) - (f2.chislitel * f1.znamenatel), f1.znamenatel * f2.znamenatel);

    }

}

    //Перегрузка оператора умножения

TFrac operator *(const TFrac &f1, const TFrac &f2)

{

    if((f1.znak == true && f2.znak == true) || (f1.znak == false && f2.znak == false))

        return TFrac(f1.chislitel * f2.chislitel, f1.znamenatel * f2.znamenatel);

    else return TFrac(-(f1.chislitel * f2.chislitel), f1.znamenatel * f2.znamenatel);

}

    //Перегрузка оператора вычитания

TFrac operator -(const TFrac &f1, const TFrac &f2)

{

        //Если знаменатели дробей равны

    if(f1.znamenatel == f2.znamenatel)

    {

            //Обе дроби положительные

        if(f1.znak == false && f2.znak == false)

            return TFrac(f1.chislitel - f2.chislitel, f1.znamenatel);

            //Вторая дробь отрицательная

        else if(f1.znak == false && f2.znak == true)

            return TFrac(f1.chislitel + f2.chislitel, f1.znamenatel);

            //Первая дробь отрицательная

        else if(f1.znak == true && f2.znak == false)

            return TFrac(f1.chislitel + f2.chislitel, f1.znamenatel);

            //Обе дроби отрицательные

        else

            return TFrac(-(f1.chislitel - f2.chislitel), f1.znamenatel);

    }

        //Иначе

    else

    {

            //Обе дроби положительные

        if(f1.znak == false && f2.znak == false)

            return TFrac((f1.chislitel * f2.znamenatel) - (f2.chislitel * f1.znamenatel), f1.znamenatel * f2.znamenatel);

            //Вторая дробь отрицательная

        else if(f1.znak == false && f2.znak == true)

            return TFrac((f1.chislitel * f2.znamenatel) + (f2.chislitel * f1.znamenatel), f1.znamenatel * f2.znamenatel);

            //Первая дробь отрицательная

        else if(f1.znak == true && f2.znak == false)

            return TFrac(-((f1.chislitel * f2.znamenatel) + (f2.chislitel * f1.znamenatel)), f1.znamenatel * f2.znamenatel);

            //Обе дроби отрицательные

        else return TFrac(-((f1.chislitel * f2.znamenatel) - (f2.chislitel * f1.znamenatel)), f1.znamenatel * f2.znamenatel);

    }

}

    //Перегрузка оператора деления

TFrac operator /(const TFrac &f1, const TFrac &f2)

{

    if((f1.znak == true && f2.znak == false) || (f1.znak == false && f2.znak == true))

        return TFrac(-(f1.chislitel * f2.znamenatel), f1.znamenatel * f2.chislitel);

    else

    {

        if(f1.znak == true)

            return TFrac((f1.chislitel * f2.znamenatel),(f1.znamenatel * f2.chislitel));

        else return TFrac(-(f1.chislitel * f2.znamenatel),(f1.znamenatel * f2.chislitel));

    }

}

    //Возведения в квадрат

TFrac TFrac::Square()

{

    return TFrac((this->chislitel * this->chislitel), (this->znamenatel * this->znamenatel));

}

    //Возвращает дробь обратную данной

TFrac TFrac::Inverse()

{

    if(this->znak == true)

        return TFrac(-(this->znamenatel), this->chislitel);

    else return TFrac(this->znamenatel, this->chislitel);

}

    //Меняет знак дроби

TFrac TFrac::Minus()

{

    if(this->znak == true)

        return TFrac(this->chislitel, this->znamenatel);

    else return TFrac(-(this->chislitel), this->znamenatel);

}

    //Перегрузка оператора сравнения

bool operator ==(const TFrac &f1, const TFrac &f2)

{

    if((f1.znak == f2.znak) & (f1.chislitel == f2.chislitel) & (f1.znamenatel == f2.znamenatel))

        return true;

    else return false;

}

    //Перегрузка оператора "Больше"

bool operator >(const TFrac &f1, const TFrac &f2)

{

        //Обе дроби положительные

    if(f1.znak == false && f2.znak == false)

    {

            //Если знаменатели равны

        if(f1.znamenatel == f2.znamenatel)