1、二级 C 语言笔试-103 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:50,分数:60.00)1.若有定义:int aa8;则以下表达式中不能代表数组元素 aa1的地址是(分数:1.00)A.”,b5的值 6,故 s 的值变为 10。把 s 作为函数值返回并赋值给 x。6.下面可以作为 C 语言用户标识符的一组是(分数:1.00)A.void define WORDB.a3_b3_123 IF C.for -abc caseD.2a D0 sizeof解析:解析在 C 语言中,合法的标识符可以由字母、数字和下划线组成,其中关键字不能作为用户的标识符,且开头的第一
2、个字符必须为字母或下划线。选项 A 中 void 为关键字;选项 C 中 for 和 case 为关键字;选项 D 中 sizeof 为关键字。7.以下程序的输出结果是main()int b33=0,1,2,0,1,2,0,1,2,i,j,t=1;for(i=0;i3;i+)for(j=i;ji;j+)t=t+bibjj;printf(“%d/n”,t);(分数:1.00)A.3B.4 C.1D.9解析:解析本题中定义了一个二维数组 b 并初始化,定义了一个变量 t 并赋初值 1。接着通过一个二重循环将若干个元素的值加到变量 t 中。循环的执行步骤是:外层循环变量 i=0 时,内层循环变量 j
3、=i 执行语句“t=t+bibjj”,相当于 t=t+b 0b0)0,由于 b00的值为 0,得到 t 的值为 1;依次类推,循环共执行了 3 次,最后输出 t 的值为 4。8.以下说法中,不正确的是(分数:1.00)A.C 程序中必须有一个 main()函数,从 main()函数的第一条语句开始执行B.非主函数都是在执行主函数时,通过函数调用或嵌套调用而执行C.C 程序中的 main()函数必须放在程序的开始位置 D.C 程序中的 main()函数位置可以任意指定解析:解析main()函数的作用,以及 main()函数在程序中出现的位置。一个完整的 C 语言程序有且仅有一个主函数(main(
4、)函数)。程序总从 main()函数的第一条语句开始执行,到 main()函数的最后条语句结束,其他函数都是在执行 main()函数时,通过函数调用或嵌套调用而得以执行的。C 语言规定,main()函数在程序中的位置是任意的。9.设有以下说明语句typedef structint n;char ch8;PER;则下面叙述中正确的是(分数:1.00)A.PER 是结构体变量名B.PER 是结构体类型名 C.typedef struct 是结构体类型D.struct 是结构体类型名解析:解析本题通过 typedef 在定义一个结构体类型的同时,把它自定义成类型名 PER,故 PER 是结构体类型名
5、。10.设有下列二叉树:(分数:1.00)A.B.C. D.解析:解析二叉树的遍历分为先序、中序、后序三种不同方式。本题要求先序遍历;遍历顺序应该为:访问根结点-先序遍历左子树-先序遍历右子树。按照定义,先序遍历序列是 ABDECF。11.若有以下定义和语句:int s45,( *ps)5;ps=s;则对 s 数组元数的正确引用形式是(分数:1.00)A.ps+1B.*(ps+3)C.ps02 D.*(ps+1)+3解析:解析本题首先定义了一个 4 行 5 列的数组 s,又定义了一个指向由 5 个元素组成的一维数组的指针变量 ps,通过赋值让 ps 指向了数组 s 的首地址。此时数组元素 si
6、)j的地址为“*(ps+i)+j”,数组元素 sij可表示为*(*(pe+i)+j);选项 B 表示的是数组元素 a30的地址;选项 D 表示的是数组元素 s13的地址;选项 A 中“ps+1”为指向下一行(第二行)的地址;选项 C 中 ps02无条件等价于“*(ps0 +2)”又无条件等价于“*(*(pe+0)+2)”,即是数组元素 s02。12.若有以下程序#includestdiohvoid f(int n);main()void f(int n);f(5);void f(int n)printf(“%d/n”,n);则以下叙述中不正确的是(分数:1.00)A.若只在主函数中对函数 f
7、进行说明,则只能在主函数中正确调用函数 fB.若在主函数前对函数 f 进行说明,则在主函数和其后的其他的其他函数中都可以正确调用函数 fC.对于以上程序,编译时系统会提示出错信息;提示对 f 函数重复说明 D.函数 f 无返回值,所以可用 void 将其类型定义为无值型解析:解析若一个函数定义在主调函数之后,其返回值不是 int 或 char 型,则必须对之进行函数说明。可在函数外说明也可以在函数内说明,在函数外说明,在其后的所有函数均可调用该函数,若在函数内说明,则只能在本函数内调用该函数。函数只能定义一次,但函数说明可以出现多次。13.以下程序中,while 循环的循环次数是main()i
8、nt i=0;while(i10)if(i1)continue;if(i=5)break;i+;(分数:1.00)A.1B.10C.6D.死循环,不能确定次数 解析:解析break 语句只能在循环体和 switch 语句体内使用,当 break 出现在 switch 语句体内时,其作用只是跳出该 switch 语句体。当 break 出现在循环体中,但不在 switch 语句体内时,则在执行 break后,跳出本层循环体。而 continue 语句的作用是结束本次循环,即跳过本次循环中余下尚未执行的语句,接着再一次进行循环的条件判定。本程序中,变量 i 的初始值为 0,判断 while 后面括
9、号内表达式的值为真,执行循环体内的 if 语句,判断 if 后面括号内表达式的值为真,执行“continue;”语句。因continue 的作用是结束本次循环,即跳过本次循环体中余下尚未执行的语句,接着再一次进行循环的条件判断,所以 i 的值未发生变化,循环条件仍然为真,if 语句也仍然成立,因此循环将无止境地进行下去。14.变量 a 已被定义为整型,下列表达式不正确的是(分数:1.00)A.a=A+20B.a-=aC.a=c+d D.a=c+d解析:解析在 C 语言中,字符变量可参与任何整数运算。本题中只有 C 有错,因为 C 选项中 c、d 如果是字符常量,应有单引号,如果是变量,应该提前
10、定义。15.数据库是()的集合,它具有统一的结构格式并存放于统一的存储介质,可被各个应用程序所共享(分数:1.00)A.视图B.消息C.数据 D.关系解析:解析数据库是数据的集合,其中的数据是按数据所提供的数据模式存放的,它能构造复杂的数据结构,以建立数据之间的内在联系与复杂的关系。16.以下程序调用 findmax 函数返回数组中的最大值findmax(int*a,int n)int * p,* s;for(p=a,s=a;p-an;p+)if(_)s=p;return(*s);main()int x5=12,21,13,6,18;printf(“%d/n”,findmax(x,5);在下划
11、线处应填入的是(分数:1.00)A.psB.*p*s C.apasD.p-ap-s解析:解析在 main()函数中定义了一个具有 5 个元素的 x 数组并赋初值,然后调用 findmax()函数求数组中元素的最大值。调用时把数组元素 x 的首地址,传给了形参指针变量 a,把 5 传给形参 n。在函数findmax()中定义了两种指针变量 p 和 s,其中 s 用来记录最大元素的地址,p 作为循环控制变量,表示每个元素的地址。求最大值的算法是先将第一个元素(用 s 记下它的地址)做为最大值,然后用最大值(*s)与后面的每个元素比较(*p),若后面的元素大,则用 s 记下它的地址,所以下划线应填“
12、*8*p 或“*p*8”。17.若变量 a 是 int 类型,并执行了语句:a=A+1.6;则正确的叙述是(分数:1.00)A.a 的值是字符 CB.a 的值是浮点型C.不允许字符型和浮点型相加D.a 的值是字符A的 ASCII 值加上 1。 解析:解析在 C 语言中规定允许不同类型的量进行运算,但在运算时需转换成高级的类型进行运算。在表达式中有字符型和实型参加运算时,统一转换为实型再运算,当运算结果存入变量时再转换为该变量的类型。18.若指针 p 已正确定义,要使 p 指向两个连续的整型动态存储单位,不正确的语句是(分数:1.00)A.p=2*(int*)malloc(sizeof(int)
13、; B.p=(int *)malloc(2*sizeof(int);C.p=(int *)malloc(2*2);D.p=(int *)malloc(2,sizeof(int);解析:解析malloc()函数的调用格式是“malloc(n)”,作用是申请 n 个字符的存储单元并把该存储区的首地址作为返回值,实际调用的时候可在前面加上“(类型说明符 *)”,以转换成需要的类型的地址。选项 D 多了一个参数,不符合 malloc()函数的调用格式;整型变量在有的计算机系统里占 4 个字节,并不一定在所有的计算机系统里都是两个字节;选项 A 中是申请一个整型的存储空间并把该存储空间的首地址乘以 2,
14、这样的做法是不正确的,其存储空间为没乘以 2 之前的存储空间的 2 倍的连续存储空间的地址。19.以下程序的输出结果是int f()stadc int i=0;int s=1;s+=i;i+;return s;main()int i,a=0;for(i=0;i5;i+)a+=f();printf(“%d/n”,(分数:1.00)A.;A) 20B.24C.25D.15 解析:解析在 C 语言中声明为 static 型的变量,在整个程序运行期间,静态局部变量在内存的静态存储区中占据永久性的存储单元。即使退出函数后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因
15、此这些存储单元中的值得以保留;因而可以继续使用存储单元中原来的值。本题中函数 f()中定义了一个 static 型变量 i,故每调用一次函数 f(),i 的值加 1,返回 s 的值等于 i,在主函数中用了一个 for 循环,该循环执行了 5 次,每次都调用 f()函数,将其返回值累加到变量 a 中,故最后 a 的值为 1+2+3+4+5=15。20.以下不能正确进行字符串赋初值的语句是(分数:1.00)A.char str5=“good!”; B.char str=“good!”;C.char *str=“good!”;D.char str5=g,o,o,d;解析:解析选项 A 定义了一个字符
16、数组 str,具有 5 个元素,但赋初值的时候,初值个数却是 6 个(有一个/0,);选项 B 定义了一个字符数组 str 并给它赋初值,由于省去了长度定义,长度由初值个数确定,相当于 str6;选项 C 定义了一个字符型指针变量并用一个字符串给它赋初值,使该字符型指针指向了该字符串;选项 D 是对字符型数组中单个元素依次赋初值。21.若有以下定义:struct linkint data;struct link * next;a,b,c,*p,*q;且变量 a 和 b 之间已有如下图所示的链表结构:(分数:1.00)A.B.C.D. 解析:解析在本题中指针 p 指向变量 a,q 指向变量 c。
17、要把 c 插入到变量 a 和变量 b 之间,就应该首先让变量 a 的指针域指向变量 c,即(*p).next=q,然后让变量 c 的指针域指向变量 b,即(*q).next=”构成的。赋值表达式的形式为:变量=表达式;。选项 A 中 a+相当于 a+1,是赋值语句;选项 C 和选项 D 也是赋值语句。只有选项 B 不是,因为选项 B 中“=”符号是等于的意思,并不是赋值运算符。46.编制一个好的程序,首先要保证它的正确性和可靠性,还应强调良好的编程风格,在书写功能性注释时应考虑(分数:2.00)A.仅为整个程序作注释B.仅为每个模块作注释C.为程序段作注释 D.为每个语句作注释解析:解析功能性
18、注释是嵌在源程序体中的,用以描述其后的语句或程序段是在做什么工作,或者执行了下面的语句会怎么样。所以它描述的是一段程序,是为程序段做注释,而不是每条语句。47.若有定义:int a=8,b=5,c;执行语句 c=a/b+0.4;后,c 的值为(分数:2.00)A.1.4B.1 C.2.0D.2解析:解析在表达式中根据运算的结合性和运算符的优先级,首先计算的是 a/ b(8/5=1),再将 1+0.4赋值给 c,由于 c 为整型变量所以要将 1.4 转换为整型,即舍弃小数位(c 的值变为 1)。48.以下叙述正确的是(分数:2.00)A.可以把 define 和 if 定义为用户标识符B.可以把
19、 define 定义为用户标识符,但不能把 if 定义为用户标识符 C.可以把 if 定义为用户标识符,但不能把 define 定义为用户标识符D.define 和 if 都不能定义为用户标识符解析:解析C 语言中的保留字,而 define 不是保留字。用户标识符不允许使用保留字。49.以下程序段的输出结果是int a=1234;printf(“%2d/n”;(分数:2.00)A.;A) 12B.34C.1234 D.提示出错、无结果解析:解析printf()函数的输出格式,当整数的值超过格式要求输出范围时,原样输出。本题中要求输出两个有效数字,而实际上 a 有 4 个有效数字,故原样输出,输
20、出 1234。50.下列哪个面向对象程序设计不同于其他语言的主要特点(分数:2.00)A.继承性 B.消息传递C.多态性D.静态联编解析:解析继承是一个子类直接使用父类的所有属性和方法。它可以减少相似的类的重复说明,从而体现出一般性与特殊性的原则,这使得面向对象程序设计语言有了良好的重用性,也是其不同于其他语言的主要特点。二、填空题(总题数:18,分数:40.00)51.算法的复杂度主要包括空间复杂度和 【1】 复杂度。(分数:2.00)填空项 1:_ (正确答案:时间)解析:解析算法的复杂度主要指时间复杂度和空间复杂度。52.在线性结构中,队列的操作顺序是先进先出,而栈的操作顺序是 【2】
21、。(分数:2.00)填空项 1:_ (正确答案:先进后出)解析:解析队列和栈都是线性结构,但是不同之处在于队列的操作顺序是先进先出,而栈的操作顺序是先进后出。53.数据流图的类型有 【3】 和事务型。(分数:2.00)填空项 1:_ (正确答案:变换型)解析:解析典型的数据流图有两种,即变换型和事务型。54.在数据库理论中,数据物理结构的改变,如存储设备的更换、物理存储的更换、存取方式等都不影响数据库的逻辑结构,从而不引起应用程序的变化,称为 【4】 。(分数:2.00)填空项 1:_ (正确答案:物理独立性)解析:解析数据的物理结构改变,不影响数据库的逻辑结构,从而不引起应用程序的变化,这种
22、性质叫做物理独立性。操作系统55.数据库管理系统是位于用户与 【5】 之间的软件系统。(分数:2.00)填空项 1:_ (正确答案:操作系统)解析:解析数据库管理系统是帮助用户创建和管理数据库的应用程序的集合。因此,数据库管理系统需要操作系统的支持,为用户提供服务。56.若从键盘输入 58,则以下程序的输出结果是 【6】 。main()int a;scanf(“%d”,&A) ;if(a50)printf(“%d”,A) ;if(a40)printf(“%d”,A) ;if(a30)printf(“%d”,A) ;(分数:2.00)填空项 1:_ (正确答案:585858)解析:解析在程序中,
23、执行 scanf()语句后,a 被赋值为 58。接着执行第一个 if 语句,因为,a=5850,执行第一个 if 语句后面的输出语句,输出 58;接着执行第二个 if 语句,因为,a=5840,执行第二个 if 语句后面的输出语句,输出 58;接着执行第三个 if 语句,因为,a=5830,执行第三个if 语句后面的输出语句,输出 58,所以最后的输出为 585858。57.以下程序的输出结果是 【7】 。main()int a=177;printf(“%o/n”,A) ;(分数:2.00)填空项 1:_ (正确答案:261)解析:解析在控制格式符中“o”代表的是将数据按八进制数输出,十进制数
24、的 177 代表的八进制数是261。58.以下程序的输出结果是 【8】 。main()int a=0;a+=(a=8);printf(“%d/n”,A) ;(分数:2.00)填空项 1:_ (正确答案:16)解析:解析在程序中首先将 8 赋值给变量 a,然后再进行复合赋值运算。即 a=a+a=8 +8=16,所以该空格处应该填 16。59.以下程序的输出结果是 【9】 。main()int a=5,b=4,c=3,d;d=(abC) ;printf(“%d/n”,D) ;(分数:2.00)填空项 1:_ (正确答案:0)解析:解析关系运算符“”的结合方式是从左向右的,所以在本题中的表达式 ab
25、c;从左向右开始计算,ab 的结果为“1”,接着 1 和 c 比较假,该空格处应该填 0。60.以下定义的结构体类型包含两个成员,其中成员变量 info 用来存放整型数据;成员变量 link 是指向自身结构体的指针。请将定义补充完整。struct nodeint info;【10】 Link;(分数:2.00)填空项 1:_ (正确答案:struct node*)解析:解析link 是指向结构体自身的指针,因此 link 是指针,指向 strict node 类型的数据,可定义成“stmct node*link”。61.以下程序的输出结果是 【11】 。main()int s,i;for(s=0,i=1;i3;i+,s+=i;printf(“%d/n”,s);