3、任何程序都可由顺序、选择和重复等三种基本控制结构构造。这三种基本控制结构的共同点是单入口和单出口。
4、程序设计风格是人们编写程序的特点、习惯和逻辑思路等。 5、语句构造的原则是简单,直接不能因为追求效率而使代码复杂化。 6、追求效率建立在不损害程序可读性或可靠性的基础上。
7、提高程序效率的根本途径在于选择良好的设计方法、良好的数据结构和算法,而不是靠编程时对语句进行调整。
8、为开发一个特定的项目选择程序设计语言时,必须从心理特性、工程特性和技术性能特性等几方面考虑。 9、通常考虑选用程序设计语言的因素有项目的应用领域、软件开发的方法、软件执行的环境、算法和数据结构的复杂性和软件开发人员的知识。 二、单项选择题
1、在编制程序时应采纳的原则之一是D。
A. 不限制 goto语句的使用 B. 减少或取消注解行C. 程序越短越好 D. 程序结构应有助于读者理解 2、一个程序如果把它作为一个整体,它也是只有一个入口、一个出口的单个顺序结构,这是一个B。 A. 结构化程序 B. 组合的过程C. 自顶向下程序设计 D. 分解过程 3、程序控制一般分为B、分支和重复等三种基本控制结构。 A. 分块B. 顺序C. 迭代D. 循环
4、将非结构化的程序转换为结构化程序的过程中,下面D不适用于具有重复结构的程序。 A. 重复编码法 B. 状态变量法C. 布尔标记法 D. 全部方法 5、以下说法正确的是B。
A. 所有改变循环条件的成分都在循环体外 B. 在直到型循环中,循环体至少要执行一次 C. 在当型循环中,循环体至少要执行一 D. 基本程序结构不允许嵌套 6、源程序文档化要求在每个模块的首部加序言性注释。该注释的内容不应有B。 A. 模块的功能 B. 语句的功能C. 模块的接口 D. 扇入数越低 7、功能性注释的作用是解释下面的语句B。
A. 怎么做 B. 做什么C. 何时做 D. 为何做 8、对于不好的程序,应当C
A. 打补丁 B. 修改错误C. 重新编写 D. 原封不动 9、程序设计语言的心理特性在语言中表现不应包括C。 A. 二义性 B. 简洁性C. 保密性 D. 传统性 10、程序设计语言的工程特性之一表现在A。
A. 软件的可复用性 B. 数据结构的可描述性C. 抽象类型的可描述性 D. 数据库的易操作性 11、程序设计语言的技术特性不应包括D。
A. 数据结构的可描述性 B. 抽象类型的可描述性C. 数据库的易操作性 D. 软件的可移植性 12、Lipow证明了:当源程序少于100个语句时,每行代码的出错率随程序行数的增长A。 A. 呈线性相关关系 B. 呈指数方式增长C. 呈对数方式增长 D. 没有一定规律 三、选择填空题
1、从下列关于模块化程序设计的叙述中选出5条正确的叙述。 (×)(1) 程序设计比较方便,但比较难以维护。 (√ )(2) 便于由多个人分工编制大型程序。 (√ )(3) 软件的功能便于扩充。 (√ )(4) 程序易于理解,也便于排错。
(× )(5) 在主存储器能够容纳得下的前提下,应使模块尽可能大,以便减少模块的个数。 (× )(6) 模块之间的接口叫做数据文件。
(√ )(7) 只要模块之间的接口关系不变,各模块内部实现细节的修改将不会影响别的模块。 (√ )(8) 模块间的单向调用关系叫做模块的层次结构。
(× )(9) 模块越小,模块化的优点越明显。一般来说,模块的大小都在10行以下。
2、从下列叙述中选出5条符合程序设计风格指导原则的叙述。(1)、(3)、(5)、(7)、(9)是正确的 (1) 嵌套的重数应加以限制。 (2) 尽量多使用临时变量。 (3) 不滥用语言特色。 (4) 不用可以省略的括号。 (5) 使用有意义的变量名。 (6) 应尽可能把程序编得短些。
(7) 把常见的局部优化工作留给编译程序去做。 (8) 注解越少越好。
(9) 程序的格式应有助于读者理解程序。 (10) 应尽可能多用GOTO语句。
3、从下面关于程序编制的叙述中,选出三条正确的叙述。(1)、(4)、(6) 是正确的
(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、从供选择的答案中选出适当的字句填入下面关于程序生产率的描述中的( )内。 A. ⑤, B. ②, C. ③, D. ①, E. ③
(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 ); 答:
(1) 的功能是对换A[I] 与A[T] 的内容。等效的程序段可以是: WORK = A[T]; A[T] = A[I]; A[I] = WORK;
(2) 的功能是建立一个单位矩阵V。等效的程序段可以是:
for ( i = 1; i <= n; i ++ ) for ( j = 1; j <= n; j ++ )
if ( i == j ) V[i][j] = 1; else V[i][j] = 0;
2、结构化程序设计有时被错误地称为“无GOTO语句”的程序设计。请说明为什么会出现这样的说法,并讨论环绕着这个问题的一些争论。 答:
纷乱如麻的程序流程
早在1963年,针对当时流行的ALGOL语言,Peter Naur指出,在程序中大量地,没有节制地使用GOTO语句,会使程序结构变得非常混乱。但是很多人还不太注意这一问题。以致许多人写出来的程序仍然是纷乱如麻的。
1965年,E.W.Dijkstra在一次会议上提出,应当把GOTO语句从高级语言中取消。并指出,程序的质量与程序中包含的GOTO语句的数量成反比。在这种思想的影响下,当时新开发的几
种高级程序设计语言,例如LISP、ISWIM、BLISS等,都把GOTO语句取消了。
1966 年,Bohm与Jacopini证明了任何单入口单出口的没有“死循环”的程序都能由三种最基本的控制结构构造出来。这三种基本控制结构就是“顺序结构”、“选择IF-THEN-ELSE结构”、“重复DO-WHILE或DO-UNTIL结构”。
1968 年,Dijkstra在写给(美国计算机协会通讯)杂志编辑部的信中再次建议从一切高级语言中取消GOTO语句,只使用三种基本控制结构编写程序。他的建议引起了激烈的争论。争论集中在如何看待GOTO语句的问题上。赞成取消 GOTO 语句的一方认为,GOTO语句对程序清晰性有很大破坏作用,凡是使用GOTO语句多的程序,其控制流时而GOTO向前,时而GOTO向后,常使程序变得很难理解,从而增加查错和维护的困难,降低程序的可维护性。但以D.E.Knuth为代表的另一方认为,GOTO 语句虽然存在着破坏程序清晰性的问题,但不应完全禁止。因为GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁,并且GOTO语句可直接得到硬件指令的支持。经过争论,人们认识到,不是简单地去掉GOTO语句的问题,而是要创立一种新的程序设计思想、方法和风格,以显著提高软件生产率和软件质量,降低软件维护的成本。
1970年代初N.Wirth在设计Pascal语言时对GOTO语句的处理可被当做对GOTO 语句争论的结论。在Pascal语言中设置了支持上述三种基本控制结构的语句;另一方面,GOTO语句仍然保留在该语言中。不过,N.Wirth解释说,通常使用所提供的几种基本控制结构已经足够,习惯于这样做的人不会感到GOTO语句的必要。也就是说,在一般情况下,可以完全不使用GOTO语句。如果在特殊情况下,由于特定的要求,偶然使用GOTO语句能解决问题,那也未尝不可,只是不应大量使用罢了。
事实上,大量采用GOTO语句实现控制路径,会使程序路径变得复杂而且混乱,从而使程序变得不易阅读,给程序的测试和维护造成困难,还会增加出错的机会,降低程序的可靠性。因此要控制GOTO语句的使用。但有时完全不用GOTO语句进行程序编码,比用GOTO语句编出的程序可读性差。例如,在查找结束时,文件访问结束时,出现错误情况要从循环中转出时,使用布尔变量和条件结构来实现就不如用GOTO语句来得简洁易懂。
3、设下图给出的程序流程图代表一个非结构化的程序,试问: (1) 为什么说它是一个非结构化的? (2) 设计一个等价的使用附加标志变量flag的结构化程序。 (3) 设计一个使用break(用于代替goto)的程序。
答:
(1) 它是一个单入口、两出口的结构,所以是一个非结构化的程序。 (2) 等价的结构化程序:
enum Boolean { false, true }
Boolean flag = true; while ( P && flag ) {
do G;
if ( !Q ) flag = false; }
(3) 使用break的程序
while ( P ) {
do G;
if ( !Q ) break;
}
4、有一种循环结构,叫做N+1/2循环。其流程图如下所示。这种控制结构不属于基本控制结构:它既不是先判断型循环,又不是后判断型循环。试修改此流程图,将它改为用基本控制结构表示的等效的流程图。
答:等效的控制流程图如下图中 (a) 所示。先判断型循环要求在进入循环体之前,先判断是否要继续执行此循环。因此,在这种控制结构的入口处应是一个判断语句。这种循环的循环体可能一次也不执行。参看图 (b)。
5、下面是两个程序流程图,试分别用N-S图和PAD表示之,并计算它们的McCabe复杂性度量。