Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
7.3 kB
7
Indexable
using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Equation e = new Equation();
        double a; double b; double c;
        Console.WriteLine("Дано уравнение вида ax^2+bx+c=0");
        Console.Write("Введите коэфицент а: ");
        a = double.Parse(Console.ReadLine());
        Console.Write("Введите коэфицент b: ");
        b = double.Parse(Console.ReadLine());
        Console.Write("Введите коэфицент c: ");
        c = double.Parse(Console.ReadLine());
        e = Equation.CreateEquation(a, b, c);
        e.Solve();
    }
}
public class Equation
{
    protected const int infinity = Int32.MaxValue;
    protected int count = -1;
    public Equation() { }
    // виртуальный метод решения уравнения 
    public virtual void Solve()
    {
        PrintSolution();
    }
    // виртуальный метод печати результата решения уравнения 
    public virtual void PrintSolution()
    {
        Console.WriteLine("Уравнение еще не решено, поскольку не определен тип уравнения!!!");

    }
    // метод базового класса, предназначенный для создания 
    // объектов-уравнений в зависимости от набора коэффициентов 
    public static Equation CreateEquation(params double[] coef)
    {
        double a, b, c;
        // инициализируем коэффициенты уравнения 
        // в зависимости от длины массива коэффициентов 
        switch (coef.Length)
        {
            case 3:
                a = coef[0];
                b = coef[1];
                c = coef[2];
                break;
            case 2:
                a = 0.0;
                b = coef[0];
                c = coef[1];
                break;
            case 1:
                a = 0.0;
                b = 0.0;
                c = coef[0];
                break;
            default:
                throw new Exception("Данный набор коэффициентов не определяет рассматриваемые типы уравнений");

        }
        // определение типа уравнения по коэффициентам 
        if (a == 0)
        {
            if (b == 0)
            {
                // создается и возвращается 
                // объект класса Equation_0 
                return new Equation_0(c);
            }
            else
            {
                // создается и возвращается 
                // объект класса Equation_1 
                return new Equation_1(b, c);
            }
        }
        else
        {
            // объект класса Equation_2 
            return new Equation_2(a, b, c);
        }
    }
}

// создается и возвращается 
// производный класс для определения уравнений 0-ого порядка 
class Equation_0 : Equation
{
    protected double c;
    // переопределенный виртуальный метод решения уравнения 
    public override void Solve()
    {
        if (c == 0)
            count = infinity;
        else
            count = 0;
        PrintSolution();
    }
    // переопределенный виртуальный метод печати 
    // результатов решения уравнения 
    override public void PrintSolution()
    {
        Console.WriteLine("{0} = 0", c);
        if (count == -1)
        {
            base.PrintSolution();
            return;
        }
        if (count == 0)
            Console.WriteLine("Корней нет");
        else
            Console.WriteLine("Любое x является решением");
    }
    // конструктор класса 
    public Equation_0(double c1)
    {
        c = c1;
    }
}
// производный класс уравнения 1-ого порядка 
// (линейного уравнения) 
class Equation_1 : Equation_0
{
    //добавляется коэффициент b 
    protected double b;
    // уравнение имеет один корень 
    protected double x1;
    // переопределенный виртуальный метод решения уравнения 
    override public void Solve()
    {
        count = 1;
        x1 = -c / b;
        PrintSolution();
    }
    // переопределенный виртуальный метод печати 
    // результатов решения уравнения 
    override public void PrintSolution()
    {
        Console.WriteLine("{0} x + {1} = 0", b, c);
        if (count == -1)
        {
            base.PrintSolution();
            return;
        }
        Console.WriteLine("x={0}", x1);
    }
    // конструктор 
    public Equation_1(double b1, double c1) : base(c1)
    {
        b = b1;
    }
}
// производный класс уравнения 2-ого порядка 
// (квадратного уравнения) 
class Equation_2 : Equation_1
{
    // по сравнению с линейным уравнением добавляется 
    // коэффициент a 
    protected double a;
    // уравнение может иметь два корня 
    protected double x2;
    // переопределенный виртуальный метод решения уравнения 
    public override void Solve()
    {
        double disc = b * b - 4 * a * c;
        if (disc < 0.0)
            count = 0;
        else if (disc == 0.0)
        {
            count = 1;
            x1 = -b / (2 * a);
            x2 = x1;
        }
        else
        {
            count = 2;
            x1 = (-b + Math.Sqrt(disc)) / (2 * a);
            x2 = (-b - Math.Sqrt(disc)) / (2 * a);
        }
        PrintSolution();
    }
    // переопределенный виртуальный метод печати 
    // результатов решения уравнения 
    override public void PrintSolution()
    {
        Console.WriteLine("{0} x^2 {1} x + {2} = 0",
            a, b, c);

        if (count == -1)
        {
            base.PrintSolution();
            return;
        }
        switch (count)
        {
            case 2:
                Console.WriteLine("x1={0}, x2={1}", x1, x2);
                break;
            case 1:
                Console.WriteLine("x={0}", x1);
                break;
            case 0:
                Console.WriteLine("Корней нет");
                break;
        }
    }
    // конструктор класса 
    public Equation_2(double a1, double b1,

    double c1) : base(b1, c1)

    {
        a = a1;
    }
}