#include <stdio.h>
int main()
{void search(float (*p)[4],int n);
float score[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}};
search(score,3);
return 0;
}
void search(float (*p)[4],int n)
{int i,j,flag;
for(j=0;j<n;j++)
{flag=0;
for(i=0;i<4;i++)
if(*(*(p+j)+i)<60)flag=1;
if(flag==1)
{printf("No.%d fails,his scores are:\n",j+1);
for(i=0;i<4;i++)
printf("%5.2f ",*(*(p+j)+i));
printf("\n");
}
}
}
————譚浩強 ,《C程序設計》(第四版),清華大學出版社, 2010年6月,p254
有一種收拾房間的方法叫做“表面光”,一般用於應付客人短時間內就要來造訪。具體的實施方法就是,把房間里的一切雜物,像什么化妝品啊、內衣啊、零食啊、外褲啊、還沒來得及洗的餐具啊、襪子啊、鞋子啊等等等等統統都一股腦地塞到一個大紙箱中。
這種方法省時見效快,可以讓房間在極短的時間內“顯得”很整潔。只要你能接受房間像毛坯房那樣空曠的“整潔感”並且甘於忍受把食品和襪子放在一起。
樣本代碼就是這種“表面光”方法在C代碼中的具體應用。main()中空空盪盪:只有一個不應該放在這里的函數類型聲明“void search(float (*p)[4],int n);”;一套程序所要處理的數據對象“float score[3][4]”;還有一個大紙箱子的鑰匙“search(score,3);”。
把函數類型聲明放在某個函數內就猶如把共用的垃圾箱擺在自己房間里(參見§55):自己專用,讓別的函數用不成,除非其他函數自己再備一個。
把程序所要處理的數據放在main()雖然無可非議,但是在main()中對數據沒有做任何處理,只是把它徹底地與處理它的函數分離開來,猶如把原料堆在 了遠離加工場的地方。這種做法其實倒不如把search()函數中的代碼寫在main()中,因為這樣可以省去傳遞參數的資源開銷。就仿佛盡管房間不甚整 潔,但需要用的東西卻可以隨手拿得到。
再來看那個堆滿雜物的大紙箱——search()函數的定義。由於main()中空空盪盪,就必須把所有的雜物都藏在這里。這里不但堆積了查找構成 score數組的各個一維數組中哪個含有小於60的元素的功能,還塞進來了一個輸出一維數組各個元素的功能,這使得search()函數不但名不副實,而 且臃腫不堪。
非但如此,這里面還塞進了一個散發着餿味腐朽不堪的flag變量(參見§88、§89、§90)。這個變量非但沒有必要,而且使得程序的效率變得低下(flag=1以后至少應該立即break)。
以上就是在C代碼中應用“表面光”方法的實施秘訣。
與這種“表面光”風格不同的另一種收拾房間的方法則是:並不追求房間的空洞感但只在房間中擺放必要的物品,且擺放在恰當好處的位置。這種方法也不排斥使用紙箱,但絕對不使用一只紙箱,而是把物品分門別類地放在各種不同的箱子中。
用這種方式寫出的C代碼是這樣的:
#include <stdio.h> #define TRUE 1 #define FALSE 0 #define PASSMARK 60.0F int less_than (float * , float * const , float const); void output(float * , float * const); int main( void ) { float score[3][4] = { {65,57,70,60}, {58,87,90,81}, {90,99,100,98} }; for( int i = 0 ; i < sizeof score/sizeof *score ; i++ ) if( less_than ( *(score+i) , *(score+i+1) , PASSMARK ) == TRUE ) { printf("No.%d fails,hid scores are:\n",i+1); output(*(score+i) , *(score+i+1) ); } return 0; } void output(float *p_begin , float * const p_end ) { while( p_begin < p_end ) printf("%5.2f ", *p_begin++); putchar('\n'); } int less_than (float *p_begin , float * const p_end , float const passmark ) { while( p_begin < p_end ) if( *p_begin++ < passmark ) return TRUE; return FALSE; }