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

一个月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 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用