1、软件水平考试(中级)软件设计师上午(基础知识)试题模拟试卷 78及答案与解析 1 下面关于编程语言的各种说法中, (1)是不正确的。 ( A)逻辑型语言适用于书写自动定理证明 ( B) Smalltalk、 C+、 Java、 C都是面向对象语言 ( C)函数型语言适用于人工智能领域 ( D)由于 C语言程序是由函数构成的,因此它是一种函数型语言 2 序言性注释是指在每个程序或模块开头的一段说明,起辅助理解程序的作用,一般包括:程序的表示、名称和版本号,程序功能描述,接口与界面描述,输入输出数据说明,开发历 史,与运行环境有关的信息等。下列叙述中不属于序言性注释功能的是 (2)。 ( A)程序
2、对硬件、软件资源的要求 ( B)重要变量和参数说明 ( C)嵌入在程序中的 SQIL语句 ( D)程序开发的原作者、审查者、修改者、编程日期等 3 传值调用和引用调用是常用的函数调用方式,下列描述中正确的是 (3)。 ( A)在传值调用方式下,是将形参的值传给实参 ( B)在传值调用方式下,形参可以是任意形式的表达式 ( C)在引用调用方式下,是将实参的地址传给形参 ( D)在引用调用方式下,实参可以是任意形式的表达式 4 编译器对高级语言源程序的处理过程可以划分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等几个阶段,其中, (4)并不是每种编译器都必需的。 ( A)语
3、法分析和语义分析 ( B)中间代码生成和目标代码生成 ( C)中间代码生成和代码优化 ( D)代码优化和目标代码生成 5 高级语言程序编译的过程可以分成千个阶段,其中把单词符号分解成句子属于 (5)阶段的工作。 ( A)词法分析 ( B)语法分析 ( C)语义分析 ( D)分析代码生成 6 有限自动机可分为确定的有限自动机和不确 定的有限自动机。那么确定的有限自动机 A与不确定的有限自动机 B等价,则 (6)。 ( A) A与 B的状态个数相等 ( B) A与 B可识别的记号完全相同 ( C) B能识别的正规集是 A所识别正规集的真子集 ( D) A能识别的正规集是 B所识别正规集的真子集 7
4、 以下关于编译和解释程序的描述,正确的是 (7)。 ( A)解释程序不需要进行词法和语法分析,而是直接分析源程序的语义并产生目标代码 ( B)编译程序不需要进行词法和语法分析,而是直接分析源程序的语义并产生目标代码 ( C)编译程序不生成源程序的目标代码,而解释程 序则产生源程序的目标代码 ( D)编译程序生成源程序的目标代码,而解释程序则不产生源程序的目标代码例 8 某确定性有限自动机 (DFA)的状态转换图如图 2-1所示,令 d=0 1 2 9,则以下字符串中,能被该 DFA接受的是 (8)。 ( A) 80008 ( B) 1-2 E+5 ( C) -968 12 ( D) 12 57
5、6E10 9 关于以下描述错误的是 (9)。 ( A)高级语言都是用接近人们习惯的自然语言和数学语言作为语言的表达形式 ( B)计算机只能处理由 0和 1的代码构成的二进制指令或数据 ( C)每一种高级语言都有它对应的编译程序 ( D) C语言源程序经过 C语言编译程序编译之后生成一个后缀为 EXE的二进制文件 10 下列关于编译系统对某高级语言进行翻译的叙述中,错误的是 (10)。 ( A)不同的高级程序语言可以产生同一种中间代码 ( B)在机器上运行的目标程序完全独立于源程序 ( C)目标代码生成阶段的工作与目标机器的体系结构相关 ( D)经过反编译,可以将目标代码还原成源代码 11 对于
6、以下编号为 、 、 的正则式,正确的说法是 (11)。 (a*b*)b* (a b)b* (b* a*)*b ( A)正则式 、 等价 ( B)正则式 、 等价 ( C)正则式 、 等价 ( D)正则式 、 , 等价 12 集合 L=ambm m0)(12)。 ( A)可用正规式 “a*b*”表示 ( B)不能用正规式表示,但可用非确定的有限自动机识别 ( C)可用正规式 “ambm”表示 ( D)不能用正规式表示,但可用上下文无关文法表示 13 程序语言的大多数语法现象可用上下文无关文法描述。对于一个上下文无关文法 G=(N, T, P, S),其中 N是非终结符号的集合, T是终结符号的集
7、合, P是产生式集合, S是开始符号。令集合 V: N T,那么 G所描述的语言是 (13)的集合。 ( A)从 S出发推导出的包含 V和 T中所有符号的串 ( B)从 S出发推导出的只包含 V中所有符号的串 ( C)从 S出发推导出的只包含 T中符号的串 ( D) T中所有符号组成的串 14 某一确定有限自动机 (DFA)的状态转换图如图 2-2所示,与该 DFA等价的正规式是 (14)。 ( A) 10*(0 1)* ( B) (0*0)*1*)* ( C) 1*(0 1)00)* ( D) (1*(01*0)*)* 15 图 2-3所示为一确定有限自动机的状态转换图,图中的 (15)是可
8、以合并的状态。( A) 0和 1 ( B) 2和 3 ( C) 1和 2 ( D) 0和 3 16 已知函数 f1()、 f2()的定义如下所示,设调用函数 f1时传递给形参 x的值是 10,若函数调用 f2(a)以引用调用 (Call By Reference)方式传递信息和以值调用 (Call By Va1ue)方式传递信息,则函数 f1的返回值分别为 (16)。 ( A) 20和 20 ( B) 59和 20 ( C) 59和 98 ( D) 20和 98 17 序设计语言一 般都提供多种循环语句,有先判断循环条件再执行循环体的 while语句,也有先执行循环体再判断循环条件的 do-w
9、hile语句,那么下列描述中正确的是 (17)。 ( A) while循环语句能够实现的功能 do-while不一定能实现 ( B)循环条件相同时, while语句的执行效率更高 ( C) while语句的循环体执行次数比循环条件的判断次数少 1,而 do-while语句的循环体执行次数等于循环条件的判断次数 ( D) while语句的循环体执行次数比循环条件的判断次数少 1,而 do-while语句的循环体执行次数比循 环条件的判断次数多 1 18 某一确定性有限自动机 (DFA)的状态转换如图 2-4所示,则以下字符串中,不能被该 DFA接受的是 (18)。 0010 0001 0101
10、( A) , ( B) , ( C) , ( D) , , 19 设某程序中定义了全局整型变量 x和 y,且函数 f()的定义如下所示,则在语句“x=3*y+1; ”中 (19)。 int f(int y) int x; x=3*y+1; return x; ( A) x和 y均是全局变量 ( B) x是全局变量、 y是局部变量 ( C) x是局部变量、 y是局部变量 ( D) x是局部变量、 y是全局变量 20 下列叙述中正确的是 (20)。 ( A)算法的时间、空间复杂性与实现该算法所采用的程序设计语言相关 ( B)面向对象程序设计语言不支持对一个对象的成员变量进行直接访问 ( C)与汇编
11、语言相比,采用脚本语言编程可获得更高的运行效率 ( D)面向对象程序设计语言不支持过程化的程序设计,只支持面向对象程序设计 21 若程序中存在死循环,那么这属于 (21)错误。 ( A)语法 ( B)语用 ( C)语义 ( D)语境 22 由终结符 0、 1组成且仅包含偶数个 0的串的集合用正规式表示为 (22)。 ( A) (0*0)*1* ( B) (1*(01*0)*)* ( C) (0*0*)*1)* ( D) (0 1)*(00)* 23 许多程序设计语言规定,程序中的数据都必须具有类型,其作用不包括 (23)。 ( A)便于系统数据分配合理的存储单元 ( B)便于了解数据的取值范围
12、 ( C)便于对参与表达式计算的数据对象进行检查 ( D)便于定义动态数据结构 24 以下关于程序设计语言的描述中,正确的是 (24)。 ( A)在 C语言中,对指针变量进行算术运算是没有意义的 ( B)在 C语言中,指针变量必须由动态产生的数据对象来赋值 ( C)在 C语言中,变量和常量都具有类型属性 ( D)在 C语言中,变量和常量都可以被赋值 25 表达式 a*(b+c)-d的后缀表达式为 (25)。 ( A) abcd*+- ( B) abc+*d- ( C) abc*+d- ( D) -+*abcd 26 已知某文法 GS: SaSa Sb ,从 S推导出的符号串可用 (26)(n0
13、)描述。 ( A) (aba)n ( B) anban ( C) bn ( D) abna 27 下列程序语言, (27)最早是为了教学的目的开发而成的。 ( A) C语言 ( B) Fortran ( C) Prolog ( D) Pascal 28 对于正规式 0*(010101)*0,其正规集中字符串的特点是 (28)。 ( A)开头和结尾必须是 0 ( B) 1必须出现奇数次 ( C) 0不能连续出现 ( D) 1不能连续出现 29 下面的 C程序代码段在运行中会出现 (29)错误。 int i=0; while(i”或标以 “-”,终态结点用双圈表示或标以 “+”,若 f(ki, a
14、)=kj,则从状态结点 ki到状态结点 kj画标记为 a的弧;被 DFA所接受是指从初态开始来终态,所输入的字符串能够按顺序的执行下去,若到某个状态不能往下走得到下一个字符,则认为不可接受 。本题的状态图的状态间的字符有一、 d、 E、,下面来逐个分析 4个选项: A选项不能被接受。由于 80008都是数字,所以从初态 0出发不经过状态 4,而是直接到状态 1,因为 0和 1之间产生字符为 d,又在状态 1处有 d*,所以表面可以接受 “dddd”形式的字符串;但是,状态 1之后的产生字符是 E和,不再是数字 d,若输入全数字则到不了终态 6。所以输入 3857是不能接受的。 B选项不能被接受
15、。从初态 0412 ,就不能再往下走了,因为状态 2后的产生字符是 “-、 d”,不是 “+”,也无法到达终态 6。 C选项能被接受。从初态 04156 ,由于状态 1和 6处的可以反复多个字符,所以本选项正确。 D选项不能被接受。从初态 0156 ,虽然从初态到终态,但无法接受字符E了,所以错误。 【知识模块】 程序语言与语言处理程序 9 【正确答案】 D 【试题解析】 本题主要考查高级程序设计语言的基础知识。下面分别分析一下本题的 4个选项。 由于高级程序设计语言具有可读写、可理解性好等特点,这就要求高级程序设计语言用接近人们习惯的自然语言和数学语言作为语言的表达形式,选项 A的说法正确
16、。 在计算机中,机器可以接受和处理的只能是由 0和 1组成的二进制代码,用高级语言编写的程序都需要经过编译和连接,使其转化为二进制代码才能被机器执行。因此,选项 B的说法正确。 由于高级语言编写的程序都需要经过编译和连接,才能被计算机执行,因此每一种高级语言都有它对应的编译程序, C选项的说法正确。 C语言源程序经过 C语言编译程序编译之后生成一个后缀为 OBJ的二进制文件(称为目标文件 );最后要由 “连接程序 ”把此 OBJ文件与 C语言提供的各种库函数连接起来生成一个后缀为 EXE的可执行文件。因此,选项 D的说法不正确。 【知识模块】 程序语言与语言处理程序 10 【正确答案】 D 【
17、试题解析】 本题主要考查对编译系统的理解。 求解这个题目,首先要了解源程序、中间代码、目标代码的关系。其中源程序是指用高级语言编写的程序,将源程序经过编译,就可以得到中间代码并最终得到目标代码,目标代 码就是可以在具体机器上执行的代码,这时源程序和编译程序都不再参与目标程序的执行过程,所以在机器上运行的目标程序是完全独立于源程序的。 另外,目标代码是在机器上运行的代码,所以它的生产与目标机器的体系结构是密切相关的。 中间代码是一种简单且含义明确的记号系统,与具体的机器无关,可以有若干种形式。可以将不同的高级程序语言翻译成同一种中间代码,另外由于与具体机器无关,使用中间代码有利于进行与机器无关的
18、优化处理,以及提高编译程序的可移植性。 编译是将高级语言源程序翻译成机器语言程序 (即目标代 码 ),反编译是编译的逆过程。反编译通常不能把可执行文件还原成高级语言源代码,只能转换成功能上等价的汇编程序。 【知识模块】 程序语言与语言处理程序 11 【正确答案】 C 【试题解析】 本题主要体现对闭包的理解。 正则闭包:A+=A1 A2 A3 An ( 也就是所有幂的组合 )。闭包: A*: A0 A+ (在正则闭包的基础上,加上 A0=)。比如 a*=a, aa, aaa, , ),而 (ab)*=ab,abab, ababab, , )。 正规式中的运算符 “ ”、 “ ”、 “*”分别称为
19、 “或 ”、 “连接 ”和 “闭包 ”。在正规式的书写中,连接运算符 “ ”可省略。运算的优先级从高到低顺序排列为: “*”、 “ ”、 “ ”。 那么在本题中, (a*b*)*b所表示的含义就是以b结尾的且只包含 a和 b字符的任意字符串。 在正则式 (a b)*b中,闭包内的可以选 a也可选 b,而且 a和 b在最终字符串中的顺序没有确定,可以是任意的,因此该正则式所表示的含义也是以 b结尾的且只包含 a和 b字符的任意字符串。 在正则式 (b* a*)*b中,括号包内的可以选 a*也可选 b*,然后对结果进行闭包,同样的道理, a和 b在最终字符串中的顺序 没有确定,可以是任意的,因此该
20、正则式所表示的含义也是以 b结尾的且只包含 a和 b字符的任意字符串。 综上所述,可知题目中给出的三个正则式都表示以 b结尾的且只包含 a和 b字符的任意字符串,因此是等价的。 【知识模块】 程序语言与语言处理程序 12 【正确答案】 D 【试题解析】 用正规式定义一些简单的语言,但是很多复杂一些的语言不能用正规式表达。例如,正规式不能用于描述配对或嵌套的结构,具体的例子有由配对括号构成的串的集合不能用正规式描述,语句的嵌套结构也不能用正规式描述;还有,重复串也不能用正规式 表示,如集合 WCW W是 a和 b的串 )不能用正规式描述。 正规式只能表示给定结构的固定次数的重复或没有指定次数的重
21、复。在本题中,指定了重复的次数 m,但 m又不是固定的,所以也不能使用正规式表示。 有限状态自动机识别的语言是正规语言。对于每个非确定的有限自动机,都有一个与其等价的正规式。因此,题目中的集合既然不能使用正规式表达,也就不能用非确定的有限自动机识别。 上下文无关文法的描述功能比正规式更强,正规式可以描述的每种结构都可以用上下语言无关文法来描述,但反之不然。上下文无关文法能表示 次数不固定的重复。因此本题的答案选 D。 【知识模块】 程序语言与语言处理程序 13 【正确答案】 C 【试题解析】 对于一个上下文无关文法 G=(N, T, P, S),如果它的产生式规则都取如下的形式: V w,这里
22、 V VN, w (VT VN)*。开始符号是一种特殊的非终结符,而所谓终结符号是组成语言的基本符号,从语法分析的角度来看,终结符号是一个语言不能再进行分割的基本符号。上下文无关文法取名为 “上下文无关 ”的原因就是因为字符 V总可以被字串 w自由替换,而无须考虑字符 V出现的上下文。在这道题里, V N T,根据 “上下文无关 ”的特性, V总可以被字串N T自由的替换;但当 V=N T时,由于非终结符的不唯一性,要构成等式成立,必须要 N T中的符号串收缩为终结符,即都是 T的集合。所以上下文无关方法 G所描述的语言是从 S出发推导出的仅包含 T中符号的串的集合。 【知识模块】 程序语言与
23、语言处理程序 14 【正确答案】 D 【试题解析】 本题主要考察有限自动机和正规式,这个知识点也是考试中的重点和难点。 对于判断一个有限自动机与那个正规式等价,常见的方法是分析有限自动机,清楚有限自动机所表示 的含义和特性,然后用排除法找到与该有限自动机等价的正规式。 对于本题,首先分析题目中给出的状态转换图,由图可知,状态 q0为唯一的终态,也是初态,那么从初态到终态可以不输入然后字符,因此该有限自动机可识别空串。 另外,仔细分析有限自动机,不难发现,以一个 0离开状态 q0然后再以一个 0返回状态 q0。那么从初态到终态输入 0的个数必须是偶数,而该有限自动机只能识别 0和 1两种字符。因
24、此该自动机识别的串是包含偶数 0的二进制代码串。 清楚了该有限自动机的特性和含义后,我们再逐个分析四个正规式。 在正规式 1*0(0 1)木中,不能确保 O的个数是偶数,而不能表示空串 (因为所有闭包取空,结果仍然有一个 1),因此这个正规式肯定不与有限自动机等价。 在正规式 (0*0)*1*)*中,可以表示空串,但不能确保 O的个数是偶数,因此也不等价于题目给出的有限自动机。 同样的道理,可知正规式 1*(0 1)00)*也不与题目给出的有限自动机等价。 而在正规式 (1*(01*0)*)*中,即可以表示空串,也由于 (01*0)这部分不管重复多少次,都能确保 0的个数是偶数,因此等价。 【
25、知识模 块】 程序语言与语言处理程序 15 【正确答案】 B 【试题解析】 在状态转换图中,每一个结点代表一个状态,其中双圈是终结状态。该题实际上是一个简化确定有限自动机 (DFA)的过程,一个确定有限自动机可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有限自动机。 先介绍两个概念:最小状态 DFA和等价状态。 最小状态 DFA必须满足以下两个条件。 (1)没有多余状态 (死状态 ):多余状态是指从该自动机的开始状态出发,任何输入串都不能到达的那个状态。 (2)没有两 个状态是互相等价 (不可区别 )。 两个状态 s和 t如果同时满足下列两个条件,我们就称 s和 t是等价的:
26、(1)一致性:同是终态或同是非终态。 (2)蔓延性:从 s出发读入某个 a和从 t出发读入某个 a到达的状态等价。 本题的简化过程如下: 首先,将图中状态分为终态和非终态两个子集即 (0, 1, 2, 3),再进行子集划分。观察第一个子集 0, 1,输入 b后,状态 O转换为状态 1,而状态 1转换为状态 2。因此 1和 2中的状态是可区别的。 由于状态 2, 3输入字符 a得到相同 的结果 3,输入字符 b得到相同结果 2,所以子集 2, 3是不可区别的。从而得到新的划分: (0, 1, 2, 3),因此,本题的正确答案为 B。 【知识模块】 程序语言与语言处理程序 16 【正确答案】 B
27、【试题解析】 本题主要考查传值调用和引用调用。 在传值调用中,形参取的是实参的值,形参的改变不会导致调用点所传的实参的值发生改变;而引用 (传址 )调用中,形参取的是实参的地址,即相当于实参存储单元的地址引用,因此其值的改变同时就改变了实参的值。 在本题中, f2以引用调用时, 这个时候将变量 x的值 10传递给变量 a,即 a的值为 10,然后将 a作为 f2的实参,以引用调用方式调用 f2,然后计算得到 y的值为 49并带回,然后在函数 f1中返回 a+x=49+10=59。 f2以值调用时,这个时候将变量 x的值 10传递给变量 a,即 a的值为 10,然后将 a作为 f2的实参,以值调
28、用方式调用 f2,然后计算得到 y的值为 49,但无法带回,然后在函数 f1中返回 a+x=10+10=20。 【知识模块】 程序语言与语言处理程序 17 【正确答案】 C 【试题解析】 本题主要考查循环结构。 常见的循 环结构有 while结构、 do-while结构和 for结构。 while循环也称为当型循环,其逻辑如下图所示。从图中,不难看到, while语句是先判定循环条件,条件成立,则执行循环体,而条件不成立,则不执行循环题,循环结束,这样很显然,其条件的判定次数肯定不循环体的执行次数多 1。而在 do-while结构中,是先执行循环体,再判断条件,如果条件成立,则继续执行循环体,
29、每次循环体结束后,都要判断一次条件,知道条件不成立,循环部分结束,所以其循环体的执行次数等于条件的判断次数。 【知识模块】 程序语言与语言 处理程序 18 【正确答案】 C 【试题解析】 本题主要考查有限自动机识别字符串,这也是考试中一个常考的知识点。所谓被有限自动机所识别,就是依次输入字符串中的字符,判断其是否能使有限自动机从初态开始到终态结束,如果能,则能被该有限自动机所识别,反之,则视为不能被该有限自动机所识别。 在本题中,给出了 3个字符串,分别来判断这 3个字符串是否能别有限自动机所识别。 对于字符串 0010,从初态 q0出发,输入 0后,跳转到自己,然后再输入 0,依然调整到自己
30、,然后输入 1,跳转到终态 q1,这个时候要注意,看到这里很多 考生就认为该字符串能被该有限自动机所识别,但其实不然,因为还有一个字符 0没有输入,如果输入这个 0,则又跳转到了初态,因此该字符串不能被有限自动机所识别。 对于字符串 0001,从初态q0出发,输入 3个 0后,仍然跳转到自己,然后再输入 1,跳转到终态 q1,这时,字符串中的字符已经输入完成,因此该字符串能被该有限自动机所识别。 对于字符串 0101,从初态 q0出发,输入后,跳转到自己,然后再输入 1,跳转到终态q1,输入字符 0,又跳转到初态 q0,再输入 1,跳转到终态 q1,因此在字符串输入完成后,自动机的状态停在终态
31、,所 以该字符串同样能被本题的有限自动机所识别。 【知识模块】 程序语言与语言处理程序 19 【正确答案】 C 【试题解析】 本题主要考查程序中变量的作用域。 根据变量作用域与其定义语句在程序中出现位置关系,可把变量分为局部变量和全局变量两种。其中,在函数外部定义的变量叫做全局变量,又称为外部变量;在函数体内定义的变量是局部变量,又称为内部变量 (当然,函数的形参也是一种局部变量 )。局部变量和全局变量主要有以下区别。 (1)作用域的不同,局部变量的作用域是定义它的函数或程序段,而全局 变量的作用域是整个程序。 (2)局部变量的生命周期与其存储类型有关,而全局变量的生命周期是整个程序的生命周期
32、。 (3)当局部变量和全局变量同名时,局部变量在其作用域内具有更高的优先使用权。 (4)不同函数或程序段之中的局部变量可以同名,而不同的全局变量名称必须不相同。 所以,在本题中,虽然在函数外定义了全局变量 x和 y,但在函数 f中,有局部变量 x和 v,那么在函数 f中使用时,局部变量比全局变量具有更高的优先权,所以函数 f中的 x和 y都是局部变量。 【知识模块】 程序语言与语言 处理程序 20 【正确答案】 B 【试题解析】 本题考查程序设计语言基础知识。 过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,这个过程抽象程度越来越高,程序可读性越来越
33、好,但其程序的执行效率越来越低。 面向对象程序设计语言引入了数据抽象和类的概念,即可支持过程化的程序设计,也可以支持面向对象的程序设计。其最大的特点有继承、封装和多态,其中它的封装特性决定了面向对象程序设计语言不支持对一个对象的成员变量被直接访问,否则就破坏了其封装性。 关于脚本语言的一些基本知识如下: 脚本语言 (JavaScript, VBScript等 )是介于 HTML和 C、 C+、 Java、 C撑等编程语言之间的程序设计语言。 HTML通常用于格式化和链接文本,而编程语言通常用于向机器发出一系列复杂的指令。 脚本语言中也使用变量和函数,这一点与编程语言相似。与编程语言之间最大的区
34、别是编程语言的语法和规则更为严格和复杂。 脚本语言一般都有相应的脚本引擎来解释执行,是一种解释性语言,一般需要解释器才能运行。 脚本语言一般以文本形式存 在,类似于一种命令。 下面举例说明脚本语言。设有一个可执行程序 open_aa exe,用于打开扩展名为 “ aa”的文件。编写 “ aa”文件需要指定一套规则 (语法 ), open_aa exe就用这种规则来理解文件编写人的意图并做出回应。因此,这一套规则就是脚本语言。 汇编语言是符号化的机器语言,一般情况下,用汇编语言编写的程序比高级语言效率更高。根据脚本语言的以上特点, “采用脚本语言编程可获得更高的运行效率 ”是错误的。 综上所述,
35、可知本题的正确答案选 B。 【知识模块】 程序语言与语 言处理程序 21 【正确答案】 C 【试题解析】 源程序中可能出现的错误主要有三类:词法错误、语法错误和语义错误。 词法错误如非法字符或拼写错关键字、标识符等。 语法错误是指语法结构出错,如少分号、 begin end不配对等。 静态语义错误:如类型不一致、参数不匹配等。 动态语义错误 (逻辑错误 ):如死循环、变量为零时作除数等。 大多数错误的诊断和恢复集中在语法分析阶段。一个原因是大多数错误是语法错误;另一个原因是语法分析方法的准确性,它们能以非常有效 的方法诊断语法错误。 在编译时,想要准确诊断语义或逻辑错误有时是很困难,所存在死循
36、环这样的错误,一般在编译阶段是不会报错的,只要到程序运行时,才会发现。 【知识模块】 程序语言与语言处理程序 22 【正确答案】 B 【试题解析】 本题考查对正规式的理解。 在正规式中,符号木表示闭包,即所标示部分可以重复若干次 (包括 0次 ),那么本题中 4个正规式那个能表示题目描述的含义,可以逐个分析。 在选项 A中,正规式 (0*0)*1*中的表达式 (0*0)根据重复的次数不同,得到的结果中 含 0的个数并不一定是奇数个,也有可能是偶数个,如 001就是这个正规式所能表示的一个字符串。 在选项 B中,正规式 (1*(01*0)*)*中的表达式 (01*0)*不管重复多少次,其 0的个
37、数都是 2n个,因此这个正规式能保证 0的个数是偶数个。 同样的道理,可以推断出在选项 C、 D中,不能确保 0的个数是偶数个。 【知识模块】 程序语言与语言处理程序 23 【正确答案】 D 【试题解析】 本题考查程序设计语言的基础知识。 程序设计语言规定,程序中的数据都必须具有类型,这主要是考虑到 了以下几个因素: (1)确定数据类型,这样就确定了该数据所需要占用的存储空间,便于系统为程序分配存储空间。 (2)确实了数据类型,就知道了该数据占几个字节,自然也就清楚了数据所能表示的数组范围。 (3)确定了数据类型,那么就确定了该数据能参加一些什么样的运算,如自加运算就不允许其操作数为浮点数。
38、【知识模块】 程序语言与语言处理程序 24 【正确答案】 C 【试题解析】 在 C语言中,常理是指值一旦确定后就不能再变的量,而变量则是一个在程序执行过程中,可以根据需要修改的 量,是一个可改变的量。当然不管是常量还是变量,它们都有其类型属性,而变量的值允许修改,因此可被赋值,常量则不能赋值。 变量是内存单元的抽象,用于在程序中表示数据。当变量存储的是内存单元地址时,称为指针变量,或者说指针变量指向了另一个变量。指针变量可以定义在函数或复合语句内,也可以定义在所有的函数之外,即可以是全局变量,也可以是局部变量。需要区分指针变量与指针所指向的变量,无论指针变量指向何种变量,其存储空间大小都是一样
39、的。当指针变量指向数组中的一个元素时,对指针变量进行算术运算可以使其指向同一个数组 中的其他元素。 【知识模块】 程序语言与语言处理程序 25 【正确答案】 B 【试题解析】 题目要求根据已知的表达式写对应的后缀表达式。解这种题,如果知道前缀、中缀、后缀表达式有何关联,有什么特点,解题就非常轻松。其实前缀、中缀、后缀的得名是从二叉树来的,也就是把一个表达式转化为一棵二叉树后,对二叉树进行前序遍历得到前缀表达式,对二叉树进行中序遍历得到中序表达式 (也就是一般形式的表达式 ),对二叉树进行后序遍历得到后缀表达式。所以这里只要把表达式转成树的形式,再对二叉树进行后序遍历,即可得到正确答 案。现在最
40、主要的问题是如何构造这棵树。构造的规则是这样的:所有的操作数只能在叶子结点上,操作符是它们的根结点,括号不构造到二叉树当中去,构造树的顺序要遵循运算的顺序。在表达式 a*(b+c)-d中最先计算 b+c,所以先构造如图 2-6所示的部分。 然后把 b+c的结果与 a进行运算,有如图 2-7所示的结果。接着把运算结果和 d相减,最终得到的二叉树如图 2-8所示。 对此树进行后序遍历得到序列: abc+*d-,所以正确答案是 B。【知识模块】 程序语言与语言处理程序 26 【正确答案】 B 【试题解析 】 本题考查文法的推导过程,是常考的知识点。 对于这类题目,求解,可以先从开始符开始,本题中就是
41、 S,注意这是从 “文法 GS”的描述中看出的,另外在产生式中,默认大写字符是非终结符,而小写字母是终结符,这些知识题目中很可能不会给出,但必须知道。 然后分别看产生式 SaSa Sb ,如果是 Sb 的话,那么 b是终结符,就直接结束了,而如果是 S用 aSa替换,重复多次的话,就行成了 anSan,最后 S用 b替代,就可以得到本题答案选 B。 【知识模块】 程序语言与语言处理程序 27 【正确答案】 D 【试 题解析】 本题考查各高级程序设计语言的特点。 Fortran语言是第一个广泛应用于科学计算的高级语言。由一个主程序和若干个子程序组成,由于大部分代码都可以直接使用硬件结构实现,因此
42、执行效率很高。 Pascal语言最早是为了教学的目的开发而成的,拥有一些相当紧凑的机制,其语言的表达能力十分强。它引入了数据结构、过程等重要概念。常用的 Delphi便是采用的 PASCAL语言语法规则。 C语言是 20世纪 70年代发展起来的通用程序设计语言,提供了指针、数组、结构、联合等新的数据类型。它通过指针 可以完成地址操作能力,因此是一种较低级的语言,能够编写出高效的程序。 UNIX系统本身,以及其中大量的应用程序都是使用 C编写的。 Prolog程序是以特殊的逻辑推理形式回答用户的查询。 Prolog程序具有逻辑的简洁性和表达能力。实际应用上多用于数据库和专家系统。 【知识模块】
43、程序语言与语言处理程序 28 【正确答案】 D 【试题解析】 本题考查对正规式的理解。 在本题给出的正规式 0*(010101)*0中, 0*部分可以使连续出现多个 0,这部分也可以表示为空,因此开头不一定是 0,而 (010101)*部分随着重复次数的不同,那么出现 1的个数有可能是奇数次,也有可能是偶数次,但不管 010101部分不管怎么重复,都不能出现连续的 1,因此本题的答案选 D。 【知识模块】 程序语言与语言处理程序 29 【正确答案】 D 【试题解析】 对于上面的程序段,大致一看,可能发现不了错误。所以,这类错误也是大家编程时需要注意的,错误仅仅是 while语句后面多了一个分号
44、 “; ”,然而这种错误是编译程序无法发现的,因为这个程序段并没有语法错误,它是一个可执行的程序段。只是程序中出现了死循环, 无法停止,这种错误属于语义错误。正确的写法应是: int i=0; while(i10) i=i+1; ) 所以正确答案为: D。 【知识模块】 程序语言与语言处理程序 30 【正确答案】 A 【试题解析】 本题主要考查有限自动机。有限自动机可分为确定的有限自动机和不确定的有限自动机。其中不确定有限状态自动机与确定有限状态自动机的最大区别是它们的转移函数不同,确定有限状态自动机对每一个可能的输入只有一个状态的转移,不确定有限状态自动机对每一个可能的输入可以有多 个状态转移,接受到输入时从这多个状态转移中非确定地选择一个。 在题目中, 0是初始状态, 3是终止状态,通过选项中的字符串可以从初始状态到达终止状态,则说明该字符串能被题目中的自动机识别。也可以理解为依次输入选项中的字符串,可以在该自动机中找到相应的路径。 对于选项 A的字符串 aabb,通过 a可以达到状态 2,然后通过 a可以达到状态1,又经过 b到底状态 2,最后经过 b达到终止状态,这时字符串输入完成,状态停留在终态,因此 A可被该自动机识别。同样的道理,我们可以其他选项都不能被该自动机识别。 【知 识模块】 程序语言与语言处理程序