c语言求一元二次方程解
答案:2 悬赏:80
解决时间 2021-03-01 10:35
- 提问者网友:独菊痴梦
- 2021-02-28 10:10
#include
#include
int main()
{
float a,b,c,a2,x1,x2;double d;
printf("Input a,b,c\n");
scanf("%f,%f,%f",&a,&b,&c);
if(a==0&&b==0&&c!=0)
printf("Input error!\n");
else if(a==0&&b==0&&c==0)
printf("Input error!\n");
else if(a==0&&b!=0)
{x1=-c/b;
printf("x=%f",x1);
}
else if(a!=0&&b*b-4*a*c<0)
{
a2=2*a;
d=(-b*b+4*a*c)/a2 ;
x1=-b/(2*a)+sqrt(d);
x2=-b/(2*a)-sqrt(d);
printf("x1=%fi",x1);
printf("x2=%fi",x2);
}
else if(a!=0&&b*b-4*a*c==0)
{x1=-b/(2*a);
printf("x1=x2=%f",x1);
}
else (a!=0&&b*b-4*a*c>0)
;{
d=(-b*b+4*a*c)/(2*a);
x1=-b/(2*a)+sqrt(d);
x2=-b/(2*a)-sqrt(d);
printf("x1=%f",x1);
printf("x2=%f",x2);
return 0;
}
}
请问哪里有错误
最佳答案
- 二级知识专家网友:无字情书
- 2021-02-28 10:20
#include
#include
int main()
{
float a,b,c,a2,x1,x2,d;
printf("Input a,b,c\n");
scanf("%f,%f,%f",&a,&b,&c);
if(a==0&&b==0&&c!=0)
printf("Input error!\n");
else if(a==0&&b==0&&c==0)
printf("Input error!\n");
else if(a==0&&b!=0)
{x1=-c/b;
printf("x=%g",x1);
}
else if(a!=0&&b*b-4*a*c<0)
{
d=(-b*b+4*a*c);
printf("d=%f\n",d);
x1=-b/(2*a);
x2=sqrt(d)/(2*a);
printf("x1=%g+%gi\n",x1,x2);
printf("x2=%g-%gi\n",x1,x2);
}
else if(a!=0&&b*b-4*a*c==0)
{x1=-b/(2*a);
printf("x1=x2=%g\n",x1);
}
else if(a!=0&&b*b-4*a*c>0)
{
d=(-b*b+4*a*c);
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("x1=%g\n",x1);
printf("x2=%g\n",x2);
}
return 0;
}
全部回答
- 1楼网友:木子香沫兮
- 2021-02-28 11:05
多出一句“请正确输入,谢谢合作!”与“是否正确?(是y\否n)”的原因:
注意一下scanf,scanf并不是像通常所误解的,认为是直接读取用户的当前输入为输入值。
而是读取当前键盘缓冲区中的数据为本次输入值。
所以如果当前的键盘缓冲区内仍有数据,那么就不会接受当前的用户输入值。
在这个程序中,
由于键盘缓冲区内仍有用户上次输入数据时所残留的回车符(也就是输入a,b,c时最后敲的回车),
所以scanf("%c",&z); 这一句就将键盘缓冲区中的回车读入,作为z值了。
所以判断失败,多出一句“请正确输入,谢谢合作!”与“是否正确?(是y\否n)”。
改正办法:
在每句scanf前,加上强制清空键盘缓冲区的处理fflush(stdin);,以保证接收的数据的正确性。
这也是一个好的编程习惯。
改过以后的程序:
#include "stdio.h"
#include "math.h"
void main()
{
printf("求方程ax^2+bx+c=0的根:\n");
l: printf("请分别输入a,b,c的值。\n");
double a,b,c,x1,x2,x,y;
char z;
printf("a=");
fflush(stdin); //强制清空键盘缓冲区
scanf("%lf",&a);
printf("b=");
fflush(stdin); //强制清空键盘缓冲区
scanf("%lf",&b);
printf("c=");
fflush(stdin); //强制清空键盘缓冲区
scanf("%lf",&c);
printf("你所输入的方程为%lfx^2+%lfx+%lf=0。\n",a,b,c);
m: printf("是否正确?(是y\否n)\n");
fflush(stdin); //强制清空键盘缓冲区
scanf("%c",&z);
if (z=='n')
goto l;
else if (z=='y')
{
if ((b*b-4*a*c)>0)
x1=(-b+sqrt(b*b-4*a*c))/(2*a),
x2=(-b-sqrt(b*b-4*a*c))/(2*a),
printf("有两个不同的实根:\nx1=%lf\nx2=%lf\n",x1,x2),
printf("\n");
if ((b*b-4*a*c)==0)
x1=-b/(2*a),
printf("有两个相同的实根:\nx1=x2=%lf\n",x1),
printf("\n");
if ((b*b-4*a*c)<0)
x=-b/(2*a),
y=sqrt(4*a*c-b*b)/(2*a),
printf("有两表个不同的曾根:\nx1=%lf+%lfi\nx2=%lf-%lfi\n",x,y,x,y),
printf("\n");
goto l ;
}
else printf("请正确输入,谢谢合作!\n");
goto m;
}
我要举报
大家都在看
推荐资讯