2016-12-13 5 views
1

誰かがこのプログラムの仕組みを段階的に説明できますか?条件付き演算子を使用して2次方程式を解きます。しかし、それは混乱です。条件付き演算子を使用した二次方程式

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

によって分割します。) – izlin

+1

これは、[わずか] golfedない、難読化されています。ゴルフ場の方が面倒です! – anatolyg

+0

これは混乱してコンパイルされません。実際のソースコードをコピーして貼り付けてください。そして、ソースコードエディタとしてMS Wordを使用しないでください。 – Lundin

答えて

3

条件演算子の構文は次のとおりです。このプログラム、最初の形式を理解するためにifなどの条件演算子 - else文:

condition? 
    expression1 
: 
    expression2 

の結果: - else

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で条件演算子を交換してください。これを行うには、カンマ演算子も削除します。

コンマ演算子の構文は、これは、より多くの従来の複合文に置き換える必要があり

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"); 
    } 
} 

今、あなたはこれを読むことができますプログラム。

3

トップから始めましょう。

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

D = B 設定後、0でない場合 - 4AC。 d>が0の場合、2つのルートがあり、両方を印刷します。

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)): 

は今、この行の最後のコロンは使用して印刷されているため0

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

等しい場合今、bが0でない場合(aは覚えていますか?)、ルートは1つだけです。 bが0の場合は、次のコロンに行きます。

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

私は残りの部分は簡単ではないと思います。 else声明 - それはifの代替として使用されている

condition ? expression1 : expression2 

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);私はhttp://codegolf.stackexchange.com/から、ユーザーが著者の誇りだと思う0