• 代码点评:小球下落


    题目:

    一球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下。求它在第10次触地时,在空中共经过了多少m?第十次反弹多高?
    结果:299.609375 0.097656
    策略:用循环语句模拟每次下落/弹起的过程

    有位同学给我寄来了下面的代码:

    0001 #include<stdio.h>
    0002 int main()
    0003 {
    0004     double n, i, x=0;
    0005     scanf("%lf", &n);
    0006     for(i=2;i<=10;i++){
    0007         n=n/2;
    0008         x=2*n+x;
    0009     }
    0010     x=x+100;
    0011     printf("%lf\n", x);
    0012     return 0;
    0013 }
    
    

      我试了一下,tcc,输入100,输出:299.609375。尽管结果是正确的,但还存在这样几个问题:

      1. 题目还要求计算“第10次触地后反弹多高?”这里的代码没有给出答案。

      2. 第4行的 n, i, x 没有注释说明。哪怕是程序员自己,1周以后恐怕也忘了这些变量代表什么了。

      3. 作为循环的控制变量,把 i 定义为 double 是很不明智的。事实上,这里的 i 指的是“小球第 i 次触地”。从本质上说,i 就应该是一个整数:不可能存在第2.3次触地这种情况。

        (这是初级程序员很容易犯的错误,要谨记!)

        修正之后,我给出如下代码:

        0001 #include<stdio.h>
        0002 int main()
        0003 {
        0004     double n, /*第i次触地前,小球所处的最高高度*/
        0005         x=0;  /*小球在空中经过的路程*/
        0006     int i;    /*小球第i次触地*/
        0007 
        0008     printf("小球的起始高度(米):");
        0009     scanf("%lf", &n);
        0010     for(i=2;i<=10;i++){
        0011         n=n/2;
        0012         x=2*n+x;
        0013     }
        0014     x=x+100; /*累加小球第一次触地前所经过的100米*/
        0015     printf("小球共经过:%lf米\n", x);
        0016     printf("第十次触地后,反弹:%lf米", n/2);
        0017     return 0;
        0018 }
        

        运行的结果如下:

        D:\temp>tcc -run test.c

        小球的起始高度(米):100

        小球共经过:299.609375米

        第十次触地后,反弹:0.097656米

        记住:用注释说明自己为什么要这样写代码?为什么要定义这些变量?为什么要……

        我原来给出的代码,请下载“算法竞赛”》“源代码”》“e7.c”和“e7.1.c”。

      1. 相关阅读:
        (五)SpringCloud学习系列-构建部门微服务消费者Module
        (四)SpringCloud学习系列-构建部门微服务提供者Module
        (三)SpringCloud学习系列-Rest微服务构建
        git提交 显示作者名不是自己
        linux一些常见命令
        支付宝退款demo
        ffmpeg截取视频
        excel导入数据到mysql
        二分法与冒泡排序
        mysql的级联删除
      2. 原文地址:https://www.cnblogs.com/fzd19zx/p/1941692.html
      Copyright © 2020-2023  润新知