Untitled
unknown
plain_text
7 months ago
7.3 kB
7
Indexable
Never
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; } }