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;
}
}