[求助]关于函数求根的问题
题目如下:求方程ax+bx+c=0的根,用3个函数分别求当b-4ac大于0、等于0和小于0是的根,并输出结果。从主函数输入a、b、c的值。
以下是我的程序:
#include<math.h>
float disc,x1,x2,p,q;
float rootzero(float a,float b) /*定义一个函数,用来求disc=0时方程的根*/
{
x1=x2=-b/(2*a);
}
float rootlarge(float a,float b) /*定义一个函数,用来求disc>0时方程的根*/
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
}
float rootsmall(float a,float b) /*定义一个函数,用来求disc<0时方程的根*/
{
p=-b/(2*a);
q=sqrt(disc)/(2*a);
}
main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
disc=b*b+4*a*c;
printf("root:\n"); /*到这里都可以输出*/
if(disc<0)
{rootsmall(a,b);
printf("x1=%5.2f,x2=%5.2f\n",x1,x2);
}
else if(disc>0)
{rootlarge(a,b);
printf("x1=%5.2f+%5.2fi,x2=%5.2f-%5.2fi\n",p,q,p,q);
}
else rootzero(a,b);
printf("x1=%5.2f,x2=%5.2f\n",x1,x2);
}
我的程序运行后,输出到"root:",然后就显示"sqrt:DOMAIN error",然后换一行才显示x1,x2;
而却结果也不正确,我想了一下午也不明白到底那里错了.
各位朋友帮我看看程序那里出错了!先谢谢了!
----------------解决方案--------------------------------------------------------
以下是引用tomddr在2006-3-6 20:29:00的发言:
题目如下:
求方程ax+bx+c=0的根,用3个函数分别求当b-4ac大于0、等于0和小于0是的根,并输出结果。从主函数输入a、b、c的值。
以下是我的程序:
#include<math.h>
float disc,x1,x2,p,q; /*它们不应该定义为全局变量*/
float rootzero(float a,float b) /*定义一个函数,用来求disc=0时方程的根*/
{
x1=x2=-b/(2*a); /*你的函数没有返回值,主调函数无法使用*/
}
float rootlarge(float a,float b) /*定义一个函数,用来求disc>0时方程的根*/
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
}
float rootsmall(float a,float b) /*定义一个函数,用来求disc<0时方程的根*/
{
p=-b/(2*a);
q=sqrt(disc)/(2*a);
}
main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
disc=b*b-4*a*c;
printf("root:\n"); /*到这里都可以输出*/
if(disc<0)
{rootsmall(a,b);
printf("x1=%5.2f,x2=%5.2f\n",x1,x2);
}
else if(disc>0)
{rootlarge(a,b);
printf("x1=%5.2f+%5.2fi,x2=%5.2f-%5.2fi\n",p,q,p,q);
}
else rootzero(a,b);
printf("x1=%5.2f,x2=%5.2f\n",x1,x2);
}
我的程序运行后,输出到"root:",然后就显示"sqrt:DOMAIN error",然后换一行才显示x1,x2;
而却结果也不正确,我想了一下午也不明白到底那里错了.
各位朋友帮我看看程序那里出错了!先谢谢了!
题目如下:
求方程ax+bx+c=0的根,用3个函数分别求当b-4ac大于0、等于0和小于0是的根,并输出结果。从主函数输入a、b、c的值。
以下是我的程序:
#include<math.h>
float disc,x1,x2,p,q; /*它们不应该定义为全局变量*/
float rootzero(float a,float b) /*定义一个函数,用来求disc=0时方程的根*/
{
x1=x2=-b/(2*a); /*你的函数没有返回值,主调函数无法使用*/
}
float rootlarge(float a,float b) /*定义一个函数,用来求disc>0时方程的根*/
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
}
float rootsmall(float a,float b) /*定义一个函数,用来求disc<0时方程的根*/
{
p=-b/(2*a);
q=sqrt(disc)/(2*a);
}
main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
disc=b*b-4*a*c;
printf("root:\n"); /*到这里都可以输出*/
if(disc<0)
{rootsmall(a,b);
printf("x1=%5.2f,x2=%5.2f\n",x1,x2);
}
else if(disc>0)
{rootlarge(a,b);
printf("x1=%5.2f+%5.2fi,x2=%5.2f-%5.2fi\n",p,q,p,q);
}
else rootzero(a,b);
printf("x1=%5.2f,x2=%5.2f\n",x1,x2);
}
我的程序运行后,输出到"root:",然后就显示"sqrt:DOMAIN error",然后换一行才显示x1,x2;
而却结果也不正确,我想了一下午也不明白到底那里错了.
各位朋友帮我看看程序那里出错了!先谢谢了!
你的程序问题挺多的,还有很多问题你没有考虑到如果a==0的时候先等等,你先看看书上的那个例子,再改
----------------解决方案--------------------------------------------------------
你的程序问题多多
你连disc的表达式都弄错了
----------------解决方案--------------------------------------------------------
还有一点就是,disc>0或者disc<0这两个条件对int型数字来说会很容易界定
但是换了float型就不好界定了,而且你还使用了sqrt(disc)呢,那就更难界定其大小了
你是要求它小数点后面多少个0开始算是小于0呢?
----------------解决方案--------------------------------------------------------
关于判断等于0的问题
#define M 0.000001
……………………
………………
if(fabs(disc)<=M)
认定其等于0
----------------解决方案--------------------------------------------------------
我在书上帮你抄了个程序。给你参考
#include<stdio.h>
#include<math.h>
int root(float a,float b,float c,float *x1,float *x2)
{float d;
d=b*b-4*a*c;
if(d<0)
return 0;
else if(d==0)
{*x1=(-b)/(2*a);
return 1;
}
else
{ *x1=(-b+sqrt(d))/(2*a);
*x2=(-b-sqrt(d))/(2*a);
return 2;
}
}
void disp(float a,float b,float c)
{int n;
float x1,x2;
printf("方程系数:%g,%g,%g,",a,b,c);
n=root(a,b,c,&x1,&x2);
switch(n)
{case 0:printf("无实根\n");break;
case 1:printf("一个根:x=%g\n",x1);break;
case 2:printf("两个根:x1=%g,x2=%g\n",x1,x2);break;
}
}
main()
{disp(3.5,2.3,4.8);
disp(2,4,2);
disp(2.5,3.6,-2);
getch();
}
----------------解决方案--------------------------------------------------------
潭浩强书中有这个程序
----------------解决方案--------------------------------------------------------
谢谢各位的帮助.
二楼的朋友,我的被调函数是没返回值,但x1,x2,p,q是全局变量,可供主函数使用呀!不过其他的地方的确考虑不够,正向4,5楼所说的,恩,想一下再说!
----------------解决方案--------------------------------------------------------