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日

悬赏问题

  • ¥50 资源管理器无法使用且一直崩溃重启
  • ¥15 用sql语句完成下列问题
  • ¥50 yalmip+Gurobi 求解线性规划
  • ¥15 微信开发者工具/云函数/数据库
  • ¥15 如何导出数据库中的表格
  • ¥15 Torch not compiled with CUDA enabled
  • ¥15 三种节点编号优化算法比较
  • ¥15 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥115 用Java解决探地雷达dzt文件的解析过程
  • ¥20 有关神经网络这道(b)determine the parameters of neural network