2

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

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

它可以完美地与某些功能(例如 -6x2-6x+12)配合使用,而与其他功能(4x2-20x+25)配合使用时,它会表现出我怀疑的舍入误差。

我对 C# 完全陌生,我看不到任何问题;有人可以帮我调试这段代码吗?

namespace ConsoleApplication {
    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, x1, x2;

            while (true) {
                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 = -b / (2 * a);
                Console.WriteLine("The only solution is x={0}.", x1);
                Console.ReadLine();
            }

            // If d < 0, no real solutions exist
            else if (d < 0) { 
                Console.WriteLine("There are no real solutions");
                Console.ReadLine();
            }

            // If d > 0, there are two real solutions 
            else {
                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();
            }
        }
    }
}
4

3 回答 3

21

我刚刚编写了我的第一个 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 a = ObtainInput("A? ", false);
double b = ObtainInput("B? ", true);
double c = ObtainInput("C? ", true);

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

于 2012-04-20T20:26:22.223 回答
3

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

将 a、b、c 和 d 值更改为双倍也可能有意义,这也将解决问题,并允许人们为系数输入非整数值。

于 2012-04-20T20:01:35.633 回答
3

整数a,b,c;诠释d;

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

于 2012-04-20T20:02:38.873 回答