一、填空 1、软件详细设计的目标不仅是逻辑上正确地实现 ,还应使设计出的处理过程 。结构化程序设计是实现该目标的关键技术之一;它指导人们用良好的思想方法开发易于 、易于 的程序。 2、结构化程序设计方法的基本要点是:① 采用 的程序设计方法;② 使用 构造程序,避免GOTO语句的使用;③ 。 3、任何程序都可由 、 和 等三种基本控制结构构造。这三种基本控制结构的共同点是 和 。 4、程序设计风格是人们编写程序的 、 和 等。 5、语句构造的原则是 ,不能因为追求效率而使代码 。 6、追求效率建立在不损害 或 的基础上。 7、提高程序效率的根本途径在于选择良好的 、良好的 ,而不是靠编程时对语句进行调整。 8、为开发一个特定的项目选择程序设计语言时,必须从 、 和技术性能特性等几方面考虑。 9、通常考虑选用程序设计语言的因素有 、 、 、算法和数据结构的复杂性和软件开发人员的知识。
二、单项选择题 1、在编制程序时应采纳的原则之一是( )。 A. 不限制 goto语句的使用 B. 减少或取消注解行 C. 程序越短越好 D. 程序结构应有助于读者理解 2、一个程序如果把它作为一个整体,它也是只有一个入口、一个出口的单个顺序结构,这是一个( )。 A. 结构化程序 B. 组合的过程 C. 自顶向下程序设计 D. 分解过程 3、程序控制一般分为( )、分支和重复等三种基本控制结构。 A. 分块 B. 顺序 C. 迭代 D. 循环 4、将非结构化的程序转换为结构化程序的过程中,下面( )不适用于具有重复结构的程序。 A. 重复编码法 B. 状态变量法 C. 布尔标记法 D. 全部方法 5、以下说法正确的是( )。 A. 所有改变循环条件的成分都在循环体外 B. 在直到型循环中,循环体至少要执行一次 C. 在当型循环中,循环体至少要执行一次 D. 基本程序结构不允许嵌套 6、源程序文档化要求在每个模块的首部加序言性注释。该注释的内容不应有( )。 A. 模块的功能 B. 语句的功能 C. 模块的接口 D. 扇入数越低 7、功能性注释的作用是解释下面的语句( )。 A. 怎么做 B. 做什么 C. 何时做 D. 为何做 8、对于不好的程序,应当( ). A. 打补丁 B. 修改错误 C. 重新编写 D. 原封不动 9、程序设计语言的心理特性在语言中表现不应包括( )。 A. 二义性 B. 简洁性 C. 保密性 D. 传统性 10、程序设计语言的工程特性之一表现在( )。 A. 软件的可复用性 B. 数据结构的可描述性 C. 抽象类型的可描述性 D. 数据库的易操作性 11、程序设计语言的技术特性不应包括( )。 A. 数据结构的可描述性 B. 抽象类型的可描述性 C. 数据库的易操作性 D. 软件的可移植性 12、Lipow证明了:当源程序少于100个语句时,每行代码的出错率随程序行数的增长( )。 A. 呈线性相关关系 B. 呈指数方式增长 C. 呈对数方式增长 D. 没有一定规律 三、选择填空题 1、从下列关于模块化程序设计的叙述中选出5条正确的叙述。 ( )(1) 程序设计比较方便,但比较难以维护。 ( )(2) 便于由多个人分工编制大型程序。 ( )(3) 软件的功能便于扩充。 ( )(4) 程序易于理解,也便于排错。 ( )(5) 在主存储器能够容纳得下的前提下,应使模块尽可能大,以便减少模块的个数。 ( )(6) 模块之间的接口叫做数据文件。 ( )(7) 只要模块之间的接口关系不变,各模块内部实现细节的修改将不会影响别的模块。 ( )(8) 模块间的单向调用关系叫做模块的层次结构。 ( )(9) 模块越小,模块化的优点越明显。一般来说,模块的大小都在10行以下。
2、从下列叙述中选出5条符合程序设计风格指导原则的叙述。 (1) 嵌套的重数应加以限制。 (2) 尽量多使用临时变量。 (3) 不滥用语言特色。 (4) 不用可以省略的括号。 (5) 使用有意义的变量名。 (6) 应尽可能把程序编得短些。 (7) 把常见的局部优化工作留给编译程序去做。 (8) 注解越少越好。 (9) 程序的格式应有助于读者理解程序。 (10) 应尽可能多用GOTO语句。
3、从下面关于程序编制的叙述中,选出三条正确的叙述。 (1) 在编制程序之前,首先必须仔细阅读给定的程序说明书。然后,必须如实地依照说明书编写程序。说明书中常会有含糊不清或难以理解的地方。程序员在作业时应该对这些地方作出适当的解释。 (2) 在着手编制程序时,重要的是采用既能使程序正确地按设计说明书进行处理,又易于出错的编写方法。 (3) 在编制程序时,首先应该对程序的结构充分考虑,不要急于开始编码,而要象写软件文档那样,很好地琢磨程序具有什么样的功能,这些功能如何安排等等。 (4) 考虑到以后的程序变更,为程序编写完整的说明书是一项很重要的工作。只要有了完整的程序说明书,即使程序的编写形式难以让他人看懂也没有什么关系。 (5) 编制程序时不可缺少的条件是,程序的输入和输出数据的格式都应确定。其他各项规定都是附带的,无足轻重。 (6) 作为一个好的程序,不仅处理速度要快,而且易读易修改等等也都是重要的条件。为了能得到这样的程序,不仅要熟悉程序设计语言的语法,还要注意采用适当的规程和单纯的表现方法,注意使整个程序的结构简洁。
4、从供选择的答案中选出应该填入下面 ( ) 中的正确答案。 A. 允许用户建立、修改、存储正文的计算机程序是( )。 �① BOOtstrap�② Editor �③ Loader�� ④ Textformatter B. 程序语言的编译系统和解释系统相比,从用户程序的运行效率来看 ( )。 �① 前者运行效率高�② 两者大致相同 �③ 后者运行效率高�④ 不能确定 C. FORTRAN语言的源程序是( )结构。 �① COBOL��② BASIC �③ FORTRAN�④ PL/1 E. 国际上最流行的数值计算的程序设计语言是( )。 �① BASIC��② ALGOL �③ FORTRAN�④ C F. 美国国防部主持开发了高级程序设计语言Ada,在它研制开始时,经反复比较,确定以高级语言( )作为Ada研究的出发点。 �① LISP�� ②ALGOL �③ ALGOL68�④ PL/1 G. 在人工智能领域,目前最广泛使用的高级语言是( )。 �① Ada��② FORTRAN �③ COBOL�④ LISP
5、从供选择的答案中选出应该填入下面( )中的正确答案。 A. 汇编程序是指( )。 �① 用汇编语言写的程序�② 符号程序 �③ 汇编语言的处理程序 B. 为了实现递归子程序的正确调用,人们必须用( )来保存( )及有关信息。 �① 堆栈��② 线性表 �③ 队列��④ 树 �⑤ 入口点�⑥ 返回地址 �⑦ 断点 C. UNIX操作系统是( )研制的,它是用程序语言( )书写实现的。 �① Bell实验室�② DEC公司 �③ IBM公司 ��④ PASCAL �⑤ 并发PASCAL�⑥ MODULA �⑦ C
6、从供选择的答案中选出适当的字句填入下面关于程序生产率的描述中的( )内。 (1) 1960年底Dijkstra提倡的 ( A ) 是一种有效的提高程序设计效率的方法。 (2) Dijkstra为了使程序结构易于理解,把基本控制结构限于顺序、( B )、( C )3种,应避免使用( D )。 (3) ( A )不仅提高程序设计的生产率,同时也容易进行程序的( E )。 供选择的答案: A.�① 标准化程序设计�② 模块化程序设计 ��③ 多道程序设计��④ 宏语言 ��⑤ 结构化程序设计�⑥ 汇编语言 ��⑦ 表格处理语言 B~C. ① 分支�② 选择 ���③ 重复�④ 计算 ���⑤ 输入输出 D.�① GOTO语句�② DO语句 ��③ IF语句��④ REPEAT语句 E.�① 设计���② 调试 ��③ 维护���④ 编码 四、问答题 1、试说明下面的两个程序段的功能是什么?可否用另一些等效的程序段来代替它,以提高其可读性。 (1) A[I] = A[I] + A[T];�(2) for ( i = 1; i <= n; i ++ ) ��A[T] = A[I] - A[T];����for ( j = 1; j <= n; j ++ ) ��A[I] = A[I] - A[T];�����V[i][j] = ( i / j ) * ( j / i );
2、结构化程序设计有时被错误地称为“无GOTO语句”的程序设计。请说明为什么会出现这样的说法,并讨论环绕着这个问题的一些争论。
3、设下图给出的程序流程图代表一个非结构化的程序,试问: (1) 为什么说它是一个非结构化的? (2) 设计一个等价的使用附加标志变量flag的结构化程序。 (3) 设计一个使用break(用于代替goto)的程序。
4、有一种循环结构,叫做N+1/2循环。其流程图如下所示。这种控制结构不属于基本控制结构:它既不是先判断型循环,又不是后判断型循环。试修改此流程图,将它改为用基本控制结构表示的等效的流程图。
5、下面是两个程序流程图,试分别用N-S图和PAD表示之,并计算它们的McCabe复杂性度量。
6、下面给出一个求实函数方程F(x)在自变量区间 [a, b] 中的全部实根的算法。首先阅读此程序,然后 �(1) 画出消去全部goto语句的结构化程序流程图。 �(2) 将它改成N_S图。 �(3) 计算该程序的McCabe复杂性度量。 �在算法中,a与b是区间[a, b]的两端点值;eps1与eps2是用户要求的求解精度。如果区间中点的函数值的绝对值小于eps1或新的小区间的长度小于eps2,就认为这个中点为根。 �float BinRoot ( float a, float b, float eps1, float eps2 ) { ���float low= a, high = b, mid, fmid; ���float flow = Func(low), fhigh := Func(high); ���label L1, L2, L3; //标号说明,给定某些程序地址 ���if ( flow * fhigh > 0.0 ) { BinRoot = 0; goto L3; } //无实根 �L1: mid = (low + high) / 2; fmid = Func(mid); ���if ( abs ( fmid ) <= eps1 ) { �L2: BinRoot = mid; goto L3 } ���else if ( high - mid <= eps2 ) goto L2; ����else if ( flow * fmid > 0.0){ low=mid;flow=fmid;goto L1; } �����else { high = mid; goto L1 }; �L3: �}
7、用某种软件复杂性度量算法来度量不同类型的程序时,得出的度量值是否真正反映了它们的复杂性? 如果对同类型的程序进行度量,其结果是否就比较有价值?
8、软件复杂性有哪几类?软件复杂性度量模型应遵循哪些基本原则?