C语言数组试题[共35页]_第1页
C语言数组试题[共35页]_第2页
C语言数组试题[共35页]_第3页
C语言数组试题[共35页]_第4页
C语言数组试题[共35页]_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 数组4.1内容概述本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。指针数组与数组指针定义、元素引用。利用一维数组实现如挑数、排序、求和等实际应用问题。利用二维数组实现矩阵的应用问题。利用字符数组实现字符串的各种操作。本章知识结构如图4.1所示。数组 数值数组定义初始化元素引用数组元素输入和输出指针数组 定义初始化应用字符数组定义初始化元素引用数组元素输入和输出图4.1 第4章知识结构图考核要求:掌握一维数组、二维数组、字符数组和指针数组的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;

2、掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。重点难点:本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。本章的难点是字符串与字符数组的区别,指针数组和数组元素的指针法引用。核心考点:数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。4.2 典型题解析【例4.1】以下对一维数组a的定义中正确的是( )。 A. char a(10); B. int a0.100;C. int a5; D. int k=10;int ak; 解析:一维数

3、组定义的一般形式为:类型标识符 数组名常量表达式其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。答案:C【例4.2】以下对一维数组的定义中不正确的是( )。A. double x5=2.0,4.0,6.0,8.0,10.0; B. int y5=0,1,3,5,7,9;C. char ch1 =1, 2, 3, 4, 5; D. char ch2 =x10, xa, x8;解析:可以对一维数组的全部元素或部分元素赋初值。在对全部数组元素初始化时,数组长度可以省略。若数组长度没有省略,则初始化列表中值的个数不能超过数组的长度。答案:B【例4.3】以下对二维数

4、组的定义中正确的是( )。Aint a4=1,2,3,4,5,6; B. int a3;Cint a3= 1,2,3,4,5,6; D. int a1,2,3,4,5,6;解析:定义二维数组时,若按一维格式初始化,则第一维的长度可以省略,此时,系统可根据初始化列表中值的个数及第二维的长度计算出省略的第一维长度,但无论如何,第二维的长度不能省略。没有初始化时,每一维的长度都不能省略。答案:C【例4.4】假定一个int型变量占用两个字节,若有定义:int x10=0,2,4; 则数组x在内存中所占字节数是( )。A. 3 B. 6 C. 10 D. 20解析:一维数组在内存中所占的字节数为:数组长

5、度sizeof(元素类型)。答案:D【例4.5】以下程序的输出结果是( )。main() int a44=1,3,5,2,4,6,3,5,7; printf(%d%d%d%dn,a03,a12,a21,a30);A. 0650 B. 1470 C. 5430 D. 输出值不定解析:定义的数组a为4行4列,且前三行三列元素已初始化,根据C语法规定,未初始化的元素值为0。 答案:A【例4.6】以下程序的输出结果是( )。main() int m3=1,4,7,2,5,8,3,6,9;int i,j,k=2; for(i=0;i3;i+) printf(%d ,mki);A. 4 5 6 B. 2

6、5 8 C. 3 6 9 D. 7 8 9解析:根据初始化列表中值的个数和第二维的长度,可求得第一维长度为3。第一行的元素值依次为1,4,7;第二行元素值依次为2,5,8;第三行元素值依次为3,6,9。循环执行三次,依次输出行标为2的三个元素,即第三行的3个元素。答案:C【例4.7】以下程序的输出结果是( )。main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=0; for(i=0;i3;i+) for(j=i;j=i;j+) t=t+bibjj; printf(%dn,t);A. 3 B. 4 C. 1 D. 9解析:程序中,引用的b数组元素的行下标为循环变量i,列

7、下标为数组元素bjj。外层循环共进行3次,对于每次外循环,内层循环只执行一次(即j=i),所以变量t 的值为元素b0b00、b1b11、b2b22的和。由于数组元素b00、b11、b22的值分别为0、1、2,所以t的值为:0+0+1+2=3。答案:A【例4.8】若有定义:int a24;,则引用数组元素正确的是( )。A. a03 B. a04 C. a22 D. a22+1解析:引用二维数组元素时,行下标范围为0行数-1,列下标范围为0列数-1。答案:A【例4.9】若有定义:int aa8;,则不能代表数组元素aa1地址的是( ) 。A. &aa0+1 B. &aa1 C. &aa0+ D.

8、 aa+1解析: &aa1、&aa0+1和aa+1都是数组元素aa1的地址。由于&aa0是地址值常量,不能进行自加、自减运算,所以选项C不能代表aa1地址。答案:C【例4.10】下列程序执行后的输出结果是( ) 。main() int a33, *p,i;p=&a00; for(i=0;i9;i+) pi=i+1; printf(%d n,a12); A. 3 B. 6 C. 9 D. 随机数解析:二维数组的物理存储结构为一维,即按行序顺序存储在连续存储空间中。本题中,p为指向数组元素的指针变量,初始时,p指向a00。通过指针p实现对对二维数组元素按行依次赋值。a12即p5,其值6。答案:B【

9、例4.11】下列程序的输出结果是( )。main() char a10=9,8,7,6,5,4,3,2,1,0,*p=a+5; printf(%d,*-p);A. 运行出错 B. a4的地址 C. 5 D. 3解析:初始时,p指向a5。由于单目运算符的结合方向为右结合,所以,*-p等价于*(-p),即先执行-p,p指向a4,再输出a4的值(5)。 答案:C【例4.12】若有如下定义,则b的值是( )。int a10=1,2,3,4,5,6,7,8,9,10,*p=&a3,b=p5;A. 5 B. 6 C. 8 D. 9解析:p指向a3,即p=a+3;b=p5,即b=*(p+5)。因此,b=*(

10、a+8)=a8=9。 答案:D【例4.13】若二维数组y有m列,则排在yij前的元素个数为( )A.j*m+iB.i*m+j C.i*m+j-1 D.i*m+j+1解析:C语言中的二维数组按行存储。行标为i的元素前共有i行元素,元素个数为i*m,每行列标为j的元素前共有j个元素。因此,yij前的元素个数为i*m+j。答案:B【例4.14】若有定义:char a10,*b=a;,则不能给数组a输入字符串”This is a book”的语句是( )。 A. gets(a) B. scanf(%s,a) C. gets(&a0); D. gets(b) ;解析: gets为字符串输入函数,调用该函

11、数时需给出字符串的存储地址,以回车作为字符串输入的结束,并将回车符转换成为0。而scanf函数则以回车、空格或跳格作为串输入结束,因此scanf不能输入有空格的字符串。答案:B【例4.15】以下程序执行后的输出结果是( )。A. 2 B. 3 C. 4 D. 5#include string.hmain( ) char *p10= abc,aabdfg,dcdbe,abbd,cd; printf(%dn,strlen(p4);解析:定义了一个含有10个元素的字符指针数组p,并对前5个元素初始化,其中p4指向字符串cd,其串长为2。答案:A【例4.16】若定义一个名为s且初值为123的字符数组,

12、则下列定义错误的是( )。Achar s=1,2,3,0 ; Bchar s=123;Cchar s=123n; Dchar s4=1,2,3;解析:字符数组中所存字符中有0时,字符数组才能作为字符串使用。选项A是用字符常量对字符数组初始化,且最后一个元素的值为字符串结束标记(0),所以数组s中存放的就是字符串123;选项D是用字符常量对部分元素初始化,根据 C语言的规定,系统为第四个元素赋初值为空值,即0,所以数组s中存放的也是字符串 123。选项B是直接使用字符串123对字符数组初始化;选项C也是使用字符串初始化,但是字符串不是123,而是123n,数组长度为5。 答案:C【例4.17】下

13、列程序的功能是输入N个实数,然后依次输出前l个实数和、前2个实数和、前N个实数和。填写程序中缺少的语句。#define N 10main() float fN,x=0.0;int i; for(i=0;iN;i+) scanf(%f,&fi); for(i=1;i=N;i+) ; printf(sum of NO %2d-%fn,i,x); 解析:分析程序可知,第一个循环实现数据的输入,第二个循环实现求和并输出,程序中缺少的是计算前i个实数和并存入变量x的语句。由于每次循环的x值都是在前一次循环的基础上作累加,即前i个实数和(x)等于前i-1个实数和(x)加上第i个实数fi-1,因此,处应填写

14、:xxfi-1;。答案:x=xfil; 或 xfil;【例4.18】下面程序的功能是检查一个NN矩阵是否对称(即判断是否所有的aij等于aji)。请填空。#define N 4main() int aNN=1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4; int i,j,found=0; for(j=0;jN-1; j+) for( ;iN; i+) if(aij!=aji) ; break; if(found) printf(No); else printf(Yes);解析:设置判断标志found,初始值为0。对于主对角线以上每个元素,分别与对称元素比较,若不相等,则将fou

15、nd置为1并结束比较。循环结束后,根据found的值确定是否对称。 答案: i=j+1 found=1【例4.19】编写程序,从一整型数组a的第一个元素开始,每三个元素求和并将和值存入到另一数组中(最后一组可以不足3个元素),最后输出所求的所有和值且每行输出5个值。解析:用于存储和值的数组设为b,所有元素都初始化为0。从数组a的第一个元素开始,进行累加操作bj+=ai,累加过程中,数组a的下标每自加3次,数组b的下标自加1次。重复此操作,直到数组a的所有元素累加完为止。输出时,每输出5个元素输出一次换行符n。#define N 20#define M N/3+1main() int aN,i,

16、j,bM=0; for(i=0;iN;i+) scanf(%d,&ai); for(i=0,j=0;iN;i+) bj+=ai; if(i+1)%3=0) j+; if(N%3=0) j-; for(i=0;i=j;i+) printf(%d ,bi); if(i+1)%5=0) printf(n); 【例4.20】已知数组b中存放N个人的年龄,编写程序,统计各年龄段的人数并存入数组d。要求把0至9岁年龄段的人数放在d0中,把10至19岁年龄段的人数放在d1中,把20至29岁年龄段的人数放在d2中,其余依此类推,把100岁(含100)以上年龄的人数都放在d10中。 解析:首先将数组d的所有元素

17、都初始化为0,然后从数组b的第一个元素开始判断,如果数组b的元素值大于或等于100,则数组元素d10加1,否则,数组元素d数组b的元素值/10加1。重复此操作,直到数组b的最后一个元素为止。#include #define M 11#define N 20main() int bN=32,45,15,12,86,49,97,3,44,52,17,95,63,14,76,88,54,65,99,102;int dM,i; for(i=0;iM;i+) di=0; for(i=0;i=100) d10+; else dbi/10+; for(i=0;iM-1;i+) printf(%4d-%4d

18、:%4dn, i*10, i*10+9,di); printf( over 100 :%4dn, d10);【例4.21】编写程序,将一维数组x中大于平均值的数据移至数组的前部,小于等于平均值的数据移至数组的后部。解析:先计算一维数组x的平均值,然后将大于平均值的数据存入数组y的前部,小于等于平均值的数据存入数组y的后部,最后将数组y复制到数组x。#include #define N 10main() int i,j; float av,yN,xN; for(i=0;iN;i+) scanf(%f,x+i); av=0; for(i=0;iN;i+) av=av+xi; av/=N; for(

19、i=j=0;iav) yj+=xi;xi=-1; for(i=0;iN;i+) if(xi!=-1) yj+=xi; for(i=0;iN;i+) xi=yi;printf(%5.2f ,xi);【例5.22】已知一维整型数组a中的数已按由小到大的顺序排列,编写程序,删去一维数组中所有相同的数,使之只剩一个。解析:从数组a的第二个元素开始,与前面保留的最后一个元素作比较,若不相等,则前移。重复此操作,直到数组a的最后一个元素为止。#include #define N 20main() int aN= 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10; in

20、t i,j; printf(The original data :n); for(i=0;iN;i+) printf(%3d,ai); for(j=1,i=1;iN;i+) if(aj-1!=ai) aj+=ai; printf(nnThe data after deleted :n); for(i=0;ij;i+) printf(%3d,ai);【例4.23】编写程序,把从键盘输入的一个数字字符串转换为一个整数并输出。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。要求:不得调用C语言提供的将字符串转换为整数的函数。解析:设存放数字字符串的数组为s,存放对应整型数的变量为

21、n(初始值为0)。若字符串的第一个字符为-,则从第二个字符开始,否则从第一字符开始,利用公式n=n*10+si-0进行转换,直到0为止。#include #include main() char s10;long n=0; int i=0; printf(Enter a string:n) ; gets(s); if(s0=-) i+; while(si) n=n*10+si-0;i+; if(s0=-) n=-n; printf(%ldn,n);【例4.24】编写程序,把NN矩阵A加上矩阵A的转置,存放在矩阵B中。解析:可先将A的转置存入B,再将A的元素aij累加到B的元素bij。也可直接利

22、用转置性质,bij=aij+aji。#define N 3#includemain() int aNN=1,2,3,4,5,6,7,8,9,bNN; int i,j; for(i=0;iN;i+) for(j=0;jN;j+) bij=aij+aji; for(i=0;iN;i+) for(j=0;jN;j+) printf(%4d,bij); printf(n); 【例4.25】编写程序,将二维数组aNM中每个元素向右移一列,最右一列换到最左一列,移动后的数组存到另一个二维数组b中,原数组保持不变。例如: 解析:将数组a的最后一列元素存入数组b的第1列中,再依次将数组a的第i列存入数组b的第

23、i+1列(0=i=M-2)。 #define N 3#define M 3main() int aNM=4,5,6,1,2,3,6,7,8,bNM,i,j; for(i=0;iN;i+) bi0=aiM-1; for(i=0;iM-1;i+) for(j=0;jN;j+) bji+1=aji; for(i=0;iN;i+) for(j=0;jM;j+) printf(%d ,bij); printf(n); 4.3 自测试题1. 单项选择题(1)以下定义语句中,错误的是( )。Aint a=1,2; Bchar *a3;Cchar s10=test; D int n=5,an;(2)以下能正确

24、定义二维数组的是( )。Aint a3; Bint a3=2*3; Cint a3=; Dint a23=1,2,3,4;(3)以下程序的输出结果是( )。A1 5 9 B1 4 7 C3 5 7 D3 6 9main() int i,x33=1,2,3,4,5,6,7,8,9; for(i=0;i=1); for(b=a-1;b=0;b-) printf(%d , xb); printf(n);(2) main() int i,n6=0; for(i=1;i=4;i+) ni=ni-1*2+1; printf(%d ,ni); (3)#include #include main() char

25、 c=a,t=you and me; int n,k,j; n=strlen(t); for(k=0;kn;k+) if(tk=c) j=k;break; else j=-1; printf(%d, j);(4) #include main() char str120=China0USA, str220=Beijing; int i, k, num; i=strlen(str1); k=strlen(str2); num=ik?i:k; printf(%dn, num);(5)#include main() static int a=1,3,5,7; int *p3=a+2,a+1,a; in

26、t *q=p; printf(%dn,*(p0+1)+*(q+2);3. 程序填空题(1)下面程序的功能是将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。#include #include main() char a=clanguage,t; int i,j,k; k=strlen(a); for(i=0;i=k-2;i+=2) for(j=i+2;jk; ) if( ) t=ai;ai=aj;aj=t; puts(a);printf(n);(2)下列程序的功能是在字符串s中找出与字符串t相同的子串的个数。请填空。#include main() char s=fabcdab

27、gabt,t=ab,*p,*q,*r; int n; n=0;q=s; while(*q) p=q;r=t; while(*r) if( ) r+; p+; else break; if( ) n+; q+; printf(nThe result is: n=%dn,n);(3)下面程序的功能是把给定的字符按其矩阵格式读入数组str中,并输出行号与列号之和为3的数组元素。请填空。main( ) char str43=A,b,C,d,E,f,G,h,I,j,K,l; int x,y,z; for(x=0;x4;x+) for (y=0; ;y+) z=x+y; if( ) printf(%cn,

28、strxy); (4)下面程序的功能是输入一个33的实数矩阵,求两条对角线元素中各自的最大值。请填空。main() float s33,max1,max2,x; int i,j; for(i=0;i3;i+) for(j=0;j3;j+) scanf(%f,&x);sij=x; max1= ; for(i=1;i3;i+) if(max1sii) max1=sii; max2= ; if(max2s11) max2=s11; if(max2s20) max2=s20; printf(max1=%fn,max1); printf(max2=%fn,max2);(5)下面程序的功能是利用数组计算并

29、存储Fibonacci序列的前40项,每行输出4项。请填空main() long int a40=1,1; int i; for(i=2;i40;i+) ai= ; for(i=0;iq解答:指向同一个数组的两个指针变量可以相减,其值是两个指针之间的元素个数。指向同一个数组的两个指针变量也可以比较,指向前面元素的指针“小于”指向后面元素的指针。指向数组元素的指针变量可以加减一个整型数c,加c后指向其后面的第c个元素,减c后指向其前面的第c个元素。但指向同一个数组的两个指针变量进行加法运算没有意义。答案:(9)C语言中,数组名代表( )。 数组全部元素的值 数组首地址 数组第一个元素的值 数组元

30、素的个数解答:C语言规定,数组名代表数组的首地址。答案:(10)若有如下定义,则值为4的表达式是( )。int a12=1,2,3,4,5,6,7,8,9,10,11,12;char c=a,d,g; ag-c a4 ad-c ad-c解答:值为4的数组元素的下标为3,所以是错误的,g-c的值不确定,d-c的值为1,只有d-c的值为3,所以是正确的。答案:(11)设有定义:char s12=string;则printf(%d,strlen(s);的输出结果是( )。 6 7 11 12解答:函数strlen()的功能是返回字符串中第一个0之前的字符个数,所以输出结果为6。答案:(12)语句pr

31、intf(%d,strlen(absno121);的输出结果是( )。 11 10 9 8解答:字符串中的“n”、“1”和“”都是转义字符,都表示一个字符,所以字符串中的字符个数为9。答案:(13)设有定义:int t32;,能正确表示t数组元素地址的表达式是( )。 &t32 t3 t1 *t2解答:C语言中,数组元素的下标从0开始,所以和是错误的,表示数组元素a20,表示第二行的首地址,所以是正确的。答案:(14)语句strcat(strcpy(str1,str2),str3);的功能是( )。 将字符串str1复制到字符串str2中后再连接到字符串str3之后。 将字符串str1连接到字

32、符串str2中后再复制到字符串str3之后。 将字符串str2复制到字符串str1后再将字符串str3连接到字符串str1之后。 将字符串str2连接到字符串str1后再将字符串str1复制到字符串str3中。解答:先执行strcpy(str1,str2),即将字符串str2复制到字符串str1中,再执行strcat(str1,str3),即将字符串str3连接到字符串str1之后。答案:(15)若有如下定义,则正确的叙述为( )。char x=abcdefg;char y=a,b,c,d,e,f,g; 数组x和数组y等价 数组x和数组y的长度相同 数组x的长度大于数组y的长度 数组y的长度大

33、于数组x的长度解答:char y=a,b,c,d,e,f,g, 0;等价于:char x=abcdefg;,所以是正确的。答案:2程序分析题(1)下列程序的运行结果是 main() int a33=1,2,3,4,5,6; int i,j,s=0; for(i=0;i3;i+) for(j=0;j=i;j+) s+=aij; printf(%dn,s); 解答:此程序完成的功能是计算33矩阵的下三角阵(包括主对角线元素)元素和,运行结果是1+3+4+5+6,即19。答案:19(2)下列程序的运行结果是 main() int i,j,k,n3; for(i=0;i3;i+) ni=0; k=2;

34、 for(i=0;ik;i+) for(j=0;jk;j+) nj=ni+1; printf(%dn,n1); 解答:当i=0时,n0=n0+1=1,n1=n0+1=2。当i=时,n0=n+1=,n1=n+1=。答案:3(3)下列程序的运行结果是 main() int a=2,4,6,8,10; int y=1,x,*p; p=&a1; for(x=0;x3;x+) y+=*(p+x); printf(%dn,y); 解答:程序的功能是把数组a中下标为、和的元素值累加到变量y上,即:y=1+4+6+8=19。答案:19(4)下列程序的运行结果是 main() int i,c; char num4=CDEF,ACBD; for(i=0;i4;i+) c=num0i+num1i-2*A; printf(%3d,c); 解答:程序的功能是从左向右依次输出两个字符串对应字符的ASCII码之和与130的差值。答案:2 5 5 8(5)下列程序的运行结果是 main() char a=*; int i,j,k; for(i=0;i5;i+) printf(n); for(j=0;ji;j+) printf(%c, ); for(k=0;k

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论