C语言数组试题

因此,①处应填写:x=x+f[i-1];。

答案:x=x+f[i-l]; 或 x+=f[i-l]; 【例4.18】下面程序的功能是检查一个N×N矩阵是否对称(即判断是否所有的a[i][j]等于a[j][i])。请填空。 #define N 4

main()

{ int a[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4}; int i,j,found=0; for(j=0;j

for( ① ;i

if(found) printf(\ else printf(\}

解析:设置判断标志found,初始值为0。对于主对角线以上每个元素,分别与对称元素比较,若不相等,则将found置为1并结束比较。循环结束后,根据found的值确定是否对称。

答案:① i=j+1 ② found=1

【例4.19】编写程序,从一整型数组a的第一个元素开始,每三个元素求和并将和值存入到另一数组中(最后一组可以不足3个元素),最后输出所求的所有和值且每行输出5个值。

解析:用于存储和值的数组设为b,所有元素都初始化为0。从数组a的第一个元素开始,进行累加操作b[j]+=a[i],累加过程中,数组a的下标每自加3次,数组b的下标自加1次。重复此操作,直到数组a的所有元素累加完为止。输出时,每输出5个元素输出一次换行符\。

#define N 20 #define M N/3+1 main()

{ int a[N],i,j,b[M]={0};

for(i=0;i

if((i+1)%3==0) j++; }

if(N%3==0) j--; for(i=0;i<=j;i++) { printf(\

if((i+1)%5==0) printf(\ } }

【例4.20】已知数组b中存放N个人的年龄,编写程序,统计各年龄段的人数并存入数

66

组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 #define M 11 #define N 20 main()

{ 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 #define N 10 main() { int i,j;

float av,y[N],x[N];

for(i=0;i

for(i=0;i

for(i=j=0;iav)

{ 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 #define N 20 main()

{ 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 #include main()

{ 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 main()

{ 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

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4