1、二级 C语言分类模拟题 516及答案解析(总分:51.00,做题时间:90 分钟)一、选择题(总题数:35,分数:51.00)1.下列程序的输出结果是_。 #includestdio.h main() int a23=1, 2, 3, 4, 5, 6, (*p)3, i; p=a; for(i=0; i3; i+) if(i2) p1i=p1i-1; else p1i=1; printf(“%d/n“, a01+a11+a12); (分数:2.50)A.8B.7C.12D.92.以下叙述中正确的是_。(分数:2.00)A.使用 break语句可以使流程跳出 switch语句体B.break语句
2、不能用于提前结束 for语句的本层循环C.continue语句使得整个循环终止D.在 for语句中,continue 与 break的效果是一样的,可以互换3.有以下程序: #includestdio.h void fun(int*s, int n1, int n2) int i, j, t; i=n1; j=n2; while (ij) t=*(s+i); *(s+i)=*(s+j); *(s+j)=t; i+; j-; main() int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 0, i, *p=a; fun(p, 0, 3); fun(p, 4, 9); fun(
3、p, 0, 9); for(i=0; i10; i+) printf(“%d“, *(a+i); 程序的输出结果是(分数:1.00)A.0987654321B.4321098765C.5678901234D.09876512344.以下叙述中正确的是_。(分数:2.00)A.只要适当地修改代码,就可以将 do-while与 while相互转换B.对于“for(表达式 1;表达式 2;表达式 3)循环体“首先要计算表达式 2的值,以便决定是否开始循环C.对于“for(表达式 1;表达式 2;表达式 3)循环体“,只在个别情况下才能转换成 while语句D.如果根据算法需要使用无限循环(即通常所称
4、的“死循环”),则只能使用 while语句5.有以下程序: # include stdio.h main() char a=“H“; a=(a=“A“a=“Z“)?(a-“A“+“a“):a; printf(“%c/n“,a); 程序运行后的输出结果是_。(分数:1.00)AABaCHDh6.以下定义数组的语句中错误的是_。(分数:1.00)A.int num=1,2,3,4,5,6;B.int num3=1,2,3,4,5,6;C.int num24=1,2,3,4,5,6;D.int num4=1,2,3,4,5,6;7.设有某函数的说明为: int*func(int a10,int n)
5、; 则下列叙述中,正确的是_。(分数:1.00)A.形参 a对应的实参只能是数组名B.说明中的 a10写成 a或*a 效果完全一样C.func的函数体中不能对 a进行移动指针(如 a+)的操作D.只有指向 10个整数内存单元的指针,才能作为实参传给 a8.有以下程序: #include stdio.h #define N 5 #define M N+1 #define f(x) (x*M) main( ) int i1,i2; i1=f(2); i2=f(1+1); printf(“%d%d/n“,i1,i2); 程序的运行结果是_。(分数:2.00)A.12 7B.12 12C.11 11D
6、.11 79.有以下程序 #includestdio.h main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=1; for(i=0;i3;i+) for(j=i;j=i;j+)t+=bibji; printf(“%d/n“,t); 程序运行后的输出结果是_。(分数:1.00)A.3B.4C.1D.910.循环控制语句“while(!scanf(“%d“, int a=1, b=3, c=2; 则正确的 switch语句是_。(分数:2.00)A.switch(a+b) case 1:printf(“*/n“);case c:printf(“*/n“);B.switch
7、(int)x);case 1:printf(“*/n“);case 2:printf(“*/n“);C.switch(x)case 1.0:printf(“*/n“);case 2.0:printf(“*/n“);D.switch(a+b)case 1:printf(“*/n“);case 2+1:printf(“*/n“);18.有以下程序 #includestdio.h typedef struct int b,p;A; void f(A c) /*注意:c 是结构变量名*/ int j; c.b+=1;c.p+=2; main() int i; A a=1,2; f(a); printf
8、(“%d,%d/n“,a.b,a.p); 程序运行后的输出结果是_。(分数:2.00)A.2,4B.1,2C.1,4D.2,319.有以下程序: #include stdio.h struct link int data; struct link* next; ; main() struct link *h,a,b; h=a.data=10;a.next=b.data=20; 程序运行时不能输出 10,20 的语句是_。(分数:1.00)A.printf(“%d,%d/n“,h-data,a.next.data);B.printf(“%d,%d/n“,a.data,(%a.next).data
9、);C.printf(“%d,%d/n“,h-data,(*a.next).data);D.printf(“%d,%d/n“,a.data,a.next-data);20.有以下程序 #include main() int a=0,b=0; /*给 a赋值 a=10; b=20;给 b赋值*/ printf(“a+b=%d/n“,a+b);/*输出计算结果*/ 程序运行后的输出结果是_。(分数:1.00)A.a+b=0B.a+b=30C.a+b=10D.出错21.若有定义:double a=22;int i=0,k=18;,则不符合 C语言规定的赋值语句是_。(分数:2.00)A.i=(a+k
10、)=(i+k);B.i=a%11;C.a=a+,i+D.i=!a;22.表达式(int)(double)9/2)-9%2 的值是_。(分数:2.00)A.0B.3C.4D.523.若 a是数值类型,则逻辑表达式(a=1)|(a!=1)的值是_。(分数:1.00)A.1B.0C.2D.不知道 a的值,不能确定24.已知字符 A的 ASCII代码值是 65,字符变量 c1的值是 A,c2 的值是 D。则执行语句printf(“%d,%d“,c1,c2-2);的输出结果是_。(分数:1.00)A.A,68B.65,66C.A,BD.65,6825.有以下程序 #includestdio.h #def
11、ine S(x)4*(x)*x+1 main() int k=5,j=2; printf(“%d/n“,S(k+j); 程序运行后的输出结果是_。(分数:2.00)A.143B.197C.33D.2826.有以下程序: #includestdio.h #includestring.h main() char p20=“a“,“b“,“c“,“d“,q=“abc“,r=“abcde“; strcat(p,r);strcpy(p+strlen(q),q); printf(“%d/n“,strlen(p); 程序运行后的输出结果是_。(分数:1.00)A.11B.9C.6D.727.软件按功能可以分
12、为:应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软件的是_。(分数:1.00)A.编译程序B.操作系统C.教务管理系统D.汇编程序28.以下_不属于对象的基本特征。(分数:2.50)A.继承性B.封装性C.分类性D.多态性29.若指针 p已正确定义并指向如图所示存储单元: (分数:1.00)A.20B.30C.21D.3130.有以下程序: #includestdio.h main() int a, b, k, m, *p1, *p2; k=1, m=8; p1= a=/*p1-m; b=*p1+*p2+6; printf(“%d“, a); printf(“%d/n“, b);
13、编译时编译器提示错误信息,你认为出错的语句是_。(分数:1.00)A.a=/*p1-m;B.b=*p1+*p2+6;C.k=1, m=8;D.p1=31.以下程序的输出结果是_。 #include stdio.h main() int k, j, m; for (k=5; k=1; k-) m=0; for (j=k; j=5; j+) m=m+k*j; printf(“% d/n“, m); (分数:2.50)A.124B.25C.36D.1532.在下列语句中,其含义为“q 是一个函数指针,该指针指向整型数据”的定义语句是_。(分数:2.50)A.int*q;B.int(*q)();C.i
14、nt*q;D.int*q();33.以下选项中可用作 C程序合法实数的是_。(分数:1.00)A1e0B.3.0e0.2CE9D.9.12E34.设 x,y,z 均为实型变量,代数式 (分数:1.00)A.x/y*zB.x%y%zC.x/y/zD.x*z/y35.有如下程序: #include stdio.h main() int i; for(i=0;i5;i+) putchar(“9“-i); printf(“/n“); 程序运行后的输出结果是_。(分数:1.00)A.54321B.98765C.“9“8“7“6“5“D.“43210“二级 C语言分类模拟题 516答案解析(总分:51.0
15、0,做题时间:90 分钟)一、选择题(总题数:35,分数:51.00)1.下列程序的输出结果是_。 #includestdio.h main() int a23=1, 2, 3, 4, 5, 6, (*p)3, i; p=a; for(i=0; i3; i+) if(i2) p1i=p1i-1; else p1i=1; printf(“%d/n“, a01+a11+a12); (分数:2.50)A.8B.7 C.12D.9解析:解析 本题考查 for循环及 ifelse语句嵌套,第 1次执行 for循环,p10=p10=p10-1=3;第 2次执行 for循环,p11=p11-1=4;第 3次
16、执行 for循环,p12=1,最后输出的是a01+a11+a12=2+4+1=7。2.以下叙述中正确的是_。(分数:2.00)A.使用 break语句可以使流程跳出 switch语句体 B.break语句不能用于提前结束 for语句的本层循环C.continue语句使得整个循环终止D.在 for语句中,continue 与 break的效果是一样的,可以互换解析:解析 break 跳出 switch语句或循环语句,contiune 结束本次循环,继续进行剩余的循环。所以答案选择 A。3.有以下程序: #includestdio.h void fun(int*s, int n1, int n2)
17、 int i, j, t; i=n1; j=n2; while (ij) t=*(s+i); *(s+i)=*(s+j); *(s+j)=t; i+; j-; main() int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 0, i, *p=a; fun(p, 0, 3); fun(p, 4, 9); fun(p, 0, 9); for(i=0; i10; i+) printf(“%d“, *(a+i); 程序的输出结果是(分数:1.00)A.0987654321B.4321098765C.5678901234 D.0987651234解析:4.以下叙述中正确的是_。(分数
18、:2.00)A.只要适当地修改代码,就可以将 do-while与 while相互转换 B.对于“for(表达式 1;表达式 2;表达式 3)循环体“首先要计算表达式 2的值,以便决定是否开始循环C.对于“for(表达式 1;表达式 2;表达式 3)循环体“,只在个别情况下才能转换成 while语句D.如果根据算法需要使用无限循环(即通常所称的“死循环”),则只能使用 while语句解析:解析 do-while 与 while可以相互转换,所以选择 A。5.有以下程序: # include stdio.h main() char a=“H“; a=(a=“A“a=“Z“)?(a-“A“+“a“)
19、:a; printf(“%c/n“,a); 程序运行后的输出结果是_。(分数:1.00)AABaCHDh 解析:解析 多元运算符问号前面表达式为真,所以(a-“A“+“a“)赋值给 a,括号里的运算是把大写字母变成小写字母,所以答案应为选项 D。6.以下定义数组的语句中错误的是_。(分数:1.00)A.int num=1,2,3,4,5,6;B.int num3=1,2,3,4,5,6;C.int num24=1,2,3,4,5,6; D.int num4=1,2,3,4,5,6;解析:解析 C 选项中定义的数组为 2行 4列,而赋值时赋成了 3行,因此出错。7.设有某函数的说明为: int*
20、func(int a10,int n); 则下列叙述中,正确的是_。(分数:1.00)A.形参 a对应的实参只能是数组名B.说明中的 a10写成 a或*a 效果完全一样 C.func的函数体中不能对 a进行移动指针(如 a+)的操作D.只有指向 10个整数内存单元的指针,才能作为实参传给 a解析:解析 本题重点考查返回指针值的函数的相关知识。返回指针值的函数,一般定义形式为:类型名*函数名(参数列表)。fune 函数被定义为指针型函数,它的一个形参为整型数组 a,形参 a对应的实参可以是数组名和指针,A、D 错误。实参传递给形参 a的是地址值,实参和形参指向同一段内存单元,在fune函数体内对
21、形参 a进行移动指针操作,可以改变实参的值,C 错误。8.有以下程序: #include stdio.h #define N 5 #define M N+1 #define f(x) (x*M) main( ) int i1,i2; i1=f(2); i2=f(1+1); printf(“%d%d/n“,i1,i2); 程序的运行结果是_。(分数:2.00)A.12 7B.12 12C.11 11D.11 7 解析:解析 本题考查宏定义。宏定义只是做简单的替换,所以本题中执行语句 f(2)=(2*N+1)=11,执行语句 f(1+1)=(1+1*N+1)=7。因此选项 D正确。9.有以下程序
22、#includestdio.h main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=1; for(i=0;i3;i+) for(j=i;j=i;j+)t+=bibji; printf(“%d/n“,t); 程序运行后的输出结果是_。(分数:1.00)A.3B.4 C.1D.9解析:解析 每次内循环只循环一次就结束,第一次外循环时 t=t+b0b00=1+b00=1+0=1;第二次外循环时 t=t+b1b11=1+b11=1+1=2;第三次外循环时 t=1+b2b22=2+b22=2+2=4。故本题答案为 B。10.循环控制语句“while(!scanf(“%d“, i
23、nt a=1, b=3, c=2; 则正确的 switch语句是_。(分数:2.00)A.switch(a+b) case 1:printf(“*/n“);case c:printf(“*/n“);B.switch(int)x);case 1:printf(“*/n“);case 2:printf(“*/n“);C.switch(x)case 1.0:printf(“*/n“);case 2.0:printf(“*/n“);D.switch(a+b)case 1:printf(“*/n“);case 2+1:printf(“*/n“); 解析:解析 B 选项的“switch(int)x);”语
24、句中不应该有最后的分号。switch(expr1)中的 expr1不能用浮点类型或 long类型,也不能为一个字符串,因此 C错误。case 后面只能是常量表达式,因此 A错误。18.有以下程序 #includestdio.h typedef struct int b,p;A; void f(A c) /*注意:c 是结构变量名*/ int j; c.b+=1;c.p+=2; main() int i; A a=1,2; f(a); printf(“%d,%d/n“,a.b,a.p); 程序运行后的输出结果是_。(分数:2.00)A.2,4B.1,2 C.1,4D.2,3解析:19.有以下程序
25、: #include stdio.h struct link int data; struct link* next; ; main() struct link *h,a,b; h=a.data=10;a.next=b.data=20; 程序运行时不能输出 10,20 的语句是_。(分数:1.00)A.printf(“%d,%d/n“,h-data,a.next.data); B.printf(“%d,%d/n“,a.data,(%a.next).data);C.printf(“%d,%d/n“,h-data,(*a.next).data);D.printf(“%d,%d/n“,a.data,
26、a.next-data);解析:解析 可用以下 3种形式来引用结构体变量中的成员:结构体变量名成员名;指针变量名-成员名;(*指针变量名)成员名。主函数定义了两个结构体变量 a,b 其成员 data分别为 10和 20,且 a成员指针指向 b。A 选项中 a.next为指针,其引用格式为 a.next-data 与(*a.next).data,A 选项错误,故选择 A选项。B 选项 a.data=10,(*a.next).data=20,能正确输出 10,20;C 选项 h-data=10,(*a.next).data=20,能正确输出 10,20;D 选项 a.data=10,a.next-
27、data=20,能正确输出 10,20。20.有以下程序 #include main() int a=0,b=0; /*给 a赋值 a=10; b=20;给 b赋值*/ printf(“a+b=%d/n“,a+b);/*输出计算结果*/ 程序运行后的输出结果是_。(分数:1.00)A.a+b=0 B.a+b=30C.a+b=10D.出错解析:解析 注释/*和*/之间计算机不参与编译,所以 a、b 值仍为 0,答案选择 A。21.若有定义:double a=22;int i=0,k=18;,则不符合 C语言规定的赋值语句是_。(分数:2.00)A.i=(a+k)=(i+k);B.i=a%11;
28、C.a=a+,i+D.i=!a;解析:解析 取模运算符“%”、二元运算符具有左结合性,参与运算的量均为整型。B 选项中的 a变量是 double实型,不符合规定。22.表达式(int)(double)9/2)-9%2 的值是_。(分数:2.00)A.0B.3 C.4D.5解析:解析 先将整型数据 9强制转换成 double型,然后除以 2,得到的结果与 double型保持一致,即为 4.5,然后将 4.5强制转换成整型数据 4,然后计算 9%2的值为 1,最后计算 4-1的值为 3,所以选择B选项。23.若 a是数值类型,则逻辑表达式(a=1)|(a!=1)的值是_。(分数:1.00)A.1
29、B.0C.2D.不知道 a的值,不能确定解析:解析 由于 a=1和 a!=1两者互斥,即总有一个为真,因此二者的“或”也必定为真。24.已知字符 A的 ASCII代码值是 65,字符变量 c1的值是 A,c2 的值是 D。则执行语句printf(“%d,%d“,c1,c2-2);的输出结果是_。(分数:1.00)A.A,68B.65,66 C.A,BD.65,68解析:解析 在 C语言中,字符型数据在内存中的存储形式是 ASCII码值。当需要以整型格式输出字符时,输出的也是 ASCII码值。字符“A“和“D“的 ASCII码值分别为 65和 68。25.有以下程序 #includestdio.
30、h #define S(x)4*(x)*x+1 main() int k=5,j=2; printf(“%d/n“,S(k+j); 程序运行后的输出结果是_。(分数:2.00)A.143 B.197C.33D.28解析:26.有以下程序: #includestdio.h #includestring.h main() char p20=“a“,“b“,“c“,“d“,q=“abc“,r=“abcde“; strcat(p,r);strcpy(p+strlen(q),q); printf(“%d/n“,strlen(p); 程序运行后的输出结果是_。(分数:1.00)A.11B.9C.6 D.7
31、解析:解析 strcpy:字符串拷贝函数;strlen:求字符串长度函数(注意:不包含字符串结束标识符“/0“);strcat:字符串连接函数。执行完语句 strcat(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,a,b,c。所以 strlen(p)的结果为6,C 选项正确
32、。27.软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软件的是_。(分数:1.00)A.编译程序B.操作系统C.教务管理系统 D.汇编程序解析:解析 编译软件、操作系统、汇编程序都属于系统软件,只有教务管理系统才是应用软件。所以选择 C选项。28.以下_不属于对象的基本特征。(分数:2.50)A.继承性 B.封装性C.分类性D.多态性解析:解析 对象具有如下特征: 标识惟一性,指对象是可区分的; 分类性,指可以将具有相同属性和操作的对象抽象成类; 多态性,指同一个操作可以是不同对象的行为; 封装性,从外面看只能看到对象的外部特征,而不知道也无需知道数据的具体结构以
33、及实现操作的算法;模块独立性好,对象是面向对象的软件的基本模块,对象内部各种元素彼此结合得很紧密,内聚性强。29.若指针 p已正确定义并指向如图所示存储单元: (分数:1.00)A.20B.30 C.21D.31解析:30.有以下程序: #includestdio.h main() int a, b, k, m, *p1, *p2; k=1, m=8; p1= a=/*p1-m; b=*p1+*p2+6; printf(“%d“, a); printf(“%d/n“, b); 编译时编译器提示错误信息,你认为出错的语句是_。(分数:1.00)A.a=/*p1-m; B.b=*p1+*p2+6;
34、C.k=1, m=8;D.p1=解析:解析 本题考查指针,p1= for (k=5; k=1; k-) m=0; for (j=k; j=5; j+) m=m+k*j; printf(“% d/n“, m); (分数:2.50)A.124B.25C.36D.15 解析:32.在下列语句中,其含义为“q 是一个函数指针,该指针指向整型数据”的定义语句是_。(分数:2.50)A.int*q;B.int(*q)(); C.int*q;D.int*q();解析:解析 本题考查指针函数。其定义的基本格式为:类型说明符(*函数名)()。“类型说明符”表示返回的指针值指向的数据类型。33.以下选项中可用作
35、C程序合法实数的是_。(分数:1.00)A1e0 B.3.0e0.2CE9D.9.12E解析:解析 C 语言中实数的指数计数表示格式为字母 e或者 E之前必须有数字,且 e或 E后面的指数必须为整数。所以选项 A正确。34.设 x,y,z 均为实型变量,代数式 (分数:1.00)A.x/y*zB.x%y%zC.x/y/z D.x*z/y解析:解析 运算符、/的结合顺序是从左到右,所以 x先除以 y,再除以 z。35.有如下程序: #include stdio.h main() int i; for(i=0;i5;i+) putchar(“9“-i); printf(“/n“); 程序运行后的输出结果是_。(分数:1.00)A.54321B.98765 C.“9“8“7“6“5“D.“43210“解析:解析 putcbar 函数是向标准输出设备上输出一个字符。字符在内存中以 ASCII码方式存储,可以与整数进行加减运算,但是要保证计算结果在 0255 之间。本题执行过程为:i=0,输出字符 9,在i5 的情况下,依次输出字符 8、7、6、5。在 i=5时,退出 for循环。最后显示在命令窗口结果为98765,故 B选项正确。