C#二次方程求解器遇到问题

我只写了我的第一个C#程序。

这是一个解决二次方程的简单代码。

它可以完美地与一些函数(如-6x2-6x + 12)一起工作,而其他函数(4x2-20x + 25)则表现出我怀疑的舍入误差。

我对C#完全陌生,并且看不到问题; 有人能够帮助我调试此代码吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
            int d;
            double x1, x2;
            entA: Console.Write("a?");
            try
            {
                a = Convert.ToInt32(Console.ReadLine());
            }
            catch
            {
                /*If a=0, the equation isn't quadratic*/
                Console.WriteLine("Invalid input");
                goto entA;
            }
            entB: Console.Write("b?");
            try
            {
                b = Convert.ToInt32(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("Invalid input");
                goto entB;
            }
            entC: Console.Write("c?");
            try
            {
                c = Convert.ToInt32(Console.ReadLine());
            }
            catch
            {
                Console.WriteLine("Invalid input");
                goto entC;
            }
            /*Calculating a discriminant*/
            d = b * b - 4 * a * c;
            if (d == 0)
            {
                x1 = x2 = -b / (2 * a);
                Console.WriteLine("The only solution is x={0}.", x1);
                Console.ReadLine();
            }
            else if (d < 0) /*If d<0, no solutions are possible*/
            { 
                Console.WriteLine("There are no possible solutions");
                Console.ReadLine();
            }
            else /*If d>0, there are two possible solutions*/
            {
                x1 = (-b - Math.Sqrt(d)) / (2 * a);
                x2 = (-b + Math.Sqrt(d)) / (2 * a);
                Console.WriteLine("x1={0} and x2={1}.", x1, x2);
                Console.ReadLine();
            }
        }
    }
}

以下是更新的代码:

    namespace ConsoleApplication7
    {
    class Program
    {
        static int ObtainInput(string prompt, bool canBeZero)
        {
            double a = ObtainInput("A? ", false);
            double b = ObtainInput("B? ", true);
            double c = ObtainInput("C? ", true);
            double d;
            double x1, x2;
            while (true) // loop forever!
            {
                Console.Write(prompt);
                string input = Console.ReadLine();
                int result;
                bool success = int.TryParse(input, out result);
                if (success && (canBeZero || result != 0))
                    return result;
                Console.WriteLine("Invalid input!");
            }
            /Calculating a discriminant/
            d = b * b - 4 * a * c;
            if (d == 0)
            {
                x1 = x2 = -b / (2 * a);
                Console.WriteLine("The only solution is x={0}.", x1);
                Console.ReadLine();
            }
            else if (d < 0) /If d<0, no solutions are possible/
            { 
                Console.WriteLine("There are no possible solutions");
                Console.ReadLine();
            }
            else /If d>0, there are two possible solutions/
            {
                x1 = (-b - Math.Sqrt(d)) / (2 * a);
                x2 = (-b + Math.Sqrt(d)) / (2 * a);
                Console.WriteLine("x1={0} and x2={1}.", x1, x2);
                Console.ReadLine();
            }
        }
    }
    }
    


我只写了我的第一个C#程序。

真棒。 现在将是一个很好的时间不要陷入坏习惯:

entA: Console.Write("a?");   
try { a = Convert.ToInt32(Console.ReadLine()); }
catch 
{ /*If a=0, the equation isn't quadratic*/
  Console.WriteLine("Invalid input"); 
  goto entA;             
} 

问题比比皆是。 首先,使用int.TryParse ,而不是围绕可能失败的东西进行try-catch。

其次,评论与代码的行为不匹配。 该代码确定结果是否是整数; 评论说它检查零。

第三,当你试图表示的是一个循环时,不要使用goto。

第四,看看所有重复的代码! 你有相同的代码重复三次,并有微小的变化。

让自己成为一个帮手方法:

 static int ObtainInput(string prompt, bool canBeZero)
 {
     while(true) // loop forever!
     {
         Console.Write(prompt);
         string input = Console.ReadLine();
         int result;
         bool success = int.TryParse(input, out result);
         if (success && (canBeZero || result != 0))
             return result;
         Console.WriteLine("Invalid input!");
     }
 }

现在你的主线是:

int a = ObtainInput("A? ", false);
int b = ObtainInput("B? ", true);
int c = ObtainInput("C? ", true);

你的错误虽然在这里:

x1 = x2 = -b / (2 * a);   

你用整数进行算术运算,然后转换成双精度。 也就是说,你做分部,四舍五入到最接近的整数,然后转换为double。 从一开始就做双打(或者小数点以下)。 它应该是:

double a = ObtainInput("A? ", false);
double b = ObtainInput("B? ", true);
double c = ObtainInput("C? ", true);

也就是说,a,b和c不应该是整数。


分配给x1和x2时,你正在进行整数除法; (您可以将2更改为2.0以将其更改为双倍分数并获得双倍结果)

把你的a,b,c和d值改为double也可能是有意义的,这也会解决问题,并允许人们输入系数的非int值。


int a,b,c; int d;

首先,尝试使用double而不是int,因为使用整数的1/3 = 0。

链接地址: http://www.djcxy.com/p/52777.html

上一篇: Having trouble with C# quadratic equation solver

下一篇: Why does Boolean.ToString output "True" and not "true"