Сделать класс фракции в C#

Класс Fraction представляет рациональные числа с использованием дробей, по крайней мере, до тех пор, пока числители и демониторы не станут слишком большими. Класс Fraction использует следующий код, большинство из которых просты.

class Fraction
{
    public long Numerator, Denominator;

        public Fraction(string txt)
    {
        string[] pieces = txt.Split('/');
        Numerator = long.Parse(pieces[0]);
        Denominator = long.Parse(pieces[1]);
        Simplify();
    }

        public Fraction(long numer, long denom)
    {
        Numerator = numer;
        Denominator = denom;
        Simplify();
    }

        public static Fraction operator *(Fraction a, Fraction b)
    {
                Fraction result1 = new Fraction(a.Numerator, b.Denominator);
        Fraction result2 = new Fraction(b.Numerator, a.Denominator);

        return new Fraction(
            result1.Numerator * result2.Numerator,
            result1.Denominator * result2.Denominator);
    }

        public static Fraction operator -(Fraction a)
    {
        return new Fraction(-a.Numerator, a.Denominator);
    }

        public static Fraction operator +(Fraction a, Fraction b)
    {
                long gcd_ab = MathStuff.GCD(a.Denominator, b.Denominator);

        long numer =
            a.Numerator * (b.Denominator / gcd_ab) +
            b.Numerator * (a.Denominator / gcd_ab);
        long denom =
            a.Denominator * (b.Denominator / gcd_ab);
        return new Fraction(numer, denom);
    }

        public static Fraction operator -(Fraction a, Fraction b)
    {
        return a + -b;
    }

        public static Fraction operator /(Fraction a, Fraction b)
    {
        return a * new Fraction(b.Denominator, b.Numerator);
    }

        private void Simplify()
    {
                if (Denominator < 0)
        {
            Numerator = -Numerator;
            Denominator = -Denominator;
        }

                        long gcd_ab = MathStuff.GCD(Numerator, Denominator);
        Numerator = Numerator / gcd_ab;
        Denominator = Denominator / gcd_ab;
    }

        public static implicit operator double(Fraction a)
    {
        return (double)a.Numerator / a.Denominator;
    }

        public override string ToString()
    {
        return Numerator.ToString() + "/" + Denominator.ToString();
    }
}

Метод Simplify делит наибольший общий делитель (GCD) с числителем и знаменателем. Описание функции GCD см. В примере Вычислите наибольший общий делитель (GCD) и наименьшее общее число (LCM) двух целых чисел в C# .

Класс Fraction является таким же упражнением при перегрузке оператора, как и все остальное. Оператор double преобразует дробь в двойную. Он объявлен неявным, поэтому вам не нужно использовать оператор трансляции для преобразования.

Источник: http://csharphelper.com/blog/2015/06/make-a-fraction-class-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector