Untitled
unknown
plain_text
2 years ago
6.7 kB
14
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...