如何优化我的C代码来解决R中的二次方程?

时间:2016-11-04 21:45:42

标签: c equation-solving quadratic

我只想知道如何优化我的C代码。我的程序运行正常,我用很多不同的值测试它,一切都很好。但是,我想减少行数并以更好的质量编写程序。 这是源代码:

#include <stdio.h>
#include <math.h>

int main(void) {
    float a,b,c,x,x1,x2;
    printf("aX^2 + bX + c = 0\n");
    printf("Type the value of a: ");
    scanf("%f", &a);
    printf("Type the value of b: ");
    scanf("%f", &b);
    printf("Type the value of c: ");
    scanf("%f", &c);

    if ( a!=0 && b!=0 && c!=0){
        float delta = b*b - 4*a*c;
        if (delta>0){
            x1 = (-b-sqrt(delta))/(2*a);
            x2 = (-b+sqrt(delta))/(2*a);
            printf("Solutions are x1 = %f and x2 = %f\n",x1,x2);
        }
        else if (delta == 0){
            x = -b/(2*a);
            printf("One unique solution is x = %f\n", x);
        }
        else {
            printf("No solutions !\n");
        }
    }
    if ( a==0 && b!=0 && c!=0)
        printf("One unique solution x = %f\n", -c/b);
    if ( a==0 && b==0 && c!=0)
        printf("No solutions !\n");
    if ( a==0 && b==0 && c==0 )
        printf("Set of solutions is R\n");
    if (a!=0 && b==0 & c!=0) {
        x = -c/a;
        if(x>=0)
            printf("Two soltions x = %f et -x = %f\n", sqrt(x),-sqrt(x));
        else{
            printf("No solutions !\n");
        }
    }
    if (a!=0 && b==0 && c==0)
        printf("One unique x = 0\n");

}

4 个答案:

答案 0 :(得分:1)

一个小优化:使用else if代替所有原始if。这将避免在一个if条件匹配后进行不必要的比较。

您还可以尝试if语句的顺序。如果您的用例更常见任何条件,那么它们应该是第一个。

答案 1 :(得分:1)

由于您基本上是在构建状态机,所以我们实际上是这样做的:

int state = (a == 0) ? 0 : 1;
state |= (b == 0) ? 0 : 2;
state |= (c == 0) ? 0 : 4;

switch(state)
{
    case 0: // All co-efficents 0 Domain R print 
        break; 
    case 1: // Only a coefficient: 0 case
        break;
    case 2: // Only b coefficient 0 case.
        break;
    case 3: // a and b coefficient case - one root 0, other linear.
        break;
    case 4: // Only c case - no solutions
        break;
    case 5: // a and c case
        break;
    case 6:  // b and c case (linear)
        break;
    case 7: // a,b,c all here - do full quadratic solve.
         break;
    default:
       // This should never happen - assert and exit.
         break;
}

这样,您的所有案例都是明确定义的。然后每个案例也可以调用一个函数。或者,更进一步,每个案例的函数指针数组,完全正确命名。

答案 2 :(得分:1)

1)计算的某些部分正在重复。将计算分解为更小的部分,将结果存储在变量中,并使用它们来构建所需的结果。

2)您可以完全避免对案例a!=0 && b==0 & c!=0进行特殊处理(尽管您需要更改其他一些测试)。

3)重复一些操作(例如提示和阅读)。在带有参数的函数中执行这些操作(例如,用于提示的字符串)。

4)您打印“无解决方案”的第一行实际上是复杂或虚构的解决方案。第二个是另一种解决方案。

5)也可能将一些重复计算(第1点)分解为单独的函数。

6)略微提升:您的代码不能很好地处理输入垃圾(非数字)输入的用户。

答案 3 :(得分:0)

您可以使用此示例来优化代码:

#include <stdio.h>
#include <math.h>

int main()
{
    double a, b, c, determinant, root1,root2, realPart, imaginaryPart;

    printf("Enter coefficients a, b and c: ");
    scanf("%lf %lf %lf",&a, &b, &c);

    if(a==0 && b!=0 && c!=0){
     root1 = -c/b;
     printf("linear equation root = -c/b = %.2lf", root1);
    }else{

    determinant = b*b-4*a*c;

    // condition for real and different roots
    if (determinant > 0)
    {
    // sqrt() function returns square root
        root1 = (-b+sqrt(determinant))/(2*a);
        root2 = (-b-sqrt(determinant))/(2*a);

        printf("root1 = %.2lf and root2 = %.2lf",root1 , root2);
    }

    //condition for real and equal roots
    else if (determinant == 0)
    {
        root1 = root2 = -b/(2*a);

        printf("root1 = root2 = %.2lf;", root1);
    }

    // if roots are not real 
    else
    {
        realPart = -b/(2*a);
        imaginaryPart = sqrt(-determinant)/(2*a);
        printf("root1 = %.2lf+%.2lfi and root2 = %.2f-%.2fi", realPart, imaginaryPart, realPart, imaginaryPart);
    }
}
    return 0;
}
  • 如果行列式大于0,则根是真实的,不同的。
  • 如果行列式等于0,则根是真实且相等的。
  • 如果行列式小于0,则根很复杂且不同。

所以,

Sample image