使用条件算子的二次方程

时间:2016-12-13 11:44:58

标签: c conditional-operator

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

#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; 
}

3 个答案:

答案 0 :(得分:3)

让我们从顶部开始。

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

如果a不为0,则设置d = b 2 - 4ac。 如果d>&gt; = 0,则有两个根,我们打印它们。

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

否则,如果d <0,我们有假想的根,并使用

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

现在,此行中的最后一个冒号是for a等于0

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

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

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

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

答案 1 :(得分:3)

条件运算符的语法是

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 :(得分: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.