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