Untitled
unknown
plain_text
3 years ago
6.7 kB
18
Indexable
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}");
}
}
Editor is loading...