1.2 程序设计的基本知识
程序设计就是利用某种计算机语言,按照一定的算法,对特定的数据进行处理。程序设计的最终结果是用某种语言描述的计算机程序。本节主要介绍程序设计的基本概念、程序设计的步骤、程序设计语言、程序设计的方法及程序设计评判标准。
1.2.1 程序设计的基本概念
程序设计就是利用某种计算机语言,按照一定的算法,对特定的数据进行处理。程序设计的最终结果是用某种语言描述的计算机程序。程序设计就是设计程序,而程序=算法+数据结构,算法必须与计算机处理问题的步骤相一致。所以,程序设计的主要因素就是考虑算法和设计数据结构。
1. 算法
算法是为解决某个特定问题而采取的确定且有限的步骤。所以,算法的要素主要是操作和控制结构。即一个算法由一些操作组成,这些操作又是按一定的控制结构所规定的次序执行的,计算机可以执行的基本操作是以指令的形式向人们提供的,指令是计算机所完成的最基本的功能。
计算机的基本操作有:算术运算、关系运算、逻辑运算、数据传送即赋值运算。算法的功能不仅取决于所选用的操作,而且还决定于控制结构。算法的控制结构有顺序、选择和循环三种。算法的控制结构可以用图示的方法形象地表示出来。这一点将在下一节讲解。
一个算法有以下3个特性:
(1)有穷性。一个算法通过若干步骤即可实现预定目标,算法的每一步都可以在合理的时间内完成。
(2)确定性。算法中的每一条指令都必须有确切的含义,同样的步骤、同样的条件结果也是相同的。
(3)输入和输出。计算机的工作步骤可以分为三步,如图1-4所示。
图1-4 计算机的工作步骤
首先,把要处理的数据输入到计算机中;然后,根据处理要求对输入的数据进行处理,得到处理结果;最后,把结果显示或打印出来。
计算机工作的步骤具有不可逆的方向性。再简单再复杂的计算机概莫能外。也就是说,一个算法再简单,也要有输入、处理和输出三个步骤。
2. 数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构的基本类型有四种,定义中的“关系”描述的是数据元素之间的逻辑关系,称为逻辑结构;数据结构在计算机中的表示(映象)称为数据的物理结构,有顺序结构(如数组)和随机结构(如链表)两种;数据结构要解决的三个问题是:数据的表示、数据元素间的关系,以及在这种关系上的运算。
对计算机语言来说,数据结构体现为数据类型。数据类型是一个值的集合和定义在这个值集上的一组操作的总称。它是信息特性的抽象。
从硬件上看,引入数据类型的目的是为了解释计算机内存中信息含义的一种手段;从用户的角度看,引入数据类型实现了信息的隐蔽,即将一切用户不必了解的细节都封装在类型中。
3. 算法与数据结构的关系
算法与数据结构是人们用计算机解题时所作的两种抽象。算法是从计算机操作的角度对解题过程的抽象;数据结构是从如何组织被处理对象的角度进行抽象。这两种抽象相互依赖,互为补充,有效地降低了问题的复杂性。
1.2.2 程序设计的步骤
程序实际上是问题的实际处理过程在计算机中的体现。那么要让程序来解决实际问题,需要经过分析问题和解决问题两大步。
1. 分析问题
首先必须分析实际的处理过程,确定已知的数据、结果数据,以及如何由已知获得结果。在这里重点考虑的是数据在计算机中的描述形式和处理过程。数据在计算机中的描述形式就是在计算机中数据采用什么样的数据类型存储。选择数据类型的依据是数据表示的范围和参与的运算。数据的处理就是数据的如何输入,如何处理,如何输出。数据处理是程序中的主要算法,即由已知数据求结果数据的过程。
分析的结果,可以用图示的方法来表示。即用各种易于人们理解和接受的方式来表示数据的处理过程。
2. 解决问题
解决问题就是把分析的结果用计算机语言描述出来,并在计算机上调试运行。对于C语言来说就是用C语言的符号和规则来描述,即编写C语言程序,在C语言的编辑和编译环境下调试和运行程序的过程。这里重点是掌握C语言的符号和规则,熟悉编辑和编译的环境。要熟悉和掌握C语言的符号和规则,重要的方法是通过大量的程序编写和上机调试。
解决问题的结果,就是要产生一个能够正确解决实际问题的可以运行的计算机程序。这个程序可以是源程序,也可以是编译后的可执行程序。
1.2.3 程序设计语言
程序设计语言,也称为编程语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。程序设计语言分为机器语言、汇编语言和高级语言。
1. 机器语言
机器语言是指用二进制代码直接表达指令的语言。机器语言程序可以被计算机识别并执行,但由于每条指令都是由0和1组成的数串,不好记忆,容易出错,不同机型的指令代码不同,现在一般的计算机用户很少使用它设计程序。
2. 汇编语言
汇编语言是用一些指令助记符(指令功能的英文词缩写)来表示机器语言每条指令的一种语言。如加法指令ADD,减法指令SUB,传送数据指令MOV等。汇编语言的指令要比机器语言易于记忆理解,不易出错。但这种语言没有从根本上减少指令,且繁琐,不易移植,功能弱,一般用户很少用这种语言编写程序。用汇编语言编写的程序不能被计算机直接执行,必须经过汇编程序汇编转换成机器语言程序后才能执行。
3. 高级语言
高级语言是比较接近人类自然语言和数学描述的语言。高级语言一条命令的功能可以代替几条、几十条汇编语言的指令功能。因此,高级语言更简便、易学、易记,通用性强,兼容性好,便于移植,高级语言是目前广泛使用的程序设计语言。高级语言虽然好学易用,但用高级语言编写的源程序,实际上是不能直接在计算机内运行的,还必须经过翻译转换成计算机所能识别的机器语言程序,即目标程序,才可运行。高级语言通常采用编译程序和解释程序两种翻译方式,如图1-5所示。
图1-5 源程序的两种翻译方式
解释程序是边翻译边运行,即从源程序中取一条指令转换一次执行一次,直到结束。编译程序是翻译完后再运行,即将源程序的每条指令全部转换成机器语言表达的程序(目标程序)再运行。每一种高级语言,都有一套与之相对应的翻译程序。C语言属于高级语言,其程序采用编译方式转换成计算机可以识别的目标程序。
1.2.4 程序设计的方法
程序设计的方法包括结构化程序设计方法和面向对象程序设计方法。
1. 结构化的程序设计方法
结构化程序设计方法可归结为“程序=算法+数据结构”,其核心是算法设计,是一种面向过程的设计方法,数据与数据处理分离。基本思想是采用自顶向下、逐步细化的设计方法和单入单出的控制结构。自顶向下、逐步细化指是将一个复杂任务按照功能进行分解,形成由若干模块组成的树状层次结构,逐层细化到便于理解和描述的程度,各模块尽可能独立;而单入单出的控制结构,指的是每个模块内部均用顺序、选择、循环三种基本结构来描述。结构化的程序设计方法将软件程序分解成若干个可单独命名和编址的功能模块,如图1-6所示。
图1-6 结构化的程序设计方法
结构化程序设计方法为处理复杂问题提供了有利手段,一度成为程序设计的主流方法。C语言即为目前应用比较广泛的结构化程序设计语言。
然而,随着计算机应用的不断发展,这种设计方法开始逐渐暴露出缺陷。如在大型多文件软件系统中,随着数据量的增大,程序变得越来越难以理解。另外,采用结构化方法所设计的程序,可重用性比较差。于是,又出现了面向对象的程序设计方法。
2. 面向对象的程序设计方法
结构化的程序设计方法缺点的根源在于数据与数据处理分离。而面向对象的程序设计方法正是克服了这个缺点,同时吸纳结构化设计思想的合理部分而发展起来的,这两种方法并非对立关系。
面向对象的设计思想模拟自然界认识和处理事物的方法,将数据和对数据的操作方法放在一起,形成一个相对独立的整体——对象,对同类型对象抽象出共性,形成类。任何类中的数据都只是用本类自有的方法进行处理,并通过简单的接口与外部联系。对象通过消息进行通信。面向对象的程序设计方法同样遵循分层抽象、逐步细化的原则。该方法的核心是从问题中抽象出合适的对象,即首先解决“做什么”的问题。至于“怎么做”,则以操作的设计封装在对象内部。对于操作方法的设计,核心仍然是算法设计,完全吸收了结构化程序设计的思想。面向对象的方法把软件系统分解成为相互协作而又彼此独立的对象的集合,如图1-7所示。
图1-7 面向对象的程序设计方法
面向对象方法应该尽量选用支持面向对象技术的语言来实现。目前比较流行的面向对象的编程语言有:C++、Java等。
1.2.5 程序设计评判标准
学习一门计算机语言的最终目的,是用该门语言又快又好地编出程序。那么,一个好程序的标准是什么呢?好程序的标准有四条。
1. 正确性
正确性是指给出正确的数据,得到正确的结果。勿庸置疑,程序运行结果不正确,前功尽弃,再好的程序也是空谈。保证结果的正确性有许多环节构成,主要有:所选题目存在正确结果;题目是可解的;解题算法是正确的;解题程序设计、调试是正确的、合理的。
2. 易读性
易读性是指编写的程序不但自己很容易看懂(即使隔了很长时间),而且别人也很容易看懂。编写的程序在很大程度上是给别人用的,别人拿到你的程序如何能够很快看懂是至关重要的。除在程序中使用注释语句外,交付使用的程序应配备完整的规范的说明书。
3. 健壮性
健壮性是指容易维护,其具体内容包括:功能性扩充易于实现;不因为输入数据或使用人员的变换导致输出结果错误;程序的自纠错能力强;安全性高;发生数据输入错,程序运行错,系统有到位的提示功能。
4. 可移植性
可移植性是指编写的程序在不同机型的同一语言环境下仍然能够正确运行。
好的程序必须遵循结构化程序设计方法,结构化是一个非常重要的的概念,以后读者还可能会碰到“结构化系统分析”、“结构化系统设计”、“结构化对象”、“结构化系统实现”等与“结构化”相关的术语。这里的“结构化”的含义基本上可以理解为“标准”两字,标准即规范,即按照一定的规范进行程序设计的方法,称之为结构化程序设计方法。