首页 > 解决方案 > 通过调用函数在 C 中打印一系列数字的值

问题描述

我正在做一个计算值的项目,ratio在这里,我想打印ratioin range within的值3 to 5

我想打印 3 到 5 范围内的值,如果 ratio< cratio,则应打印 3 到 5 范围内的升序比率。如果 ratio> cratio 那么 ratio 应该在 5 到 3 的范围内按降序打印。好吧,我只想打印一组值。我得到了两个集合,即比率打印为 - 3.05,3.52,4.5,4.5,3.52,3.05 等等。在哪里改进我的代码,以便仅显示temp2,之间的比率?LsLg3 to 5

这是我的代码:

float Calculate_RG(float r, int d, float cratio) {
    temp2 = d;
    y = ( pg / (p0 - pg) ) * (r / dm);
    LgD = 422 * ( (T * Z * Qg) / P ) * sqrt(y);
    Lg = LgD / temp2;
    Ls = Lg + (temp2 / 12);
    ratio = 12 * (Ls / temp2);

    if (ratio < 3) {
        temp2--;
        Calculate_RG(r, temp2--, ratio);
    } else if (ratio > 5) {
        temp2++;
        Calculate_RG(r, temp2, ratio);
    } else if (ratio > 3 && ratio < 5) {

        if (ratio > cratio) {
         printf("%d\t\t %0.2f\t\t %0.2f\t\t %0.2f\n\n", temp2, Lg, Ls, ratio);
            temp2--;
            Calculate_RG(r,temp2,ratio);
        } else if(ratio < cratio){
            printf("%d\t\t %0.2f\t\t %0.2f\t\t %0.2f\n\n", temp2, Lg, Ls, ratio);
            temp2++;
            Calculate_RG(r,temp2,ratio);            
        }
    }
cratio= ratio;
return cratio;
}

我哪里做错了??建议请!!

标签: cfunctionloopsif-statement

解决方案


你声明你的函数返回浮点数,但你从不返回值。

由于 C 是按值传递的,因此您不会更改递归调用 Calculate_RG 中的参数值。

temp2、Lg、Ls 和 ratio 有哪些类型?你是在这个函数之外声明它们,还是忽略编译器警告?这些(全局)变量的初始值是多少?

您对代码的大多数分支使用递归。您应该有一个明确的条件(递归保护)应该停止递归。什么终止条件(比率值等)应该导致您的递归停止?人们通常还期望通过递归将递归的返回值分配给调用函数使用或返回的变量。

添加一个 printf 以显示条件上方的各种值。您还可以传递一个“深度”参数,以便打印递归深度(有助于调试)。

printf("r:%f, d:%d, cratio:%f, temp2:%d, Lg:%d, Ls:%d, ratio:%d\n",
    r,d,cratio,temp2,Lg,Ls,ratio);
if(ratio < 3)

该函数将向您显示您的函数在遍历递归调用时采用哪个分支。

您的条件表达式处理比率值,

  • ratio < 3(这应该是 <= 3 吗?)
  • ratio > 3 && ratio < 5(应该是 >= 3 还是 <= 5?)
  • 比率 > 5(这应该 >= 5 吗?)

当比率 ==3 或 ==5 时,您的条件不会执行任何操作,因此您应该更改边界条件以包括这两个点,或者添加 else 来检测这些情况。(始终处理所有域值,即使您只是提供说明您忽略这些值的注释)。

  • 比率 == 3
  • 比率 == 5

您也对 ratio 和 cratio 进行相同的比较,

  • 比率 > 比率
  • 比率 < 比率
  • 当 ratio == cratio 时你想做什么?

当您的代码递减 temp2(两次)时,第一个可能是 --temp2 或 temp2--(没有语义差异),但第二个在您调用函数递减,这对您的程序没有后续影响(从未使用 temp2 /再次引用)。当 ratio 的值 <3 或 >5 时,您不会打印任何内容。

    temp2--;
    Calculate_RG(r, temp2--, ratio);
....
    temp2++;
    Calculate_RG(r, temp2, ratio);

推荐阅读