C,是一种信仰

代码点评:小球下落

题目:

一球从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”。

      posted @ 2011-01-21 22:00  胖乎乎的王老师  Views(635)  Comments(0Edit  收藏  举报
      Email 联系我:fzd19zx@qq.com