第2章 程序设计基础

程序设计方法是研究问题求解和进行系统构造的软件方法学,其发展经过了结构化程序设计和面向对象的程序设计阶段。

除了好的程序设计方法和技术之外,程序设计风格也是很重要的。因为程序设计风格会深刻地影响软件的质量和可维护性,良好的程序设计风格可以使程序结构合理,使程序代码便于维护。因此,程序设计风格对保证程序的质量是很重要的。

2.1 考点精讲

根据考试大纲,本章要求考生掌握以下知识点:

1)程序设计方法与风格。

2)结构化程序设计。

3)面向对象的程序设计方法,对象,方法,属性及继承与多态性。

2.1.1 程序设计的方法与风格

程序设计风格指一个人编制程序时所表现出来的特点、习惯、逻辑思路等。

在程序设计中要使程序结构合理、清晰,形成良好的编程习惯。对程序的要求不仅是可以在机器上执行,给出正确的结果,而且要便于程序的调试和维护,这就要求编写的程序不仅自己看得懂,而且也要让别人能看懂。

随着计算机技术的发展,软件的规模扩大了,软件的复杂性也增强了。为了提高程序的可阅读性,要形成良好的编程风格。

一般来讲,程序设计风格是指编写程序时所表现出的特点、习惯和逻辑思路。程序是由人来编写的,为了测试和维护程序,往往还要阅读和跟踪程序,因此程序设计的风格总体而言应该简单和清晰,程序必须是可以理解的。

1.数据说明的方法

1)数据说明顺序应规范,使数据的属性更易于查找,从而有利于测试、纠错与维护。

2)一个语句说明多个变量时,各变量名按字母排序。

3)对于复杂的数据结构要加注释,说明在程序实现时的特点。

2.输入和输出

无论是批处理的输入和输出方式,还是交互式的输入和输出方式,在设计和编程时都应该考虑如下原则:

1)输入操作步骤和输入格式尽量简单。

2)应检查输入数据的合法性、有效性,报告必要的输入状态信息及错误信息。

3)输入一批数据时,使用数据或文件结束标志,而不要用计数来控制。

4)交互式输入时,提供可用的选择和边界值。

5)当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性。

6)输出数据表格化、图形化。

7)应允许默认值。

8)给所有的输入和输出加注释,并设计输出报表格式。

2.1.2 结构化程序设计

常用的结构化程序设计有以下3种形式。

1.顺序结构

顺序结构是简单的程序设计,它是最基本、最常用的结构,所谓顺序执行,就是按照程序语句行的自然顺序,一条语句一条语句地执行程序,如图2-1所示。

图2-1 顺序结构程序

2.选择结构

选择结构又称为分支结构,它包括简单选择和多分支选择结构。这种结构可以根据设定的条件,判断应该选择哪一条分支来执行相应的语句序列,如图2-2所示。

3.循环结构

循环结构根据给定的条件,判断是否需要重复执行某一相同的或类似的程序段,利用重复结构可简化大量的程序行。它分为两类:一是先执行后判断,二是先判断后执行,如图2-3所示。

图2-2 选择结构程序

图2-3 循环结构程序

2.1.3 面向对象的程序设计

对象是面向对象方法中最基本的概念。对象可以用来表示客观世界中的任何实体,也就是说,应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界意义的东西。总之,对象是对问题域中某个实体的抽象,设立某个对象就反映软件系统保存有关它的信息并具有与它进行交互的能力。

面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,它由一组表示其静态特征的属性和它可执行的一组操作组成。

对象可以做的操作表示它的动态行为,在面向对象分析和面向对象设计中,通常把对象的操作也称为方法或服务。

属性即对象所包含的信息,它在设计对象时确定,一般只能通过对象的操作来改变。

操作描述了对象执行的功能,若通过消息传递,还可以为其他对象使用。操作过程对外是封闭的,即用户只能看到这一操作实施后的结果。这相当于事先已经设计好的各种过程,用户只要调用就可以了,而不必关心这一过程是如何编写的。事实上,这个过程已经封装在对象中,用户也看不到。这一特性即是对象的封装性。

1.面向对象特点

面向对象具有封装性、继承性和多态性。

(1)封装性

封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接收哪些消息,具有哪些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓行为实现的细节,只需用设计者提供的消息来访问该对象即可。

(2)继承性

继承性是子类自动共享父类之间数据和方法的机制,它由类的派生功能体现。一个类直接继承其他类的全部描述,同时可修改和扩充。继承具有传递性,继承分为单继承(一个子类只有一个父类)和多重继承(一个类有多个父类)。类对象是各自封闭的,如果没继承性机制,则类对象中的数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。

(3)多态性

对象根据所接收的消息而做出动作。同一消息为不同的对象接收时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接收消息的对象自行决定,同一消息即可调用不同的方法。例如,Print消息被发送给图或表时调用的打印方法与将同样的 Print 消息发送给正文文件而调用的打印方法可能完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在面向对象的编程语言中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。

2.类和实例

类是对象的模板,即类是对一组有相同数据和相同操作的对象的定义。一个类所包含的方法和数据可描述一组对象的共同属性和行为,将属性、操作相似的对象归为类,也就是说,类是具有共同属性、共同方法的对象的集合。所以,类是对象的抽象,它描述了属于该对象类型的所有对象的性质,而一个对象则是其对应类的一个实例。

需要注意的是,当使用“对象”这个术语时,既可以指一个具体的对象,也可以泛指一般的对象。但是,当使用“实例”这个术语时,必然是指一个具体的对象。

由类的定义可知,类是关于对象性质的描述,它同对象一样,包括一组数据属性和在数据上的一组合法操作。

在UML语言中,类的表示如图2-4所示。

图2-4 UML语言中的类

3.消息

面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间传递的信息,它是对象执行某一处理或回答某一要求的信息,它统一了数据流的控制流。消息的使用类似于函数调用,消息中指定了某一个实例、一个操作名和一个参数表(可为空)。接收消息的实例执行消息中指定的操作,并将形式参数与参数表中相应的值结合起来。在消息传递过程中,由发送消息的对象(发送对象)的触发操作产生输出结果,作为消息传送至接收消息的对象(接收对象),引发接收消息对象的一系列的操作。所传送的消息实质上是接收对象所具有的操作/方法名称,有时还包括相应参数。

通常,一个消息由以下3部分组成:

1)接收消息的对象的名称。

2)消息标识符(也称为消息名)。

3)0个或多个参数。

2.2 历年试题分析

试题1

下列选项中属于面向对象设计方法主要特征的是( )。

A.继承

B.自顶向下

C.模块化

D.逐步求精

【分析】面向对象方法的主要特征包括继承、封装、多态。而自顶向下、模块化、逐步求精是结构化设计的主要特征。

【答案】A

试题2

结构化程序所要求的基本结构不包括( )。

A.顺序结构

B.GOTO跳转

C.选择(分支)结构

D.重复(循环)结构

【分析】结构化程序的基本结构有3种,即顺序结构、选择结构(又称分支结构)、循环结构。

1)顺序结构。顺序结构是程序设计中最基本的结构。在该结构中,程序的执行是按命令出现的先后顺序依次执行的。

2)分支结构。分支结构是按给定的选择条件成立与否来确定程序的走向。分支可分为单向选择分支、双向选择分支和多路分支。在任何条件下,无论分支多少,只能选择其一。

3)循环结构。循环结构是一种重复结构,程序的执行发生了自下而上的往复,某一程序段将重复执行。按循环的嵌套层次,循环可分为单循环结构和多循环结构。按循环体执行的条件性质,循环又可分为计数循环和条件循环。无论何种类型的循环结构,都要确保循环的重复执行能够终止。

【答案】B

试题3

符合结构化原则的3种基本控制结构是:选择结构、循环结构和( )。

A.顺序结构

B.链表结构

C.分支结构

D.重复结构

【分析】结构化的3种基本控制结构为顺序结构、选择结构(分支结构)和循环结构(重复结构)。

【答案】A

试题4

面向对象的设计方法与传统的面向过程的设计方法有本质的不同,它的基本原理是( )。

A.模拟现实世界中不同事物之间的联系

B.强调模拟现实世界中的算法而不强调概念

C.使用现实世界的概念抽象地思考问题,从而自然地解决问题

D.以上说法都不对

【分析】面向对象设计方法与面向过程设计方法有本质不同,其基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题,其特点包括继承性、封装性、多态性等。模块化是结构化程序设计的特点。

【答案】C

2.3 过关全真模拟题

1.下列叙述中正确的是( )。

A.在面向对象的程序设计中,各个对象之间具有密切的关系

B.在面向对象的程序设计中,各个对象都是公用的

C.在面向对象的程序设计中,各个对象之间相对独立,相互依赖性小

D.上述3种说法都不对

2.源程序的文档化不包括( )。

A.符号名的命名要有实际意义

B.正确的文档形式

C.良好的视觉组织

D.正确的程序注释

3.在面向对象的方法中,( )描述的是具有相似属性与操作的一组对象。

A.属性

B.事件

C.方法

D.类

4.下列叙述中正确的是( )。

A.程序设计时不需要讲究风格

B.程序中的注释是可有可无的

C.程序只要求机器读懂就可以了,不需要去关心维护的问题

D.以上说法都不对

5.在面向对象的方法中,一个对象请示另一个对象为其服务的方式是通过发送( )。

A.调用语句

B.命令

C.口令

D.消息

2.4 过关全真模拟题解析

【试题1分析】本题考查对面向对象的理解,面向对象的程序设计是对象模拟问题领域中的实体,各对象之间相互独立,相互依赖性小,通过消息来实现对象之间的相互联系。

【答案】C

【试题2分析】源程序的文档化主要包括3点:符号名应具有一定含义,便于理解程序功能;正确的程序注释;良好的视觉组织:利用空格、空行、缩进等技巧使程序层次清晰。

【答案】B

【试题3分析】类描述的是具有相似属性与操作的一组对象,类是具体对象的实例。

【答案】D

【试题4分析】程序设计的风格总体而言应该简单和清晰,程序必须是可以理解的。程序的正确注释有助于读者理解程序,不是可有可无的。对程序的要求不仅是可以在机器上执行,给出正确的结果,而且要便于程序的调试和维护,这就要求编写的程序不仅自己看得懂,而且也要让别人能看懂。

【答案】D

【试题5分析】在面向对象的方法中,对象之间能通过消息进行通信,消息中包含传递者的要求,它告诉接收者需要做哪些处理,但并不指示接收者应该怎么完成这些处理,接收者独立决定采用什么方式完成所需的处理。

【答案】D