我正在做一个计算值的项目ratio
,我想在ratio
范围内打印3 to 5
的值。
我想打印范围3到5的值,这样如果比率<1。 cratio,然后应打印从3到5的升序比率。并且如果比率> cratio则应按照从5到3的范围内的降序打印。
好吧,我想只打印一组值。我得到的两个设定比率打印为 - 3.05,3.52,4.5,4.5,3.52,3.05等等。
在哪里改进我的代码,只显示temp2
之间的比率Ls
,Lg
,3 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;
}
我在哪里做错了?建议请!!
答案 0 :(得分:1)
你声明你的函数返回float,但你永远不会返回值。
由于C是按值传递,因此您不会更改递归调用的Calculate_RG中的参数值。
temp2,Lg,Ls和比率是什么类型?您是否在此函数之外声明它们,或忽略编译器警告?这些(全局)变量的初始值是什么?
您对代码的大多数分支使用递归。你应该有一个明确的条件(递归保护),递归应该停止。什么终止条件(比率值等)会导致你的递归停止?另外一个人通常希望通过递归将递归的返回值赋给调用函数使用或返回的变量。
添加printf以显示条件上方的各种值。您也可以传递一个'depth'参数,以便打印递归深度(有助于调试)。
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)
该函数将显示函数在遍历递归调用时所采用的分支。
您的条件表达式处理比率值
当比率== 3或== 5时,您的条件无效,因此您应更改边界条件以包含这两个点,或添加其他以检测这些情况。 (始终处理所有域值,即使您只是提供了一条表明您忽略这些值的注释)。
你也对比率和关键做同样的比较,
当你的代码递减temp2(两次)时,第一个可能是--temp2或temp2--(没有语义差异),但是第二个递减在之后你调用了函数,它没有对程序的后续影响(从不再使用/引用temp2)。当比率具有值<3或> 5时,您不打印任何内容。
temp2--;
Calculate_RG(r, temp2--, ratio);
....
temp2++;
Calculate_RG(r, temp2, ratio);
答案 1 :(得分:0)
您以递归方式调用Calculate_RG()
,但未在本地定义其变量。因此它们必须是全局变量,因此代码将失败。
此外,您不会使用函数的返回值。
最后在21世纪永远不会使用float
,除非你可以使用double
。