组d。要求把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,其余依此类推,把100岁(含100)以上年龄的人数都放在d[10]中。
解析:首先将数组d的所有元素都初始化为0,然后从数组b的第一个元素开始判断,如果数组b的元素值大于或等于100,则数组元素d[10]加1,否则,数组元素d[数组b的元素值/10]加1。重复此操作,直到数组b的最后一个元素为止。
#include
{ int b[N]={32,45,15,12,86,49,97,3,44,52,17,95,63,14,76,88,54,65,99,102}; int d[M],i;
for(i=0;i if(b[i]>=100) d[10]++; else d[b[i]/10]++; for(i=0;i printf(\ printf(\} 【例4.21】编写程序,将一维数组x中大于平均值的数据移至数组的前部,小于等于平均值的数据移至数组的后部。 解析:先计算一维数组x的平均值,然后将大于平均值的数据存入数组y的前部,小于等于平均值的数据存入数组y的后部,最后将数组y复制到数组x。 #include float av,y[N],x[N]; for(i=0;i for(i=0;i for(i=j=0;i { y[j++]=x[i];x[i]=-1;} for(i=0;i if(x[i]!=-1) y[j++]=x[i]; for(i=0;i { x[i]=y[i];printf(\} 【例5.22】已知一维整型数组a中的数已按由小到大的顺序排列,编写程序,删去一维数组中所有相同的数,使之只剩一个。 解析:从数组a的第二个元素开始,与前面保留的最后一个元素作比较,若不相等,则 67 前移。重复此操作,直到数组a的最后一个元素为止。 #include { int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10}; int i,j; printf(\ for(i=0;i printf(\ for(j=1,i=1;i if(a[j-1]!=a[i]) a[j++]=a[i]; printf(\ for(i=0;i printf(\} 【例4.23】编写程序,把从键盘输入的一个数字字符串转换为一个整数并输出。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。要求:不得调用C语言提供的将字符串转换为整数的函数。 解析:设存放数字字符串的数组为s,存放对应整型数的变量为n(初始值为0)。若字符串的第一个字符为’-’,则从第二个字符开始,否则从第一字符开始,利用公式n=n*10+s[i]-‘0’进行转换,直到’\\0’为止。 #include { char s[10];long n=0; int i=0; printf(\ gets(s); if(s[0]=='-') i++; while(s[i]) { n=n*10+s[i]-'0';i++;} if(s[0]=='-') n=-n; printf(\} 【例4.24】编写程序,把N×N矩阵A加上矩阵A的转置,存放在矩阵B中。 解析:可先将A的转置存入B,再将A的元素a[i][j]累加到B的元素b[i][j]。也可直接利用转置性质,b[i][j]=a[i][j]+a[j][i]。 #define N 3 #include { int a[N][N]={{1,2,3},{4,5,6},{7,8,9}},b[N][N]; int i,j; for(i=0;i 68 b[i][j]=a[i][j]+a[j][i]; for(i=0;i printf(\ printf(\ } } 【例4.25】编写程序,将二维数组a[N][M]中每个元素向右移一列,最右一列换到最左一列,移动后的数组存到另一个二维数组b中,原数组保持不变。例如: a?415263 b?645312 解析:将数组a的最后一列元素存入数组b的第1列中,再依次将数组a的第i列存入数组b的第i+1列(0= #define N 3 #define M 3 main() { int a[N][M]={4,5,6,1,2,3,6,7,8},b[N][M],i,j; for(i=0;i printf(\ printf(\ } } 4.3 自测试题 1. 单项选择题 (1)以下定义语句中,错误的是( )。 A.int a[]={1,2}; B.char *a[3]; C.char s[10]=\. int n=5,a[n]; (2)以下能正确定义二维数组的是( )。 A.int a[][3]; B.int a[][3]={2*3}; C.int a[][3]={}; D.int a[2][3]={{1},{2},{3,4}}; (3)以下程序的输出结果是( )。 A.1 5 9 B.1 4 7 C.3 5 7 D.3 6 9 main() { int i,x[3][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) printf(\ 69 } (4)有以下程序, 执行后输出结果是( ) main() { int x[8]={8,7,6,5,0},*s; s=x+3; printf(\} A. 随机值 B. 0 C. 5 D. 6 (5)若有定义:int a[][3]={1,2,3,4,5,6,7,8}; ,则a数组的行数为( )。 A.3 B.2 C.无确定值 D.1 (6)下列描述中不正确的是 ( )。 A. 字符型数组中可以存放字符串 B. 可以对字符型串进行整体输入、输出 C. 可以对整型数组进行整体输入、输出 D. 不能在赋值语句中通过赋值运算符\对字符型数组进行整体赋值 (7)运行下列程序的输出结果是( )。 main() { int a[]={1,2,3,4,5},i,*p=a+2; printf(\} A. 出错,因下标不能为负值 B. 2 C. 1 D. 3 (8)以下printf语句的输出结果是( )。 printf(\ A. 7 B. 6 C. 存在语法错误 D. 不定值 (9)若有语句:char s1[10], s2[10]=\,则能将字符串books赋给数组s1的语句是( )。 A. s1=\ B. strcpy(s1, s2); C. s1=s2; D. strcpy(s2, s1); (10)以下语句或语句组中,能正确进行字符串赋值的是( )。 A. char *sp; *sp=\ B. char s[10]; s=\C. char s[10]; *s=\ D. char *sp=\2. 程序分析题(阅读程序,写出运行结果) (1) main() { int x[6],a=0,b,c=14; do { x[a]=c%2;a++;c=c/2;}while(c>=1); for(b=a-1;b>=0;b--) printf(\ printf(\} (2) main() { int i,n[6]={0}; 70 for(i=1;i<=4;i++) { n[i]=n[i-1]*2+1; printf(\ } } (3) #include #include { char c='a',t[]=\ int n,k,j; n=strlen(t); for(k=0;k if(t[k]==c) {j=k;break;} else j=-1; printf(\} (4) #include main() { char str1[20]=\ int i, k, num; i=strlen(str1); k=strlen(str2); num=i printf(\} (5) #include { static int a[]={1,3,5,7}; int *p[3]={a+2,a+1,a}; int **q=p; printf(\} 3. 程序填空题 (1)下面程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。 #include { char a[]=\ int i,j,k; k=strlen(a); for(i=0;i<=k-2;i+=2) 71