c#。得到一个x,它产生一条由方程y=a*x^2+给出的抛物线的最小值;b*x+;C
我正试图写一个方法来找到由等式c#。得到一个x,它产生一条由方程y=a*x^2+给出的抛物线的最小值;b*x+;C,c#,C#,我正试图写一个方法来找到由等式y(x)=ax^2+bx+c给出的曲线获得最小值的数字(整数)x 该方法应采用非负系数a,以及任意系数b和c,如果存在解决方案,则返回所需x的字符串表示形式,否则返回字符串“不可能” 通过数学,将导数等于零y'(x)=0,很容易找到所需x=-b/2a的公式 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadi
y(x)=ax^2+bx+c
给出的曲线获得最小值的数字(整数)x
该方法应采用非负系数a
,以及任意系数b
和c
,如果存在解决方案,则返回所需x
的字符串表示形式,否则返回字符串“不可能”
通过数学,将导数等于零y'(x)=0
,很容易找到所需x=-b/2a
的公式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GetMinX
{
class Program
{
public static void Main()
{
Console.WriteLine(GetMinX(1, 2, 3));
Console.WriteLine(GetMinX(0, 3, 2));
Console.WriteLine(GetMinX(1, -2, -3));
Console.WriteLine(GetMinX(5, 2, 1));
Console.WriteLine(GetMinX(4, 3, 2));
Console.WriteLine(GetMinX(0, 4, 5));
// in these cases the solution exists:
Console.WriteLine(GetMinX(0, 0, 2) != "Impossible");
Console.WriteLine(GetMinX(0, 0, 0) != "Impossible");
}
private static string GetMinX(int a, int b, int c)
{
var GetMinX = (double)(-b / ((2.0) * a));
if (a > 0)
GetMinX.ToString();
else if (a == 0)
{
Console.WriteLine("Invalid");
}
else
GetMinX.ToString();
return GetMinX.ToString();// this is how we output string representation of x value
}
}
}
作为输出,我得到以下结果:
-1
Invalid
-?
1
-0.2
-0.375
Invalid
-?
Invalid
True
Invalid
True
我提供8行,得到12个答案。有人能解释一下我的代码出了什么问题吗?它的功能是不正确的,因为它是
这个方法可以用
?:
操作符来写吗?我不确定这个公式是否正确-我在其中缺少c,假设它是正确的。现在,您的代码应该是这样的
void Main()
{
Console.WriteLine(GetMinX(1, 2, 3));
Console.WriteLine(GetMinX(0, 3, 2));
Console.WriteLine(GetMinX(1, -2, -3));
Console.WriteLine(GetMinX(5, 2, 1));
Console.WriteLine(GetMinX(4, 3, 2));
Console.WriteLine(GetMinX(0, 4, 5));
// in these cases the solution exists:
Console.WriteLine(GetMinX(0, 0, 2) != "Impossible");
Console.WriteLine(GetMinX(0, 0, 0) != "Impossible");
}
private static string GetMinX(int a, int b, int c)
{
//We can't proceed if a is zero otherwise we will get division by zero error
if(a == 0)
return "Invalid"; //Exit method with message. I would inform about mistake like "a variable is equal to zero"
//Per requirement check if a is non negative - we can't do calculations then
if(a < 0)
return "Impossible"; //Exit method with message. Again I would use more informative message
//all good do calculation and return result
var minX = (double)(-b / ((2.0) * a));
return minX.ToString();
}
void Main()
{
Console.WriteLine(GetMinX(1,2,3));
Console.WriteLine(GetMinX(0,3,2));
控制台写入线(GetMinX(1,-2,-3));
Console.WriteLine(GetMinX(5,2,1));
Console.WriteLine(GetMinX(4,3,2));
Console.WriteLine(GetMinX(0,4,5));
//在这些情况下,解决方案是存在的:
Console.WriteLine(GetMinX(0,0,2)!=“不可能”);
Console.WriteLine(GetMinX(0,0,0)!=“不可能”);
}
私有静态字符串GetMinX(inta、intb、intc)
{
//如果a为零,我们不能继续,否则我们将得到零除误差
如果(a==0)
返回“Invalid”;//带消息退出方法。我会通知错误,如“变量等于零”
//根据需求检查a是否为非负-我们无法进行计算
if(a<0)
返回“不可能”;//退出带有消息的方法。同样,我会使用信息更丰富的消息
//所有好的做计算和返回结果
var minX=(双)(-b/(2.0)*a));
返回minX.ToString();
}
还有一件事。我建议不要把重点放在?:
操作符上,否则语句就是等价的。当您完全理解基础知识并希望提高可读性时,开始使用?:
<代码>?:<代码>只是句法糖。 你必须考虑比你已经实施的更多的情况(<强>四< /强>:
1. a > 0 - min at -b / 2a
2. a < 0 - Invalid: no minimum, but maximum at -b / 2a
3. a = 0
3.1 b = 0 - min at any x value (we have "y = c" equation)
3.2 b <> 0 - Invalid: neither minimum nor maximum (we have "y = bx + c" equation)
结果:
private static void Main() {
Console.WriteLine(GetMinX(1, 2, 3));
Console.WriteLine(GetMinX(0, 3, 2));
Console.WriteLine(GetMinX(1, -2, -3));
Console.WriteLine(GetMinX(5, 2, 1));
Console.WriteLine(GetMinX(4, 3, 2));
Console.WriteLine(GetMinX(0, 4, 5));
Console.WriteLine(GetMinX(0, 0, 2));
Console.WriteLine(GetMinX(0, 0, 0));
}
Minimum 2 at -1
Invalid. Neither minumum nor maximum exists
Minimum -4 at 1
Minimum 0.8 at -0.2
Minimum 1.4375 at -0.375
Invalid. Neither minumum nor maximum exists
Minimum 2 at any x
Minimum 0 at any x
最后,您可以使用三元运算符?,很好地重写例程:代码>,例如
private static string GetMinX(int a, int b, int c) {
return (a == 0)
? // degenerated case
b != 0 ? "Invalid" // straight line y = b * x + c
: "0" // y == c; any x will do, let's put "0"
: // general case
a < 0 ? "Invalid" // parabola with maximum
: (-b / (2.0 * a)).ToString(); // parabola with minimum
}
私有静态字符串GetMinX(inta、intb、intc){
返回值(a==0)
?//退化病例
b!=0?“无效”//直线y=b*x+c
:“0”//y==c;任何x都可以,让我们把“0”
://一般情况
小于0?“//无效抛物线,最大
:(-b/(2.0*a)).ToString();//最小值抛物线
}
但是,我认为您不应该这样做,因为这段代码可读性较差。您可能需要这样的内容:返回“a不能等于0”代码>而不是控制台.WriteLine(“无效”)代码>您会得到更多的结果,因为在某些情况下(当a==0)您的代码会打印“无效”和一个数字。你也在做!=“不可能”
check,但您的方法永远不会返回“不可能”…在计算之前,您必须进行==0检查,否则您将得到一个被零除的错误。为什么要调用GetMinX.ToString()代码>经常使用的方法内部?如果(a==0{return“Invalid”;}
(首先处理“特殊情况”),然后var minX=(double)(-b/((2.0)*a)),那么说是否更有意义;返回minX.ToString()代码>。顺便说一句,变量通常以小写形式命名,并且与方法的名称不同(以减少混淆)。if(a>0)GetMinX.ToString()代码>只是死代码。它对你的最后一个问题没有任何作用:当然<代码>返回a==0?“无效”:((双精度)(-b/((2.0)*a)).ToString()代码>。。。如果你觉得这更容易理解,我想正确的公式应该是:c-(b*b/(4*a))
。如果a<0
,则不存在可能的(有意义的)最小值(抛物线向下打开;公式将计算最大值)。如果a==0,它就不是抛物线了。因此,只有a>0
才能产生有效的最小值。-b
和c
的值可以是它们想要的任何值。@Corak谢谢您的输入,您可能是对的。正如我写的,我的目标是解释代码,您的评论可能会导致OP得出正确的公式:)谢谢您的建议!现在,有了你的解释,我对这些基本知识有了更好的理解!但是,关于这个主题,我还有最后一个问题,关于最后两行输入。Console.WriteLine(GetMinX(0,0,2)!=“不可能”);在这种情况下,解决方案应该存在。然而,在最后一次检查中,我得到了一个错误。它应该返回真的,但我得到假。。。反之亦然。。。如果我在您的代码中将Invalid改为不可能…@ShepenkovValeriy在这两种情况下,您都将0
作为a
参数传递,因此它将始终到达a==0
案例并返回“Invalid”。因此,对于这两种方法调用,您总是从方法中获得“Invalid”,并且在这两种情况下都是“Invalid”!=“不可能”是真的。我真的不知道你想用最后两行做什么:)谢谢你的回答,先生!我从你的解释中学到了很多!
private static string GetMinX(int a, int b, int c) {
return (a == 0)
? // degenerated case
b != 0 ? "Invalid" // straight line y = b * x + c
: "0" // y == c; any x will do, let's put "0"
: // general case
a < 0 ? "Invalid" // parabola with maximum
: (-b / (2.0 * a)).ToString(); // parabola with minimum
}