二次方程公式

时间:2013-11-18 17:32:15

标签: c# math

我正在尝试制作一个用通用公式计算二次方程答案的程序,但我遇到了一些错误。 我的Windows窗体应用程序设置方式要求a,b和c,并在通用公式中替换它们。 我有3个文本框,一个用于a,b和c的每个值,还有一个用于答案,它应该使用一个名为“calculate”的按钮。 我的问题是,当我尝试一个完美的三项式广场以外的东西时,答案就像NaN一样。 以下是我的一些代码:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        a = Double.Parse(textBox1.Text);
    }

^这就是我为变量赋值的方式

double sqrtpart = b * b - 4 * a * c;
        answer = (b + Math.Sqrt(sqrtpart)) / 2 * a;
        textBox4.Text = answer.ToString();

6 个答案:

答案 0 :(得分:4)

组2a并确保值有效(b ^ 2> 4ac)

answer = (b + Math.Sqrt(sqrtpart)) / (2 * a);

答案 1 :(得分:2)

首先,确保4ac<称b²。二次公式也使用±符号,因此我们必须创建两个单独的变量来保存两个不同的答案。

double sqrtpart = (b * b) - (4 * a * c);
answer1 = ((-1)*b + Math.Sqrt(sqrtpart)) / (2 * a);
answer2 = ((-1)*b - Math.Sqrt(sqrtpart)) / (2 * a);
textBox4.Text = answer1.ToString() + " and " + answer2.ToString();

答案 2 :(得分:0)

如果您希望计算器能够计算复数,请尝试以下

 string ans = "";
        double root1 = 0;
        double root2 = 0;
        double b = 0;
        double a = 0;
        double c = 0;
        double identifier = 0;


        a =Convert.ToDouble(Console.ReadLine());
        b = Convert.ToDouble(Console.ReadLine());
        c = Convert.ToDouble(Console.ReadLine());

        identifier = b * b - (4 * a * c);

        if (identifier > 0)
        {
            root1 = (-b+(Math.Sqrt(identifier)/(2*a)));
            root2 = (-b - (Math.Sqrt(identifier) / (2 * a)));
            string r1 = Convert.ToString(root1);
            string r2 = Convert.ToString(root2);
            ans = "Root1 =" + r1 + "Root2 = " + r2;
            Console.WriteLine(ans);
        }

        if (identifier < 0)
        {
            double Real = (-b / (2 * a));
            double Complex = ((Math.Sqrt((identifier*(-1.00))) / (2 * a)));
            string SReal = Convert.ToString(Real);
            string SComplex = Convert.ToString(Complex);
            ans = "Roots = " + SReal + "+/-" + SComplex + "i";
            Console.WriteLine(ans);
        }

        if (identifier == 0)
        {
            root1 = (-b / (2 * a));
            string Root = Convert.ToString(root1);
            ans = "Repeated roots : " + Root;
        }

答案 3 :(得分:0)

使用以下代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace SoftwareAndFinance
{
    class Math
    {

            // quadratic equation is a second order of polynomial       equation in       a single variable 
        // x = [ -b +/- sqrt(b^2 - 4ac) ] / 2a
        public static void SolveQuadratic(double a, double b, double c)
        {
            double sqrtpart = b * b - 4 * a * c;
            double x, x1, x2, img;
            if (sqrtpart > 0)
            {
                x1 = (-b + System.Math.Sqrt(sqrtpart)) / (2 * a);
                x2 = (-b - System.Math.Sqrt(sqrtpart)) / (2 * a);
                Console.WriteLine("Two Real Solutions: {0,8:f4} or  {1,8:f4}", x1, x2);
            }
            else if (sqrtpart < 0)
            {
                sqrtpart = -sqrtpart;
                x = -b / (2 * a);
                img = System.Math.Sqrt(sqrtpart) / (2 * a);
                Console.WriteLine("Two Imaginary Solutions: {0,8:f4} + {1,8:f4} i or {2,8:f4} + {3,8:f4} i", x, img, x, img);
            }
            else
            {
                x = (-b + System.Math.Sqrt(sqrtpart)) / (2 * a);
                Console.WriteLine("One Real Solution: {0,8:f4}", x);
            }
        }


        static void Main(string[] args)
        {

            // 6x^2 + 11x - 35 = 0
            SolveQuadratic(6, 11, -35);

            // 5x^2 + 6x + 1 = 0
            SolveQuadratic(5, 6, 1);

            // 2x^2 + 4x + 2 = 0
            SolveQuadratic(2, 4, 2);

            // 5x^2 + 2x + 1 = 0
            SolveQuadratic(5, 2, 1);
        }
    }
}

这是原始source

答案 4 :(得分:0)

有点晚了,但这是我的解决方法:

using System;
using System.Collections.Generic;

namespace MyFunctions
{
    class Program
    {
        static void Main(string[] args)
        {
            printABCSolution(1, -3, 4);
            printABCSolution(1, -4, 4);
            printABCSolution(1, -5, 4);
            printABCSolution(9, 30, 25);
            printABCSolution(9, -15, 25);

            Console.ReadKey();
        }

        private static void printABCSolution(double a, double b, double c)
        {
            Console.WriteLine($"Solution a={a} b={b} c={c}");
            var solution = ABCMath.ABCFormula(a, b, c);
            Console.WriteLine($"# Solutions found: {solution.Count}");
            solution.ForEach(x => Console.WriteLine($"x={x}"));
        }

    }

    public static class ABCMath
    {
        public static List<double> ABCFormula(double a, double b, double c)
        {
            // Local formula
            double formula(int plusOrMinus, double d) => (-b + (plusOrMinus * Math.Sqrt(d))) / (2 * a);
            double discriminant = b * b - 4 * a * c;

            List<double> result = new List<double>();
            if (discriminant >= 0)
            {
                result.Add(formula(1, discriminant));
                if (discriminant > 0)
                    result.Add(formula(-1, discriminant));
            }
            return result;
        }
    }
}

输出:

Solution a=1 b=-3 c=4
# Solutions found: 0
Solution a=1 b=-4 c=4
# Solutions found: 1
x=2
Solution a=1 b=-5 c=4
# Solutions found: 2
x=4
x=1
Solution a=9 b=30 c=25
# Solutions found: 1
x=-1,66666666666667
Solution a=9 b=-15 c=25
# Solutions found: 0

答案 5 :(得分:0)

这是代码:

    using System;

    namespace RoomPaintCost
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("This program applies quadratic formula to Ax^2+Bx+C=0 problems");

                double[] ABC= getABC();
                double[] answerArray=QuadFormula(ABC);

                Console.WriteLine("Positive answer: {0:0.000} \n Negative answer: {1:0.000}", answerArray[0], answerArray[1]);

            }

            //Form of Ax^2 + Bx + C
            //Takes array of double containing A,B,C 
            //Returns array of positive and negative result
            public static double[] QuadFormula(double[] abc)
            {
                NotFiniteNumberException e = new NotFiniteNumberException();

                try
                {
                    double a = abc[0];
                    double b = abc[1];
                    double c = abc[2];
                    double discriminant = ((b * b) - (4 * a * c));
                    if (discriminant < 0.00)
                    {
                        throw  e; 
                    }

                    discriminant = (Math.Sqrt(discriminant));
                    Console.WriteLine("discriminant: {0}",discriminant);
                    double posAnswer = ((-b + discriminant) / (2 * a));
                    double negAnswer = ((-b - discriminant) / (2 * a));

                    double[] xArray= { posAnswer,negAnswer};
                    return xArray;

                }
                catch (NotFiniteNumberException)
                {
                    Console.WriteLine("Both answers will be imaginary numbers");
                    double[] xArray = { Math.Sqrt(-1), Math.Sqrt(-1) };
                    return xArray;
                }

            }

            public static double[] getABC()
            {

                Console.Write("A=");
                string sA = Console.ReadLine();
                Console.Write("B=");
                string sB = Console.ReadLine();
                Console.Write("C=");
                string sC = Console.ReadLine();

                int intA = Int32.Parse(sA);
                int intB = Int32.Parse(sB);
                int intC = Int32.Parse(sC);
                double[] ABC = { intA, intB, intC };



                return ABC;
            }
        }
    }