已知兩邊長求三角形面積


/*

題目:有一個一維數組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 ;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM