
1.1 计算机与程序设计语言
在当今的信息化时代,了解计算机的基础知识,掌握程序设计的基本方法是每个科学工作者必须具备的基本能力。
计算机系统由计算机硬件和软件组成,硬件是计算机的“躯体”,软件是计算机的“灵魂”,两者相辅相成,缺一不可。
1.1.1 计算机系统的基本组成
计算机系统包括计算机硬件和软件。
计算机硬件主要是指构成计算机系统的物理元器件、部件和设备,其中包括运算器、控制器、存储器和输入/输出设备等。它的基本组成结构如图1-1所示。

图1-1 计算机硬件的基本组成结构
运算器和控制器是计算机的核心部分,人们将它们称为中央处理器(CPU)。其中,运算器是完成算术运算和逻辑运算的部件,它通常由能够实现加减法、乘法、布尔代数和移位等多种运算的算术逻辑电路和存储操作数的寄存器组成。控制器负责按照程序规定的顺序,自动地接受和执行每一条计算机指令。
计算机存储器包括主存储器和辅助存储器。主存储器又被称为内存,其内部的数据可以直接参与运算处理;辅助存储器又称为外存,主要包括硬盘、磁盘和光盘,其中的数据要被调入内存后才能够参与运算处理。
输入设备负责把数据输入到计算机中,输出设备负责把计算机处理的结果传递出去。例如,键盘、鼠标、扫描仪和麦克风是几种常用的输入设备;显示器、打印机是两种常用的输出设备。随着科学技术的迅猛发展,输入/输出设备的种类,也在不断增加。
计算机硬件是计算机的物理体现,它的发展决定着计算机系统的更新换代。在计算机发展过程中,计算机经历了从第一代到第四代的变革。第一代计算机以前的计算工具大都是机械式或机电式的。尽管当时已经有人提出制造自动计算工具的设想,但由于其计算速度慢、精确度差、成本昂贵,未能实现现代意义上的大众化计算机。20世纪30年代后期,一些学者开始尝试使用真空电子器件制造计算机,这样不仅提高了运行速度,而且还实现了自动计算,第一代计算机就此诞生了。此后,计算机技术以惊人的速度迅猛发展。40年代末期,晶体管电路的出现造就了第二代计算机。与第一代计算机相比,它具有工作速度快、可靠性高、耗电量少、体积小、成本低廉和适宜大批量生产等突出优点。1958年,半导体集成电路使计算机硬件的发展水平又向前迈进了一大步,成为了第三代计算机的核心。而随后的大规模和超大规模集成电路成为第四代计算机的重要标志,使计算机技术发生了根本性的变革。
与其他电器设备不同,缺少软件这个“灵魂”的计算机硬件“躯体”没有任何活力。简单地说,计算机软件包括程序和文档。程序是计算任务的处理对象和处理规则的描述;文档是软件设计的说明性资料,用于理解程序功能和程序维护。
计算机所能够完成的计算任务不仅有科学计算,而且涵盖信息处理、工业控制、网络通信、声音图像处理等各个应用领域。这些功能都是通过软件开发来实现的,而设计、编制和调试程序是软件开发的基本任务。
通常,按照应用层次可以将软件划分成系统软件、支撑软件和应用软件3个层次,如图1-2所示。

图1-2 计算机系统结构
系统软件是最靠近计算机硬件系统的软件层。它位于支撑软件与计算机硬件之间,是其他软件操纵计算机硬件的接口。它主要包含一些与具体应用领域无关的底层操作,并担负着诸如系统管理、语言翻译等重任。常见的系统软件有操作系统、编译系统等。
支撑软件是用于支持软件开发和应用软件运行的软件。例如,数据库管理系统、网络服务器软件等都属于支撑软件。随着计算机应用领域的扩展,软件系统的规模越来越大,功能越来越复杂。为了降低软件开发的复杂性,人们针对常用的功能,开发出各种支撑软件,使得软件开发不必从零开始,开发者可以根据应用的需求,直接使用支撑软件提供的功能,通过软件模块的组合、软件功能的扩展来实现新的软件。
应用软件是指为特定应用领域编写的专用软件。例如,文档编辑系统、游戏软件、图书管理系统和图像加工软件等都是应用软件。计算机应用是计算机科学发展的最终目的,计算机应用的发展水平依赖于计算机各个环节的技术支持。在计算机硬件的强劲发展势头下,开发高质量、可维护的软件应用产品是提高整个社会应用计算机水平的重要环节。
计算机软件开发需要使用计算机语言、软件方法学和软件工程。计算机语言主要包括用于编写软件需求定义的需求级语言,用于编写软件功能规约的功能级语言,用于编写软件设计规约的设计级语言,用于编写实现算法的程序设计语言,以及用于编写文档的文档级语言。软件方法学是研究软件开发全过程的指导原则与方法体系的学科。从软件开发风格的角度观察,主要有自顶向下和自底向上两种常规方法。在实际应用中,人们更加喜欢将两种方式结合起来使用。软件工程是指应用计算机科学、数学及管理科学等原理,以工程化方法开发软件的学科。探索一种行之有效的软件开发方法、提高软件的开发质量、改善软件的可维护性和降低软件生产的成本都是软件工程研究的最终目的。
1.1.2 程序设计
程序是对计算任务的处理对象和处理过程的描述。任何以计算机为处理工具的任务都是计算任务。处理对象是诸如数字、文本、图形、图像和声音等数据;处理过程包括具体的操作和步骤。用低级语言编写的程序是一组指令和有关数据的集合;而用高级语言编写的程序则是一组说明和语句的集合。
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,软件的质量需要通过程序的质量来体现,因此,研究一种正确的、切实可行的程序设计方法就显得尤为重要。回顾程序设计的发展历程,大致经历了以下几个阶段。
(1)面向计算机的程序设计。计算机诞生初期,人们与计算机打交道的唯一途径是机器语言。机器语言是一种可以被计算机直接识别的程序设计语言,其中的每一条指令和操作数都是采用二进制形式表示的,因此,它具有复杂、易错、难读和难纠错等缺点,尽管后来人们采用助记符将很多指令形象化,但仍无法摆脱指令格式与机器相关的弊病。
(2)面向过程的程序设计。随着计算机技术的迅速发展,软件开发水平的滞后严重影响了计算机应用领域的推广,人们迫切需要一种更加自然、规范和易学的程序设计方法,以提高软件开发的效率,改善软件产品的质量。在这种背景下,人们提出了面向过程的程序设计思路。面向过程是指从功能的角度分析问题,将待解决的问题空间分解成若干个功能模块,每个功能模块描述一个操作的具体过程。在20世纪70年代,广泛使用的结构化程序设计方法就是面向过程的一个典型代表。它的核心思想是自顶向下、逐步求精,模块化和语句的结构化。这样既有益于在每一个抽象级别上尽可能地保证设计过程的正确性及最终程序的正确性,又可以改善程序的可读性、可理解性和可维护性。
(3)面向对象的程序设计。面向对象的程序设计是指以对象为中心,分析、设计及构造应用程序的机制。与面向过程的程序设计不同,在使用面向对象的方法求解问题时,观察问题空间的视角将定位于现实世界中存在的客体,并在解空间中用对象描述客体,用对象之间的关系描述客体之间的联系,用对象之间的通信描述客体之间的相互交流及相互驱动,从而实现问题空间到解空间的直接映射,完成计算机系统对现实世界环境的真正模拟。
计算机硬件的发展,激发了普通人使用计算机的欲望;人们对计算机的需求又催促着软件行业的迅速发展;而软件开发方法的每一次变革都需要有与之相适应的程序设计语言的支撑。
1.1.3 程序设计语言
众所周知,汉语、英语等自然语言都是人类进行沟通、交流的工具,而计算机语言则是计算机及其使用者进行交流的工具。计算机系统仅仅能够按照给定的程序工作,因此我们说计算机仅仅懂得计算机语言。
程序设计语言是用于编写计算机程序的语言。通常可将其分为两个类别:低级语言和高级语言。
低级语言是一种与特定计算机体系结构密切相关的程序设计语言,主要包括机器语言和汇编语言。机器语言由机器可以执行的全部指令及其所操作的数据组成,其实施的操作主要包括算术运算、逻辑运算、赋值、判断、转移和中断等。由于机器语言中的指令和数据均采用二进制代码形式表示,故而,对于用户而言,用机器语言编写的程序难以理解、烦琐且容易出错,而且这种程序与机器相关,开发出来的软件产品不易移植。为了改善上述不足,将其中的部分内容符号化就形成了汇编语言。汇编语言由汇编指令组成,汇编指令就是将机器指令的地址部分用符号来表示,操作码采用易于记忆的操作符表示,地址码采用标号、变量名和常量等较为直观的表示形式。汇编指令与机器指令基本上保持一一对应的关系。汇编语言程序运行前需要先翻译成等价的机器语言程序。采用汇编语言编写程序的优点是:占用内存少,运行效率高,且能够直接控制各种设备资源,适合编写实时性要求较高的程序部分。其缺点是:语言描述能力弱,且仍与具体的机器系统相关。
高级语言是一类采用接近数学语言,并力求与具体机器无关的程序设计语言。相对于低级语言,高级语言具有描述能力强,便于阅读理解,易于修改维护等特点。各种常用的高级程序设计语言都支持通用的程序设计方法。例如,C 语言支持结构化程序设计,C++语言和Java语言支持面向对象程序设计。
C语言是应用最广的一种高级程序设计语言,由美国贝尔实验室的D. Ritchie设计,最早用于书写UNIX操作系统。C语言本身比较简单,具有简明的数据定义和流程控制机制。它提供的函数机制用于描述程序模块,使得开发者可以通过模块的组合来构造结构化的复杂程序,并且允许软件系统不同程序模块的分别开发。同时,C语言支持底层程序设计。利用C语言提供的指针等功能,可以面向计算机硬件,直接描述内存单元的地址运算和二进制运算,从而编制出高性能的计算程序和控制程序。
以上优点使得C语言得到了十分广泛的应用。很多既存的软件都是采用C语言开发的,相当多的计算机硬件也都选择C语言作为访问接口,这使得C语言成为软件设计者必备的工具,也使其成为大学理工科多数专业的专业课程。同时,信息学科相关专业的众多课程也都将C语言程序设计作为先修课程,都需要这种程序设计基础作为后续内容学习的必备知识。因此,此类程序设计基础课程的学习在很大程度上制约了相关专业毕业生培养目标的达成。
1.1.4 程序设计的学习方法
程序设计的学习离不开程序设计语言的学习,也离不开程序设计方法的学习。程序设计语言的学习和外语的学习有一定的相似性。外语的学习包括单词、句法和语义的学习,也包括使用方法的学习。仅仅背单词无法学好外语,更多地需要听说读写的练习以及实际运用。
相比之下,高级语言的单词和句法都非常少,不需要很长时间的学习即可掌握。然而,仍然有不少人对于程序设计深感恐惧,其原因在于程序设计不仅涉及高级语言,而且涉及计算任务的解决方案设计,以及正确的程序设计方法。综上所述,程序是计算任务的处理对象和处理规则的描述,不同的计算任务具有不同的处理对象和不同的处理规则。鉴于计算机需要承担各种不同的复杂的计算任务,这些处理对象和处理规则的设计也必定会各不相同。然而,这些内容已经超出了本书的范围,是计算机科学及其各个应用领域要解决的问题,而本书的学习目的是为信息科学的学习提供必要的程序设计基础,具体目标在于以下几点。
(1)对于计算任务的处理对象,掌握C语言提供的各种数据类型、变量、数组和数据结构等的数据组织方法。
(2)对于计算任务的处理规则,掌握C语言提供的控制语句、函数等程序组织方法。
(3)掌握枚举、递推、递归、状态机等简单的算法和模式,以及结构化程序设计方法。
(4)围绕各种经典的程序设计案例,运用上述算法或模式,掌握正确的数据组织方法和程序组织方法。
程序设计方法的正确性对于程序设计具有至关重要的作用。这里包括合理的数据组织、合理的控制结构以及合理的程序结构。为了保证计算机软件的可用性和可维护性,正确的程序设计不仅必须保证程序执行得到正确的计算结果,而且要求程序执行具有较高的执行效率,占用有限的存储资源,具备良好的响应性能,来满足多方面应用需求。不仅如此,程序设计也必须保证代码易于理解、修改和扩展,以满足软件系统的维护需求。
这些需求都要求高级语言的学习者掌握正确的程序设计方法,养成良好的程序设计习惯,形成良好的工程素质。然而,鉴于高级语言具有出色的描述能力,计算任务的复杂性和解决方案的多样性,以及程序设计技巧的灵活多变性,使得许多现有程序无法同时满足上述所有目标。为此,一方面,本书将力图通过规范的程序设计案例来展现正确的程序设计方法,促使程序设计的初学者建立一个良好的开端;另一方面,正如外语的学习需要多听、多说一样,程序设计语言的学习必须通过大量编程实践才能掌握,书本知识是有限的,许多知识和技巧需要在程序设计上机实践中通过反复阅读和修改代码、反复测试和检查才能逐步积累起来。