【发布时间】:2017-06-26 21:03:21
【问题描述】:
我正在为班级编写一个二次方程根求解器。我要么得到 %f 期望参数类型为 double 但参数 2 和 3 在第 45 和 51 行具有 float 类型,要么得到 -nan 和 -inf 作为编译时的答案。我想不出任何其他方法来让它工作。我不能在这上面使用双打。只有浮点数和整数与子程序。
#include <stdio.h>
#include <math.h>
void solve_linear(int, int);
void solve_quad(int, int, int);
void solve_real(int,int, int);
void solve_complex(int, int, int);
int main (int argc, char *argv[]){
int a, b, c;
if (argc==4) {
sscanf(argv[1], "%d", &a);
sscanf(argv[2], "%d", &b);
sscanf(argv[3], "%d", &c);
if (a=0){
if (b=0){
printf("Error. A and B cannot both be 0\n");
}
else solve_linear(b, c);
}
else solve_quad(a,b,c);
}
else printf("Error. Must enter 3 numbers on command line.\n");
}
void solve_linear(b, c){
float root;
root=(float)-c/b;
printf("%f\n", root);
}
void solve_quad(a, b, c){
if(b*b-4*a*c<0){
solve_complex(a,b,c);
}
else{
solve_real(a, b, c);
}
}
void solve_real(a, b, c){
float x1, x2;
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("%f, %f\n", &x1, &x2);
}
void solve_complex(a, b, c){
float x_real, x_img;
x_real=-b/(2.0*a);
x_img=(sqrt(abs(b*b-4*a*c)))/(2*a);
printf("%f + %fi\n", &x_real, &x_img);
}
【问题讨论】:
-
if (a=0){所以'a'总是零并且除以a,它是无穷大 -
if (a=0)总是会返回 true,你应该做的是if (a == 0)。同样if (b == 0) -
感谢您注意到这一点。但是,我仍然遇到花车问题。
-
使用
void solve_quad(a, b, c){ … }确实是老式的代码,你现在不应该编写这样的代码。 1989 年的风格很糟糕;令人震惊的是,您没有使用阻止它被接受的编译器选项。使用正确的原型符号:void solve_quad(int a, int b, int c){ … }。 -
您的问题是在您应该传递
double值时传递指向printf()的指针。你有:printf("%f + %fi\n", &x_real, &x_img);——你需要printf("%f + %fi\n", x_real, x_img);。我想您在需要指针的scanf()和需要读取double值的"%lf"和需要值的printf()和"%f"之间感到困惑(尽管"%lf"也适用于C99 或更高版本的库)。