Реализовать класс для неправильных дробей - C#

Узнай цену своей работы

Формулировка задачи:

Реализовать класс для неправильных дробей. В этом классе реализовать интерфейс, содержащий методы для выполнения следующих операций: 1) сложение; 2) вычитание; 3) сокращение дроби.

Решение задачи: «Реализовать класс для неправильных дробей»

textual
Листинг программы
using System;
 
namespace Space
{
    class Program
    {
        static void Main(string[] args)
        {
            IrregularFraction a = new IrregularFraction(-8, 5);
            IrregularFraction b = new IrregularFraction(7, 3);
            Console.WriteLine(a.ToString());
            Console.WriteLine(b.ToString());
 
            IrregularFraction d = a.Sub(b);
            Console.WriteLine(d.ToString());
            Console.WriteLine(d.Reduce());
            Console.ReadLine();
        }
    }
 
    interface IIrregularFraction
    {
        IrregularFraction Sum(IrregularFraction a);
        IrregularFraction Sub(IrregularFraction b);
        int Reduce();
    }
 
    class IrregularFraction : IIrregularFraction
    {
        public int Numerator { get; private set; }
        public int Denominator { get; private set; }
 
        public IrregularFraction(int num, int denum)
        {
            if (num != 0 && denum != 0 && Math.Abs(num) >= Math.Abs(denum)) 
            {
                Numerator = num * denum < 0 ? -Math.Abs(num) : num;
                Denominator = Math.Abs(denum);
            }
            else
            {
                Console.WriteLine("Дробь не является неправильной. Взяты значения по умолчанию.");
                Numerator = 1;
                Denominator = 1;
            }
        }
 
        public IrregularFraction Sum(IrregularFraction a)
        {
            if (Denominator == a.Denominator)
                return new IrregularFraction(Numerator + a.Numerator, Denominator);
            int newDenum = NOD(Denominator, a.Denominator);
            int newNum = Numerator * newDenum / Denominator + a.Numerator * newDenum / a.Denominator;
            return new IrregularFraction(newNum, newDenum);
        }
 
        public IrregularFraction Sub(IrregularFraction a)
        {
            if (Denominator == a.Denominator)
                return new IrregularFraction(Numerator - a.Numerator, Denominator);
            int newDenum = NOD(Denominator, a.Denominator);
            int newNum = Numerator * newDenum / Denominator - a.Numerator * newDenum / a.Denominator;
            return new IrregularFraction(newNum, newDenum);
        }
 
        public int Reduce()
        {
            int iPart = Numerator / Denominator;
            Numerator = Numerator % Denominator;
            Console.WriteLine("{0}{1}{2}/{3}", iPart, Numerator >= 0 ? "+" : "", Numerator, Denominator);
            return iPart;
        }
 
        // В конкретно этой задаче НОД находится для знаменателей.
        // Поэтому этот метод работает только для положительных чисел, т.к. знаменатель всегда положительный.
        // В цикле не учитываются значения заменателя, равные нулю, ибо такие знаменатели отсеиваются при создании новой дроби.
        int NOD(int a, int b)
        {
            if (a == 1 || b == 1)
                return 1;
            for (int i = 2; i < a * b; i++)
                if (i % a == 0 && i % b == 0)
                    return i;
            return a * b;
        }
 
        public override string ToString()
        {
            return String.Format("{0}/{1}", Numerator, Denominator);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы