Загрузка данных


1 вариант
using System;

class Value : IComparable<Value>
{
    public long Whole { get; private set; }
    public ushort Fraction { get; private set; }

    public Value(long whole, ushort fraction)
    {
        Whole = whole;
        Fraction = fraction;
        Normalize();
    }

    private double ToDouble()
    {
        double frac = Fraction / 1000.0;
        return Whole < 0 ? Whole - frac : Whole + frac;
    }

    private static Value FromDouble(double number)
    {
        long whole = (long)Math.Truncate(number);
        ushort fraction = (ushort)Math.Round(Math.Abs(number - whole) * 1000);
        return new Value(whole, fraction);
    }

    private void Normalize()
    {
        if (Fraction >= 1000)
        {
            Whole += Fraction / 1000;
            Fraction %= 1000;
        }
    }

    public static Value operator +(Value a, Value b)
        => FromDouble(a.ToDouble() + b.ToDouble());

    public static Value operator -(Value a, Value b)
        => FromDouble(a.ToDouble() - b.ToDouble());

    public static Value operator *(Value a, Value b)
        => FromDouble(a.ToDouble() * b.ToDouble());

    public int CompareTo(Value other)
        => ToDouble().CompareTo(other.ToDouble());

    public static bool operator >(Value a, Value b) => a.CompareTo(b) > 0;
    public static bool operator <(Value a, Value b) => a.CompareTo(b) < 0;
    public static bool operator ==(Value a, Value b) => a.ToDouble() == b.ToDouble();
    public static bool operator !=(Value a, Value b) => !(a == b);

    public override bool Equals(object obj)
        => obj is Value v && this == v;

    public override int GetHashCode()
        => ToDouble().GetHashCode();

    public override string ToString()
        => $"{Whole},{Fraction:D3}";
}

abstract class Triangle
{
    protected double a;
    protected double b;
    protected double angle;

    public Triangle(double a, double b, double angle)
    {
        this.a = a;
        this.b = b;
        this.angle = angle;
    }

    public abstract double Area();
    public abstract double Perimeter();

    protected double ThirdSide()
    {
        double rad = angle * Math.PI / 180;
        return Math.Sqrt(a * a + b * b - 2 * a * b * Math.Cos(rad));
    }
}

class RightTriangle : Triangle
{
    public RightTriangle(double a, double b) : base(a, b, 90) { }

    public override double Area() => a * b / 2;

    public override double Perimeter()
        => a + b + Math.Sqrt(a * a + b * b);
}

class IsoscelesTriangle : Triangle
{
    public IsoscelesTriangle(double side, double baseSide, double angle)
        : base(side, baseSide, angle) { }

    public override double Area()
    {
        double rad = angle * Math.PI / 180;
        return a * b * Math.Sin(rad) / 2;
    }

    public override double Perimeter()
        => a + b + ThirdSide();
}

class EquilateralTriangle : Triangle
{
    public EquilateralTriangle(double side) : base(side, side, 60) { }

    public override double Area()
        => Math.Sqrt(3) * a * a / 4;

    public override double Perimeter()
        => 3 * a;
}

class Program
{
    static void Main()
    {
        Value x = new Value(5, 250);
        Value y = new Value(2, 500);

        Console.WriteLine($"x = {x}");
        Console.WriteLine($"y = {y}");
        Console.WriteLine($"x + y = {x + y}");
        Console.WriteLine($"x - y = {x - y}");
        Console.WriteLine($"x * y = {x * y}");
        Console.WriteLine($"x > y: {x > y}");

        Triangle t1 = new RightTriangle(3, 4);
        Triangle t2 = new IsoscelesTriangle(5, 5, 60);
        Triangle t3 = new EquilateralTriangle(6);

        Console.WriteLine($"Прямоугольный: S = {t1.Area()}, P = {t1.Perimeter()}");
        Console.WriteLine($"Равнобедренный: S = {t2.Area()}, P = {t2.Perimeter()}");
        Console.WriteLine($"Равносторонний: S = {t3.Area()}, P = {t3.Perimeter()}");
    }
}


2 вариант

using System;

class Money : IComparable<Money>
{
    public long Rubles { get; private set; }
    public byte Kopecks { get; private set; }

    public Money(long rubles, byte kopecks)
    {
        Rubles = rubles;
        Kopecks = kopecks;
        Normalize();
    }

    private void Normalize()
    {
        if (Kopecks >= 100)
        {
            Rubles += Kopecks / 100;
            Kopecks = (byte)(Kopecks % 100);
        }
    }

    private double ToDouble()
    {
        return Rubles + Kopecks / 100.0;
    }

    private static Money FromDouble(double value)
    {
        long rubles = (long)Math.Truncate(value);
        byte kopecks = (byte)Math.Round(Math.Abs(value - rubles) * 100);
        return new Money(rubles, kopecks);
    }

    public static Money operator +(Money a, Money b)
        => FromDouble(a.ToDouble() + b.ToDouble());

    public static Money operator -(Money a, Money b)
        => FromDouble(a.ToDouble() - b.ToDouble());

    public static Money operator /(Money a, Money b)
        => FromDouble(a.ToDouble() / b.ToDouble());

    public static Money operator /(Money a, double number)
        => FromDouble(a.ToDouble() / number);

    public static Money operator *(Money a, double number)
        => FromDouble(a.ToDouble() * number);

    public int CompareTo(Money other)
        => ToDouble().CompareTo(other.ToDouble());

    public static bool operator >(Money a, Money b) => a.CompareTo(b) > 0;
    public static bool operator <(Money a, Money b) => a.CompareTo(b) < 0;
    public static bool operator ==(Money a, Money b) => a.ToDouble() == b.ToDouble();
    public static bool operator !=(Money a, Money b) => !(a == b);

    public override bool Equals(object obj)
        => obj is Money m && this == m;

    public override int GetHashCode()
        => ToDouble().GetHashCode();

    public override string ToString()
        => $"{Rubles},{Kopecks:D2}";
}

abstract class Payment
{
    public abstract void CalculateRoots();
    public abstract void PrintResult();
}

class Linear : Payment
{
    private double a, b;
    private double root;
    private bool hasRoot;

    public Linear(double a, double b)
    {
        this.a = a;
        this.b = b;
    }

    public override void CalculateRoots()
    {
        if (a == 0)
            hasRoot = false;
        else
        {
            root = -b / a;
            hasRoot = true;
        }
    }

    public override void PrintResult()
    {
        if (hasRoot)
            Console.WriteLine($"Линейное уравнение: x = {root}");
        else
            Console.WriteLine("Линейное уравнение не имеет единственного корня");
    }
}

class Square : Payment
{
    private double a, b, c;
    private double x1, x2;
    private int rootsCount;

    public Square(double a, double b, double c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public override void CalculateRoots()
    {
        double d = b * b - 4 * a * c;

        if (d < 0)
            rootsCount = 0;
        else if (d == 0)
        {
            x1 = -b / (2 * a);
            rootsCount = 1;
        }
        else
        {
            x1 = (-b + Math.Sqrt(d)) / (2 * a);
            x2 = (-b - Math.Sqrt(d)) / (2 * a);
            rootsCount = 2;
        }
    }

    public override void PrintResult()
    {
        if (rootsCount == 0)
            Console.WriteLine("Квадратное уравнение не имеет корней");
        else if (rootsCount == 1)
            Console.WriteLine($"Квадратное уравнение: x = {x1}");
        else
            Console.WriteLine($"Квадратное уравнение: x1 = {x1}, x2 = {x2}");
    }
}

class Program
{
    static void Main()
    {
        Money m1 = new Money(10, 50);
        Money m2 = new Money(3, 25);

        Console.WriteLine($"m1 = {m1}");
        Console.WriteLine($"m2 = {m2}");
        Console.WriteLine($"m1 + m2 = {m1 + m2}");
        Console.WriteLine($"m1 - m2 = {m1 - m2}");
        Console.WriteLine($"m1 / m2 = {m1 / m2}");
        Console.WriteLine($"m1 / 2.5 = {m1 / 2.5}");
        Console.WriteLine($"m1 * 1.5 = {m1 * 1.5}");
        Console.WriteLine($"m1 > m2: {m1 > m2}");

        Payment p1 = new Linear(2, -6);
        p1.CalculateRoots();
        p1.PrintResult();

        Payment p2 = new Square(1, -5, 6);
        p2.CalculateRoots();
        p2.PrintResult();
    }
}