1、国家二级(C 语言)机试模拟试卷 142及答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列关于循环队列的叙述中正确的是( )。(分数:2.00)A.循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B.循环队列中元素的个数是由队头指针和队尾指针共同决定的C.在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D.在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况2.设有一个初始状态为空的栈。现将元素 A、B、C、1、2、3 依次入栈,然后再依次出栈,则出栈后的元素顺序为以下哪一项?( )(分数:2.00)A.123A
2、BCB.CBA321C.ABC123D.321CBA3.在长度为 m的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。(分数:2.00)A.O(m)B.O(m 2 )C.O(1og 2 m )D.O(mlog 2 m )4.下列叙述中正确的是( )。(分数:2.00)A.顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的B.顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C.顺序存储结构能存储有序表,链式存储结构不能存储有序表D.链式存储结构比顺序存储结构节省存储空间5.数据流图中带有箭头的线段表示的是( )。(分数:2.00)A.控制流B.事件驱动C.模
3、块调用D.数据流6.在软件开发的需求分析阶段,可以使用下列哪种工具?( )(分数:2.00)A.NS图B.DFD图C.PAD图D.程序流程图7.计算机语言中常说的面向对象中,“对象”基本特点一般不包括( )。(分数:2.00)A.多态性B.封装性C.一致性D.标识唯一性8.一间学生宿舍可住至少一个学生,则宿舍和学生之间的对应关系是( )。(分数:2.00)A.一对多B.一对一C.多对一D.多对多9.在数据管理技术发展的三个阶段中,数据共享最好的一个阶段是( )。(分数:2.00)A.人工管理阶段B.文件系统阶段C.数据库系统阶段D.三个阶段相同10.有三个关系 R、S 和 T如下: (分数:2
4、.00)A.笛卡尔积B.交C.并D.自然连接11.在以下选项中,按照 C语言规定,不能出现在标识符中的是( )。(分数:2.00)A.大写字母B.下划线C.数字字符D.连接符12.在以下选项中,能用作 C语言数据常量的是( )。(分数:2.00)A.10LB.083C.05e12D.o30F13.下列叙述中错误的是( )。(分数:2.00)A.一个 C语言程序只能实现一种算法B.C语言程序可以由多个程序文件组成C.C语言程序可以由一个或多个函数组成D.一个 C语言函数可以单独作为一个 C语言程序文件存在14.假如下列选项中的变量已正确定义并成功赋值,其中正确的表达式是( )。(分数:2.00)
5、A.int(2212)B.n=y+m+5,+yC.x=y*3=x+kD.x=217015.设在 C语言程序中已经定义了整型变量 int x=2;,以下表达式中,值不为 6的是( )。(分数:2.00)A.2*x,x+=2B.x+,2*xC.x*=(1+x)D.x*=x+116.有以下 C语言程序: #inelude void main() int x,y,z; x=y=1; z=x+,y+,+y; printf(d,d,dn,x,y,z); 程序运行后的输出结果是( )。(分数:2.00)A.2,3,3B.2,3,2C.2,2,1D.2,3,117.设 x,y已经成功定义并赋值,则与表达式(x
6、y)?(x+):(y+)中的条件表达式(x 一 y)等价的是( )。(分数:2.00)A.(xy0)B.(x一 y0x 一 y0)C.(xy0)D.(x一 y=0)18.有以下 C语言程序: #include void main() char ch1,ch2; ch1=R+5一2; ch2=R+5一13; printf(c,dn,ch1,ch2); 已知字母 R的 ASC码为 82,程序运行后的输出结果是( )。(分数:2.00)A.U,84B.T,83C.U,TD.T,U19.有以下程序: #include void main() int x=2,y=3; if(!x)y+=3; else
7、if(x=0) if(x)y+=2; else y+; printf(dn,y); 程序运行后的输出结果是( )。(分数:2.00)A.3B.2C.1D.020.在 C语言中定义下列变量并赋值:double x=1333;int a=3,b=2,c=1;则下列选项中正确的switch语句是( )。(分数:2.00)A.switch(a+b) casel:printf(*n); case2+l:printf(*n);B.switch(int)x); ease1:printf(*n); case2:printf(*n);C.switch(x) case1333:printf(*n); case 2
8、0:printf(*n);D.switch(a+b) case 1:printf(*n); case c:printf(*n);21.有以下程序: #include void main() int i=15; for(;i0;i 一一) if(i5=0)printf(d,一一 i); 程序运行后的输出结果是( )。(分数:2.00)A.1494B.15105C.151005D.14090422.有以下程序: #include void main() int i,j,m=1; for(i=1;i3;i+) for(j=3;j0;j一一) if(i*j3)break; m*=i*j; printf
9、(m=dn,m); 程序运行后的输出结果是( )。(分数:2.00)A.m=4B.m=2C.m=6D.m=523.有以下程序:includestdiohint fun(int x,int y)if(x!=y)return(x+y)2);else return(x);void main()int a=3,b=5,c=6;printf(dn,fun(fun(b,c),2*a);程序运行后的输出结果是( )。(分数:2.00)A.6B.5C.8D.1224.下列选项中,定义 C语言数组的正确语句是( )。(分数:2.00)A.int N=10;int xN;int xN;B.#define N 10
10、 int xNC.int x010;D.int x;25.有以下程序:#includestdioh void main()int i,*p=NULL;*p=&i;printf(Inputi:);scanf(d,&p);printf(outputi:);printf(dn,p);该程序试图通过指针 p为变量 i读入数据并输出,但程序有多处错误,以下语句正确的是( )。(分数:2.00)A.*p=&i;B.int i,*p=NULL;C.scanf(d,&p)D.printf(dn,p);26.有以下程序: #include int add(int x,int y)return(x+y); voi
11、d main() int s,(*pf)(),a=1,b=2; pf=add; 则以下函数调用语句错误的是( )。(分数:2.00)A.s=pf(a,b);B.s=add(a,b);C.s=(*pf)(a,b);D.s=*pf(a,b);27.有以下程序: #include void main() int a:7,8,9,10,i; for(i=0;i4;i+) switch(i3) case 0:switch(ai3) case 0:ai+;break; case 1:ai; break; case 1:ai=0; for(i=0;i4;i+)printf(d,ai);printf(n);
12、程序运行后的输出结果是( )。(分数:2.00)A.0696B.6010C.0906D.609928.有以下程序: #include void main() int a33=0,1,2,0,1,2,0,1,2,i,j,s=10; for(i=0;i3;i+) for(j=1;j=i;j+) s+=aiaji/; printf(dn,s); 程序运行后的输出结果是( )。(分数:2.00)A.12B.13C.11D.1529.以下语句中存在语法错误的是( )。(分数:2.00)A.char ss620;ss1=right?;B.char ss20=fight;C.char*ss6;ss1=rig
13、ht?;D.char*ss=right?;30.以下不能将 s所指字符串正确复制到 t所指存储空间的是( )。(分数:2.00)A.do*t+=*s+;while(*s);B.for(i=0;ti=si;i+);C.while(*t=*s)t+;s+;D.for(i=0,j=0;ti+=sj+;);31.有以下程序: #include void swap(char*ch1,char*ch2) char ch; ch=*ch1;*ch1=*ch2;*ch2=ch; void main() char*str1=xyz,*str2=abc; swap(str1,str2);printf(s,sn,s
14、tr1,str2); 程序执行后的输出结果是( )。(分数:2.00)A.xyz,cbaB.xyz,abcC.ayz,xbcD.abc,xyz32.有以下函数:int fun(char*x,char*y)int m=0;while(*x=*y)&*x!=0)x+;y+;m+;return m;函数的功能是( )。(分数:2.00)A.将 y所指字符串赋给 x所指存储空间B.统计 x和 y所指字符串中最前面连续相同的字符个数C.查找 x和 y所指字符串中是否有0D.统计 x和 y所指字符串中相同的字符个数33.有以下程序: #lnclude int fun() static int i=1; i
15、*=3; retum i; void main() int k,s=1; for(k=1;k=3;k+)s*=fun(); printf(dn,s); 程序运行后的输出结果是( )。(分数:2.00)A.729B.27C.81D.24334.在 C语言源文件中定义的全局变量的作用域为( )。(分数:2.00)A.所在文件的全部范围B.所在程序的全部范围C.所在函数的全部范围D.由具体定义位置和 extern说明来决定范围35.以下叙述中不正确的是( )。(分数:2.00)A.用 typedef可以为各种类型起别名,但不能为变量起别名B.可以用 typedef将已存在的类型用一个新的名字来代表C
16、.用 typedef定义新的类型名后,原有类型名仍有效D.可以通过 typedef增加新的类型36.有以下程序: #include struct S int x,y;data2=1,2,10,12; void main() struct s p=data1; printf(dn,+(px); 程序运行后的输出结果是( )。(分数:2.00)A.10B.11C.20D.2137.有以下程序: #include #define pi 314 #define S(r)pi*r*r void main() int i=1,j=2;printf(42fn,S(i+j); 程序运行后的输出结果是( )。(
17、分数:2.00)A.714B.2826C.628D.94238.有以下程序: #include void main() unsigned char a=1,b=3,c=5,d; d=ab;d&=c;printf(dn,d); 程序运行后的输出结果是( )。(分数:2.00)A.1B.3C.4D.539.C语言的文件操作过程中,以下描述中正确的是( )。(分数:2.00)A.C语言中的文件是流式文件,因此只能顺序存取数据B.打开一个已存在的文件并进行了写操作后,原有文件中的全部数据必定被覆盖C.在一个程序中当对文件进行了写操作后,必须先关闭该文件然后再打开,才能读到第 1个数据D.当对文件的读(
18、写)操作完成之后。必须将它关闭:否则可能导致数据丢失40.有以下程序: #include #include void main( ) int*a,*b,*c; a=b=c=malloc(sizeof(int); a=0;*b=1;*c=2: a=b; printf(d,d,dn,*a,*b,*c); 程序运行后的输出结果是( )。(分数:2.00)A.出错B.2,2,3C.1,2,3D.2,2,2二、程序填空题(总题数:1,分数:2.00)41.下列给定程序中,函数 fun的功能是进行数字字符转换。若形参 ch中是数字字符0到9,则将0转换成9,1转换成8,2转换成7,9转换成0;若是其他字符
19、则保持不变;并将转换后的结果作为函数值返回。 请在程序的下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 注意:部分源程序在文件 BLANKlC 中。不得增行或删行,也不得更改程序的结构! #inelude *found* 【1】fun(char ch) *found* if(ch=0&【2】) *found* return9一(ch 一【3】); return ch; main() char c1,c2; c1=1; c2=fun(c1) printf(c,c,c1,c2); (分数:2.00)_三、程序修改题(总题数:1,分数:2.00)42.给定程序 modilc 的主函数中
20、,将 a、b、c 三个节点链成一个单向链表,并给各节点的数据域赋值,函数 fun()的作用是:累加链表节点数据域中的数据作为函数值返回。请改正函数 fun中指定部位的错误,使它能得出正确的结果。注意:不要改动 main函数,不得增行或删行,也不得更改程序的结构。试题程序:#includestdiohtypedef struct listint data;struct list*next;LIST;int fun(LIST*h)LIST*P;*found*int t:p=h;*found*while(*p)*found*t=t+pdata;p=(*p)next;return t:main()LI
21、ST a,b,c,*h;adata=34;bdata=51;cdata=87;enext=0;h=&a;anext=&b;bnext=&c;printf(总和=dn,fun(h);(分数:2.00)_四、程序设计题(总题数:1,分数:2.00)43.规定输入的字符串中只包含字母和#号。请编写函数 fun,其功能是:将字符串尾部的#号全部删除,前面和中间的#号不动。例如,字符串中的内容为:“#AB#CD#EF”,删除后,字符串中的内容应当是:“#AB#CD#EF”。在编写函数时,不得使用 C语言提供的字符串函数。注意:部分源程序在文件 PROC1C中。请勿改动主函数 main和其他函数中的任何内
22、容,仅在函数 fun的花括号中填入你编写的若干语句。#includestdioh void fun(char*a)main()char s81;void NONO();printf(Enter a string:n);gets(s);fun(s);printf(The string after deleted:n);puts(s);NONO();void NONO()*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*FILE*in,*out;int i;char s81;in=fopen(indat,r);out=fopen(outdat,W);for(i=0;i10;i+)fs
23、canf(in,s,s);fun(s);fprintf(out,sn,s);fclose(in);fclose(out);(分数:2.00)_国家二级(C 语言)机试模拟试卷 142答案解析(总分:86.00,做题时间:90 分钟)一、选择题(总题数:40,分数:80.00)1.下列关于循环队列的叙述中正确的是( )。(分数:2.00)A.循环队列有队头和队尾两个指针,因此,循环队列是非线性结构B.循环队列中元素的个数是由队头指针和队尾指针共同决定的 C.在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况D.在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况解析:解析:循环
24、队列有队头指针和队尾指针,其中的元素个数是由队头指针和队尾指针共同决定的,且循环指针是线性结构,因此,其他选项不正确。2.设有一个初始状态为空的栈。现将元素 A、B、C、1、2、3 依次入栈,然后再依次出栈,则出栈后的元素顺序为以下哪一项?( )(分数:2.00)A.123ABCB.CBA321C.ABC123D.321CBA 解析:解析:用栈组织数据的原则是先进后出,所以最后进栈的元素最先出栈,最先进栈的元素最后出栈,所以答案选择 D。与队列组织数据的先进出原则要区分开来。3.在长度为 m的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。(分数:2.00)A.O(m)B.O(m
25、2 )C.O(1og 2 m ) D.O(mlog 2 m )解析:解析:进行二分法查找时,有序线性表中的元素必须顺序存储,因此进行二分法查找需要 log 2 m次。4.下列叙述中正确的是( )。(分数:2.00)A.顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 B.顺序存储结构只针对线性结构,链式存储结构只针对非线性结构C.顺序存储结构能存储有序表,链式存储结构不能存储有序表D.链式存储结构比顺序存储结构节省存储空间解析:解析:链式存储可以是连续结构也可以是非连续结构,这是链式存储的特点。但链式存储中的存储节点不仅包括数据域还包括指针域,所以存储空间会更多,而不是节省
26、存储空间。5.数据流图中带有箭头的线段表示的是( )。(分数:2.00)A.控制流B.事件驱动C.模块调用D.数据流 解析:解析:数据流图中的箭头线段表示数据流,指从前一个结点流向后一个结点。6.在软件开发的需求分析阶段,可以使用下列哪种工具?( )(分数:2.00)A.NS图B.DFD图 C.PAD图D.程序流程图解析:解析:在软件开发的需求阶段一般会使用的工具有数据流图(DFD 图)和数据字典(DD),因此选择B。7.计算机语言中常说的面向对象中,“对象”基本特点一般不包括( )。(分数:2.00)A.多态性B.封装性C.一致性 D.标识唯一性解析:解析:对象的基本特点包括:多态性、封装性
27、、模块化和标识唯一性,因此选项 C不正确。8.一间学生宿舍可住至少一个学生,则宿舍和学生之间的对应关系是( )。(分数:2.00)A.一对多 B.一对一C.多对一D.多对多解析:解析:一间宿舍可以住多个学生,而一个学生只能住一间宿舍,因此,宿舍和学生是一对多的关系。9.在数据管理技术发展的三个阶段中,数据共享最好的一个阶段是( )。(分数:2.00)A.人工管理阶段B.文件系统阶段C.数据库系统阶段 D.三个阶段相同解析:解析:数据管理技术的三个发展阶段为人工管理阶段、文件系统阶段和数据库管理阶段。只有在数据库管理阶段实现数据的自由分享更加容易和方便。10.有三个关系 R、S 和 T如下: (
28、分数:2.00)A.笛卡尔积B.交C.并D.自然连接 解析:解析:只有通过自然连接,即将数据自然连接在一起,并去掉重复的数据才能实现如题所示的结果,因此选择 D。11.在以下选项中,按照 C语言规定,不能出现在标识符中的是( )。(分数:2.00)A.大写字母B.下划线C.数字字符D.连接符 解析:解析:按照 C语言规定,标识符由字母、数字和下划线组成,且开头必须是字母或下划线,所以选项 D不合法。12.在以下选项中,能用作 C语言数据常量的是( )。(分数:2.00)A.10L B.083C.05e12D.o30F解析:解析:选项 A是长整型数,合法;选项 B的形式是八进制数,但其中包含数字
29、 8,不合法;选项 C是科学计数法的形式,但 e后面的数不是整数,不合法;选项 D有点像十六进制的数,但第一个字符是0,不是 0也不是 0x所以不合法。13.下列叙述中错误的是( )。(分数:2.00)A.一个 C语言程序只能实现一种算法 B.C语言程序可以由多个程序文件组成C.C语言程序可以由一个或多个函数组成D.一个 C语言函数可以单独作为一个 C语言程序文件存在解析:解析:在 C语言程序中可以自选编制多种算法,因此选项 A的叙述错误。C 语言中可以由多个文件组成,并通过引用的方式连接在一起编译并运行,每个文件可以包含一个或多个函数,因此选项 B和 D的叙述没有错误;C 语言可以包含多个函
30、数,所以选项 C的叙述也没有错误。14.假如下列选项中的变量已正确定义并成功赋值,其中正确的表达式是( )。(分数:2.00)A.int(2212)B.n=y+m+5,+y C.x=y*3=x+kD.x=2170解析:解析:求余运算符的左右两个数字都必须是整数,所以选项 A和 D错误,另外,进行整型强制转化时正确的表达式是(int)x,而不是 int(x);选项 C中不能将 x+k的值赋给 y*3,所以选项 C错误。选项 B中涉及逗号运算符,它的级别最低,因此,选项 B表达式的执行过程是先将 y+m+5的值赋给 n,y 值自加一次。15.设在 C语言程序中已经定义了整型变量 int x=2;,
31、以下表达式中,值不为 6的是( )。(分数:2.00)A.2*x,x+=2 B.x+,2*xC.x*=(1+x)D.x*=x+1解析:解析:选项 A和 B中出现的逗号表达式,整个表达式是取逗号后面的表达式的值,因此,选项 A的计算过程是先计算 2*x,得到 4,此时 x还是 2,再计算 x+=2,得到 4,因此整个表达式的值是 4。选项 B的计算过程是先计算 x+,得到 2,此时 x经过自加 1后变成了 3,再计算 2*x,得到 6,整个表达式的值取逗号后面的表达式的值为 6。选项 C分解后可以写成 x=x*(1+x),将 x=2代入,结果为 6。选项 D中的加法运算级别高于赋值运算,所以可以
32、写成 x=x*(x+1),将 x=2代入,结果为 6。16.有以下 C语言程序: #inelude void main() int x,y,z; x=y=1; z=x+,y+,+y; printf(d,d,dn,x,y,z); 程序运行后的输出结果是( )。(分数:2.00)A.2,3,3B.2,3,2C.2,2,1D.2,3,1 解析:解析:本题主要考察+运算符和逗号运算符的执行顺序。表达式 z=x+,y+,+y 的计算过程是,首先计算 x+,得到 1,x 加 1后变成 2(先使用后自加);再计算 y+,得到 1后变成 2;最后计算+y,y先加 1变成 3,得到 3(先自加再使用)。因为赋值
33、运算级别高于逗号运算,所以整个表达式是 x+的值,即将 1赋给 z。程序运行后 x,y,z 的值将是 2,3,1。17.设 x,y已经成功定义并赋值,则与表达式(xy)?(x+):(y+)中的条件表达式(x 一 y)等价的是( )。(分数:2.00)A.(xy0)B.(x一 y0x 一 y0) C.(xy0)D.(x一 y=0)解析:解析:表达式(xy)?(x+):(y+)中问号前面在表达式若为非 0(注意不是大于 0),则用冒号前面的表达式为整个表达式赋值,否则将用冒号后面的表达式赋值。18.有以下 C语言程序: #include void main() char ch1,ch2; ch1=
34、R+5一2; ch2=R+5一13; printf(c,dn,ch1,ch2); 已知字母 R的 ASC码为 82,程序运行后的输出结果是( )。(分数:2.00)A.U,84 B.T,83C.U,TD.T,U解析:解析:本题中将字符进行整数运算,其实是使用字符的 ASC码进行运算,运算后 ch1和 ch2的ASC码将为 82+3和 82+2,注意在程序输出时用的格式是cd,因此,chi1 输出字符 U(ASC码为 85),字符 ch2输出为整数,即 84。19.有以下程序: #include void main() int x=2,y=3; if(!x)y+=3; else if(x=0)
35、if(x)y+=2; else y+; printf(dn,y); 程序运行后的输出结果是( )。(分数:2.00)A.3 B.2C.1D.0解析:解析:if 一 elseilf一 else分支结构中的关键考察点是 else将与最近的一个 if一 elself配对。本题串最后的 else语句将与紧跟在其前面的 if(x)y+=2;语句配对,而这两个语句均在其前面的 elself语句作用域内;由于 x=1,所以,程序开始的 if和 elseif语句均不执行,因而,本程度段中的具体赋值语句均未得到执行,运行后输出的 y值为初始值。20.在 C语言中定义下列变量并赋值:double x=1333;i
36、nt a=3,b=2,c=1;则下列选项中正确的switch语句是( )。(分数:2.00)A.switch(a+b) casel:printf(*n); case2+l:printf(*n); B.switch(int)x); ease1:printf(*n); case2:printf(*n);C.switch(x) case1333:printf(*n); case 20:printf(*n);D.switch(a+b) case 1:printf(*n); case c:printf(*n);解析:解析:switch()条件语句中的表达式只能接收 int,byte,clar,short
37、,enum 类型,不能接收其他类型。因此选项 C不正确;case 语句中的表达式必须是常量表达式,所以 D选项不正确。选项 B在switch后面加了一个分号,用法出错。21.有以下程序: #include void main() int i=15; for(;i0;i 一一) if(i5=0)printf(d,一一 i); 程序运行后的输出结果是( )。(分数:2.00)A.1494 B.15105C.151005D.140904解析:解析:if(i5=0)用来判断能被 5整除的整数;i 是先自减再使用,所以输出的 i值是能被 5整除的整数再减 1,答案 A正确。22.有以下程序: #incl
38、ude void main() int i,j,m=1; for(i=1;i3;i+) for(j=3;j0;j一一) if(i*j3)break; m*=i*j; printf(m=dn,m); 程序运行后的输出结果是( )。(分数:2.00)A.m=4B.m=2C.m=6 D.m=5解析:解析:外层 for循环次数为 2,内层 for循环次数为 3;当 i=1时,执行 3次内循环,结果是m=6;当 i=2时,内循环中 j=3,将执行 break语句,跳出内层循环,此时,外层循环也正好结束,所以结果为 m=6。还需要注意赋值运算符的级别仅比逗号运算符高,比其他运算符低,所以在本题中 m*=i
39、*j可以展开成 m=m*(i*j)。23.有以下程序:includestdiohint fun(int x,int y)if(x!=y)return(x+y)2);else return(x);void main()int a=3,b=5,c=6;printf(dn,fun(fun(b,c),2*a);程序运行后的输出结果是( )。(分数:2.00)A.6B.5 C.8D.12解析:解析:函数 fun(int x,int y)是求两个正数的平均数,返回结果为整数,所以,若 x+y是奇数,返回结果将会舍掉 05。在主函数调用 fun函数时是嵌套调用,第一次先执行 fun(b,c),返回结果 5,
40、第二次再调用 fun(5,6),返回结果为 5。24.下列选项中,定义 C语言数组的正确语句是( )。(分数:2.00)A.int N=10;int xN;int xN;B.#define N 10 int xN C.int x010;D.int x;解析:解析:定义 C语言数组时,数组长度不能是变量,只能是常量,所以选项 A错误;如果数组长度不写明需要在定义时通过赋初值来完成定义,如 int x=1,3,4;因此选项 D错误,选项 C中数组长度的写法不正确。25.有以下程序:#includestdioh void main()int i,*p=NULL;*p=&i;printf(Inputi
41、:);scanf(d,&p);printf(outputi:);printf(dn,p);该程序试图通过指针 p为变量 i读入数据并输出,但程序有多处错误,以下语句正确的是( )。(分数:2.00)A.*p=&i;B.int i,*p=NULL; C.scanf(d,&p)D.printf(dn,p);解析:解析:分析题意,选项 A的正确写法应该是 p=&i;选项 C的正确写法应该是 scanf(d,p);选项 D的正确写法应该是 printf(dn,*p)。26.有以下程序: #include int add(int x,int y)return(x+y); void main() int
42、s,(*pf)(),a=1,b=2; pf=add; 则以下函数调用语句错误的是( )。(分数:2.00)A.s=pf(a,b);B.s=add(a,b);C.s=(*pf)(a,b);D.s=*pf(a,b); 解析:解析:pf 是一个指向函数的指针,本题的难度在于函数指针的调用。在 C语言中,函数名会被转换为指向这个函数的指针,除非这个函数名作为&操作符的操作对象。因此,函数指针的调用可以是add(ab)和 pf(a,b),它们两者是一样的。另外,(*pf)(a,b)也是合法的,表示先对指针 pf引用,再调用函数,指针两侧的括号必须有,可以理解为将函数指针反过来转换为函数名再调用函数,其实
43、在ANSI C标准中将 pf(a,b)认为是(*pf)(a,b)的简写形式,并且推荐使用前者,因为它更符合函数调用的逻辑。但若写成*pf(a,b)的形式,则因为()优先级高于*,所以将先调用函数,再进行指针的解引用操作,但函数返回的是一个整型数值,因此,调用会出错,选项 D不正确。27.有以下程序: #include void main() int a:7,8,9,10,i; for(i=0;i4;i+) switch(i3) case 0:switch(ai3) case 0:ai+;break; case 1:ai; break; case 1:ai=0; for(i=0;i4;i+)pr
44、intf(d,ai);printf(n); 程序运行后的输出结果是( )。(分数:2.00)A.0696B.6010C.0906D.6099 解析:解析:for 循环执行 4次循环,i 分别为 0,1,2,3,循环体内包含两重 swish()条件分支语句,对数组元素 ai进行赋值操作;第一重 switch()语句的判别条件是 i被 3除的余数,但只有两种选择分支 case 0和 case 1;因此当 i=2时,for 循环体不被执行,数组元素 a2还是初始值。当 i=1时,执行第一重 switch的 case 1分支,a1=0;至此已经可以选择正确答案。若再要判断,当 i=0和 3时,程序将进
45、入第二重 switch()条件分支,a03 的值和 a33 的值均为 0,因此,都执行第二重 switch()语句的 case 0分支语句,a0且 a3;28.有以下程序: #include void main() int a33=0,1,2,0,1,2,0,1,2,i,j,s=10; for(i=0;i3;i+) for(j=1;j=i;j+) s+=aiaji/; printf(dn,s); 程序运行后的输出结果是( )。(分数:2.00)A.12B.13C.11D.15 解析:解析:此题考查 for循环执行条件和数组元素的调用。for(ex1;ex2;ex3)ex4;的执行过程是:计算 ex1;判断 ex2,若 ex2为真,执行 ex4(若 ex2为假将不执行 ex4);计算 ex3;判断 ex2的值进行下一次循环。题目中第 1层 for循环执行 3次,i=0,1,2;但第 2层 for循环要根据第 1层 for循环的 i值判断,i=0 时,i=i 为假,所以不执行循环体,i=1