C语言数组试题.docx
《C语言数组试题.docx》由会员分享,可在线阅读,更多相关《C语言数组试题.docx(51页珍藏版)》请在冰豆网上搜索。
![C语言数组试题.docx](https://file1.bdocx.com/fileroot1/2023-1/31/9291ec45-94fa-43a5-9354-9f3c28d0fafc/9291ec45-94fa-43a5-9354-9f3c28d0fafc1.gif)
C语言数组试题
第4章数组
4.1内容概述
本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。
指针数组与数组指针定义、元素引用。
利用一维数组实现如挑数、排序、求和等实际应用问题。
利用二维数组实现矩阵的应用问题。
利用字符数组实现字符串的各种操作。
本章知识结构如图4.1所示。
图4.1第4章知识结构图
考核要求:
掌握一维数组、二维数组、字符数组和指针数组的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。
重点难点:
本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。
本章的难点是字符串与字符数组的区别,指针数组和数组元素的指针法引用。
核心考点:
数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。
4.2典型题解析
【例4.1】以下对一维数组a的定义中正确的是()。
A.chara(10); B.inta[0..100];
C.inta[5];D.intk=10;inta[k];
解析:
一维数组定义的一般形式为:
类型标识符数组名[常量表达式]
其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。
答案:
C
【例4.2】以下对一维数组的定义中不正确的是()。
A.doublex[5]={2.0,4.0,6.0,8.0,10.0};
B.inty[5]={0,1,3,5,7,9};
C.charch1[]={'1','2','3','4','5'};
D.charch2[]={'\x10','\xa','\x8'};
解析:
可以对一维数组的全部元素或部分元素赋初值。
在对全部数组元素初始化时,数组长度可以省略。
若数组长度没有省略,则初始化列表中值的个数不能超过数组的长度。
答案:
B
【例4.3】以下对二维数组的定义中正确的是()。
A.inta[4][]={1,2,3,4,5,6};B.inta[][3];
C.inta[][3]={1,2,3,4,5,6};D.inta[][]={{1,2,3},{4,5,6}};
解析:
定义二维数组时,若按一维格式初始化,则第一维的长度可以省略,此时,系统可根据初始化列表中值的个数及第二维的长度计算出省略的第一维长度,但无论如何,第二维的长度不能省略。
没有初始化时,每一维的长度都不能省略。
答案:
C
【例4.4】假定一个int型变量占用两个字节,若有定义:
intx[10]={0,2,4};则数组x在内存中所占字节数是()。
A.3B.6C.10D.20
解析:
一维数组在内存中所占的字节数为:
数组长度×sizeof(元素类型)。
答案:
D
【例4.5】以下程序的输出结果是()。
main()
{inta[4][4]={{1,3,5},{2,4,6},{3,5,7}};
printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]);
}
A.0650B.1470C.5430D.输出值不定
解析:
定义的数组a为4行4列,且前三行三列元素已初始化,根据C语法规定,未初始化的元素值为0。
答案:
A
【例4.6】以下程序的输出结果是()。
main()
{intm[][3]={1,4,7,2,5,8,3,6,9};inti,j,k=2;
for(i=0;i<3;i++){printf("%d",m[k][i]);}
}
A.456B.258C.369D.789
解析:
根据初始化列表中值的个数和第二维的长度,可求得第一维长度为3。
第一行的元素值依次为1,4,7;第二行元素值依次为2,5,8;第三行元素值依次为3,6,9。
循环执行三次,依次输出行标为2的三个元素,即第三行的3个元素。
答案:
C
【例4.7】以下程序的输出结果是()。
main()
{intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0;
for(i=0;i<3;i++)
for(j=i;j<=i;j++)
t=t+b[i][b[j][j]];
printf("%d\n",t);
}
A.3B.4C.1D.9
解析:
程序中,引用的b数组元素的行下标为循环变量i,列下标为数组元素b[j][j]。
外层循环共进行3次,对于每次外循环,内层循环只执行一次(即j=i),所以变量t的值为元素b[0][b[0][0]]、b[1][b[1][1]]、b[2][b[2][2]]的和。
由于数组元素b[0][0]、b[1][1]、b[2][2]的值分别为0、1、2,所以t的值为:
0+0+1+2=3。
答案:
A
【例4.8】若有定义:
inta[2][4];,则引用数组元素正确的是()。
A.a[0][3] B.a[0][4] C.a[2][2] D.a[2][2+1]
解析:
引用二维数组元素时,行下标范围为0~行数-1,列下标范围为0~列数-1。
答案:
A
【例4.9】若有定义:
intaa[8];,则不能代表数组元素aa[1]地址的是()。
A.&aa[0]+1B.&aa[1]C.&aa[0]++D.aa+1
解析:
&aa[1]、&aa[0]+1和aa+1都是数组元素aa[1]的地址。
由于&aa[0]是地址值常量,不能进行自加、自减运算,所以选项C不能代表aa[1]地址。
答案:
C
【例4.10】下列程序执行后的输出结果是()。
main()
{inta[3][3],*p,i;p=&a[0][0];
for(i=0;i<9;i++)p[i]=i+1;
printf("%d\n",a[1][2]);
}
A.3B.6C.9D.随机数
解析:
二维数组的物理存储结构为一维,即按行序顺序存储在连续存储空间中。
本题中,p为指向数组元素的指针变量,初始时,p指向a[0][0]。
通过指针p实现对对二维数组元素按行依次赋值。
a[1][2]即p[5],其值6。
答案:
B
【例4.11】下列程序的输出结果是()。
main()
{chara[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;
printf("%d",*--p);
}
A.运行出错B.a[4]的地址C.5D.3
解析:
初始时,p指向a[5]。
由于单目运算符的结合方向为右结合,所以,*--p等价于*(--p),即先执行--p,p指向a[4],再输出a[4]的值(5)。
答案:
C
【例4.12】若有如下定义,则b的值是()。
inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b=p[5];
A.5B.6C.8D.9
解析:
p指向a[3],即p=a+3;b=p[5],即b=*(p+5)。
因此,b=*(a+8)=a[8]=9。
答案:
D
【例4.13】若二维数组y有m列,则排在y[i][j]前的元素个数为()
A.j*m+i B.i*m+jC.i*m+j-1 D.i*m+j+1
解析:
C语言中的二维数组按行存储。
行标为i的元素前共有i行元素,元素个数为i*m,每行列标为j的元素前共有j个元素。
因此,y[i][j]前的元素个数为i*m+j。
答案:
B
【例4.14】若有定义:
chara[10],*b=a;,则不能给数组a输入字符串”Thisisabook”的语句是()。
A.gets(a)B.scanf("%s",a)C.gets(&a[0]);D.gets(b);
解析:
gets为字符串输入函数,调用该函数时需给出字符串的存储地址,以回车作为字符串输入的结束,并将回车符转换成为’\0’。
而scanf函数则以回车、空格或跳格作为串输入结束,因此scanf不能输入有空格的字符串。
答案:
B
【例4.15】以下程序执行后的输出结果是()。
A.2B.3C.4D.5
#include"string.h"
main()
{char*p[10]={"abc","aabdfg","dcdbe","abbd","cd"};
printf("%d\n",strlen(p[4]));
}
解析:
定义了一个含有10个元素的字符指针数组p,并对前5个元素初始化,其中p[4]指向字符串"cd",其串长为2。
答案:
A
【例4.16】若定义一个名为s且初值为"123"的字符数组,则下列定义错误的是()。
A.chars[]={’1','2','3','\0'};B.chars[]={"123"};
C.chars[]={"123\n"};D.chars[4]={'1','2','3'};
解析:
字符数组中所存字符中有’\0’时,字符数组才能作为字符串使用。
选项A是用字符常量对字符数组初始化,且最后一个元素的值为字符串结束标记(’\0’),所以数组s中存放的就是字符串"123";选项D是用字符常量对部分元素初始化,根据C语言的规定,系统为第四个元素赋初值为空值,即'\0',所以数组s中存放的也是字符串"123"。
选项B是直接使用字符串"123"对字符数组初始化;选项C也是使用字符串初始化,但是字符串不是"123",而是"123\n",数组长度为5。
答案:
C
【例4.17】下列程序的功能是输入N个实数,然后依次输出前l个实数和、前2个实数和、…、前N个实数和。
填写程序中缺少的语句。
#defineN10
main()
{floatf[N],x=0.0;inti;
for(i=0;iscanf("%f",&f[i]);
for(i=1;i<=N;i++)
{①;
printf("sumofNO%2d---------%f\n",i,x);
}
}
解析:
分析程序可知,第一个循环实现数据的输入,第二个循环实现求和并输出,程序中缺少的是计算前i个实数和并存入变量x的语句。
由于每次循环的x值都是在前一次循环的基础上作累加,即前i个实数和(x)等于前i-1个实数和(x)加上第i个实数f[i-1],因此,①处应填写:
x=x+f[i-1];。
答案:
x=x+f[i-l];或x+=f[i-l];
【例4.18】下面程序的功能是检查一个N×N矩阵是否对称(即判断是否所有的a[i][j]等于a[j][i])。
请填空。
#defineN4
main()
{inta[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4};
inti,j,found=0;
for(j=0;jfor(①;iif(a[i][j]!
=a[j][i])
{②;
break;
}
if(found)printf("No");
elseprintf("Yes");
}
解析:
设置判断标志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个元素输出一次换行符"\n"。
#defineN20
#defineMN/3+1
main()
{inta[N],i,j,b[M]={0};
for(i=0;ifor(i=0,j=0;i{b[j]+=a[i];
if((i+1)%3==0)j++;
}
if(N%3==0)j--;
for(i=0;i<=j;i++)
{printf("%d",b[i]);
if((i+1)%5==0)printf("\n");
}
}
【例4.20】已知数组b中存放N个人的年龄,编写程序,统计各年龄段的人数并存入数组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
#defineM11
#defineN20
main()
{intb[N]={32,45,15,12,86,49,97,3,44,52,17,95,63,14,76,88,54,65,99,102};
intd[M],i;
for(i=0;ifor(i=0;iif(b[i]>=100)d[10]++;
elsed[b[i]/10]++;
for(i=0;iprintf("%4d--%4d:
%4d\n",i*10,i*10+9,d[i]);
printf("over100:
%4d\n",d[10]);
}
【例4.21】编写程序,将一维数组x中大于平均值的数据移至数组的前部,小于等于平均值的数据移至数组的后部。
解析:
先计算一维数组x的平均值,然后将大于平均值的数据存入数组y的前部,小于等于平均值的数据存入数组y的后部,最后将数组y复制到数组x。
#include
#defineN10
main()
{inti,j;
floatav,y[N],x[N];
for(i=0;iav=0;
for(i=0;iav/=N;
for(i=j=0;iif(x[i]>av)
{y[j++]=x[i];x[i]=-1;}
for(i=0;iif(x[i]!
=-1)y[j++]=x[i];
for(i=0;i{x[i]=y[i];printf("%5.2f",x[i]);}
}
【例5.22】已知一维整型数组a中的数已按由小到大的顺序排列,编写程序,删去一维数组中所有相同的数,使之只剩一个。
解析:
从数组a的第二个元素开始,与前面保留的最后一个元素作比较,若不相等,则前移。
重复此操作,直到数组a的最后一个元素为止。
#include
#defineN20
main()
{inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10};
inti,j;
printf("Theoriginaldata:
\n");
for(i=0;iprintf("%3d",a[i]);
for(j=1,i=1;iif(a[j-1]!
=a[i])a[j++]=a[i];
printf("\n\nThedataafterdeleted:
\n");
for(i=0;iprintf("%3d",a[i]);
}
【例4.23】编写程序,把从键盘输入的一个数字字符串转换为一个整数并输出。
例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。
要求:
不得调用C语言提供的将字符串转换为整数的函数。
解析:
设存放数字字符串的数组为s,存放对应整型数的变量为n(初始值为0)。
若字符串的第一个字符为’-’,则从第二个字符开始,否则从第一字符开始,利用公式n=n*10+s[i]-‘0’进行转换,直到’\0’为止。
#include
#include
main()
{chars[10];longn=0;
inti=0;
printf("Enterastring:
\n");
gets(s);
if(s[0]=='-')i++;
while(s[i])
{n=n*10+s[i]-'0';i++;}
if(s[0]=='-')n=-n;
printf("%ld\n",n);
}
【例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]。
#defineN3
#include
main()
{inta[N][N]={{1,2,3},{4,5,6},{7,8,9}},b[N][N];
inti,j;
for(i=0;ifor(j=0;jb[i][j]=a[i][j]+a[j][i];
for(i=0;i{for(j=0;jprintf("%4d",b[i][j]);
printf("\n");
}
}
【例4.25】编写程序,将二维数组a[N][M]中每个元素向右移一列,最右一列换到最左一列,移动后的数组存到另一个二维数组b中,原数组保持不变。
例如:
解析:
将数组a的最后一列元素存入数组b的第1列中,再依次将数组a的第i列存入数组b的第i+1列(0=
#defineN3
#defineM3
main()
{inta[N][M]={4,5,6,1,2,3,6,7,8},b[N][M],i,j;
for(i=0;ib[i][0]=a[i][M-1];
for(i=0;ifor(j=0;jb[j][i+1]=a[j][i];
for(i=0;i{for(j=0;jprintf("%d",b[i][j]);
printf("\n");
}
}
4.3自测试题
1.单项选择题
(1)以下定义语句中,错误的是()。
A.inta[]={1,2};B.char*a[3];
C.chars[10]="test";D.intn=5,a[n];
(2)以下能正确定义二维数组的是()。
A.inta[][3];B.inta[][3]={2*3};
C.inta[][3]={};D.inta[2][3]={{1},{2},{3,4}};
(3)以下程序的输出结果是()。
A.159B.147C.357D.369
main()
{inti,x[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)printf("%d",x[i][2-i]);
}
(4)有以下程序,执行后输出结果是()
main()
{intx[8]={8,7,6,5,0},*s;
s=x+3;
printf("%d",s[2]);
}
A.随机值B.0C.5D.6
(5)若有定义:
inta[][3]={1,2,3,4,5,6,7,8};,则a数组的行数为()。
A.3 B.2 C.无确定值 D.1
(6)下列描述中不正确的是()。
A.字符型数组中可以存放字符串
B.可以对字符型串进行整体输入、输出
C.可以对整型数组进行整体输入、输出
D.不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值
(7)运行下列程序的输出结果是()。
main()
{inta[]={1,2,3,4,5},i,*p=a+2;
printf("%d",p[1]-p[-1]);
}
A.出错,因下标不能为负值B.2C.1D.3
(8)以下printf语句的输出结果是()。
printf("%d\n",strlen("school"));
A.7 B.6 C.存在语法错误 D.不定值
(9)若有语句:
chars1[10],s2[10]="books";,则能将字符串books赋给数组s1的语句是()。
A.s1="books"; B.strcpy(s1,s2);
C.s1=s2; D.strcpy(s2,s1);
(10)以下语句或语句组中,能正确进行字符串赋值的是()。
A.char *sp; *sp="right!
"; B.chars[10]; s="right!
";
C.char s[10]; *s="right!
"; D.char *sp="right!
";
2.程序分析题(阅读程序,写出运行结果)
(1)
main()
{intx[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("%d",x[b]);
printf("\n");
}
(2)
main()
{inti,n[6]={0};
for(i=1;i<=4;i++)
{n[i]=n[i-1]*2+1;
printf("%d",n[i]);
}
}
(3)
#include
#include
main()
{charc='a',t[]="youandme";
intn,k,j;
n=strlen(t);
for(k=0;kif(t[k]==c){j=k;break;}
elsej=-1;
printf("%d",j);
}
(4)
#include