c语言 一元二次方程 改错

作者&投稿:艾剂 (若有异议请与网页底部的电邮联系)
C语言解一元二次方程改错~

#include
#include
void main()
{
float a,b,c,delta,x1,x2;
printf("请输入a,b,c
");
scanf("%f,%f,%f",&a,&b,&c);
if(a=0) //1
printf("
x=%.2f",-c/b);
else //2
delta=b*b-4*a*c;
if(delta>0) //5
x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);
printf("
x1=%.2f,x2=%.2f",x1,x2); //5
else if(delta=0) //4
printf("
x1=x2=%.2f",-b/(2*a));
else(delta<0)
printf("
x1=%.2f+%.2fi,x2=%.2f-%.2fi",-b/2,sqrt(-delta)/2,-b/2,sqrt(-delta)/2); //3
//2
getch();
}


1 if(a==0)
2 加组{}
3 答案貌似是错的,printf("
x1=%.2f+%.2fi,x2=%.2f-%.2fi",-b/2,sqrt(-delta)/2,-b/2,sqrt(-delta)/2),应该/(2*a),不是/2
4 else if(delta==0)
5 加组{}

(1)的方法是错的,因为float精度有限,最多只能保存7位有效数字,所以b的值在计算机中保存的实际上是-1.0e+12,那个额外的1是没法保存下来的,不信的话,你可以用下面的代码测试下.
#include
#include
void main( )
{float a,b;
a=1.0e+12+1.0;
b=1.0e+12;
printf("%e
",a-b);
}

同理,求出的p值理论上应该是sqrt((1e12-4)*1e12),但因为4与1e12相比实在太小,在float的精度下是没法记录的,所以计算机中保存的p值和-b的值是一样的,都是-1e12,所以-b-p只能得到0.求出的x2是0,而正解应该是1.

(3)用了double,精度足够大,可以保存15-16位有效数字,因此b,p的值都是相对精确的,求出的解是正确的.

(2)用了个小技巧,确保了不做-b和p值的减法,而只做加法,这样不会因为float精度不够导致两个理论上有较小差距的数,相减时产生差为0的情况.

/*你好a,b,c不能是int和double型的
若为int型的后面都必须强制转换成double型才能得到浮点型的结果,麻烦!
若为double型的不能进行if(a==0&&b==0)的判断!
在我的编译器上是这样,不知你的!*/
#include "stdio.h"
#include "math.h"
main()
{
float a,b,c;//将int改为float
double d,e,f;
scanf("%f%f%f",&a,&b,&c);//%d改为%f
if(a==0&&b==0)printf("Input error!\n");
else if(a==0&&b!=0)
printf("x=%.6lf\n",double(-c)/b);//强制转换成double型
else{
d=b*b-4*a*c;
e=-b/(a*2);
if(d>=0){
f=sqrt(d)/(2*a);
if(e+f==e-f)printf("x1=x2=%.6lf\n",e+f);
else printf("x1=%.6lf\nx2=%.6lf\n",e+f,e-f);
}
else{
f=sqrt(-d)/(2*a);
if(e==0)printf("x1=%.6lfi\nx2=-%.6lfi\n",f,f);
else printf("x1=%.6lf+%.6lfi\nx2=%.6lf-%.6lfi\n",e,f,e,f);
}
}
}

#include<stdio.h>
#include<math.h>
main(){
int a,b,c;
int t;
printf("请输入数字\n");
a=b=c=t=0;
scanf("%d %d %d",&a,&b,&c);
if(a==0){printf("input error!\n");}
t=b*b-4*a*c;
if (t<0)
{
printf("x1=%.6lf+%.6lfi\n",-b/2.0/a,sqrt(-t)/2/a);
printf("x1=%.6lf-%.6lfi\n",-b/2.0/a,sqrt(-t)/2/a);

}
else
{
printf("x1=%.6lf+0i\n",-b/2.0/a+sqrt(t)/2/a);
printf("x1=%.6lf+0i\n",-b/2.0/a-sqrt(t)/2/a);
}
}

把a,b,c的类型定义为float或者double 但不要是int .

若为double型的不能进行if(a==0&&b==0)的判断!
a==0.0即可


乌达区18683821301: C语言解一元二次方程改错 -
包钢凯乐: #include#include void main() { float a,b,c,delta,x1,x2; printf("请输入a,b,c\n"); scanf("%f,%f,%f",&a,&b,&c); if(a=0) //1 printf("\nx=%.2f",-c/b); else //2 delta=b*b-4*a*c; if(delta>0) //5 x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a); printf("\...

乌达区18683821301: C语言解一元二次方程改错 -
包钢凯乐: #include<stdio.h>#include<math.h>void main(){ float a,b,c,delta,x1,x2; printf("请输入a,b,c\n"); scanf("%f,%f,%f",&a,&b,&c); if(a=0) //1 printf("\nx=%.2f",-c/b); else //2 delta=b*b-4*a*c; if(delta>0) //5 x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))...

乌达区18683821301: c语言改错题 有关求一元二次方程ax2+bx+c=0的两个实根 -
包钢凯乐: (1)的方法是错的,因为float精度有限,最多只能保存7位有效数字,所以b的值在计算机中保存的实际上是-1.0e+12,那个额外的1是没法保存下来的,不信的话,你可以用下面的代码测试下.#include <math.h>#include <stdio.h> void main( ) {float ...

乌达区18683821301: 我写的一元二次方程求解的C语言不知道哪里不对,怎么改 谢谢高手 -
包钢凯乐: else后的(14,15行)X1==……吗?要改为赋值语句X1=……!你没有搞清==和=的关系.还有,浮点数不要与0做比较,0.00==0吗?对编译器来说是个难题.第八行改为if((b*b-4*a*c)<0.00001)

乌达区18683821301: 用c语言解一元二次方程,求大神看看错在哪,怎么改 -
包钢凯乐: 第一,如果VS版本较高,则要关闭C4996警告,否则报错;第二,尽量不要用float,double才是默认类型,否则误差较大;第三,if else if结构中最后一个else不要加上条件;第四,这样计算二次方程的根误差很大,不宜直接用求根公式;

乌达区18683821301: 请教高手,用C语言求一元二次方程的解错在哪里?
包钢凯乐: #include "stdio.h" #include "math.h" /*求一元二次方程ax*x+bx+c=0的解*/ main() { float a,b,c,x1,x2,d; printf("请输入a:"); scanf("%f",&amp;a); printf("请输入b:"); scanf("%f",&amp;b); printf("请输入c:"); scanf("%f",&amp;...

乌达区18683821301: C语言编出来的一元二次方程 程序错误
包钢凯乐: x1和x2不能定义成int,应该定义成浮点型;还有,你的if后面没有用大括号括起来;给你贴个以前写的例子,希望对你有所帮助: void main(){int ia,ib,ic; int delta; double x1,x2; cin>>ia>>ib>>ic;//ia不能为0 if (ia==0){ cout<<"a不能为0"<<endl; ...

乌达区18683821301: C语言计算一元二次方程出错 -
包钢凯乐: 你这边少个判断,当f=0的时候只有一个解.还有.是除以2a,不是除2乘以a;

乌达区18683821301: C语言 一元二次方程为什么错? -
包钢凯乐: if(delta=0)应该是 if(delta==0)else(delta<0){printf("无解.");}应该是else if(delta<0) 或者去掉(delta<0)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网