标题:[求助]关于函数求根的问题
只看楼主
tomddr
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-6
 问题点数:0 回复次数:7 
[求助]关于函数求根的问题
题目如下:
求方程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;
而却结果也不正确,我想了一下午也不明白到底那里错了.
各位朋友帮我看看程序那里出错了!先谢谢了!
搜索更多相关主题的帖子: float 函数 disc 方程 定义 
2006-03-06 20:29
zhangjuan
Rank: 1
等 级:新手上路
帖 子:992
专家分:0
注 册:2006-1-19
得分:0 
以下是引用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;
而却结果也不正确,我想了一下午也不明白到底那里错了.
各位朋友帮我看看程序那里出错了!先谢谢了!

你的程序问题挺多的,还有很多问题你没有考虑到如果a==0的时候先等等,你先看看书上的那个例子,再改


2006-03-06 22:02
虫的传人
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2006-3-5
得分:0 
你的程序问题多多
你连disc的表达式都弄错了

好马不吃回头草 然而,我不是好马 可见,坏马也不吃回头草
2006-03-06 22:07
虫的传人
Rank: 1
等 级:新手上路
帖 子:88
专家分:0
注 册:2006-3-5
得分:0 
还有一点就是,disc>0或者disc<0这两个条件对int型数字来说会很容易界定
但是换了float型就不好界定了,而且你还使用了sqrt(disc)呢,那就更难界定其大小了
你是要求它小数点后面多少个0开始算是小于0呢?

好马不吃回头草 然而,我不是好马 可见,坏马也不吃回头草
2006-03-06 22:11
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
得分:0 

关于判断等于0的问题

#define M 0.000001
……………………
………………
if(fabs(disc)<=M)
认定其等于0


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-03-06 22:21
zhangjuan
Rank: 1
等 级:新手上路
帖 子:992
专家分:0
注 册:2006-1-19
得分: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();
}

2006-03-06 22:31
梦想中国
Rank: 2
等 级:新手上路
威 望:5
帖 子:539
专家分:0
注 册:2006-2-26
得分:0 
潭浩强书中有这个程序

2006-03-06 23:25
tomddr
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-3-6
得分:0 
谢谢各位的帮助.
二楼的朋友,我的被调函数是没返回值,但x1,x2,p,q是全局变量,可供主函数使用呀!不过其他的地方的确考虑不够,正向4,5楼所说的,恩,想一下再说!
2006-03-07 12:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-48767-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018728 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved