1、二级 C 语言笔试-476 及答案解析(总分:92.00,做题时间:90 分钟)一、选择题(总题数:40,分数:60.00)1.下列叙述中错误的是( )。A) 一种数据的逻辑结构可以有多种存储结构B) 数据的存储结构与数据的处理效率无关C) 数据的存储结构与数据的处理效率密切相关D) 数据的存储结构在计算机中所占的空间不一定是连续的(分数:2.00)A.B.C.D.2.软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件),下面属于系统软件的是( )。A编辑软件 B操作系统C教务管理系统 D浏览器(分数:1.00)A.B.C.D.3.软件工程的理论和技术性研究的内容主要包括软件开发技术
2、和( )。A) 消除软件危机 B) 软件工程管 C) 程序设计自动化 D) 实现软件可重用(分数:1.00)A.B.C.D.4.下列选项中不属于面向对象程序设计特征的是A) 继承性 B) 多态性C) 类比性 D) 封装性(分数:2.00)A.B.C.D.5.结构化程序设计主要强调的是( )。A) 程序的规模 B) 程序的效率C) 程序设计语言的先进性 D) 程序的易读性(分数:2.00)A.B.C.D.6.设有如下 3 个关系表 R、S、T。下列操作中正确的是(分数:2.00)A.B.C.D.7.结构化程序设计的核心和基础是( )。A) 结构化分析方法 B) 结构化设计方法 C) 结构化设计理
3、论 D) 结构化编程方法(分数:2.00)A.B.C.D.8.关系数据库管理系统能实现的专门关系运算包括( )。A) 排序、索引、统计 B) 选择、投影、连接C) 关联、更新、排序 D) 显示、打印、制表(分数:1.00)A.B.C.D.9.下列对于软件测试的描述中正确的是( )。A) 软件测试的目的是证明程序是否正确B) 软件测试的目的是使程序运行结果正确C) 软件测试的目的是尽可能多地发现程序中的错误D) 软件测试的目的是使程序符合结构化原则(分数:1.00)A.B.C.D.10.有以下程序:main()int a=101, 2, 3, 4, 5, 6, 7, 8, 9, 10, *p=p
4、rintf(“% d/n“, *p+*q);程序运行后的输出结果是_。A) 16 B) 10 C) 8 D) 6(分数:1.00)A.B.C.D.11.下列叙述错误的是( )。A) 在 C 语言中的保留字必须小写B) 变量的存储类型决定了变量的存储位置及其生存期C) 宏定义以#define 开头,行未必须加分号D) 在 C 语言中的注释行可以出现在程序的任何位置(分数:1.00)A.B.C.D.12.可以在 C 语言程序中用做用户标识符的一组标识符是( )。A) void123BBNB) aaabccasC) as+b3-123IfD) 6fDoSIG(分数:1.00)A.B.C.D.13.表
5、示关系 abc 的 C 语言表达式为( )。A) (a=b)if(ab) if(b0) c=0;else c+;printf(“%d/n“,c);A) 0 B) 2 C) 1 D) 3(分数:2.00)A.B.C.D.18.两次运行下列的程序,如果从键盘上分别输入 3 和 1,则输出结果是( )。main()int x;scanf(“%d“,if(x+2) printf(“%d“,x);else printf(“%d/n“,x-);A) 4 和 2 B) 4 和 1 C) 4 和 0 D) 3 和 1(分数:1.00)A.B.C.D.19.fseek 函数的正确调用形式是A) fseek(文件
6、指针,起始点,位移量) B) fseek(文件指针,位移量,起始点)C) fseek(位移量,起始点,文件指针) D) fseek(起始点,位移量,文件指针)(分数:2.00)A.B.C.D.20.下列循环体的执行次数是( )。#includestdiohmain()int i,j;for(i=0,j=1;ij+1;i+=1,j-)printf(“%d/n“,j);A) 3 B) 2 C) 1 D) 0(分数:1.00)A.B.C.D.21.下列关于宏的叙述中正确的是( )。A宏名必须用大写字母表示 B宏定义必须位于源程序中所有语句之前C宏替换没有数据类型限制 D宏调用比函数调用耗费时间(分数
7、:1.00)A.B.C.D.22.有以下程序:maln()int i,s=0,t=1,2,3,4,5,6,7,8,9;for(i=0;i9;i+=2)s+=*(t+i);printf(“%d/n“,s);程序执行后的输出结果是_。A) 45 B) 20 C) 25 D) 36(分数:2.00)A.B.C.D.23.有以下程序(提示:程序中 fseek(fp,-2L*sizeof(int),SEEK_END);语句的作用是使位置指针从文件末尾向前移 2 * sizeof(int)字节):#include stdio.hmain()FILE *fp; int i, a4=1,2,3,4,b;fp=
8、fopen(“data.dar“,“wb“);for(i=0;i4;i+) fwrite(fclose(fp);fp=fopen(“data.dar“,“rb“);fseek(fp,-2L*sizeof(int),SEEK_END);fread( /*从文件中读取 sizeof(int)字节的数据到变量 b 中*/fclose(fp);printf(“%d/n“,b);执行后的输出结果( )。A) 2 B) 1 C) 4 D) 3(分数:1.00)A.B.C.D.24.有下列程序:int fun(int n)if(n=1)return 1;elsereturn(n+fun(n-1);main(
9、)int x;scanf(“%d“,while(n-) printf(“%d “,-n);A) 2 0 B) 3 1 C) 3 2 1 D) 2 1 0(分数:1.00)A.B.C.D.27.下列说法正确的是( )。A) 在 C 语言中,可以使用动态内存分配技术,定义元素个数可变的数组B) 在 C 语言中,数组元素的个数可以不确定,允许随机变动C) 在 C 语言中,数组元素的数据类型可以不一致D) 在 C 语言中,定义了一个数组后,就确定了它所容纳的元素的个数(分数:1.00)A.B.C.D.28.下列程序执行的输出结果是( )。#inClUdestdio.hmain()char a24;st
10、rcpy(a,“are“);strcpy(a1,“you“);a03=int age;stmct stu s10=“John“,11,“Paul“,12,“Mary“,11,“adam“,12:A) printf(“%c“,s3.name); B) printf(“%c“,s3.name1);C) printf(“%c“,s2.name11); D) printf(“%c“,s1.name0);(分数:1.00)A.B.C.D.32.已知有结构体:struct skint a;float b;data,*p;若有 p= C) p-data.a D) p.data.a(分数:2.00)A.B.C
11、.D.33.有以下程序: #includestdio.h int fun(int*k) int b=0; b=*k+b: return(b); main() int a10=1,2,3,4,5,6,7,8,i; for(i=2;i4;i+)printf(“%d“,fun( char str10;fp=fopen(“myfile.dat“, “w“);fputs(“abc“, fp); fclose(fp);fp=fopen(“myfile.data“, “a+“);fprintf(fp, “%d“, 28);rewind(fp);fscanf(fp, “%s“, str); puts(str)
12、;fclose(fp);A) abc B) 28c C) abc28 D) 因类型不一致而出错(分数:2.00)A.B.C.D.40.以下程序的输出结果是( )。#include stdio.hcharcchar(char eh)if(ch=A,int ifor(i=0;i3;i+) strcpy(xi,ch);for(i=0;i3;i+)printf(“%s“,printf(“/n“);(分数:2.00)填空项 1:_49.若 x 和 a 均是血型变量,则计算完 x=(a=4,6*2) 后的 x 值为 1。(分数:2.00)填空项 1:_50.表达式 pow(2.8,sqrt(float(x
13、)值的数据类型为 1 型。(分数:2.00)填空项 1:_51.若有定义:int k;,以下程序段的输出结果是_。for(k=2;k6;k+,k+)printf(“#%d“,k);(分数:4.00)填空项 1:_52.下列程序的输出结果是U /U。main()int a=2,4,6,*ptr=for(y=0;y3;y+)z=(*(ptr+y)x)?*(ptr+y):x;printf(“%d/n“,z);(分数:2.00)填空项 1:_53.有以下程序:float f1(float n)return n*n; float f2(float n)return 2*n; main()float(*p
14、1)(float),(*p2)(float),(*t)(float),y1,y2;p1=f1;p2=f2;y1=p2(p1(2.0);t=P1;p1=p2;p2=t;y2=p2(p1(2.0);printf(“%3.0f,%3.0f/n“,y1,y2);程序运行后的输出结果是U /U。(分数:2.00)填空项 1:_54.下列程序的输出结果是_。main()int i,sum;for(i1;i7;i+)sum+i;primf(“%d“,sum);(分数:2.00)填空项 1:_55.在对文件进行操作的过程中,若要求文件的位置指针重新指向文件的开头,应当调用的函数是U /U函数。(分数:2.00
15、)填空项 1:_二级 C 语言笔试-476 答案解析(总分:92.00,做题时间:90 分钟)一、选择题(总题数:40,分数:60.00)1.下列叙述中错误的是( )。A) 一种数据的逻辑结构可以有多种存储结构B) 数据的存储结构与数据的处理效率无关C) 数据的存储结构与数据的处理效率密切相关D) 数据的存储结构在计算机中所占的空间不一定是连续的(分数:2.00)A.B. C.D.解析:解析 数据的存储结构分为顺序结构和链式结构,一个数据的逻辑结构可以有多种存储结构。顺序结构中数据元素所占的存储空间是连续的,而链式存储结构中,数据元素所占的存储空间不一定是连续的。数据的存储结构与数据的处理效率
16、密切相关。2.软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件),下面属于系统软件的是( )。A编辑软件 B操作系统C教务管理系统 D浏览器(分数:1.00)A.B. C.D.解析:解析 编辑软件和浏览器属于工具软件,教务系统是应用软件。3.软件工程的理论和技术性研究的内容主要包括软件开发技术和( )。A) 消除软件危机 B) 软件工程管 C) 程序设计自动化 D) 实现软件可重用(分数:1.00)A.B. C.D.解析:解析 软件工程的目标是:在给定的成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求
17、的产品。基于这一目标,软件工程的理论和技术性研究的内容主要包括软件开发技术和软件工程管理。4.下列选项中不属于面向对象程序设计特征的是A) 继承性 B) 多态性C) 类比性 D) 封装性(分数:2.00)A.B.C. D.解析:解析 面向对象程序设计的 3 个主要特征是封装性、继承性和多态性。5.结构化程序设计主要强调的是( )。A) 程序的规模 B) 程序的效率C) 程序设计语言的先进性 D) 程序的易读性(分数:2.00)A.B.C.D. 解析:解析 程序不光是编写完就结束了,为了测试和维护程序,往往还有其他人阅读和跟踪程序,因此,程序设计的风格应该强调简单和清晰,即程序的易读性,“清晰第
18、一,效率第二”。6.设有如下 3 个关系表 R、S、T。下列操作中正确的是(分数:2.00)A.B.C. D.解析:解析 本题考查数据库的关系代数运算。R 表中只有一个域名 A,有两个记录(也叫元组),分别是m 和 n;S 表中有两个域名,分别是 B 和 C,其所对应的记录分别为 1 和 3。注意观察表 T,它是由 R 的第一个记录依次与 S 的所有记录组合,然后再由 R 的第二个记录与 S 的所有记录组合,形成的一个新表。上述运算恰恰符合关系代数的笛卡儿积运算规则。关系代数中,笛卡儿积运算用“”来表示。因此,上述运算可以表示为 T=RS。7.结构化程序设计的核心和基础是( )。A) 结构化分
19、析方法 B) 结构化设计方法 C) 结构化设计理论 D) 结构化编程方法(分数:2.00)A.B.C. D.解析:解析 结构化程序设计的核心和基础是结构化设计理论,其中包括:结构化分析方法、结构化设计方法和结构化编程方法。8.关系数据库管理系统能实现的专门关系运算包括( )。A) 排序、索引、统计 B) 选择、投影、连接C) 关联、更新、排序 D) 显示、打印、制表(分数:1.00)A.B. C.D.解析:解析关系数据库管理系统的专门关系运算包括选择运算、投影运算和连接运算。9.下列对于软件测试的描述中正确的是( )。A) 软件测试的目的是证明程序是否正确B) 软件测试的目的是使程序运行结果正
20、确C) 软件测试的目的是尽可能多地发现程序中的错误D) 软件测试的目的是使程序符合结构化原则(分数:1.00)A.B.C. D.解析:解析 软件测试是为了尽可能多地发现程序中的错误,尤其是发现至今尚未发现的错误。10.有以下程序:main()int a=101, 2, 3, 4, 5, 6, 7, 8, 9, 10, *p=printf(“% d/n“, *p+*q);程序运行后的输出结果是_。A) 16 B) 10 C) 8 D) 6(分数:1.00)A.B. C.D.解析:解析 p 指向了 a3的地址,且*p=a3=4,又有*q=p-2;则 q 指向了 a5的地址,且*q=a5=6,最后输
21、出为 10。11.下列叙述错误的是( )。A) 在 C 语言中的保留字必须小写B) 变量的存储类型决定了变量的存储位置及其生存期C) 宏定义以#define 开头,行未必须加分号D) 在 C 语言中的注释行可以出现在程序的任何位置(分数:1.00)A.B.C. D.解析:解析 本题涉及 C 语言最基本的 4 个知识点:C 语言的保留字必须小写:变量的存储类型不同,其存储位置和生存期也不一样;C 语言允许其注释部分出现在程序中的任何位置;宏定义以#define 开头,行末不需要加分号。12.可以在 C 语言程序中用做用户标识符的一组标识符是( )。A) void123BBNB) aaabccas
22、C) as+b3-123IfD) 6fDoSIG(分数:1.00)A.B. C.D.解析:解析 C 语言规定,标识符是由字母、数字或下画线组成,并且它的第一个字符必须是字母或者下画线。13.表示关系 abc 的 C 语言表达式为( )。A) (a=b)if(ab) if(b0) c=0;else c+;printf(“%d/n“,c);A) 0 B) 2 C) 1 D) 3(分数:2.00)A.B.C. D.解析:解析 本题考查 if 语句。第一个 if 语句,先判断条件,发现 ab 不成立,不再执行下列的语句,直接执行最后的 printf 输出语句,然后结束程序,整个过程 c 的值没有发生变
23、化。18.两次运行下列的程序,如果从键盘上分别输入 3 和 1,则输出结果是( )。main()int x;scanf(“%d“,if(x+2) printf(“%d“,x);else printf(“%d/n“,x-);A) 4 和 2 B) 4 和 1 C) 4 和 0 D) 3 和 1(分数:1.00)A. B.C.D.解析:解析 本题考查 if else 语句。首先 scanf 函数通过键盘读入 x 的值。当 x=3 时,第一个 if 语句,先判断条件,取 x 的值 3 和 2 比较,然后将 x 的值加 1,发现条件成立,执行下列的 printf 语句,输出x 的值 4。当 x=1 时
24、,第一个 if 语句,先判断条件,取 x 的值 1 和 2 比较,然后将 x 的值加 1(x 的值变为2),发现条件不成立,执行下列的 else 语句,先输出 x 的值 2,再将 x 的值减 1。19.fseek 函数的正确调用形式是A) fseek(文件指针,起始点,位移量) B) fseek(文件指针,位移量,起始点)C) fseek(位移量,起始点,文件指针) D) fseek(起始点,位移量,文件指针)(分数:2.00)A.B. C.D.解析:解析 本题考查函数 fseek 的用法。fseek 函数的调用形式为:fseek(文件指针,位移量,起始点)“起始点”用 0、1 或 2 代替;
25、0 代表“文件开始”,1 为“当前位置”,2 为“文件末尾”。“位移量”指以“起始点”为基点,向前移动的字节数。ANSI C 和大多数 C 版本都要求位移量是 long 型数据。这样,当文件长度大于 64KB 时不致出现问题。ANSI C 标准规定在数字末尾加一个字母 L 表示 long型。20.下列循环体的执行次数是( )。#includestdiohmain()int i,j;for(i=0,j=1;ij+1;i+=1,j-)printf(“%d/n“,j);A) 3 B) 2 C) 1 D) 0(分数:1.00)A.B.C. D.解析:解析 本题考查 for 循环。第一次循环前先判断循环
26、条件,此时 i=0,j=1,ij+1 成立,循环第一次;第二次循环前先判断循环条件,此时 i=1,j=0,(j-是先使用 j 的值再减 1),ij+1 不成立,结束循环。21.下列关于宏的叙述中正确的是( )。A宏名必须用大写字母表示 B宏定义必须位于源程序中所有语句之前C宏替换没有数据类型限制 D宏调用比函数调用耗费时间(分数:1.00)A.B.C. D.解析:解析 本题考查宏的相关知识点。宏名没有大小写限制。宏定义可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。宏替换可以代替任何数据类型,不受数据类型的限制。函数影响运行时间,宏调用影响编译时间。22.有以下程序:maln()i
27、nt i,s=0,t=1,2,3,4,5,6,7,8,9;for(i=0;i9;i+=2)s+=*(t+i);printf(“%d/n“,s);程序执行后的输出结果是_。A) 45 B) 20 C) 25 D) 36(分数:2.00)A.B.C. D.解析:解析 通过 for 循环语句 s=*(t+0)+*(t+2)+*(t+4)+*(t+6)+*(t+8)=1+3+5+7+9=25。23.有以下程序(提示:程序中 fseek(fp,-2L*sizeof(int),SEEK_END);语句的作用是使位置指针从文件末尾向前移 2 * sizeof(int)字节):#include stdio.h
28、main()FILE *fp; int i, a4=1,2,3,4,b;fp=fopen(“data.dar“,“wb“);for(i=0;i4;i+) fwrite(fclose(fp);fp=fopen(“data.dar“,“rb“);fseek(fp,-2L*sizeof(int),SEEK_END);fread( /*从文件中读取 sizeof(int)字节的数据到变量 b 中*/fclose(fp);printf(“%d/n“,b);执行后的输出结果( )。A) 2 B) 1 C) 4 D) 3(分数:1.00)A.B.C.D. 解析:解析 Leek(fp,-2L*sizeof(i
29、nt),SEEK_END);语句的作用是使位置指针从文件末尾向前移2*sizeof(int)字节,调用此函数后指针指向 a2,fread(while(n-) printf(“%d “,-n);A) 2 0 B) 3 1 C) 3 2 1 D) 2 1 0(分数:1.00)A. B.C.D.解析:解析 n-是先使用后自减,-n 是先自减后使用。n=4 时,执行 n-后,n 变为 3,执行-n 后,n 变为 2,所以,第一次输出时,n 为 2;同上过程,第二次输出时,n 为 0。27.下列说法正确的是( )。A) 在 C 语言中,可以使用动态内存分配技术,定义元素个数可变的数组B) 在 C 语言中
30、,数组元素的个数可以不确定,允许随机变动C) 在 C 语言中,数组元素的数据类型可以不一致D) 在 C 语言中,定义了一个数组后,就确定了它所容纳的元素的个数(分数:1.00)A.B.C.D. 解析:解析 本题考查数组的两个知识点:在 C 语言中,数组元素的个数是确定的,不允许随机变动,数组定义好之后,它所能容纳的元素的个数也就确定了;同一个数组中所有元素的类型是一样的。28.下列程序执行的输出结果是( )。#inClUdestdio.hmain()char a24;strcpy(a,“are“);strcpy(a1,“you“);a03=int age;stmct stu s10=“John
31、“,11,“Paul“,12,“Mary“,11,“adam“,12:A) printf(“%c“,s3.name); B) printf(“%c“,s3.name1);C) printf(“%c“,s2.name11); D) printf(“%c“,s1.name0);(分数:1.00)A.B.C.D. 解析:解析 本题主要考查按结构数组元素方式引用结构成员。字母 P 为“Paul”的第一个字母,是结构体 s1的 name 成员的第二个元素的值,即 s1.name0的值。32.已知有结构体:struct skint a;float b;data,*p;若有 p= C) p-data.a D
32、) p.data.a(分数:2.00)A.B. C.D.解析:解析 本题主要考查结构指针:p= char str10;fp=fopen(“myfile.dat“, “w“);fputs(“abc“, fp); fclose(fp);fp=fopen(“myfile.data“, “a+“);fprintf(fp, “%d“, 28);rewind(fp);fscanf(fp, “%s“, str); puts(str);fclose(fp);A) abc B) 28c C) abc28 D) 因类型不一致而出错(分数:2.00)A.B.C. D.解析:解析 本题考查文件操作。第一次以只写方式“
33、w“打开文件,将字符串“abc“写入文件 myfile.dat中,关闭文件;第二次以追加方式“a+“打开文件,将整型数 28 追加到 myfile.dat 文件中,此时,文件中内容为 abc28。再将文件位置指针反绕到文件头,从文件中以字符串形式将 abc28 读入数组 str 中,并在显示屏上输出字符数组 str。40.以下程序的输出结果是( )。#include stdio.hcharcchar(char eh)if(ch=A,int ifor(i=0;i3;i+) strcpy(xi,ch);for(i=0;i3;i+)printf(“%s“,printf(“/n“);(分数:2.00)
34、填空项 1:_ (正确答案:abebcc)解析:解析 strcpy(xi,ch),使得 x 数组的第 i 行存放“abc“,第一个循环就使数组 x 的每一行都存放了“abc“,printf(“%s“,for(y=0;y3;y+)z=(*(ptr+y)x)?*(ptr+y):x;printf(“%d/n“,z);(分数:2.00)填空项 1:_ (正确答案:6)解析:评析 条件运算符的优先级高于赋值运算符,因此本题先计算关系表达式(*(ptr+y)x)?*(ptr+y:x的值,再赋给变量 z。当 y=0 时,*(prt+y)=2,而 x=8,(*(ptr+y)x)条件为真,则整个条件表达式的值为
35、*(ptr+y)=2,所以 z=2;当 y=1 时,*(ptr+y)=4,(*(ptr+y)x)条件为真,则整个条件表达的值为*(ptr+y)=4,所以 z=4:当 y=2 时,*(ptr+y)=6,(*(ptr+y)x)为真,则整个条件表达式的值为*(ptr+y)=6,所以 z=6;循环结束。因此输出 z 的结果为 6。53.有以下程序:float f1(float n)return n*n; float f2(float n)return 2*n; main()float(*p1)(float),(*p2)(float),(*t)(float),y1,y2;p1=f1;p2=f2;y1=p
36、2(p1(2.0);t=P1;p1=p2;p2=t;y2=p2(p1(2.0);printf(“%3.0f,%3.0f/n“,y1,y2);程序运行后的输出结果是U /U。(分数:2.00)填空项 1:_ (正确答案:8,16)解析:解析 float(*p1)(float)是定义 p1 为指向函数的 float 型的指针变量。因此 p1=f1;p2=f2;表示 p1 指向函数 f1,p2 指向函数 f2,故所有 y1=p2(p1(2.0)=f2(f1(2.0)=8;后面将 p1 与 p2 互换,y2=f1(f2(2.0)=16。54.下列程序的输出结果是_。main()int i,sum;fo
37、r(i1;i7;i+)sum+i;primf(“%d“,sum);(分数:2.00)填空项 1:_ (正确答案:无定值)解析:解析 for(il;i7;i+)决定了循环次数为 6 次,每次执行的操作是 sum+i,但由于 sum 没有初始化,并不知道 sum 的初值是多少,所以结果无定值。55.在对文件进行操作的过程中,若要求文件的位置指针重新指向文件的开头,应当调用的函数是U /U函数。(分数:2.00)填空项 1:_ (正确答案:rewind 或 fseek)解析:解析 本题考查文件的定位。在对文件进行操作的过程中,若要求文件的位置指针回到文件的开头,可以调用 rewind 函数或 fseek 函数来完成。其中,rewind 函数的作用是将位置指针重新返回文件的开头;而 fseek 函数也可以实现文件指针的定位。