JackyX1ng 2022-10-22 09:24 采纳率: 66.7%
浏览 31
已结题

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

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

#include<stdio.h>
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;

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

  • 写回答

1条回答 默认 最新

  • a5156520 2022-10-22 10:37
    关注

    有两个原因:
    一、在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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月30日
  • 已采纳回答 10月22日
  • 创建了问题 10月22日

悬赏问题

  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 添加组件无法加载页面,某块加载卡住
  • ¥15 网络科学导论,网络控制
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错