1.1 程序设计

1.1.1 程序设计与算法

计算机通过程序来完成数据处理任务。程序是为了实现一个特定的任务而设计的,不同的任务需要不同的程序来完成。

1.程序

简单地讲,程序就是计算机处理数据、获取信息的工作规程,主要定义了数据的逻辑结构和程序运行的步骤。数据是计算机获取信息的基础,程序规定了计算机处理的各环节所需要的一个有序的工作流程。程序是静态的,程序只有被计算机“认识”和“理解”,数据才能被计算机处理,才能完成数据到信息的加工以及相应的任务。不同的程序可以完成不同的工作,所以处理不同的问题就需要不同的程序。著名科学家Nicklaus Wirth提出了公式“算法+数据结构=程序”,并因此而获得了全球计算机界的最高奖——图灵奖,可见这个公式对计算机科学产生的影响有多大,它用一个公式展示出了程序的本质。

算法是计算机执行计算过程的具体描述,也就是描述计算机如何将输入一步步转化为所要求的输出的过程。

数据结构是计算机处理过程中数据的组织方式。常见的数据组织方式有:数组、链表、队列、堆栈、数据库、文件等。

下面通过一个例子,了解什么是算法,算法要注意什么问题。请大家思考一个问题:如何求1×2×3×…×8×9的值。

(1)最原始的方法:

步骤1:先求1×2,得到结果2。

步骤2:将步骤1得到的乘积2乘以3,得到结果6。

步骤3:将6再乘以4,得24。

步骤4:将24再乘以5,得120。

步骤5:将120再乘以6,得720。

步骤6:将720再乘以7,得5040。

步骤7:将5040再乘以8,得40320。

步骤8:将40320再乘以9,得362880。

这就是一个算法,虽然正确,但太麻烦。

(2)改进的算法:

S1:1→t;

S2:2→i;

S3:t×i→t;

S4:i+1→i;

S5:ifi≤9,then返回S3;else算法结束。

这个算法简单、快捷、效率高,它也适用于同类相似的问题,如计算100!只需将“S5:若i≤9”改成“i≤100”即可。

同一问题可用不同的算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法的评价标准主要包括时间复杂度、空间复杂度、正确性、可读性和健壮性,关键是时间和空间复杂度。

2.程序设计

程序设计是指设计、编写和调试程序的方法与过程。程序设计一般应该包括:分析问题、设计算法、编写程序、运行程序分析结果、整理文档等5个环节。

(1)分析问题:对要解决的问题进行认真分析,研究所给定的条件,分析最后应达到的目标,找出解决问题的规律,选择解题的方法。

(2)设计算法:设计出解决问题的方法和具体步骤。

(3)编写程序:将算法书写成计算机可以“认识”的代码的过程。计算机只认识“0”和“1”,即机器语言。但是,通过编译程序或解释程序计算机就可以“认识”多种高级语言,比如:C语言、C++、Java等。

(4)运行程序分析结果:运行程序,可以得到运行结果。能得到运行结果并不意味着程序正确,要对结果进行分析,看它是否合理,同时要分析算法是否合理,不合理要对程序进行调试,即通过上机发现、修改程序中的错误及故障。

(5)整理文档:程序具有可共享性和兼容性,所以要对程序进行必要的整理。内容应包括:程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据,以及使用注意事项等。

1.1.2 程序设计语言

程序设计语言形象地说就是计算机“能听懂的话”,它是用来描述程序设计的过程,是人与计算机之间相互通信的工具;它是由一组符号和一组规则构成的。程序设计语言从发展历程来看可以分为以下四代:

1.第一代——机器语言

机器语言是由二进制0、1代码指令构成,不同的CPU具有不同的指令系统,所有的地址分配都是以绝对地址的形式处理。因此它具有代码不易记忆、程序编写麻烦,维护复杂、用户需要对存储空间进行分配、编程效率极低等缺点。

2.第二代——汇编语言

汇编是机器指令的符号化,与机器指令存在着直接的对应关系,同时增加了一些功能,例如宏、符号地址等。汇编语言同样存在着难学难用、容易出错、维护困难等缺点。但汇编语言具有可直接访问系统接口、汇编程序翻译成的机器语言程序效率高等优点,所以在高级语言不能满足设计要求或不具备支持某种特定功能的技术性能(如特殊的输入/输出)时,汇编语言也会被使用。

3.第三代——高级语言

高级语言是面向用户的、独立于具体计算机结构的语言,在形式上接近于算术语言和自然语言;高级语言不能直接被执行,在运行前需编译成相应的机器语言。高级语言的一个命令可以代替几条、几十条甚至几百条汇编语言的指令。因此,高级语言明显优于汇编语言,易学易用,通用性强,应用广泛。

C语言属于第三代语言,其功能丰富,表达能力强,有丰富的运算符和数据类型,使用灵活方便,应用面广,移植能力强,编译质量高,目标程序效率高。同时,C语言还具有低级语言的许多特点,如允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作等。用C语言编译程序产生的目标程序,其质量可以与汇编语言产生的目标程序相媲美,具有“可移植的汇编语言”的美称,成为编写应用软件、操作系统和编译程序的重要语言之一。

4.第四代(4GL)——非过程化语言

4GL是非过程化语言,更像英语,与自然语言非常接近;是面向应用、为最终用户设计的一类程序设计语言,兼具过程性和非过程性的两重特性。它具有缩短应用开发过程、降低维护代价、最大限度地减少调试过程中出现的问题以及对用户友好等优点。4GL有数据库查询语言、程序生成器等。

选择适宜的程序设计语言可使编写代码困难减少,可读性、可测试性、可维护性较好。为了使程序容易测试和维护,所选用的程序设计语言应该具有模块化机制、可读性较好的控制结构和数据结构;为了便于调试和提高软件可靠性,所选用的程序设计语言应该能够尽可能多地发现程序中的错误;为了降低软件开发和维护成本,所选用的程序设计语言应该具有良好的独立编译机制。

实际工程中选择程序设计语言时,还应考虑系统用户的要求、编译程序、软件工具、工程规模、可移植性、应用领域以及程序员的知识。