【问题标题】:Quadratic equation using conditional operator [closed]使用条件运算符的二次方程
【发布时间】:2016-12-13 11:44:58
【问题描述】:

有人可以一步一步地向我解释这个程序是如何工作的吗?它使用条件运算符求解二次方程。但它是一团糟。

#include<stdio.h>
#include <math.h> 
int main()
{ 
     float a, b, c, d; 
     printf("Introduce the coefficients: a,b,c\n"); 
     scanf("%f %f %f", &a,&b,&c); 
     a? d=b*b-4*a*c, d>=0? 
     printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a):
     printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a):
     b? printf("x=%f\n",-b/2/a): c? printf("0 solutions\n"): 
     printf("identity\n"); 
     return 0; 
}

【问题讨论】:

  • 我认为codegolf.stackexchange.com 的用户会为作者感到自豪;)
  • 它[稍微]被混淆了,而不是打高尔夫球。打高尔夫球的会更乱!
  • 一团糟,不编译。请复制粘贴实际的源代码。并且不要使用 MS Word 作为源代码编辑器...
  • 我修复了代码中的小问题。顺便说一句,每个人都可以做到:只需按edit

标签: c conditional-operator


【解决方案1】:

条件运算符的语法是

condition ? expression1 : expression2

它被用作if-else 语句的替代品。要理解这个程序,首先要格式化if-else等条件运算符:

condition?
    expression1
:
    expression2

结果:

a?
    d=b*b-4*a*c,d>=0?
        printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a)
    :
        printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a)
:
    b?
        printf("x=%f\n",-b/2/a)
    :
        c?
            printf("0 solutions\n")
        :
            printf("identity\n");

然后将条件运算符替换为if-else 语句。为此,还要消除逗号运算符。

逗号运算符的语法是

expression1, expression2

这应该用更传统的复合语句代替:

{
    expression1;
    expression2;
}

结果:

if (a)
{
    d=b*b-4*a*c;
    if (d>=0)
        printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a);
    else
        printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a);
}
else
{
    if (b)
    {
        printf("x=%f\n",-b/2/a);
    }
    else
    {
        if (c)
            printf("0 solutions\n");
        else
            printf("identity\n");
    }
}

现在你可以阅读这个程序了。

【讨论】:

    【解决方案2】:

    让我们从头开始。

    a? d=b*b-4*a*c, d>=0? 
    

    如果 a 不为 0,则设置 d = b2 - 4ac。 如果 d >= 0,则有两个根,我们将它们都打印出来。

    printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a):
    

    否则,如果 d 为

     printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a)):
    

    现在这一行的最后一个冒号表示如果 a 等于 0

     b? printf("x=%f\n",-b/2/a): 
    

    现在如果 b 不为零(a 是 0,还记得吗?),那么只有一个根。如果 b 为零,那么我们转到下一个冒号

    c? printf("0 solutions\n"): 
     printf("identity\n"); 
    

    我认为其余的应该是微不足道的。

    【讨论】:

      【解决方案3】:

      我认为如果您使用if...else 而不是?:,功能会变得更加清晰。

      if(a != 0){
          d=b*b-4*a*c; // under the root
          if( d>=0 ){
              printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a, (-b+sqrt(d))/2/a);
          }
          else{
              printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a, sqrt(-d)/2/a,-b/2/a,sqrt(-d)/2/a);
          }
      }
      else {
          if( b != 0){
              printf("x=%f\n",-b/2/a);
          }
          else {
              if( c != 0){
                  printf("0 solutions\n");
              }
              else {
                  printf("identity\n"); 
              }
          }
      }
      

      注意:printf("x=%f\n",-b/2/a); 将除以 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 2020-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多