Реализовать класс для неправильных дробей - 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);
}
}
}