怎样整理房间
#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; }