繁体   English   中英

如何突破C语言的循环

[英]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但是FPdouble因此当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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM