已知两边长求三角形面积

/*

题目:有一个一维数组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 ;
}

 

 

posted @ 2011-12-31 21:31  garbageMan  阅读(5949)  评论(64编辑  收藏  举报