我只想知道如何优化我的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");
}
答案 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;
}
所以,