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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装