Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
6.7 kB
11
Indexable
Never
using System;
class HelloWorld
{
    class Equation
    {
        // поля класса
        // константа для обозначения
        // бесконечного количества корней
        const int infinity = Int32.MaxValue;
        // переменные для хранения коэффициентов уравнения
        double a, b, c;
        // поле для хранения количества корней уравнения
        // (-1 означает, что вычисление корней
        // уравнения пока не осуществлялось)
        int count = -1;
        int countc = 0;
        // переменные для хранения корней уравнения
        double x1, x2;
        double realPart, compPart;
        public Equation(params double[] coef)
        {
            // в зависимости от количества параметров (длины массива)
            // получаем различные виды уравнений
            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("Данный набор коэффициентов не может определять квадратное уравнение");
            }

        }
        public void Solve()
        {
            if (a == 0)
                //линейное уравнение
                if (b == 0)
                    // уравнение нулевого порядка
                    if (c == 0)
                    {

                        // тождество
                        count = infinity;
                    }
                    else
                    {
                        count = 0;
                    }
                else
                    // линейное уравнение
                    LinSolve();
            else
                //квадратное уравнение
                QSolve();
        }
        public void QSolve()
        {
            // вычисление дискриминанта
            double disc = b * b - 4 * a * c; double discs = 0;
            if (disc < 0.0)
            {
                count = 0;
                discs = -disc;
                realPart = -b / (2 * a);
                compPart = Math.Sqrt(discs) / (2 * a);
                countc = 1;
            }
            else if (disc == 0.0)
            {

                // уравнение имеет один корень

                count = 1;
                x1 = x2 = -b / (2 * a);
            }
            else
            {

                // уравнение имеет два корня

                count = 2;
                x1 = (-b + Math.Sqrt(disc)) / (2 * a);
                x2 = (-b - Math.Sqrt(disc)) / (2 * a);
            }
        }
        public void LinSolve()
        {
            count = 1;
            x1 = -c / b;
        }
        public double A
        {
            get { return a; }
            set { a = value; }
        }
        public double B
        {
            get { return b; }
            set { b = value; }
        }
        public double C
        {
            get { return c; }
            set { c = value; }
        }
        public int Count
        {
            get { return count; }
        }
        public double this[int i]
        {
            get
            {
                if (count == -1)
                    throw new Exception("Уравнение еще не решено");
                if ((count == 1 || count == 2) && i == 1)
                    return x1;
                if (count == 2 && i == 2)
                    return x2;
                throw new Exception("Уравнение не имеет корня с номером " + i);
            }
        }
        public void PrintSolution()
        {
            // сообщение определяется значением количества
            // корней уравнения
            switch (count)
            {
                case 2:
                    Console.WriteLine("x1={0}, x2={1}", x1, x2);
                    break;
                case 1:
                    Console.WriteLine("x={0}", x1);
                    break;
                case 0:
                    if (countc == 1)
                    {
                        Console.WriteLine($"x1={realPart}+{compPart}i, x2={realPart}+{compPart}i");
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Корней нет");
                        break;
                    }
                case Int32.MaxValue:

                    Console.WriteLine("Любое x является решением");
                    break;
                default:

                    Console.WriteLine("Уравнение еще не решено");
                    break;

            }
        }
    }
    static void Main()
    {
        Equation equ = new Equation(0);
        Console.WriteLine("Дано уравнение вида ax^2+bx+c=0");
        Console.Write("Введите коэфицент а: ");
        equ.A = double.Parse(Console.ReadLine());
        Console.Write("Введите коэфицент b: ");
        equ.B = double.Parse(Console.ReadLine());
        Console.Write("Введите коэфицент c: ");
        equ.C = double.Parse(Console.ReadLine());
        equ.Solve();
        equ.PrintSolution();
        Console.WriteLine($"Действительных решений = {equ.Count}");
    }
}