我的教授在课堂上给了我们这个代码来展示一个程序是如何工作的,然后说“回家试试看,你会发现它有效”...... 30分钟后我就无法运行了。有人可以帮助我,并指出我正确的方向。谢谢!
-I得到函数定义“double g(double x)” - 在x_left = x_mid控件到达非空函数结束的第一个
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define FALSE 0
#define TRUE 1
#define NO_ROOT -99999.0
//function prototypes
double bisect(double, double, double, double f(double farg));
// evaluation of function
double g(double);
double h(double);
int main(void) {
double x_left, x_right, epsilon, root; //declare variables
// get endpoint and error tolerance
printf("\nEnter interval endpoints > ");
scanf("%lf%lf", &x_left, &x_right);
printf("\nEnter tolerance > ");
scanf("%lf", &epsilon);
//use bisect function to look for roots of functions
printf("\n\n For function g(x)");
root = bisect(x_left, x_right, epsilon, g);
if (root != NO_ROOT)
printf("\n g(%.7f) = %e\n", root, g(root));
printf("\n\n For function h(x)");
root = bisect(x_left, x_right, epsilon, h);
if (root != NO_ROOT)
printf("\n h(%.7f) = %e\n", root, h(root));
system("pause");
return (0);
}
// bisection method program coding
double bisect(double x_left, double x_right, double epsilon, double f(double farg)){
double x_mid, f_left, f_right, f_mid;
int root_found;
// computes function at initial end points
f_left = f(x_left);
f_right = f(x_right);
// if no change in sign
if (f_left * f_right > 0) {
printf("\nmay not be no root in [%.7f, %.7f]\n\n", x_left, x_right);
return NO_ROOT;
}
// searches as long as interval size is large enough
root_found = FALSE;
while (fabs(x_right - x_left) > epsilon && !root_found) {
// compute the mid point
x_mid = (x_left + x_right) / 2.0;
f_mid = f(x_mid);
if (f_mid == 0.0) {
root_found = TRUE;}
else if (f_left * f_mid < 0.0) {
x_right = x_mid;
} else {
x_left = x_mid;
}
// trace loop execution
if (root_found)
printf("\nRoot found at x = %.7f , midpoint of [%.7f, %.7f] ", x_mid, x_leftx_right);
else
printf("\nNew interval is [%.7f, %.7f] \n\n", x_left, x_right);
//if there is a root
return ((x_left + x_right)/2.0);
}
// functions for which roots are sought
double g(double x){
return (5 * pow(x, 3.0) - 2 * pow(x, 2.0) +3);
}
double h(double x){
return (pow(x, 4.0) - 3 * pow(x,2.0) - 8);
};
}
答案 0 :(得分:1)
我在这一行收到错误:
printf("\nRoot found at x = %.7f , midpoint of [%.7f, %.7f] ", x_mid, x_leftx_right
说x_leftx_right
未声明。
如果我将其更改为x_left, x_right
,则除了“对g的未定义引用”和“对h的未定义引用”之外,它编译正常。
未定义引用g
的原因是您从未为由g
原型化的函数double g(double);
提供函数定义。您确实在g
中提供了嵌套函数bisect
。嵌套函数是非标准扩展,bisect::g
是与g
不同的函数。同样适用于h
。
要解决此问题,请将g
和h
的定义移至bisect
函数结尾之后;而不是在那个功能里面。
“控制到达非void函数结束”警告的原因可能是因为return
循环后没有while
语句。
您的行return ((x_left + x_right)/2.0);
行位于由while (fabs(x_right - x_left) > epsilon && !root_found) {
开始的循环内。如果循环条件完成此循环不再为真,那么执行将在函数结束时返回,而不返回任何内容。
NB。如果您正确缩进代码以便排列{
,那么您不太可能遇到此类问题。您的编辑器应该有一个密钥,您可以使用它来查找匹配的大括号。此外,在严格标准模式下运行编译器会产生有关嵌套函数使用的错误。
`