已知两边长求三角形面积
/*
题目:有一个一维数组score,内放10个学生成绩,求平均值。
*/
#include <stdio.h>
int main( )
{ float average(float array[10]);
float score[10],aver;
int i;
printf("input 10 scores:\n");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
printf("\n");
aver=average(score);
printf("average score is%5.2f\n",aver);
return 0;
}
float average(float array[10])
{int i;
float aver,sum=array[0];
for(i=1;i<10;i++)
sum=sum+array[i];
aver=sum/10;
return(aver);
}
————谭浩强 ,《C程序设计》(第四版),清华大学出版社, 2010年6月,p194
这段代码中存在很多问题。
首先,从题目中的“有一个一维数组score,内放10个学生成绩”来看,数组score中的数据应该是已知的。然而代码却从键盘输入这些数据。所以如果不是题目有问题就是代码有问题。两者必居其一。
即使是从键盘输入,相应的代码也不应该写在main()中,因为这段代码与后面的“aver=average(score);” 明显不属于同一个代码层次。这种毛病,有人称之为“颗粒度不均匀”。 “颗粒度不均匀”的代码就犹如在说明一座建筑的框架时,同时喋喋不休地说起了这座建筑内部粉刷墙体的涂料的型号与价格,非常不伦不类。这样的代码由于层析混乱不清而难以阅读和维护。(参见§55)
更严重的一个毛病在“aver=average(score);”。这里main()函数向average()函数传递了一个实参score,这个实参是一个数组名,它原本的类型是数组类型“float [10]”。然而,作为实参的数组名却并非“float [10]”类型而是“float *”类型(有人把这称之为“退化”),也就是说这里的实参score本质只是一个指向某个float类型数据的指针而已,它本身并不包含任何数组大小方面的信息。
要求average()求一组float类型数据的平均值,却只告诉了它其中一个数据的位置,对于average()函数来说,若不走歪门邪道的话,这显然是一个不可能完成的任务。这与要求别人计算三角形面积,却只告诉别人两条边长没什么两样。
再来看函数类型声明
float average(float array[10]);
除了位置不当外,这个函数类型声明中,参数的类型被写成了“float [10]”类型,然而这个10编译器是根本不予理会的。换句话说,这里你写10也好,写100也好,甚至什么都不写,编译器都会予以忽视。那么请问,写这个10有什么意义吗?没有任何意义!写这个10不表示你勤奋,只说明你在这里稀里糊涂,很可能也把别人也弄得稀里糊涂。
同样average()函数定义中也有这个毛病:
float average(float array[10])
{int i;
float aver,sum=array[0];
for(i=1;i<10;i++)
sum=sum+array[i];
aver=sum/10;
return(aver);
}
描述形参类型时,[]内的10没有任何意义,写了等于白写。这样,这个函数内部循环语句中的10以及“aver=sum/10;”中的10就不是“其来有自”,而是从天而降。这种莫名其妙的常数叫做“Magic number”,被公认是低劣代码的标志。
或许有人会为这个average()函数定义辩护说这是专门求10个float数据平均值的函数。这种辩解牵强得近乎狡辩。专门为求10个float数据的平均值写一个函数,是否还要再专门为求11个float数据的平均值再写一个函数?难道你会在大门上开两个洞,一个作为猫洞,一个作为狗洞?
如果写一个函数,它不但适用求10个float数据平均值,同样适用求11个float数据平均值,专门求10个float数据平均值这样的函数你还好意思写得出手吗?
最后,在给出修改代码之前,简单提一下样本代码的其他几处毛病:
main()中的aver变量毫无必要,占用时间和空间资源。
average()中的aver变量基于同样的原因毫无必要。
return(aver);,风格怪异。
sum=sum+array[i];,与C语言简洁的作风相悖。
下面是修改后的代码:
/* 题目:有一个一维数组score,内放10个学生成绩,求平均值。 */ #include <stdio.h> float average( float [], size_t ); int main( void ) { float score[10] = {100,56,78,98,67.5,99,54,88.5,76,58} ; printf ( "平均值为%5.2f\n" , average( score , sizeof score / sizeof score[0]) ); return 0; } float average( float array[], size_t n) { float sum=0.F; size_t i; for (i = 0 ; i < n ; i++ ) sum += array[i]; return sum / n ; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步