1、国家二级 C 语言(数组)机试模拟试卷 4 及答案解析(总分:50.00,做题时间:90 分钟)一、选择题(总题数:25,分数:50.00)1.若有定义:int x10,*pt=x;,则对 x 数组元素的正确引用是( )。(分数:2.00)A.pt+3B.*&x10C.*(pt+10)D.*(x+3)2.有以下程序:#includestdiohmain()int i,s=0,t=1,2,3,4,5,6,7,8,9;for(i=0;i9;i+=2)s+=*(t+i);printf(“dn“,s);程序的运行结果是( )。(分数:2.00)A.20B.25C.45D.363.有以下程序:#incl
2、udestdiohmain()int s12=1,2,3,4,4,3,2,1,1,1,2,3,c5=0,i;for(i=0;i12;i+)esi/+;for(i=1;i5;i+)printf(“d“,ci);printf(“n“);程序的运行结果是( )。(分数:2.00)A.2 3 4 4B.4 3 3 2C.1 2 3 4D.1 1 2 34.下列定义数组的语句中正确的是( )。(分数:2.00)A.#define N10 int xN;B.int N=10; int xN;C.int x010;D.int x;5.下列选项中能正确定义数组的语句是( )。(分数:2.00)A.int hu
3、m02008;B.int num;C.int N=2008; int numN;D.#define N2008 int numN;6.若要求定义具有 10 个 int 型元素的一维数组 a,则以下定义语句中错误的是( )。(分数:2.00)A.#define n5 int a2*n;B.int n=10,an;C.int a5+5;D.#define N10 int aN;7.设有定义:double a10,*s=a;,以下能够代表数组元素 a3的是( )。(分数:2.00)A.(*s)3B.*(s+3)C.*s3D.*s+38.有以下程序:#includestdiohmain()int i,
4、t3=9,8,7,6,5,4,3,2,1;for(i=0;i3;i+)printf(“d“,t2-ii);程序的运行结果是( )。(分数:2.00)A.3 5 7B.7 5 3C.3 6 9D.7 5 19.下列定义语句中错误的是( )。(分数:2.00)A.int x43=1,2,3,1,2,3,1,2,3,1,2,3;B.int x4=1,2,3,1,2,3,1,2,3,1,2,3;C.int x3=0,1,1,2,3;D.int x3=1,2,3,4;10.下列定义数组的语句中错误的是( )。(分数:2.00)A.int x23=1,2,3,4,5,6;B.int x3=0;C.int
5、x3=1,2,3,4,5,6;D.int x23=1,2,3,4,5,6;11.下列定义数组的语句中错误的是( )。(分数:2.00)A.int num3=1,2,3,4,5,6;B.int num24=1,2,3,4,5,6;C.int num=1,2,3,4,5,6;D.int num4=1,2,3,4,5,6;12.若有定义语句:char s10=“123456700“;,则 strlen(s)的值是( )。(分数:2.00)A.7B.8C.9D.1013.有以下程序:#includestdioh#includestringhmain()char p20=a,b,c,d,q=“abc“,
6、r=“abcde“;strcat(p,r);strcpy(P+strlen(q),q);pfinff(“dn“,strlen(p);程序的运行结果是( )。(分数:2.00)A.11B.9C.6D.714.有以下程序(strcat 函数用于连接两个字符串):#includestdioh#includestringhmain()char a20=“ABCD0EFG0“,b=“IJK“;strcat(a,b);printf(“sn“,a);程序的运行结果是( )。(分数:2.00)A.IJKB.ABCDE0FG0IJKC.ABCDIJKD.EFGIJK15.有以下程序:char name20;in
7、t num;scanf(“name=s num=d“,name,&num);当执行上述程序,并从键盘输入:name=Lili hum=1001回车后,name 的值为( )。(分数:2.00)A.name=Lili Bum=1001B.name=LiliC.Lili hum=D.Lili16.有以下程序:#includestdiohmain()char ch=“uvwxyz“,*pc;pc=ch;printf(“cn“,*(pc+5);程序的运行结果是( )。(分数:2.00)A.zB.0C.元素 ch5的地址D.字符 y 的地址17.有以下程序:#includestdiohmain()cha
8、r s=“012xy“;int i,n=0;for(i=0;si!=0;i+)if(si=a&si=z)n+;pfinff(“dn“,n);程序的运行结果是( )。(分数:2.00)A.0B.2C.3D.518.若有以下定义和语句:#includestdiohchar s110=“abcd!“,*s2=“n123“;pfinff(“ddn“,strlen(s1),strlen(s2);程序的运行结果是( )。(分数:2.00)A.10 7B.10 5C.5 5D.5 819.有以下程序:#includestdiohmain()char s=“abcde“;s+=2:printf(“dn“,s0
9、);程序的运行结果是( )。(分数:2.00)A.输出字符 c 的 ASCII 码B.程序出错C.输出字符 cD.输出字符 a 的 ASCII 码20.有以下程序:#includestdiohvoid fun(char*t,char*s)while(*t!=0)t+;while(*t+=*s+)!=0);main()char ss10=“acc“,aa10=“bbxxyy“;fun(ss,aa);printf(“s,sn“,ss,aa);程序的运行结果是( )。(分数:2.00)A.acc,bbxxyyB.accbbxxyy,bbxxyyC.accxxyy,bbxxyyD.accxyy,bbx
10、xyy21.设有定义:char p=1,2,3,*q=p;,以下不能计算出一个 char 型数据所占字节数的表达式是( )。(分数:2.00)A.sizeof(p)B.sizeof(char)C.sizeof(*q)D.sizeof(p0)22.设有定义:char s81;int i=0;,以下不能将一行(不超过 80 个字符)带有空格的字符串正确读入的语句或语句组是( )。(分数:2.00)A.gets(s);B.while(si+=getchar()!=n);si=0;C.scanf(“s“,s);D.doscanf(“c“,&si);while(si+!=n); si=0;23.若有定义
11、语句:char*s1=“OK“,*s2=“ok“;,以下选项中,能够输出“OK”的语句是( )。(分数:2.00)A.if(strcmp(s1,s2)!=0)puts(s2);B.if(strcmp(s1,s2)!=0)puts(s1);C.if(strcmp(s1,s2)=1)puts(s1);D.if(stremp(s1,s2)=0)puts(s1);24.若要求从键盘读入含有空格字符的字符串,应使用函数( )。(分数:2.00)A.getchar()B.getc()C.gets()D.seanf()25.下列选项中,能够满足“只要字符串 s1 等于字符串 s2,则执行 sT”要求的是(
12、)。(分数:2.00)A.if(s1-s2=0)ST;B.if(s1=s2)ST;C.if(strcpy(s1,s2)=1)ST;D.if(stremp(s2,s1)=0)ST;国家二级 C 语言(数组)机试模拟试卷 4 答案解析(总分:50.00,做题时间:90 分钟)一、选择题(总题数:25,分数:50.00)1.若有定义:int x10,*pt=x;,则对 x 数组元素的正确引用是( )。(分数:2.00)A.pt+3B.*&x10C.*(pt+10)D.*(x+3) 解析:解析:没有 A 选项的引用形式。*与&放在一起作用抵消,但 x10下标 10 超出了数组下标范围,所以 B 选项错
13、误。最大只能引用到 x9,而*(pt+i)表示引用指针 pt 所指元素后的第 i 个元素,所以 C选项错误,最大只能为*(pt+9)。D 选项正确。2.有以下程序:#includestdiohmain()int i,s=0,t=1,2,3,4,5,6,7,8,9;for(i=0;i9;i+=2)s+=*(t+i);printf(“dn“,s);程序的运行结果是( )。(分数:2.00)A.20B.25 C.45D.36解析:解析:统计 19 这 9 个数中的奇数和,此题考查指向数组的指针。C 语言规定数组名代表数组的首地址,也就是第一个元素的地址,因此*(t+i)代表数组的第 i+1 个元素。
14、程序的运行结果是1+3+5+7+9=25。3.有以下程序:#includestdiohmain()int s12=1,2,3,4,4,3,2,1,1,1,2,3,c5=0,i;for(i=0;i12;i+)esi/+;for(i=1;i5;i+)printf(“d“,ci);printf(“n“);程序的运行结果是( )。(分数:2.00)A.2 3 4 4B.4 3 3 2 C.1 2 3 4D.1 1 2 3解析:解析:在 for(i=0;i12;i+)csi/+中,数组元素 si的值作为数组 c 的下标,当退出循环时,数组 c 的 4 个元素的值分别为 4、3、3、2,因此 B 选项正确
15、。4.下列定义数组的语句中正确的是( )。(分数:2.00)A.#define N10 int xN; B.int N=10; int xN;C.int x010;D.int x;解析:解析:数组说明的一般形式为:类型说明符数组名常量表达式。B 选项中 N 是变量,不能用变量定义数组长度。C 选项中数组长度是一串非法的数字。定义数组时必须为其指明长度,D 选项中的数组长度为空,所以非法。5.下列选项中能正确定义数组的语句是( )。(分数:2.00)A.int hum02008;B.int num;C.int N=2008; int numN;D.#define N2008 int numN;
16、解析:解析:C 语言不允许定义动态数组,定义数组的大小必须为常量表达式。A 选项错误,C 语言中的数组没有此类型的定义方法;B 选项错误,定义数组应指明数组大小,如果不指明数组大小,需要给定初值的个数;C 选项错误,N 为变量,不能用来定义数组大小。D 选项正确。6.若要求定义具有 10 个 int 型元素的一维数组 a,则以下定义语句中错误的是( )。(分数:2.00)A.#define n5 int a2*n;B.int n=10,an; C.int a5+5;D.#define N10 int aN;解析:解析:一维数组的定义方式为:类型说明符数组名常量表达式;注意定义数组时,元素个数不
17、能是变量,因此应该选择 B 选项。7.设有定义:double a10,*s=a;,以下能够代表数组元素 a3的是( )。(分数:2.00)A.(*s)3B.*(s+3) C.*s3D.*s+3解析:解析:题中,首先定义了 double 型的数组 a,并将数组首地址赋给指针 s。s3能够表示 a3,故选项 A、C 不能表示 a3;选项 D 的,*s+3=a0+3。故本题答案为 B 选项。8.有以下程序:#includestdiohmain()int i,t3=9,8,7,6,5,4,3,2,1;for(i=0;i3;i+)printf(“d“,t2-ii);程序的运行结果是( )。(分数:2.0
18、0)A.3 5 7 B.7 5 3C.3 6 9D.7 5 1解析:解析:二维数组 t3实际上指 t33=9,8,7,6,5,4,3,2,1,通过循环语句for 语句可以得到 i=0,t20=3、i=1,t11=5、i=2,t02=7、i=3 时循环结束,即 t20=3、t11=5、t02=7,因此 A 选项正确。9.下列定义语句中错误的是( )。(分数:2.00)A.int x43=1,2,3,1,2,3,1,2,3,1,2,3;B.int x4=1,2,3,1,2,3,1,2,3,1,2,3; C.int x3=0,1,1,2,3;D.int x3=1,2,3,4;解析:解析:二维数组定义
19、的一般形式是:类型说明符数组名常量表达式 1常量表达式 2。其中常量表达式 1 表示第一维下标的长度,常量表达式 2 表示第二维下标的长度。如对二维数组的全部元素赋初值,则第一维的长度可以不给出。但如果对 x4赋值,只确定行数,而不确定列数,就无法正确赋值,因此 B 选项正确。10.下列定义数组的语句中错误的是( )。(分数:2.00)A.int x23=1,2,3,4,5,6;B.int x3=0;C.int x3=1,2,3,4,5,6;D.int x23=1,2,3,4,5,6; 解析:解析:D 选项中 x23定义的是一个 2 行 3 列的二维数组,而在给数组元素赋值时却赋成了 3 行,
20、所以错误。11.下列定义数组的语句中错误的是( )。(分数:2.00)A.int num3=1,2,3,4,5,6;B.int num24=1,2,3,4,5,6; C.int num=1,2,3,4,5,6;D.int num4=1,2,3,4,5,6;解析:解析:B 选项中定义的数组为 2 行 4 列,而赋值时赋成了 3 行,所以出错。12.若有定义语句:char s10=“123456700“;,则 strlen(s)的值是( )。(分数:2.00)A.7 B.8C.9D.10解析:解析:stden()函数是计算字符串长度时,遇到结束标识为止,且长度不包括结束标识。本题中的字符串从第一个
21、字符开始,遇到第一个结束标识0为止,注意0不占字符串长度,所以字符串长度为 7,因此 A 选项正确。13.有以下程序:#includestdioh#includestringhmain()char p20=a,b,c,d,q=“abc“,r=“abcde“;strcat(p,r);strcpy(P+strlen(q),q);pfinff(“dn“,strlen(p);程序的运行结果是( )。(分数:2.00)A.11B.9C.6 D.7解析:解析:strcpy:字符串复制函数;strlen:求字符串长度函数(注意:不包含字符串结束标记字符0);strcat:字符串连接函数。执行完语句 strc
22、at(p,r);后,p 数组中存储的元素为a,b,c,d,a,b,c,d,e;执行语句 strcpy(p+strlen(q),q);得到的结果是将 q 所指向的字符串复制至 p+strlen(q)开始的存储位置,因为 strlen 的值为 3,即 p+3 开始存储 q 中的元素,所以执行完strcpy(P+strlen(q),q)语句后,字符数组 p20的存储元素为 a,b,c,14.有以下程序(strcat 函数用于连接两个字符串):#includestdioh#includestringhmain()char a20=“ABCD0EFG0“,b=“IJK“;strcat(a,b);prin
23、tf(“sn“,a);程序的运行结果是( )。(分数:2.00)A.IJKB.ABCDE0FG0IJKC.ABCDIJK D.EFGIJK解析:解析:字符数组 a 中包含两个0,遇到第一个0时就表示字符串 a 结束。字符串处理函数strcat(字符数组 a,字符数组 b),功能是连接两个字符数组中的字符串,把字符串 b 连接到字符串 a 的后面,结果放在字符数组 a 中。连接时将字符串 a 后的0取消,只在新串最后保留一个0。本题相当于将“ABCD“和“UK“连接,因此 C 选项正确。15.有以下程序:char name20;int num;scanf(“name=s num=d“,name,
24、&num);当执行上述程序,并从键盘输入:name=Lili hum=1001回车后,name 的值为( )。(分数:2.00)A.name=Lili Bum=1001B.name=LiliC.Lili hum=D.Lili 解析:解析:在输入格式控制“name=s num=d”中,普通字符“name=num=”在输入时要原样输入,而格式控制符s 和d 对应各自的输入项,将输入的数据赋给相应的输入项。本题中输入“name=Lili num=1001回车”后,将字符串 Lili 赋给字符数组 name,整数 1001 赋给变量 num,因此 D 选项正确。16.有以下程序:#includestd
25、iohmain()char ch=“uvwxyz“,*pc;pc=ch;printf(“cn“,*(pc+5);程序的运行结果是( )。(分数:2.00)A.z B.0C.元素 ch5的地址D.字符 y 的地址解析:解析:语句 pc=ch;使得指针变量指向字符数组 ch 的首地址,即指向字符u,则 pc+5 指向的是字符向后移动 5 位,指向字符z,所以输出的*pc+5 的值即为z,因此 A 选项正确。17.有以下程序:#includestdiohmain()char s=“012xy“;int i,n=0;for(i=0;si!=0;i+)if(si=a&si=z)n+;pfinff(“dn
26、“,n);程序的运行结果是( )。(分数:2.00)A.0B.2 C.3D.5解析:解析:程序首先给字符数组 s赋值为“012xy“,for 循环语句的功能是遍历字符串,通过 if 条件语句对字符串中的小写字母进行计数,字符串中小写字母为 2 个,即 n=2,因此 B 选项正确。18.若有以下定义和语句:#includestdiohchar s110=“abcd!“,*s2=“n123“;pfinff(“ddn“,strlen(s1),strlen(s2);程序的运行结果是( )。(分数:2.00)A.10 7B.10 5C.5 5 D.5 8解析:解析:strlen 函数返回字符串的长度,求
27、字符串长度时,遇到结束标志0为止,但是长度不包括结束标识。字符数组 s1 的后 5 个元素没有赋值,都为0,即“abcd!“后为0,所以 strlen(s1)的值为 5。字符指针 s2 所指向的字符串中,n 为转义字符换行符,表示 1 个字符,也为转义字符,代表,也是 1 个字符,其后为字符串结束标识0,所以 strlen(s2)的值也为 5,因此 C 选项正确。19.有以下程序:#includestdiohmain()char s=“abcde“;s+=2:printf(“dn“,s0);程序的运行结果是( )。(分数:2.00)A.输出字符 c 的 ASCII 码B.程序出错 C.输出字符
28、 cD.输出字符 a 的 ASCII 码解析:解析:本题重点考查数组名的概念。在 C 语言中,数组名类似于一个指向数组首地址的指针常量,一旦定义就不能修改其内容。所以本题中的“s+=2”;语句让数组名 s 的内容加 2 是错误的,编译无法通过,因此 B 选项正确。20.有以下程序:#includestdiohvoid fun(char*t,char*s)while(*t!=0)t+;while(*t+=*s+)!=0);main()char ss10=“acc“,aa10=“bbxxyy“;fun(ss,aa);printf(“s,sn“,ss,aa);程序的运行结果是( )。(分数:2.00
29、)A.acc,bbxxyyB.accbbxxyy,bbxxyy C.accxxyy,bbxxyyD.accxyy,bbxxyy解析:解析:本题重点考查 while 循环语句的简单应用。在函数 fun()中,前一个 while 循环的作用是:如果形参指针 t 所指内容不为 0,则让 t 增 1,直到它指向 0。后一个 while 循环的作用是:将 s 所指内容赋给 t 所指地址,然后两者同时增 1,直到赋给 t 的内容为 0。由此可见,函数 fun()的作用就是将形参 s 所指字符串连接到形参 t 所指字符串末尾,相当于库函数中的 strcat()。主函数中使用 fun()将数组aa 中的字符串
30、连接到了数组 ss 中原有字符串之后,所以执行完后,ss 中的字符串为“accbbxxyy”。程序最后输出的结果是21.设有定义:char p=1,2,3,*q=p;,以下不能计算出一个 char 型数据所占字节数的表达式是( )。(分数:2.00)A.sizeof(p) B.sizeof(char)C.sizeof(*q)D.sizeof(p0)解析:解析:根据题目中的定义可知道 sizeof(p),计算的是数组 p 中所有元素所占用的字节数,而不是char 型数据所占的字节数。22.设有定义:char s81;int i=0;,以下不能将一行(不超过 80 个字符)带有空格的字符串正确读入
31、的语句或语句组是( )。(分数:2.00)A.gets(s);B.while(si+=getchar()!=n);si=0;C.scanf(“s“,s); D.doscanf(“c“,&si);while(si+!=n); si=0;解析:解析:使用 scanf()输入字符串时,空格和回车符都作为输入数据的分隔符而不能被读入,而应该使用 gets(s)。23.若有定义语句:char*s1=“OK“,*s2=“ok“;,以下选项中,能够输出“OK”的语句是( )。(分数:2.00)A.if(strcmp(s1,s2)!=0)puts(s2);B.if(strcmp(s1,s2)!=0)puts(
32、s1); C.if(strcmp(s1,s2)=1)puts(s1);D.if(stremp(s1,s2)=0)puts(s1);解析:解析:strcmp(s1,s2)是字符串比较函数,比较规则是两个字符串自左向右逐个字符相比(按照ASCII 码值大小),以第一个不相同字符的大小作为比较结果。因为OKok,所以 strcmp(s1,s2)为负值,只有 B 选项正确。24.若要求从键盘读入含有空格字符的字符串,应使用函数( )。(分数:2.00)A.getchar()B.getc()C.gets() D.seanf()解析:解析:scanf()语句中用“空格”间隔不同的字符串,空格将被全部忽略掉
33、,所以用 scanf()函数不能输入空格;getchar()函数用于输入字符,其调用格式为:ch=getchar(),getchar()函数从终端读入一个字符作为函数值,把读入的字符赋给变量 ch。在输入时,空格、回车符都将作为字符读入,而且只有在用户敲入回车键时,读入才开始执行。gets()函数的调用形式为:gets(str_adr),其中 str_adr 是存放输入字符串的起始地址,可以是字符数组名、字符数组元素的地址或字符指针变量。gets 函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。getc()函数的调用形式为:ch=getc(pf),其中 pf 是文件指针,函数的功能是从 pf 指定的文件中读入一个字符,并把它作为函数值返回。因此 C 选项正确。25.下列选项中,能够满足“只要字符串 s1 等于字符串 s2,则执行 sT”要求的是( )。(分数:2.00)A.if(s1-s2=0)ST;B.if(s1=s2)ST;C.if(strcpy(s1,s2)=1)ST;D.if(stremp(s2,s1)=0)ST; 解析:解析:在 C 语言中,要对两个字符串的大小进行比较,就需要调用字符串比较函数 strcmp,如果这个函数的返回值等于 0,说明两个字符串相等,因此 D 选项正确。