刷题课视频配套文档,视频录制时间(2020 年)依据为全国计算机二级 C 语言考试大
纲最新版(2019,2020 年依旧使用的是 2018 版),大纲详细内容见文档最后附件一。
致未来:是否适合当前的考情,可以登陆中国教育考试网: http://ncre.neea.edu.cn/
查看最新版大纲。
2020 考试方式:
上机考试,考试时长 120 分钟,满分 100 分。
1 题型及分值
单项选择题 40 分(含公共基础知识部分 10 分,数据结构、软件工程、数据库、
面向程序设计)。
操作题 60 分(程序填空题 (18 分),程序修改题 (18 分),程序设计题(24 分))。
2 考试环境
操作系统:中文版 Windows 7 。
开发环境: Microsoft Visual C++ 2010 学习版。
考试过程中需要使用 VC++2010 编译器,要学会使用 VC++2010 加载、创建工程,新
建以及添加现有 C 文件,编译运行。如果是新建文件,一定要将后缀名从 cpp 改为.c,
确保使用 C89 语法进行编译运行。会使用基本的调试功能,将会对考试有很大帮助。
VC++2010 学习版连接可以在文档底部,附件二中找到。
技术咨询交流 QQ 群:658522731
内容如有冲突,以视频内容为准
视频地址:https://ke.qq.com/course/1347494?flowToken=1018171
或可在腾讯课堂中搜索阿西拜
一、选择题
1. 某二叉树共有 7 个结点,其中叶子结点只有 l 个,则该二叉树的层数为
(假设根结点在第 1 层)( )。
A. 3
B. 4
C. 6
D. 7
【答案】D
【解析】叶子结点总比度为 2 的结点多一个.所以度为 2 结点个数为:1-1=0 个,所以二叉
树的每一个结点都有一 1 个结点,共 7 层,即度为 7。
2. 设有下列二叉树:
对此二叉树后序遍历的结果为
A)ABCDEF
B)BDAECF
C)ABDCEF
D)DBEFCA
【答案】D
【解析】二叉树的遍历分为先序、中序、后序三种不同方式。后序遍历的顺序应该为:左子
树一>右子树一>根结点。按照定义,后序遍历序列是 DBEFCA,故答案为 D。
3. 冒泡排序在最坏情况下的比较次数是(
A)n(n+1)/2
B)nlog2n
C)n(n-1)/2
)
D)n/2
【答案】C
【解析】冒泡排序的基本思想是:将相邻的两个元素进行比较,如果反序,则交换;对于一
个待排序的序列,经一趟排序后,最大值的元素移动到最后的位置,其他值较大的元素也向
最终位置移动,此过程称为一趟冒泡。对于有 n 个数据的序列,共需 n-1 趟排序,第 i 趟对
从 l 到 n-i 个数据进行比较、交换。冒泡排序的最坏情况是待排序序列逆序,第 l 趟比较
n-1 次,第 2 趟比较 n-2 次。依此类推,最后趟比较 1 次,一共进行 n-l 趟排序。因此,冒
泡排序 在最坏情况 下的比较次 数是(n-1)+(n-2)+…+l, 根据等 差数列求和 公式结果为
n(n-1)/2。本题的正确答案是选项 c。
4. 下列选项中不符合良好程序设计风格的是
A)源程序要文档化
C)避免滥用 goto 语
B)数据说明的次序要规范化
D)模块设计要保证高耦合、高内聚
【答案】D
【解析】编程风格是在不影响性能的前提下,有效地编排和组织程序,以提高可读性和
可维护性。更直接的说,风格就是意味着要按照规则进行编程。这些规则包括:(1)程
序文档化。就是程序文档包含恰当的标识符.适当的注解和程序的视觉组织等。(2)数
据说明。出于阅读理解和维护的需要,最好使模块前的说明语句次序规范化。此外,为
方便查找,在每个说明语句的说明符后,数据名应按照字典顺序排列。(3)功能模块化。
即把源程序代码按照功能划分为低耦合、高内聚的模块。(4)注意 goto 语句的使用。合
理使用 goto 语句可以提高代码的运行效率.但 goto 语句的使用会破坏程序的结构特性。
因此,除非确实需要,否则最好不使用 goto 语,因此,本题的正确答案是 D。
5. 面向对象的设计方法与传统的面向过程的方法有本质不同,它的基本原理是______。
A、模拟现实世界中不同事物之间的联系
B、强调模拟现实世界中的算法而不强调概念
C、使用现实世界的概念抽象地思考问题从而自然地解决问题
D、鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考
【答案】C
【解析】面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是,
使用现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概
念而不强调算法,它鼓励开发者在软件开发的绝大部分中都用应用领域的概念去思考。
6. 下列叙述中正确的是(
)
A)软件测试的主要目的是发现程序中的错误
B)软件测试的主要目的是确定程序中错误的位置
C)为了提高软件测试的效率,最好由程序编制者自己来完成软件测试的工作
D)软件测试是证明软件没有错误
【答案】A
【解析】本题考查软件工程中测试的目的和方法。仅就软件测试而言,它的目的是发现
软件中的错误,但是,发现错误并不是最终目的,最终目的是通过测试发现错误之后还
必须诊断并改正错误,这就是调试的目的。由于测试的目标是暴露程序中的错误.从心
理学角度看,由程序的编写者自己进行测试是不恰当的。因此,在软件测试阶段通常由
其他人员组成测试小组来完成测试工作。因此,经过上述分析可知选项 A 的说法是正确
的,而选项 B、c、D 的说法是错误的。
7. 软件需求分析阶段的工作可以分为 4 个方面:需求获取、需求分析、编写需求分析说明
书和
A) 阶段性报告 B)需求评审 C)总结 D)都不正确
【答案】B
【解析】需求分析的四个方面是:需求获取、需求分析、编写需求分析说明书和需求评
审。
8. 在 E-R 图中,用来表示实体之间联系的图形是(
A)矩形 B)椭圆形 C)菱形 D)平行四边形
【答案】C
【解析】E-R 模型中,有三个基本的抽象概念:实体、联系和属性。E-R 图是 E-R 模型
的图形表示法,在 E-R 图中,用矩形框表示实体,菱形框表示联系,椭圆形框表示属性。
)
9. “商品”与“顾客”两个实体集之间的联系一般是
A)一对一
C)多对一
B)一对多
D)多对多
【答案】D
【解析】本题考核实体集之间的联系。实体集之间的联系有 3 种:一对一、 一对多和
多对多。因为一类商品可以由多个顾客购买,而一个顾客可以购买多类商品.所以.“商
品”与“顾客”两个实体集之间的联系一般是“多对多”
10. 关系数据库管理系统应能实现的专门的关系运算包括
A)排序、索引、统计
B)选择、投影、连接
C)关联、更新、排序
D)显示、打印、制表
【答案】B
【解析】: 关系数据库建立在关系数据模型基础上,具有严格的数学理论基础。关系数
据库对数据的操作除了包括集合代数的并、差等运算之外,更定义了一组专门的关系运
算:连接、选择和投影。关系运算的特点是运算的对象都是表。
11. 若有定义语句:int a=3,b=2,c=1;以下选项中错误的赋( )。
A) a=(b=4)=3;
B) a=b=c+1;
C) a=(b=4)+c;
D) a=1+(b=c=4);
【答案】A
【解析】:不能将变量或常量赋给一个表达式,所以 A 选项
(b=4)=3 是错误的。
12. 以下程序运行后的输出结果是
。
main()
{
int m=011,n=11;
printf("%d %d\n",++m, n++);
}
A)11 11
B)12 12
C)10 11
D)11 12
【答案】C 10 11
【解析】011 是 8 进制,转换成十进制其值等于 9 , 然后在输出语句中变量 m 、 n
分别自加后其值分别是 10 和 12 ,但 “ ++m ” 和 “ n++ ” 表达式的值分别为 10 和
11 。所以输出结果是 10 11 。
13. 以下关于 typedef 的叙述错误的是(
)。
A.用 typedef 可以增加新类型
B.typedef 只是将已存在的类型用一个新的名字来代替
C.用 typedef 可以为各种类型说明一个新名,但不能用来为变量说明一个新名
D.用 typedef 为类型说明一个新名,通常可以增加程序的可读性
【答案】B
【解析】C 语言允许通过 typedef 为数据类型定义新名字,但是,它并非是生成新的数
据类型
14. 若有定义:“int a[2][3];”,则对 a 数组的第 i 行第 j 列元素的正确引用为(
)。
A.*(*(a+i)+j)
B.(a+i)[j]
C.*(a+i+j)
D.*(a+i)+j
【答案】A
【解析】一般有五种正确的取值方式:①a[i][j];②*(a[i]+j);③*(*(a+i)+j);
④*(a[i])[j];⑤*(&a[0][0]+3*i+j)。
B,C 指向一样,是第 i+j 行的首地址,取出来是一个数组,是 int*,不是元素值。如
果需要取值,需要再加上一个取值付*,*((a+i)[j])与**(a+i+j)都是 a[i+j][0];D
错的比较离谱,是 int*+int
15. 设有定义:int
a;
float
b;
执行 scanf("%2d%f",&a,&b); 语句时,
若从键盘输入 876
543.0<回车>,a 和 b 的值分别是
A)876 和 543.000000
B)87 和 6.000000
C)87 和 543.000000
D)76 和 543.000000
【答案】B
【解析】%2d 决定了 a 只能接受两位数字,所以 a 的值为 87 你的%2d%f 是连在一起的,
那么按照默认约定,输入的数据也应该是连续的,中间没有空格。否则会将空格作为输
入的结束符看待。6 和 5 中间有一个空格,所以输入到 6 就结束了,后面的 543.0 被无
视。
16. 若变量均已正确定义并赋值,以下合法的 C 语言赋值语句是(?)。
A.x=y==5;
B.x=n%2.5;
C.x+n=i;
D.x=5=4+1;
【答案】A
【解析】选项 B)中,2.5 不是整数,故非法;选项 C)中,表达式 X+n 计算后得到的是
一临时值,临时值不能做左值,故非法;选项 D)中,由于“=”运算符的结合性是“从
右到左”,故先计算 5=4+1,5 是常量不能对其赋值,故非法。
17. 设有定义:float x=123.4567;,则执行以下语句后的输出结果是【】。
printf("%f\n",(int)(x*100+0.5)/100.0);
A)123.460000
B)123
C)0
D)123.46
【答案】A。123.460000
【解析】被强制转换为整型的是分子部分,分母 100.0 为浮点型,结果还是浮点型。
单精度浮点型在输出时保留小数点后 6 位,双精度浮点型在输出时保留小数点后 12 位
这里是%f,所以是单精度,应保留 6 位小数,若是双精度,就是%lf,若想保留例如 4
位小数,则是%.4f
18. 若变量 x、y 已正确定义并赋值,以下符合 C 语言语法的表达式是
A)++x,y=x--
B)x+1=y
C)x=x+10=x+y
D)double(x)/10
【答案】A
【解析】++x 是前缀表达式,y=x--是复合语句,先进行 x--,然后把自减后的值赋给 y。
B 项错误,x+1 是右值,不能被赋值;C 项错误,x+10 是右值,不能被赋值;D 项错误,
应改成(double)x/10,double (x)/10 是表示声明了一个 double 变量, 它名字是
(x)/10,显然不符合 C 语言语法。cpp 编译器能够通过编译,c 不行。
19. 在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是_______。
A)地址传递
B)单向值传递
C)由实参传递给形参,再由形参传递给实参
D)传递方式由用户指定
【答案】B
【解析】:实参变量对形参变量的数据传递是"单向值传递",只由实参传给形参。在内
存中,实参单元与形参单元是不同的单元。调用结束后,实参单元仍保留并维持原值。
20. 下列叙述中正确的是
A)break 语句只能用于 switch 语句
B)在 switch 语句中必须使用 default
C)break 语句必须与 switch 语句中的 case 配对使用
D)在 switch 语句中,不一定使用 break 语句
【答案】D
【解析】for 语句也可以使用 break,default 也不是必须的。多个 case 可以自由一个
break,达到多个 case 公用一个结果的目的。
21. 下列可用于 C 语言用户标识符的一组是.( )。
A.void,define,WORD
B.a3_b3,_123,Car
C.For,-abc,IF Case
D.2a,DO,sizeof
【答案】B
【解析】C 语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必
须为字母或下划线。注意,大写字母和小写字母被认为是两个不同的字符。C 语言中的
关键字不能用作用户标识符
22. 有以下程序
int main(){
int
k=5;
while(--k)
printf("\n");
}
printf("%d",k -= 3);
执行后的输出结果是
A)1
B)2
C)4
D)死循环
【答案】A
【解析】--k,先减减再返回,等于 4,k=4-3=1;
23. 以下选项中,值为 1 的表达式是
A)1 –'0'
B)1 - '\0'
C)'1' -0
D)'\0' - '0'
【答案】B
【解析】1 - '\0',因为"\0"是转义代码,结果就是 0
24. 以下不合法的字符常量是( )。
C)'\\'
B)'\”’
D)'\xcc'
A)'\018'
【答案】A
【解析】本题考查的知识点是字符常量中的转义字符。转义字符是以一个“\”开头的
字符序列,它只代表一个字符。在选项 A)中,“\”后跟着三个数字,是表示一个 ASCⅡ码
值等于这三位数字所组成的八进制数数值的字符,但是八进制数只能是由 0~7 这八个数字
表示,而选项 A)中出现了数字 8 所以是不合法的。选项 B)是表示一个双引号的转义字符表
示方法;选项 C)表示的是一个反斜杆;选项 D)表示一个 ASCⅡ值为十六进制值 cc 的字符。
25. 若二维数组 a 有 m 列,则在 a[i][j]前的元素个数为( )。
B.i*m+j
C.j*m+i+1
A.j*m+i
【答案】A
【解析】下标从 0 开始,先存放第一行的元素,再存放第二行的元素。 数组第一维的
下标是 i,说明它前面还有 i 行,有 i*m 个元素,数组第二维的下标是 j,说明它前面还有
j 列,有 j 个元素,所以共有 i*m+j 个元素。
D.i*m+j+1
26. 已知大写字母 A 的 ASCIl 码值是 65,小写字母 a 的 ASCIl 码 97。以下不能将变量 C 中
的大写字母转换为对应小写字母的语句( )。
A)c=(C-'A')%26+'a'
C)c=C-'A'+'a'
B)c=C+32
D)c=('A'+c)%26-'a'
【答案】D
【解析】根据题意可知,小写字母比与之对应的大写字母 ASCⅡ码大 32。B,C 是一个
意思。%26 中的 26 表示 26 个字母,(C-'A')%26 可以计算出 C 在大写中的位置。
27. 在 16 位编译系统上,若有定义 int a[]={10,20,30}, *p=&a;,当执行 p++;后,下列说
法错误的是
A)p 向高地址移了一个字节
C)p 向高地址移了两个字节
B)p 向高地址移了一个存储单元
D)p 与 a+1 等价
【答案】A
【解析】在 16 位编译系统下,一个 int 型变量是用 16 位来存储的,其占用两个字节,
当执行 p++之后,相当于 p 向高位移动了一个存储单元,也就是两个字节。
28. 若有定义:int w[3][5]; ,则以下不能正确表示该数组元素的表达式是
A)*(*w+3)
B)*(w+1)[4]
C)*(*(w+1))
D)*(&w[0][0]+1)
【答案】B
【解析】因为 w 代表的是数组第 0 行的地址,而 *w 取的是第 0 行第 0 列的地址
A *(*w+3) ,这个表示 w[0][3];
B *(w+1)[4],f 方括号的优先级高于*,相当于*((w+1)[4]), *(w+1)[4]
的结果为 w[5][0],没有定义,*(w+1)[1]输出为 w[2][0]。正确的写法*(*(w+1)+4)或
(*w)[9];等,表示 w[1][4];
C *(*(w+1),这个表示 w[0][1];
D *(&w[0][0]+1),这个表示 w[0][1];
29. 以下关于逻辑运算符两侧运算对象的叙述中正确的是
A)只能是整数 0 或 1
C)可以是结构体类型的数据
【答案】D
【解析】逻辑运算符两侧的运算对象可以是任意合法的表达式。逻辑表达式的运算结果
B)只能是整数 0 或非 0 整数
D)可以是任意合法的表达式
或者为 1(真),或者为 0(假)。
30. 若有以下函数首部 int fun(double
x[10], int
*n)
fun(double x, int *n);
fun(double *x, int n);
则下面针对此函数的函数声明语句中正确的是
A)int
C)int
【答案】D
【解析】本题考查的是函数的声明。函数声明的一股形式为:函数类型函数名(参数类
, int );
B)int
D)int
fun(double
fun(double *,
int *);
型 1[,参数名 1],参数类型 2 [,参数名 2].……);
其中,参数名也可以省略。本题中的 fun 函数有两个参数,一个类型是 double 型一维
数组,另一个是 int 型指针。而在 C 语言中,一维数组用作函数参数和该数组元素的指
针类型是等价的。所以本题的正确答案是选项 D)。
31. 有以下程序
main(){
char s[]="abcde";
s+=2;
printf("%d\n",s[0]);
}
执行后的结果是
A)输出字符 a 的 ASCII 码
C)输出字符 c
B)输出字符 c 的 ASCII 码
D)程序出错
【答案】D
【解析】数组名作为指向数组首地址的地址值,类似是常量,不能作为左值。
32. 以下程序段中,与语句:k=a>b?(b>c?1:0):0;功能相同的是