这个问题在于,当判别式-1E-6(相当于判别式小于0),求共轭复数根时,你的x1和x2事先都是double类型(双精度浮点实数型),这个类型不能存储虚数。再加上rparti没有定义(因为系统会把rparti作为一个完整的标识符看待,所以你不能那样写)
魏县网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联建站于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
我的建议,在求共轭复根时,x1和x2就不要再表示两个根了,分别用来代表实数部分和去掉虚数单位的虚数部分就行,然后用“字符串组合"的方式输出。在这种情况下,不要直接只写一条输出语句在最后(倒数第2行),而是在每个判别式的分支都写一次printf语句比较好。
具体说,就是在前面的if分支和else if分支都写上输出(倒数第二行的输出去掉),后面else分支写成
x1=-b/(2*a); x2=sqrt(-disc)/(2*a);
这里的x1和x2代表实数部分和虚数部分。
然后写如下的输出语句:
printf("x1=%lf+%lfi, x2=%lf-%lfi", x1,fabs(x2),x1,fabs(x2));
注意,虚数部分x2的符号要去掉(所以用了fabs函数),而是在字符串中写上+和-号,以形成共轭复数的形式
另外,这个程序当中a==0的情况你没有求解,而是显示了一行错误信息,所以,你的printf更不能放在倒数第二行了(这已经是所有分支的外面了),原因是a==0的时候x1和x2从未赋值
#include stdio.h
int main(void)
{
double a,b,c,d,e;
double x1,x2;
printf("请输入ax^2+bx +c = 0中a,b,c的值");
scanf("%lf,%lf,%lf",a,b,c);
e = b * b - 4 * a * c;
if (e0) {
printf("无解,请重新输入\n");
scanf("%lf,%lf,%lf",a,b,c);
}
printf("输入正确,正在计算....\n");
d = sqrt(e);
x1 = (-b + d)/(2 * a);
x2 = (-b - d)/(2 * a);
printf("x1=%f\n",x1);
printf("x2=%f\n",x2);
return 0;
}
#include stdio.h
#include math.h
#include malloc.h
void main()
{
double a,b,c;
double s;
double *e,*f;
void d(double a ,double b,double c,double s,double* e,double* f);
void de(double a ,double b,double c,double *e);
void x();
e=(double*)malloc(sizeof(double));
f=(double*)malloc(sizeof(double));
*e=0;
*f=0;
printf("Please input coefficient:\n");
scanf("%lf%lf%lf",a,b,c);
if(a==0)
{
if(b==0c==0)
printf("x is any number");
if(b==0c!=0)
x();
if(b!=0)
{
*e=-c/b;
printf("%lf",*e);
}
}
else
{
s=(b*b-4*a*c);
if(s0)
x();
else
{
s=sqrt(s);
printf("The equation is %lf x^2 + %f x + %f\n",a,b,c);
printf("s=%lf\n",s);
if(s0)
{
d(a,b,c,s,e,f);
printf("%lf\n",*e);
printf("%lf\n",*f);
}
else if(s==0)
{
de(a,b,c,e);
printf("%lf\n",*e);
}
}
}
}
void d(double a ,double b,double c,double s,double *e ,double *f)
{
double m,n;
m=-0.5*(b+s)/a;
n=-0.5*(b-s)/a;
*e=m;
*f=n;
}
void de(double a ,double b,double c,double *e)
{
double m;
m=-0.5*b/a;
*e=m;
}
void x()
{
printf("The equation has no root!\n");
}
这是改后正确的代码,以下是你代码的错误:
1.函数如果想在main中声明,不能在执行语句后声明。
2.当调用d(double a...)函数时,e和f作为参数穿过去只是他们的值,在函数内部对它们赋值是不能改变他们内存真正的值的。
3.if(s=0)是对s赋值使s=0,如果是判断应该是if(s==0)。
4.x函数中参数a、b、c没有用到,而且你已经把abc设为全局变量,就不需要把他们当成参数传递,所以我把所有变量都改为局部变量。
5.d函数的算法错误,应该是e=-(b+s)/2a;f=-(b-s)/2a;
6.你没有考虑当a=0,b=0,时的情况。
7.当b2-4ac0时,用sqrt开方就已经错误啦。
写的有些乱,见谅~