[英]How to break out of a loop in C
我正在编写一个二等分方法算法来查找多项式的根。 我的代码的第二部分说,如果变量FP
等于0或ba
绝对值,它将破坏if语句。
我希望程序完全停止for循环(迭代)并返回p。 最后,我想打印获得解决方案所需的迭代次数,但显然使用我的printf语句,它表明程序即使在获得根(零)的情况下仍继续执行。
关于如何停止整个机制并返回p的值为零(它的值为零)和所花费的确切迭代次数的任何想法? 谢谢
double computeroots(double a, double b, double epsilon, int MaxIter)
{
double FA = pow(a,4) -4*a + 1;
double FB = pow(b,4) - 4*b + 1;
double FP;
double p;
int i;
for(i=0;i<MaxIter;i++) {
if(FA * FB < 0) {
p = a + (b-a)/2;
FP = pow(p,4) - 4*p +1;
if(FP == 0 || abs(b-a) < epsilon) {
return p;
break;
} else if (FA * FP >0) {
a =p;
FA = FP;
} else {
b = p;
FB = FP;
}
i++;
}
}
printf("The number of iterations is: %d\n", i);
}
您的printf
语句未命中,因为您的return p;
值为return p;
在break
语句之前。 return
语句立即退出该函数。
您需要将return
语句移至printf
,或将printf
移至return
之前:
if(FP == 0 || abs(b-a) < epsilon)
{
printf("the number of iterations is : %d\n", i);
return p;
}
...
printf("failed to converge after %d iterations\n", i);
return p;
}
如果您有return
语句,则break
语句将无用。 返回值将退出函数范围,并返回到调用方,因此以后不再执行任何指令。
所以这:
return p;
break;
应该变成:
printf("the number of iterations is : %d\n", i);
return p;
如果您发现出口条件选择不正确,我想那可能是一个有限精度问题 。 您正在检查FP == 0
但是FP
是double
因此当FP
足够接近0而不是完全相等时,您必须停止。 例如: abs(FP) < epsilon
。
当您需要返回多个值时,可以使用外参数。 将功能更改为
double computeroots(double a, double b, double epsilon, int MaxIter, int *numIterations)
这样称呼它:
int numIter;
soln = computeroots(a, b, epsilon, MaxIter, &numIter);
在返回之前,在函数中添加:
*numIterations = i;
合并所有必要的修改:
double computeroots(
double a,
double b,
double epsilon,
size_t MaxIter,
size_t * pNumIter
)
{
double FA = pow(a,4) -4*a + 1;
double FB = pow(b,4) - 4*b + 1;
double FP;
double p = NaN;
size_t i;
for(i=0; i<MaxIter; ++i) {
if(FA * FB < 0) {
p = a + (b-a)/2;
FP = pow(p,4) - 4*p +1;
if(FP == 0 || abs(b-a) < epsilon) {
break;
} else if (FA * FP >0) {
a =p;
FA = FP;
} else {
b = p;
FB = FP;
}
}
}
*pNumIter = i;
printf("the number of iterations is : %z\n", *pNumIter);
return p;
}
这样称呼它:
double a, b, epsilon;
size_t sizeMax, sizeIterations;
... /* some initialisations here */
double d = computeroots(a, b, epsilon, sizeMax, &sizeIterations);
修改说明:
return
int
s更改为size_t
,因为unsigned
类型更适合计数器 size_t
变量的引用以返回迭代次数 i
第二个增量 您可以返回一个双精度数组,其中第一个元素是结果,第二个元素是迭代次数。
或者,您将对变量的引用传递给函数,然后分配给它,如下所示:
double compute_something(int param1, int param2, int* iterations) {
// your code ...
// when you want to return, use this:
*iterations = 5;
return 1.23;
// your code ...
}
int iter;
double result = compute_something(1,2, &iter);
此后,结果包含结果,并迭代您存储的迭代次数。 此解决方案可能会更好,因为您不会将迭代次数(显然是整数)返回为双精度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.