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
}