一个月C++小球回弹问题我为什么不进入循环

小球从 h 高度自由落下,每次落地后反弹至原高度的二分之一再落下,当反弹高度低于 0.05 时认为不再弹起。求第几次落地后小球不再弹起,经过的总路程是多少?

#include
int main()
{
float h; //h表示小球释放时离地面的高度
int n;
double s = 0; //s表示小球总共经过的距离
printf("请输入小球开始离地面的高度h\n");
scanf("%lf", &h);

for(n=0;h>0.05;n++)
{
    s=s+3/2*h;
    h=1/2*h;
}


printf("在%d次落地时共经过%.2lf米\n",n,s);
return 0;

}
为什么我这个结果都没有进循环呢?

有两个原因:
一、在scanf用%lf格式转换符来读取输入存入float类型的变量h,导致h的数据错误了;

二、高度变量h的数据类型float和它参与的运算不相符合,因为运算过程出现了小数,所以把它改为double类型更适合

另外因为需要运算结果为double类型,所以for循环里面的数加个.0后缀保证其为double运算,以便让运算结果正确。

然后根据参考链接,发现最后一次反弹的高度需要去除,因为这个高度小于了0.05,所以不需要把它计算在内。

参考链接:
一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高 - 张昊59 - 博客园

修改如下:

#include<stdio.h>
int main()
{
    double h; //h表示小球释放时离地面的高度
    int n;
    double s = 0; //s表示小球总共经过的距离
    printf("请输入小球开始离地面的高度h\n");
    scanf("%lf", &h);
    
    
//    printf("h=%f\n",h);
    
    for(n=0;h>0.05;n++)
    {
        s=s+3.0/2*h;
        //printf("s=%.f,h=%f",s,h);
        
        h=1.0/2*h;
                
    }
     //https://www.cnblogs.com/xitidaan/p/14750290.html
    s-=h;
    printf("在%d次落地时共经过%.2lf米\n",n,s);
    return 0;
}


img