#include <stdio.h>
int lg(int);
main()
{
int i,N;
for(i=1,N=10;i<=6;i++,N*=10)
printf("%7d %2d %9d\n",N,lg(N),N*lg(N));
}
int lg(int N)
{
int i;
for(i=0;N>0;i++,N/=2);
return i;
}
3-2:该程序计算整数数列x1,x2……,xN的平均值μ和标注偏差σ。这个数列由库函数rand生成,平均值μ和标准偏差σ的数学定义如下:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
typedef int Number;
Number randNum()
{return rand();}
main(int argc,char *argv[])
{
int i,N=atoi(argv[1]);
float m1=0.0,m2=0.0;
Number x;
for(i=0;i<N;i++)
{
x=randNum();
m1+=((float)x)/N;
m2+=((float)x*x)/N;
}
printf(" Average:%f\n",m1);
printf("Std.deviation:%f\n",sqrt(m2-m1*m1));
}

让程序3-2能作用于其他数值类型(比如float,而不是int),最简单的办法是复制该文件,再将typedef修改成:
typedef float Number
同时将函数randNum修改成:
return 1.0*rand()/RAND_MAX;
(他将返回0到1之间的随机浮点数)
在C中另一种途径是把typedef和randNum放到一个单独的头文件中(假设为Num.h),在3-2的代码中用下面的指令替换他们:
*include "Num.h"
接着,我们就可以用不同的typedef和randNum编写第二个头文件。而且,改名其中的一个文件或其他Num.h,将任何一个应用到程序3-2的主程序中,不需要对他进行其他的修改。
第三种可选方案,这是关键工程实践值得推荐的方法,也就是将程序分解成3个文件: