在使用 C# 二次方程求解器时遇到问题
本文关键字:遇到 问题 二次方程 | 更新日期: 2023-09-27 18:31:52
我刚刚编写了我的第一个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();
}
}
}
}
我刚刚编写了我的第一个 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
,而不是在可能失败的东西周围进行尝试捕获。
其次,注释与代码的操作不匹配。代码确定结果是否为整数;评论说它检查零。
第三,当您尝试表示的是循环时,不要使用 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 永远不应该是整数。
在
分配给 x1 和 x2 时,您正在执行整数除法;(您可以将 2 更改为 2.0 以将其更改为双除法并获得双倍结果)
将a、b、c 和 d 值更改为双倍也可能有意义,这也将克服问题,并允许人们为系数输入非整数值。
int a, b, c;国际 d;
首先,尝试使用双精度而不是整数,因为使用整数的 1/3 = 0。