代码点评:小球下落
题目:
一球从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 }
-
题目还要求计算“第10次触地后反弹多高?”这里的代码没有给出答案。
-
第4行的 n, i, x 没有注释说明。哪怕是程序员自己,1周以后恐怕也忘了这些变量代表什么了。
-
作为循环的控制变量,把 i 定义为 double 是很不明智的。事实上,这里的 i 指的是“小球第 i 次触地”。从本质上说,i 就应该是一个整数:不可能存在第2.3次触地这种情况。
(这是初级程序员很容易犯的错误,要谨记!)
我试了一下,tcc,输入100,输出:299.609375。尽管结果是正确的,但还存在这样几个问题:
修正之后,我给出如下代码:
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”。