1、二级 C语言笔试-138 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:50,分数:50.00)1.下面不属于软件设计原则的是(分数:1.00)A.抽象B.模块化C.自底向上D.信息隐藏2.有以下程序段:main)int a=5,*b,*C;c=B.a=0,b=0,c=0;C.if(a0);D.if(b=0)m=1;n=2;19.有以下程序main()int a32=0,(*ptr)2,i,i;for(i=0; i2; i+)ptr=a+i; scanf(“%d“,ptr); ptr+; for(i=0;i3;i+)foil(j=0;j2;j+) printf(“%
2、2d“,aij);printf(“/n“);若运行时输入:1 2 3回车,则输出结果为(分数:1.00)A.产生错误信息 B.1 02 00 0 C.1 2 3 00 0D.1 02 03 020.若要打开 A盘上 user了目录下名为 abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是(分数:1.00)A.fopen(“A:/user/abc.txt“,“,“r“)B.fopen(“A:/user/abc.txt“,“r+“)C.fopen(“A:/user/abc.txt“,“rb“)D.fopen(“A:/user/abc.txt“,“w“)21.以下选项中合法的实型常数
3、是(分数:1.00)A.5E2.0B.E-3C2E0D.1.3E22.在数据库管理系统提供的数据语言中,负责数据的完整性、安全性的定义与检查以及并发控制、故障恢复等功能的是(分数:1.00)A.数据定义语言B.数据转换语言C.数据操纵语言D.数据控制语言23.有以下程序#define N 20fun(int a,int n,:Int m)int i,i;for(i=m; in; i-) ai+1);ai;main()int i,aN=1,2,3,4,5,6,7,8,9,10;fuu(a,2,9);for(i=0; i5; i+) printf(“%d“,ai);程序运行后的输出结果是(分数:1
4、.00)A.10234B.12344C.12334D.1223424.以下符合 C语言语法的实犁常量是(分数:1.00)A.1.2E0.5B.3.14159EC.5E-3D.E1525.以下程序调用 findmax函数返回数组中的最大值findmax (inE *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(x5);在下划线处应填入的是(分数:1.00)A.psB.*p*sC.apasD.p-ap-s26.有以下程序:void
5、fun(char* a,char* B) ;a=b;(*(分数:1.00)A.+;main()char c1=A,c2=a,*p1,*p2;p1=fun(p);int fun(int *p)ints; p=B.B ) main()int *p;fun(int fun(int *p)int s; *p=)C.#includemain()int *p;fun(int fun(int *p)*p=(int*)malloc(2);D.#includemain()iht *p;fun(p);iht fun(iht *p)p=(int*)malloc(sizeof(int);36.有以下程序main()i
6、nt i=1, j=2,k=3;if(i+ = l printf(“/“%s/“/n“,cf1);(分数:1.00)A.“AAAA“B.“BBB“C.“BBBCC“D.“CC“44.以下叙述中错误的是(分数:1.00)A.二进制文件打开后可以先读文件的末尾,而顺序文件不可以B.在程序结束时,应当用 fclose函数关闭已打开的文件C.在利用 fread函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据D.不可以用 FILE定义指向二进制文件的文件指针45.若有语句:char*line5,以下叙述中正确的是(分数:1.00)A.定义 line是一个数组,每个数组元素是一个基类型为
7、char的指针变量B.定义 line是一个指针变量,该变量可以指向一个长度为 5的字符型数组C.定义 line是一个指针数组,语句中的*号称为间址运算符D.定义 line是一个指向字符型函数的指针46.以下 4组用户定义标识符中,全部合法的一组是(分数:1.00)A.main enclude sin B.If-maxturboC.txtREAL3COMD.int12_00147.有以下程序int fl(int x.iht y)return xy?x:y; int f2(int x,int y)return xy?y:X; main()int a=4,b=3c=5,d,e,f;d=fla,B)
8、; d=f1(d,C) :e=f2a,B) ; e=f2(e.C) ;f=a+b+c-d-e;printf(“%d,%d,%d/n“,d,f,e);执行后输出的结果是(分数:1.00)A.3,4,5B.13,4C.5,4,3D.3,5,448.设有下列二叉树:(分数:1.00)A.ABCDEFB.BDAECFC.ABDCEFD.DBEFCA49.下列对于线性链表的描述中正确的是(分数:1.00)A.存储空间不一定是连续,且各元素的存储顺序是任意的B.存储空间不一定是连续,且前件元素一定存储在后件元素的前面C.存储空间必须连续,且前件元素一定存储在后件元素的前面D.存储空间必须连续,且各元素的存
9、储顺序是任意的50.有以下程序point(char *p) p+=3; main()char b4=ab,c,d, *p=b;point(p);printf(“%c/n“,*p);程序运行后的输出结果是(分数:1.00)A.aB.bC.cD.d二、填空题(总题数:18,分数:50.00)51.算法执行过程中所需要的存储空间称为算法的 1。(分数:2.00)填空项 1:_52.按照逻辑结构分类,数据结构可分为线性结构和非线性结构,二叉树属于_。(分数:2.00)填空项 1:_53.软件开发环境是全面支持软件开发全过程的 1 的集合。(分数:2.00)填空项 1:_54.数据库理论中,数据的独立性
10、一般可分为物理独立性和 1。(分数:2.00)填空项 1:_55.数据库管理系统是位于用户与 1 之间的软件系统。(分数:2.00)填空项 1:_56.以下程序段的输出结果是_。inc i=9;printf(“%o/n“, i);(分数:2.00)填空项 1:_57.有以下语句段int nl=10,n2=20;printf(“_“,n1,n2);要求按以下格式输出 n1和 n2的值,每个输出行从第一列开始,请填空。n1=10n2=20(分数:2.00)填空项 1:_58.若有以下程序main()int p,a=5;if(p=a!=0)printf(“%d/n“p);elseprintf(“%d
11、/n“,p+2);执行后输出结果是_。(分数:2.00)填空项 1:_59.以下程序输出的结果是_。mazn()int a=5,b=4,c=3,d;d=(abC) ;printf(“%d/n“,D) ;(分数:2.00)填空项 1:_60.以下定义的结构体类型拟包含两个成员,其中成员变量 info用来存入整形数据;成员变量 link是指向自身结构体的指针,请将定义补充完整。struct nodeint info;_link;(分数:2.00)填空项 1:_61.以下程序的输出结果是_。main()int s,i;for(s=0,i=1;i3;i+,s+=i);printf(“%d/n“s);(
12、分数:3.00)填空项 1:_62.以下程序中,fun 函数的功能是求 3行 4列二维数组每行元素的最大值。请填空。void fun(int,int,int (*)4, int *);main()int a34=12,41,36,28,19,33,15,27),3,27,19,1,b3,i;fun(3,4,a,B) ;for(i=0;i3;i+)printf(“%4d“,bi);printf(“/n“);void fun(int m,int n,int ar4,int *br)int i,j,x;for(i=0;im;i+)x=ari0;for(i=0;jn;j+) if(xarij) x=a
13、rij;_=X;(分数:3.00)填空项 1:_63.以下程序的输出结果是_。main()char s=“abcdef“;s3=/0;printf(“%s/n“,s);(分数:4.00)填空项 1:_64.以下程序运行后的输出结果是_。#inClude strinq.hchar *ss(char *s)char *p;t;p=S+1;t=*s;while(*p)*(p-1)=*p;p+;*(p-1)=t;return s;main()char *p,str10=“abcdefgh“;p=ss(str);printf(“%s/n“,p);(分数:4.00)填空项 1:_65.以下程序运行后的输出
14、结果是_。int a=5;fun (int B) static int a=10;a+=b+;printf(“%d“,A) ;main()int c=20;fun(C) ,a+=C+;printf(“%d/n“,A) ;(分数:4.00)填空项 1:_66.请在以下程序第一行的下划线处填写适当内容,使程序能正确运行。_(double,double);main()double x,y;scanf(“%lf%lf“,B.a=0,b=0,c=0;C.if(a0);D.if(b=0)m=1;n=2; 解析:解析 C 语言是一种表达式语言,所有的操作运算都通过表达式来实现,由表达式组成的语句称为表达式语
15、句,它有一个表达式后接一个分号组成。本题中,选项 D中 if(b=0) m=1;n=2;是两个表达式语句所以,4 个选项中选项 D符合题意。19.有以下程序main()int a32=0,(*ptr)2,i,i;for(i=0; i2; i+)ptr=a+i; scanf(“%d“,ptr); ptr+; for(i=0;i3;i+)foil(j=0;j2;j+) printf(“%2d“,aij);printf(“/n“);若运行时输入:1 2 3回车,则输出结果为(分数:1.00)A.产生错误信息 B.1 02 00 0 C.1 2 3 00 0D.1 02 03 0 解析:解析 本题主要
16、考查的是 scanf()函数的输入原理。scanf()函数执行时,先从键盘缓冲区中读取用户输入的数据,若缓冲区为空或输入数据少于所需数据,则暂停程序等待用户的输入,直到用户敲入回车,scanf()将继续到键盘缓冲区中读取输入,如此反复直到满足 scanf()函数所需数据,程序才继续执行下面的语句,而 scanf()没有取完的数据仍然会保存在键盘缓冲区内,到程序结束时还没取完就会被释放掉,不会影响其他的程序运行。另外,scanf()函数将取到的数据匹配给第 2个及其后面的指针参数所指的内存地址中去,而不检查该参数的类型是否匹配。所以在本题中考生不要被指针 ptr的定义所迷惑,它所做的只不过是临时
17、保存一下 a+i的值,然后送到 scanf()函数中去。题目首先定义了一个二维数组a32并用0初始化之,因为当所赋初值少于所定义数组的元素个数时,将自动给后面的元素朴以初值0,所以数组 a32中所有的元素都被初始化为 0了。在主程序的第一个 for循环体中有三条语句,该循环体会被执行两次,每次执行时 i的值分别为 0和 1。第 1条语句让 ptr的值分别为 a+0 (即元素 a0)0)的地址)和 a+1(即元素 a10的地址);第 2条语句是一条输入语句,它每次接受一个十进制整数存入到 ptr所指的内存地址中,题目要求输入的数据为“1 2 3”,所以两次 scanf()函数的调用使 a00和
18、a10分别被赋为 1和 2。笫 3 条语句让 ptr自增 1在这里没有起到任何作用,因为每次进入循环体ptr都会被重新赋值。最后,程序用一个两重循环按行列输出二维数组 a中的所有元素。所以,选项 B符合题意。20.若要打开 A盘上 user了目录下名为 abc.txt的文本文件进行读、写操作,下面符合此要求的函数调用是(分数:1.00)A.fopen(“A:/user/abc.txt“,“,“r“)B.fopen(“A:/user/abc.txt“,“r+“) C.fopen(“A:/user/abc.txt“,“rb“)D.fopen(“A:/user/abc.txt“,“w“)解析:解析
19、由于“/”是转义字符,所以在文件名中的“”用“/”来表示,因此选项 A和选项 C不正确。要打开文本文件进行读写,应使用读写模式“r+”,因此选项 D不正确。所以, 4 个选项中 B为所选。21.以下选项中合法的实型常数是(分数:1.00)A.5E2.0B.E-3C2E0 D.1.3E解析:解析 在 C语言中,实数有两种表示形式:十进制数形式与指数形式。一般形式的实数:小数形式的实数由整数部分、小数点和小数部分组成(必须要有小数点),指数形式的小数;指数形式的实数由尾数部分、 e(E)和指数部分组成(字母 e或 E的前后必须要有数字,且其后面的指数必须为整数)。选项 A中,5E2.0 中 E后面
20、的 2.0不是整数;选项 B中,E 前面没有数字:选项 D中,E 后面没有数字。最终可以判断选项 C正确。22.在数据库管理系统提供的数据语言中,负责数据的完整性、安全性的定义与检查以及并发控制、故障恢复等功能的是(分数:1.00)A.数据定义语言B.数据转换语言C.数据操纵语言D.数据控制语言 解析:解析 在数据库管理系统提供的数据语言中,数据控制语言负责数据的完整性、安全性的定义与检查以及并发控制、故障恢复等功能。23.有以下程序#define N 20fun(int a,int n,:Int m)int i,i;for(i=m; in; i-) ai+1);ai;main()int i,
21、aN=1,2,3,4,5,6,7,8,9,10;fuu(a,2,9);for(i=0; i5; i+) printf(“%d“,ai);程序运行后的输出结果是(分数:1.00)A.10234B.12344C.12334 D.12234解析:解析 数组名可以作为实参传送,由于数组名本身是一个地址值,因此,在函数中对形参数组元素的修改也会相应改变实参数组的元素在本题中,函数 fun()通过一个 for循环,将形参数组 a中下标为 n到 m之间的元素向后移动一位,an元素的值不变。所以主函数调用 fun(a,2,9);之后,数组 a的内容变成1,2,3,3,4,5,5,6,7,8,9,10,最后通过
22、 for循环输出数组前 5个元素为 12334。选项 C符合题意。24.以下符合 C语言语法的实犁常量是(分数:1.00)A.1.2E0.5B.3.14159EC.5E-3 D.E15解析:解析 实型常量只能用十进制形式表示,不能用八进制或十六进制形式表示,实型常量可以用小数形式或指数形式表示,在 C语言中,可以用指数形式将实型常量表示为数值和指数两部分,数值部分不能为空,指数部分只能为整数表示。选项 A中 1.2和 0.5都不是整数,故选项 A不正确;选项 B中3.14159也不是整数,故选项 B不正确;选项 D中数值部分不能为空,故选项 D也不正确;所以,4 个选项中选项 C符合题意。25
23、.以下程序调用 findmax函数返回数组中的最大值findmax (inE *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(x5);在下划线处应填入的是(分数:1.00)A.psB.*p*s C.apasD.p-ap-s解析:解析 在 main()函数中定义了一个具有 5个元素的 x数组并赋初值,然后调用 findmax()函数求数组中元素的最大值。调用时把数组元素 x的首地址,传给了形参指针变量 a,把 5传给形参 n。在函
24、数findmax()中定义了两种指针变量 p和 s,其中 s用来记录最大元素的地址,p 作为循环控制变量,表示每个元素的地址求最大值的算法是先将第一个元素(用 s记下它的地址)做为最大值,然后用最大值(*s)与后面的每个元素比较(*p),若后面的元素大,则用 s记下它的地址,所以下划线应填“*s*s”。所以,4个选项中 B为所选。26.有以下程序:void fun(char* a,char* B) ;a=b;(*(分数:1.00)A.+;main()char c1=A,c2=a,*p1,*p2;p1=fun(p);int fun(int *p)ints; p=B.B ) main()int *
25、p;fun(int fun(int *p)int s; *p=)C.#includemain()int *p;fun(int fun(int *p)*p=(int*)malloc(2); D.#includemain()iht *p;fun(p);iht fun(iht *p)p=(int*)malloc(sizeof(int);解析:解析 本题考核的知识点是指针变量作为函数的参数以及变量的作用域。在选项 A中,main()函数中定义了一个指针变量 p,调用 fun()函数时把 p传给形参 p,在函数中让 p指向局部变量 s,由于函数调用返回后,局部变量 s将被释放,因此无法实现让实参 p指向
26、一个整型单元,故选项 A错误选项 B中实现的也是让实参 p,指向一个在函数 fun()定义的局部变量 s,因此也是错误的;选项 C在函数 fun()中分配了两个字节的内存单元并把首地址赋值给形参 p指向的变量,即 main()函数的指针变量 p中,由于整型变量占两个字节,因此,选项 C是正确的;选项 D在主函数中定义了一个指针地址变量 p,并把指针变量的值传给形参变量 p,在 fun()函数分配了一个整型单元并把首地址赋值给行参指针变量 p,由于C语言中变量作为参数是传值的,所以并没有改变对应实参指针变量的值,因此选项 D也是错误的所以,C选项为所选。36.有以下程序main()int i=1, j=2,k=3;if(i+ = l printf(“/“%s/“/n“,cf1);(分数:1.00)A.“AAAA“B.“BBB“ C.“BBBCC“D.“CC“