1、国家二级 C语言机试(选择题)模拟试卷 89及答案与解析 一、选择题 1 下列关于栈和队列的描述中,正确的是 ( )。 ( A)栈是先进先出 ( B)队列是先进后出 ( C)队列允许在队头删除元素 ( D)栈在栈顶删除元素 2 已知二叉树后序遍历序列是 CDABE,中序遍历序列是 CADEB,它的前序遍历序列是 ( )。 ( A) ABCDE ( B) ECABD ( C) EACDB ( D) CDEAB 3 在数据流图中,带有箭头的线段表示的是 ( )。 ( A)控制流 ( B)数据流 ( C)模块调用 ( D)事件驱动 4 结构化程序设计的 3种结构是 ( )。 ( A)顺序结构,分支结
2、构,跳转结构 ( B)顺序结构,选择结构,循环结构 ( C)分支结构,选择结构,循环结构 ( D)分支结构,跳转结构,循环结构 5 下列方法中,不属于软件调试方法的是 ( )。 ( A)回溯法 ( B)强行排错法 ( C)集成测试法 ( D)原因排除法 6 下列选项中,不属于模块间耦合的是 ( )。 ( A)内容耦合 ( B)异构耦合 ( C)控制耦合 ( D)数据耦合 7 下列特征中 不是面向对象方法的主要特征的是 ( )。 ( A)多态性 ( B)标识惟一性 ( C)封装性 ( D)耦合性 8 在数据库设计中,将 E-R图转换成关系数据模型的过程属于 ( )。 ( A)需求分析阶段 ( B
3、)概念设计阶段 ( C)逻辑设计阶段 ( D)物理设计阶段 9 在一棵二叉树上,第 5层的结点数最多是 ( )。 ( A) 8 ( B) 9 ( C) 15 ( D) 16 10 下列有关数据库的描述,正确的是 ( )。 ( A)数据库设计是指设计数据库管理系统 ( B)数据库技术的根本目 标是要解决数据共享的问题 ( C)数据库是一个独立的系统,不需要操作系统的支持 ( D)数据库系统中,数据的物理结构必须与逻辑结构一致 11 以下关于 C语言的叙述中正确的是 ( )。 ( A)预处理命令通常位于函数体外面,但也可以位于函数体中间 ( B) C语言中的变量定义须在其他语句之前 ( C)在 C
4、语言程序的书写中,一个语句必须单占一行 ( D)一个 C语言源程序可以由一个或多个源文件组成,每个源文件可由自己的main函数 12 下列叙述中错误的是 ( )。 ( A)用户所定义的标识符允许使 用关键字 ( B)用户所定义的标识符应尽量做到 “见名知意 ” ( C)用户所定义的标识符必须以字母或下划线开头 ( D)用户定义的标识符中,大、小写字母代表不同标识 13 下列选项中可作为 C语言合法常量的是 ( )。 ( A) -80 ( B) -080 ( C) -8e1 0 ( D) -80 0e 14 下列定义变量的语句中错误的是 ( )。 ( A) int _int; ( B) doub
5、le int_; ( C) char For; ( D) float US$; 15 下列关于函数的叙述中 正确的是 ( )。 ( A)每个函数都可以被其他函数调用 (包括 main函数 ) ( B)每个函数都可以被单独编译 ( C)每个函数都可以单独运行 ( D)在一个函数内部可以定义另一个函数 16 当 a=1、 b=2、 c=3、 d=4时,执行下面程序段后, x的值是 ( )。 if(a main() int a=4, b=3, c=2, d=1; printf(“ d“, a main() int b33=0, 1, 2, 0, 1, 2, 0, 1, 2), i, j, t=0;
6、for(i=0; i=i; j-)t+=bij; printf(“ d n“, t); 程序运行后的输出结果是 ( )。 ( A) 4 ( B) 3 ( C) 8 ( D) 9 19 以下程序: #include main() char str10; scanf(“ s“, printf(“ n“); 程序运行后的输出结果是 ( )。 ( A) 12 14 ( B) 12 32 ( C) 10 14 ( D) 10 20 40 己知函数的调用形式 “fread(buffer,size, count, fp); ”其中 buffer代表的是 ( )。 ( A)一个整型变量,代表要读 入的数据项总
7、数 ( B)一个文件指针,指向要读的文件 ( C)一个指针,是指向的输入数据放在内存中的起始位置 ( D)一个存储区,存放要读的数据项 国家二级 C语言机试(选择题)模拟试卷 89答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 栈实际也是线性表,只不过是一种特殊的线性表。栈是只能在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶,另一端为栈底。队列是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头,允许插入的一端叫做队尾。 2 【正确答案】 C 【试题解析】 由于后序遍历的最后一个元素为 E,所以 E为根结点,所以它的前序遍历的首个元素为 E,故排除
8、 A)和 D)选项。由于中序遍历中,元素 B在元素根结点 E的后面,所以 B为二叉树的右子树,并且该二叉树右子树只有一个元素,所以前序遍历的最后一个元素应为 B,故选项 C)为正确选项,即该二叉树的前序遍历序列是 EACDB。 3 【正确答案】 B 【试题解析】 数据流图中带箭头的线段表示数据流,沿箭头方向传递数据的通道,一般在旁边标注数据流名。 4 【正确答案】 B 【试题 解析】 程序设计语言仅仅使用顺序、选择和重复 (循环 )三种基本控制结构就足以表达出各种其他形式结构的程序设计方法。遵循程序结构化的设计原则,按结构化程序设计方法设计出的程序易于理解、使用和维护;可以提高编程工作的效率,
9、降低软件的开发成本。 5 【正确答案】 C 【试题解析】 软件调试主要采用以下三种方法: 强行排错法:作为传统的调试方法,其过程可概括为设置断点、程序暂停、观察程序状态、继续运行程序。 回溯法:该方法适合于小规模程序的排错、即一旦发现了错误,先分析错误征兆,确定最先发现 “症状 ”的位置。 原因排除法:原因排除法是通过演绎和归纳,以及二分法来实现。 6 【正确答案】 B 【试题解析】 耦合可以分为下列几种,它们之间的耦合度由高到低排列: 内容耦合一一若一个模块直接访问另一模块的内容,则这两个模块称为内容耦合。 公共耦合一一若一组模块都访问同一全局数据结构,则称为公共耦合。 外部耦合一一若一组模
10、块都访问同一全局数据项,则称为外部耦合。 控制耦合一一若一模块明显地把开关量、名字等信息送入另一模块,控制另一模块的功能,则称为控制耦合 。 标记耦合一一若两个以上的模块都需要其余某一数据结构的子结构时,不使用其余全局变量的方式而全都使用记录传递的方式,这样的耦合称为标记耦合。 数据耦合一一若一个模块访问另一个模块,被访问模块的输入和输出都是数据项参数,则这两个模块为数据耦合。 非直接耦合 若两个模块没有直接关系,它们之间的联系完全是通过程序的控制和调用来实现的,则称这两个模块为非直接耦合,这样的耦合独立性最强。 7 【正确答案】 D 【试题解析】 面向对象设计方法与面向过程设计方法有本质的不
11、同,其基本原理是:使用现实世界的概念抽象地思考问题从而自然地解决问题。其特点包括:标识惟一性、多态性、封装性、模块独立性、继承和多态性好。 8 【正确答案】 C 【试题解析】 逻辑结构设计的任务:概念结构是各种数据模型的共同基础,为了能够用某一 DBMS实现用户需求,还必须将概念结构进一步转化为相应的数据模型,这正是数据库逻辑结构设计所要完成的任务。它包括从 E R图向关系模式转换和逻辑模式规范化及调整、实现。 9 【正确答案】 D 【试题解析】 根据二叉树的性质:二叉树第 i(i1)层上至多有 2i-1个结点 。得到第5层的结点数最多是 16个。 10 【正确答案】 B 【试题解析】 数据库
12、设计的目的实质上是设计出满足实际应用需求的实际关系模型。数据库技术的主要目的是有效地管理和存取大量的数据资源,包括:提高数据的共享性,使多个用户能够同时访问数据库中的数据;减小数据的冗余,以提高数据的一致性和完整性;提供数据与应用程序的独立性,从而减少应用程序的开发和维护代价。 11 【正确答案】 A 【试题解析】 源程序中可以有预处理命令 (include命令仅为其中的一种 )。 C语言中的变量可以在使用之前的任 何位置进行定义。 C语言程序的书写中,多个语句可以位于一行,但为了增强可读性,一般每行只有一条语句。一个 C语言源程序可以由一个或多个源文件组成,但仅可以有一个 main函数 12
13、 【正确答案】 A 【试题解析】 在 C语言中,合法标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须为字母或下划线,凡是要求标识符的地方都必须按此规则命名。在 C语言的标识符中,大写字母和小写字母被认为是两个不同的字符。在选择标识符时,应注意做到 “见名知义 ”,即选择具有一定含义的英文单词或汉语拼音作为标 识符,以增加程序的可读性。 13 【正确答案】 A 【试题解析】 所谓常量是指在程序运行的过程中,其值不能被改变的量。在 C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。选项 B)中是以0开头,表示一个八进制数,而八进制数的取值范围是 0 7,所以 “
14、-080”错误;在C语言中 e后面的指数必须是整数,因此,选项 C)和 D)也不正确。 14 【正确答案】 D 【试题解析】 C语言规定,变量的标识符只能由字母、数字和下划线 3种字符组成,且首字符必须为字母或下划线。在 C语言中大写字母和小写字 母被认为是两个不同的字符。选项 A)定义的变量标识符 _int和选项 B)定义的变量标识符 int_与C语言的关键字 int是不同的,是正确的变量标识。选项 C)定义的变量标识符 For与 C语言中的关键字 for是两个不同的标识符,所以选项 C)是正确的,而选项 D)包含有特殊字符 $,因而其不符合 C语言的变量命名规定。 15 【正确答案】 B
15、【试题解析】 在 C语言中,函数定义是平行的,函数不能嵌套定义,即函数之间没有从属关系。虽然函数之间可以相互调用,但 main()函数不能被调用,选项A)错误; C程序从 main()函数开始执行,当 main()函数执行完毕时,整个程序就结束了。 C程序的执行必须从 main()函数开始,选项 C)选项错误;函数不能嵌套定义,选项 D)错误。 16 【正确答案】 A 【试题解析】 本题考查的是 if-else语句。第一个 if语句,先判断条件,发现 ab条件成立,执行下面的语句。第二个 if语句,先判断条件,发现 cd条件成立,执行下面的语句 x=1。 17 【正确答案】 A 【试题解析】
16、条件表达式的格式为: “a?b: c”,它的功能是:当 a为真时,表达式的值等于 b的值;当 a为假时, 表达式的值等于 c的值。因为条件运算符的结合方向为 “自右向左 ”。因此,当表达式中嵌套使用条件表达式时,应先计算右边的条件表达式,再计算左边的条件表达式。题中应先计算 “dc?d: b”的 “dc”关系表达式的值,因为 “d=1c=2”为真,所以取第一个表达式的值,即 d的值作为整个表达式的值。接着计算 “ab?a: d”, “a=4b=3”为假,取第二个表达式的值,即 d的值作为整个表达式的值。 18 【正确答案】 C 【试题解析】 这道题主要考查的是二维数组的有关知识。在两层 for
17、循环语句中,累加上三角元 素,所以程序执行的过程为“t=b00+b01+b02+b11+b12+b22=8”。 19 【正确答案】 A 【试题解析】 当从键盘输入 “how are you”时,由于 scanf输入函数的特点是遇到空格时结束读入字符,因此,该程序只将 how这 3个字符送到了字符数组 str中,并在其后自动加上结束符 “ 0”。 20 【正确答案】 A 【试题解析】 本题考查 printf函数的格式和逗号表达式。 printf函数在输出时,是根据格式说明符的个数输出 的,如果函数中有多余的项将不予输出;如果有输出项少于格式说明符,则出错,不能输出正确的结果。本题中逗号表达式 (
18、x, y)只返回 y的值。此时格式说明的个数是 2,而输出项的个数是 3,因此, printf函数只输出前两项。 21 【正确答案】 B 【试题解析】 本题考查 switch语句。因为 a=8, a 4=0,所以执行 case 0后面的语句,将 m加 1,遇到 break语句跳出 switch。 22 【正确答案】 C 【试题解析】 本题主要考查二维数组的使用。题中利用 for循环来输出 x数组中的指定元素: 当 i=0时,输出 x02=3; 当 i=1时,输出 x11=5; 当 i=2时,输出 x20=7。 23 【正确答案】 C 【试题解析】 C语言允许用 typedef说明一种新类型名,
19、其一般形式为: typedef类型名标识符。 typedef语句的作用仅仅是使 “标识符 ”来代表已存在的 “类型名 ”,并未产生新的数据类型。原有类型名依然有效。此题中,用 typedef定义了新的类型 OLD结构,所以 OLD为结构体类型。 24 【正确答案】 B 【试题解析】 二维数组的初始化有以下几种形 式: 分行进行初始化; 不分行的初始化; 部分数组元素初始化; 省略第一维的定义,不省略第二维的定义。在选项 B)中赋值号左边定义了一个 2行 3列的二维数组,而右边用 3行 2列的数字进行赋初值。所以出现了边界的越界溢出错误。 25 【正确答案】 D 【试题解析】 本题考查函数调用的
20、变量作用域。全局变量不在任何函数体内定义,作用域为整个文件;局部变量在函数体内定义,作用域仅为本次函数; static类型是静态变量,为了方便其他编译单元的引用,不能随意改变。 一个函数包含两部分:函数首和函数体,函数体 包括花括号内的所有语句。 26 【正确答案】 B 【试题解析】 本题考查函数返回值。 fun函数的返回值类型为 int*类型,即函数返回一个指向整型变量的指针。 27 【正确答案】 D 【试题解析】 本题考查通过指针引用数组元素。用指针引用数组有以下 3种形式: “(p+n)与 (a+n)”表示数组元素 an的地址; “*(p+n)与 *(a+n)”表示数组元素 an; “p
21、n=*(p+n)”,都表示数组元素 an。选项 A)、 B)没有这种引用形式;选项 C), “*(p+5)”是引用数组的第 6个元素,而数组一共有 5个元素,出现越界;选项 D), “*(a+2)”引用数组的第 3个元素。 28 【正确答案】 C 【试题解析】 联合体的几个特点: 联合体所占用的内存空间为最长的成员所占用的空间; 各个成员分量全部是从低地址方向开始使用内存单元; 联合体中的空间在某一时刻只能保存某一个成员的数据; 联合体和结构体可以任意嵌套。 29 【正确答案】 C 【试题解析】 本题考查函数调用时的参数传递。选项 C)中第一个参数的表达式不正确,因此不能得到正确的结果。 30
22、 【正确答案】 D 【试题解析】 本题考查指针的运用。通过 pt=&xy,将 pt指向 xy所占的内存地址,而 *pt是指针 pt所指向内存单元中的内容,即 200,所以最后 xy的值为230。 31 【正确答案】 B 【试题解析】 第一个 for循环,给数组 a的 20个元素分别赋值 0 19;第二个for循环,给数组 p赋值, p0=a1=1, p1=a2=2, p2=a5=5,p3=a10=10;第三个 for循环,将数组 p中元素的值进行累加,k=1+2+5+10=18。 32 【正确答案】 C 【试题解析】 函数 “fun(int*x,int i)”的功能是把数组元素 xi的值加 1
23、赋给 x0。所以在主函数中执行 fun(a,2)后,数组元数 a0的值等于 4。然后在 for循环语句中,输出数组 a中的前 4个元素的值,分别是 4、 2、 3、 4。 33 【正确答案】 C 【试题解析】 “*”号的优先级比 “+”的优先级高,所以先执行 “*p”;指针 p指向的是数组的首地址,因此, “*p=a”,再加 4得 e。 34 【正确答案】 D 【试题解析】 本题考查指针变量的运用。本题中的函数实质上是将字 符串 t续接到字符串 s中。 35 【正确答案】 A 【试题解析】 本题考查的是静态变量以及函数的实参与形参之间的地址值传递。sub()函数中定义的变量 m是一个静态变量,
24、系统可为其分配固定的存储空间,重复使用时,变量的值保留;所以当 main()函数中的 for循环中语句 “sub(a, &x)”;执行时, sub函数中 m的值依次是 4、 3、 2、 1、 0;因为变量 x进行的是地址值传递,所以最后依次输出的是数组 a的元素 a4、 a3、 a2、 a1、 a0。 36 【正确答案】 B 【试题解析】 本题考查指针变量的赋值操作。选项 A)是将指针 q1和 q2所指向的变量值相乘,然后赋给 k;选项 B)中, float型数据和指针型数据之间不能进行赋值运算;选项 C)中,是两个指针变量之间的赋值:选项 D)中,是两个指针型变量所指向的两个 int型数据相
25、加。 37 【正确答案】 B 【试题解析】 本题考查的是联合体的有关概念。因为联合体是各个成员共享一段存储空间,此段存储空间最终存放的是最后存入的成员的值,所以题目中输出s age实际上输出了最后存入的 3000,因为 3000已经把原来存入的 s age(32)的值 覆盖。 38 【正确答案】 D 【试题解析】 本题考查宏替换的规则。宏替换有两类:简单的字符替换和带参数的宏替换。使用宏应注意: 宏定义仅仅是符号替换,不是赋值语句,因此,不做语法检查; 为了区别程序中其他的标示符,宏名的定义通常用大写字母,但不是必须用大写; 双引号中出现的宏名不替换; 使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。 39 【正确答案】 B 【试题解析】 i=2时, fun(&a2)返回值是: b=b+a1=3+3=6,b=b+b=6+6=12;i=3时, fun( a3)返回值是: b=b+a3=12+4=16, b=b+b=16+16=32。 40 【正确答案】 C 【试题解析】 数据块输入输出函数的调用形式为: fread(buffer,size,count,fp)。 fread函数参数说明: “buffer”是一个指针,对 fread来说,它是读入数据的存放地址; “size”是要读写的字节数; “count”是要进行读写多少个 size字节的数据项; “fp”是指文件型指针。