2016-12-13 2 views
1

Может кто-нибудь объяснить мне шаг за шагом, как эта программа работает? Он решает квадратичное уравнение с использованием условного оператора. Но это беспорядок.Квадратичное уравнение с использованием условного оператора

#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

Я думаю, что пользователи из http://codegolf.stackexchange.com/ гордились бы автора;) – izlin

+1

Это [немного] затемненный, не golfed , Игра в гольф была бы еще более грязной! – anatolyg

+0

Это беспорядок и не компилируется. Скопируйте-вставьте фактический исходный код. И не используйте MS Word в качестве редактора исходного кода ... – Lundin

ответ

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

Теперь вы можете прочитать это программа.

3

Начнем с верхней части.

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

, если не 0, то устанавливается d = B - 4AC. Если d is> = 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)): 

Теперь последнее двоеточие в этой линии для если равен 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.

Смежные вопросы