收藏 分享(赏)

程序设计概述.doc

上传人:scg750829 文档编号:8245512 上传时间:2019-06-16 格式:DOC 页数:15 大小:526KB
下载 相关 举报
程序设计概述.doc_第1页
第1页 / 共15页
程序设计概述.doc_第2页
第2页 / 共15页
程序设计概述.doc_第3页
第3页 / 共15页
程序设计概述.doc_第4页
第4页 / 共15页
程序设计概述.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、CHAPTER1第 1 章程序设计概述1.1 计算机与程序1.1.1 功能强大的计算机计算机是 20 世纪人类最伟大的发明之一,它的发展历史可以追溯到中国古代的算盘。算盘是一种辅助计算工具,人们在进行算术运算的时候,无需复杂的心算,只要使用一些固定的口诀来拨弄几下算珠,就可以把答案算出来。1642 年,法国物理学家帕斯卡利用机械齿轮原理,发明了第一部能计算加减法的计算机。1671 年,德国数学家莱布尼兹发明了一种能作四则运算的手摇式计算机,这些工作都是早期的机械式计算机的代表。20世纪初,随着电子管的出现,计算机有了新的发展。1946 年,由于第二次大战的军事需要,美国宾夕法尼亚大学和有关单位

2、研制成功了第一台真正意义上的电子计算机电子数字积分仪与计算机(Electronic Numerical Integrator and Computer,ENIAC) 。几十年过去了,计算机取得了迅猛的发展,其使用的元件也经历了四代的变化:第一代的电子管、第二代的晶体管、第三代的集成电路和第四代的大规模集成电路。如今,电子计算机的功能已不仅仅是计算,它已渗入了人类的活动领域,成为人们工作和生活中必不可少的工具。在我们的周围,有着各种各样的计算机,如笔记本计算机、台式机、个人数字助理(PDA) 、小型机和大型机等。现代计算机的功能非常强大,能够为人类做许许多多的事情。比如说,在中国古代,一些书香门

3、第或官宦家庭,为了培养一个人的人文素养,通常都要求他掌握 4 项基本的技能,即琴、棋、书、画。对于这 4 项技能,如果能做到样样精通,那么就是一个高雅的人,是一名文人雅士。当然,对于现代人来说,在“分数压倒一切”的背景下,不要说精通这 4 项技能,计算机语言与程序设计2只要会其中的一项就很不容易了。但是计算机就能够做到样样精通。首先是弹琴,这对于计算机来说是小菜一碟,计算机合成的音乐很早以前就有了。其次是下棋,这更是计算机的强项,计算机不仅能够下棋,而且下得非常好。1997 年的 5 月,由 IBM 公司开发出来的“深蓝”计算机,就战胜了当时的国际象棋世界冠军卡斯帕罗夫。卡斯帕罗夫是俄国人,曾

4、被认为是有史以来最厉害的棋手之一,但他却被计算机给打败了。当然,古人所说的棋指的是围棋,而围棋比象棋要复杂得多,所以在这个方面,计算机还很难有大的突破。第三种技能是书法,这对于计算机来说,是再简单不过的了,什么样的字体它都能打印出来,如宋体、楷体、隶书等。第四种技能是画画,这也不是什么难事,在计算机的控制下,能够在布匹上刺绣,甚至还能编织任意图案的毛线衣!除了琴棋书画,计算机还能做到听说读写。所谓的“听” ,指的是语音识别技术,也就是说,人对着计算机说话,然后计算机就会把这些语音信号转换成相应的文字。比如说,读者需要把一篇稿子录入到计算机当中,但是又不想通过键盘输入,因为通过键盘输入得太慢、太

5、辛苦了,这时就可以使用语音识别软件。你只要对着话筒把这篇稿子念一遍,它就被录入计算机了,非常的方便。当然,这只是一种理想状态,而实际的语音识别软件目前还做不到这么完美,它们的识别正确率还达不到百分之百。但即便如此,这项技术在文字录入、身份认证等领域还是得到了广泛的应用。所谓的“说” ,指的是文语转换技术(Text-To-Speech ,TTS ) 。它和语音识别正好相反,一个是把声音变成文字,另一个是把文字变成声音。比如说,我们上网去看今天的新闻,但是又不想用眼睛去看,因为看得比较累,这时就可以使用 TTS 技术,让计算机把新闻念给你听。再比如,我们都知道英国著名的理论物理学家霍金,他是一个全

6、身瘫痪的人,除了大脑以外,身体的其他部分都是处于肌肉萎缩状态,连说话都不行。那么他是如何与别人交流的呢?就是通过 TTS 技术。当他想要说话的时候,就用手指尖去操作一台计算机,输入他想要说的话,然后,计算机就采用 TTS 技术,把这句话转换成语音播放出来。TTS 系统的关键指标是自然度,一般来说,计算机合成出来的声音不是很好听,语调比较生硬。就像电影星球大战中的机器人 C-3PO,说起话来有点怪声怪气的。当然,现有的TTS 技术已经取得了长足的进展,已经能够合成出比较好听、比较自然的声音。所谓的“读” ,指的是自然语言理解,也就是说,对于一段自然语言文字(如中文、英文等) ,计算机能够看懂它的

7、意思是什么。自然语言理解有很多的应用,如机器翻译,能够把一种语言的文字翻译成另一种语言;再比如因特网上的基于内容的智能搜索。我们可以向计算机提出各种问题,如“北京有什么好玩的地方?” ,计算机能够看懂这句话的意思,然后经过搜索,就会把北京的一些旅游景点列出来,如故宫、颐和园、圆明园及长城等。所谓的“写” ,就是说,计算机能够自动写作文。这其实也不是什么太难的事情,一般的做法是去搜集很多写得比较好的句子,然后把它们拼接在一起即可。曾经有人对某个国际学术会议的组织者表示不满,认为他们盲目扩大会议规模,而忽视了论文质量的审查。于是他就开了一个玩笑,把一篇计算机自动生成的“论文”提交给该会议,后来这篇

8、论文居然被录用了 1。1 以上所说的这些技术,实际上都是计算机科学领域当中的一些研究课题。读者如果感兴趣,将来可以从事相关方面的 第 1 章 程序设计概述3那么,计算机为什么能够做这么多的事情呢?是不是它的内部结构非常复杂,比人的大脑还要复杂?答案是否定的。实际上,计算机的工作原理非常简单。从本质上来说,计算机是一种用来处理数据的通用机器。它所能够做的事情只有一件计算。因此,从某种意义上来说,可以把计算机看成是一个超级计算器。图 1.1 是计算机硬件的体系结构图。一般来说,一台计算机主要由三个部件组成,中央处理器(Central Processing Unit,CPU) 、内存(memory)

9、和各种输入输出(Input/ Output,I/O)设备,如显示器、键盘、磁盘和鼠标等。其中,CPU 是计算机的“心脏” ,所有的计算都是在 CPU 上进行的;内存是计算机的“大脑” ,当计算机在运行时,所有的信息都存储在内存当中,包括指令和数据;而 I/O 设备是计算机的“手脚”和“五官”,对于用户来说,正是通过这些 I/O 设备来与计算机打交道。那么计算机是如何来工作的呢?很简单,就是从内存当中,取出一条指令,放在 CPU 上去运行。这条指令可能是一条算术运算指令,对两个数据进行加、减、乘、除;也可能是一条内存访问指令,去内存存储或读写数据;也可能是一条数据比较指令或控制指令。当这条指令执

10、行完以后,系统又从内存当中取出下一条指令,放在 CPU 上去运行。就这样一条指令接一条指令地运行,直到程序运行结束。这就是计算机工作的整个过程。那么指令和数据是怎么样从内存跑到 CPU 上去的呢?它们是坐“公共汽车” (bus)去的。当然,这只是一个玩笑。实际上这里的英文单词 Bus,在中文里一般翻译为总线,指令和数据就是通过总线进入到 CPU 的。图 1.1 计算机体系结构图通过刚才的介绍可以知道,计算机的工作原理其实是非常简单的,它就是在那里不断地执行指令,不断地计算。那么,为什么这么简单的工作原理,却能够完成那么多不可思议的任务呢?原因主要有两个,首先,计算机的运算速度非常快。比如说,如

11、果让我们去心算一下 537 等于多少,那么我们可能需要 1 秒钟左右的时间才能给出正确的答案,但是对于奔腾系列的 CPU 来说,它只需要十亿分之一秒就够了。 “深蓝”之所以能够战胜卡斯帕罗夫,就是因为它算得实在是太快了,每秒钟能够算 2 亿步。这样,不管你采用什么招法,它只要进行遍历式搜索,把各种可能的走法都算一遍,然后从中选择一个最佳的走法即可。当然,在围棋方面计算机还暂时没有太大的突破,原因很简单:围棋的棋盘有 1919 个格子,361 个点,每个点有 3 种可能,即黑棋、白棋或空白,这样,棋盘的每一个状态就有 3361 种可能,这是一个天文数字。除了运算速度快,研究。计算机语言与程序设计

12、4计算机的第二个优点在于它的精度非常高,它可以不知疲倦地在那里计算,而且不会出错。例如,根据一项统计数据,计算机在访问磁盘的时候,每隔 10 亿个数据位才可能会发生一个错误。所以说,计算机的工作原理虽然很简单,但由于它速度快、精度高,所以能够实现很多不可思议的功能。虽然计算机的功能非常强大,但需要指出的是,计算机并不能直接帮助人们去解决问题。因为人们在描述这些问题的时候,采用的都是人类的自然语言的形式,而不是机器指令的形式,这样的话,计算机就听不懂人们所说的话,更不知道该去做什么。比如说,假设我们想要知道 1 加 1 等于多少,那么我们不能拿起话筒,然后对一台计算机说:“计算机,请你告诉我,1

13、 加 1 等于多少?”这样做是不行的,计算机根本就不会搭理你,因为它听不懂你说的话,不知道你想要的是什么。那么我们要怎么做,才能够让计算机来帮助我们解决这个问题呢?答案就是计算机程序!1.1.2 计算机程序所谓的计算机程序(computer program) ,就是计算机能够识别、执行的一组指令。如前所述,人们正是通过编写程序(programming)来让计算机帮助我们解决各种各样的问题。这个过程一般可以分为以下的 4 个步骤。(1)需求分析。当我们拿到一个问题以后,首先要对它进行分析,弄清楚我们的核心任务是什么,输入是什么,输出是什么等。比如说,假设我们要编写一个程序,实现从华氏温度到摄氏温

14、度的转换。显然,对于这个问题来说,输入是一个华氏温度,输出是相应的摄氏温度,而我们的核心任务就是如何来实现这种转换。(2)算法(algorithm )设计。对于给定的问题,采用分而治之的策略,把它进一步分解为若干个子问题,然后对每个子问题逐一进行求解,并且用精确而抽象的语言来描述整个的求解过程。算法设计一般是在纸上完成的,最后得到的结果通常是流程图或伪代码的形式。例如,对于上述的温度转换问题,我们可以设计出如下的算法: 从用户那里输入一个华氏温度 F; 利用公式 ,计算出相应的摄氏温度 C;5(32)9C 把计算出来的结果显示给用户看。(3)编码实现。在计算机上,使用某种程序设计语言,把算法转

15、换成相应的程序,然后交给计算机去执行。如前所述,我们只能使用计算机能够看懂的语言来跟它交流,而不能用人类的自然语言来命令它。(4)测试与调试。最后一个步骤是测试与调试程序。我们在编写程序的时候,由于疏忽,经常会犯一些错误,如少写了一个字符、多写了一个字符或拼写错误等,但是计算机是非常严格的,或者说是非常苛刻的,它不允许有任何的错误存在,哪怕是再小的错误,它也会给你指出来。所以在编完了程序以后,我们通常还要进行测试和调试,以确保程序能够正确运行。第 1 章 程序设计概述5通过以上的分析可以知道,要想成为一名优秀的程序员,必须具备多种不同的能力。首先是理解能力和沟通能力,要善于与客户沟通、交流,弄

16、明白我们的任务是什么,需要解决的是什么问题。其次是算法设计能力,当我们拿到一个问题以后,如何对它进行分析,如何设计出一种巧妙、高效的算法来解决它。第三是编码能力,对于给定的一个算法,如何用某种计算机语言来实现它。第四是良好的心理素质,在真正编程的时候,要非常的耐心、细致,因为计算机非常的严格,任何一个小小的错误都有可能导致程序的失败,甚至根本就运行不了。尤其是在刚开始学习编程的时候,一个看似简单的小程序,可能也要花上几个小时甚至是几天的时间才能完全做对,所以这个时候就特别要有耐心和毅力。对于本书而言,主要的目标是第二点和第三点,即通过本书的介绍,一方面,也是最重要的一点,就是使读者能够掌握程序

17、设计的基本思路和基本方法,提高读者分析问题、解决问题的能力,也就是算法设计的能力;另一方面,使读者能够掌握一种编程语言(C 语言) ,掌握使用 C 语言来编写代码的能力。事实上,在我们的教学实践中,经常碰到一些学生,他们对 C 语言的语法都非常熟悉,说起来头头是道,但是一旦要让他们动手实践,通过编程解决一个实际的问题,就不行了。既然在编写程序的时候,必须使用计算机能够看懂的语言。那么,计算机语言包含有哪些类型呢?首先是机器语言,机器语言是与计算机硬件关系最为密切的一种计算机语言,在计算机硬件上执行的就是一条条用机器语言编写的指令。对于任何一个计算机程序来说,都要先把它变成机器指令的形式,然后才

18、能够在计算机上运行。不过,这种指令完全是由二进制的 0 和 1 所组成的,一条指令就是由若干个 0 和若干个 1 所组成的一个字符串,所以很难看懂。例如,图 1.2 就是一段机器语言代码,每一行表示一条指令,有的指令长一点,有的指令短一点。显然,对于那些不太熟悉机器语言的人来说,看到这些由 0 和 1 所组成的字符串,完全就像看天书一样,根本就看不懂。所以说,如果要采用机器语言来编写程序,那么工作效率将会极其低下,而且编写出来的代码,它的正确性也很难保证。比如说,在图 1.2 的某条指令当中,如果不小心把其中的一个 1 写成了 0,那么这条指令的含义可能就完全变了,而整个程序的运行结果也可能就

19、完全不同了。为了克服机器语言的缺点,在 20 世纪 50 年代,人们提出了汇编语言的概念。它的基本思路是:用符号的形式来代替二进制的指令。比如说,对于一条机器指令 00110101,我们可能不知道它是干什么的。但如果用符号 ADD 来代替它,那么这条指令的功能就很容易猜到:它是一个加法运算。所以说,采用汇编语言来编写程序,就比机器语言要方便得多,也容易得多。例如,对于图 1.2 当中的机器语言代码,把它翻译为相应的汇编语言的形式,如图 1.3 所示。显然,这段代码就比刚才的机器指令要好理解得多,虽然我们并不知道这种汇编语10101010 10101010 10101010 图 1.2 一段机器

20、语言代码计算机语言与程序设计6言的语法,但我们能够大致地猜测出每条指令的功能。例如,mov 可能是一个赋值操作,cmp 可能是一个比较操作,jle 和 jmp 可能是跳转指令等。不过即便如此,这段代码看起来还是比较费劲,我们还是不太明白整段代码的功能是什么,它解决的是什么问题。所以,对于汇编语言来说,它的层次仍然太低了,使用起来还是不太方便,程序开发和维护的效率还是比较低。另外,刚才讲了,在计算机硬件上执行的必须是机器指令,所以用汇编语言编写出来的程序就不能直接地在计算机上运行,而必须先使用专门的汇编系统把它翻译成机器指令的形式,然后才能够运行。为了更好地进行程序设计,人们又提出了高级程序设计

21、语言的概念。它的基本思路是:用一种更自然、更接近于人类语言习惯的符号形式(如数学公式)来编写程序,这样写出来的程序更容易理解和使用。例如,对于图 1.3 中的汇编语言代码,它所对应的C 语言代码如图 1.4 所示。mov eax, dword ptrebp-4 cp 8jle 040148 movecx, dwordptrebp-4 dworpteb-0Ch,ecxjmp04014e ov edx, dwordptrebp-8 m worpteb-0Ch,edx if(x y) z=x;else z= y; 图 1.3 一段汇编语言代码 图 1.4 一段 C 语言代码显然,对于这样的一段程序,

22、即使读者现在还没有学过 C 语言语法,也能够很容易猜测出,它的功能就是计算 x 和 y 当中的较大值,然后把它赋给 z。与汇编语言一样,用高级语言编写的程序也不能直接在计算机上运行,因为计算机硬件只认识机器语言指令,其他的一概不认。所以先要用编译器(compiler)把高级语言程序翻译成机器指令的形式,然后才能够运行。这里所说的编译器,其实也是软件,是一个专用的计算机程序,它能直接在计算机上运行。在计算机学科中,有一门“编译原理”课程,介绍的就是如何来编写一个编译器软件。从高级语言的发展历史来看,在 20 世纪 50 年代,诞生了第一个高级程序设计语言FORTRAN,它主要用于科学计算。同时期

23、还出现了 Lisp 语言,也就是表处理语言,它主要用于人工智能领域。在 20 世纪 60 年代,出现了 Cobol 语言、Algol 语言和 APL 语言。在 20 世纪 70 年代,又出现了 Basic 语言、Pascal 语言和 C 语言。其中,Basic 语言非常简单,比较适合于初学者。Pascal 语言非常规范,比较适合于教学。在过去的很长一段时间内,它一直是作为计算机系学生的第一门编程语言课程,但目前已经基本退出了历史舞台,现在一般都是直接从 C 语言开始。到了 20 世纪 80 年代,出现了一些面向对象的编程语言,如 SmallTalk、C+等,另外,还出现了 Modula、Ada

24、 和 Prolog语言。到了 20 世纪 90 年代,著名的 Java 语言也出现了,一方面,它是一种面向对象第 1 章 程序设计概述7的编程语言;另一方面,它又是一种独立于具体的硬件平台的开发环境,所以 Java 语言已经成为当今的一大热点。1.2 C 语言简介由于 C 语言具有简单、高效、应用广泛等特点,在本书中,将采用 C 语言来作为基本的教学语言。下面就对 C 语言做一个简单地介绍。1.2.1 C 语言的历史首先来看 C 语言的历史。说到 C 语言,就不能不谈 UNIX 操作系统,因为 C 语言的诞生与 UNIX 操作系统的发展是密切相关的。那么什么是操作系统(Operating Sy

25、stem, OS)呢?前面已经介绍了计算机硬件的体系结构,我们知道,在一台计算机当中,包含有 CPU、内存和各种输入输出设备。但是,有了这些硬件设备以后,计算机是不是就能正常地工作了呢?当然不能。图 1.5 是一个计算机系统的示意图,从图中可以看到,在一个计算机系统中,除了硬件以外,还必须包含有各种各样的软件。打个比方来说,硬件只是躯体,而软件才是灵魂,没有软件的计算机就像一个漂亮的花瓶,虚有其表。那么在各种软件当中,最重要的就是操作系统。操作系统是与硬件关系最为密切的一层软件,它的功能就是管理和分配计算机的各种软硬件资源,合理地组织计算机的工作流程,并且向上层提供各种各样的服务功能。操作系统

26、的种类有很多,其中最主要的有两大类,一类是 Windows 系列操作系统,如 Windows 2000、Windows XP 等;另一类是 UNIX 系列操作系统,如 UNIX、Linux、Solaris 和 AIX 等。在操作系统的上面,是其他的一些系统软件,如编译器和数据库管理系统等。再上面就是各种应用软件了,如文字处理软件 Word、上网用的 IE 浏览器、VCD 播放软件、QQ 即时通信软件和各种游戏软件等。对于计算机用户来说,则是位于系统的最上层,人们正是通过这些应用软件和系统软件,来使用计算机的。从 UNIX 操作系统的发展历史来看,1963 年,美国麻省理工学院 MIT、贝尔实验

27、室和通用电器公司决定联合开发一个操作系统 MULTICS,其设计目标是“公用计算服务系统” 。那时,计算机还很昂贵,主要是安装在一些政府部门、企业和科研机构,一般的家庭买不起,但有时人们又想使用计算机来完成一些计算任务。所以该项目的出发点是想提供一种计算服务,也就是说,在城市里布置一台计算机主机,然后用户在自己的家里,使用终端并且通过电话线来接入这台主机。终端很便宜,只有显示器、键盘和通信模块,每个家庭都买得起,他们使用终端来连接计算机,然后像使用水、电、煤气等生活资源那样来使用这台计算机的计算资源,并缴纳相应的费用。这图 1.5 计算机系统示意图计算机语言与程序设计8样一来,在主机上必须运行

28、一个操作系统,来对整个系统的资源进行管理。MULTICS 系统非常庞大、复杂,它的研制难度远远超出了人们的预料,因此,贝尔实验室和通用电器公司先后退出了这个项目。1969 年,当贝尔实验室退出该项目后,它的一个研究员 Ken Thompson 在 MULTICS 操作系统上编写了一个名为“太空旅行”(space travel)的游戏,模拟了一个飞行员驾驶着一艘宇宙飞船在太阳系中遨游,并在各个星体上着陆。后来,由于无法继续访问 MULTICS 操作系统,他就在贝尔实验室里找了一台没有人使用的 PDP-7 计算机,想把游戏程序移植到这台机器上。但是,正如前面所说的,计算机硬件所能执行的都是用机器语

29、言来描述的指令,而对于不同类型的计算机来说,它们的机器语言是不一样的,所以在 MULTICS 系统上运行的程序,不能直接把它搬到 PDP-7 这种类型的计算机上去运行。因此,Thompson 就和贝尔实验室的另外一名研究员 Dennis Ritchie,他们两个人一起,在另外一台 GE-635 计算机上,利用它的操作系统,即 GECOS 所提供的一个交叉汇编器,把空间旅行游戏用 PDP-7 的汇编语言重新编写了一遍,并且生成 PDP-7 的机器语言指令,然后用穿孔纸带的形式把它转移到了 PDP-7 上面,这样,就可以玩了。有的读者可能会问,为什么需要使用第三台机器 GE635 呢?为什么不直接

30、在 PDP-7 这台计算机上编程呢?原因很简单,这台PDP-7 计算机之所以没人来用,是因为它是一台光秃秃的计算机,只有硬件而没有任何软件,连汇编程序都没有,这样,人们就没有办法在上面编程,如果实在想编程的话,只能直接使用机器语言。但机器语言都是一些 0、1 字符串,太难懂了,所以没有人愿意使用它。后来,Thompson 觉得这台 PDP-7 计算机空在那里有点可惜,所以就和 Ritchie 等人开始为它编写一个新的操作系统,也就是说,在硬件的基础上,再给它增加一些软件,这样,这台机器就能够用起来,就能做更多的事情。他们先是写好了这个操作系统的文件系统和一组基本的软件工具,然后再编写了一个 P

31、DP-7 汇编语言的编译器。有了这些软件工具后,就能直接在 PDP-7 上编程了。到了 1970 年,这个操作系统的基本元素都已经完成了,他们给系统起了一个名字,也就是 UNIX。到了 1970 年的夏季,研究小组得到了一台新的、功能更强大的机器 PDP-11,因此需要把 UNIX 系统从 PDP-7 移植到 PDP-11 上面去,但是这项工作非常的烦琐,因为整个系统都是用汇编语言来编写的,需要把每一条 PDP-7 汇编语言指令都转换为相应的 PDP-11 汇编语言指令,工作量非常大。而且更重要的是,这种移植工作是一次性的,如果以后又来了一台新的机器,那么整个移植工作又得重新来过,所以这是一个

32、很大的问题。那么如何来解决这个问题呢?研究小组就开始考虑用某种高级语言来重写整个系统,以提高系统的可移植性和可懂性。有了这些背景知识后,我们言归正传,来看一下 C 语言的发展历史。C 语言的起源可以追溯到 1960 年出现的 Algol 60,它是一种面向问题的高级语言,离硬件比较远,不适合用来编写系统程序。1963 年英国剑桥大学推出了“组合编程语言” (Combined Programming Language,CPL) ,它在 Algol 60 的基础上更接近于硬件,但规模较大,难以实现。因此,1967 年剑桥大学的 Matin Richards 对 CPL 进行了简化,提出了第 1 章

33、 程序设计概述9BCPL( Basic Combined Programming Language) 语 言 。 那 么 到 了 1970 年 的 时 候 , 就 回 到了 刚 才 所 说 的话题,也就是说,Thompson 为了提高 UNIX 操作系统的可移植性,想要用某种高级语言来重写整个系统。但是采用哪一种高级语言来做这件事呢?他的想法是自己去设计一种高级语言。所以就以 BCPL 语言为基础,又作了进一步的简化,设计出很简单而且很接近硬件的 B 语言,这个名称取自于 BCPL 的第一个字母。但是 B 语言过于简单,是一种没有数据类型的语言,功能很有限。因此,当他试图用 B 语言来重写 U

34、NIX 操作系统时,效果并不太好。到了 1972 年,Ritchie 在 B 语言的基础上又设计出了 C 语言,这个名称取自于 BCPL 的第二个字母。C 语言既保持了 BCPL 和 B 语言的精炼、接近硬件等优点,又克服了它们过于简单、数据无类型等缺点,所以很快就成为研究小组内部的首选编程语言。后来,Ritchie 和 Thompson 两个人合作,把整个UNIX 系统用 C 语言重新写了一遍,这样,以后再需要移植的时候,就方便多了,大部分的系统代码都无需改动。1977 年,出现了不依赖于具体机器的 C 语言编译器,使得把一个 C 程序从一台机器移植到另一台机器上所需要的工作大大地简化了,这

35、就推动了 UNIX 操作系统迅速地在各种类型的机器上得以实现。反过来,随着 UNIX 系统日益广泛的使用,C 语言也得到了迅速地推广。所以说, C 语言和 UNIX 系统关系非常密切,在发展过程中它们是相辅相成的。1983 年,美国国家标准化协会(ANSI)根据 C 语言问世以来,各种版本对它的发展和扩充,制定了一个标准,称为 ANSI C。1988 年,ANSI 又公布了新的标准。目前流行的各种 C 编译系统都是以它为基础。另一方面,1983 年,贝尔实验室的另外一个研究员 Bjarne Stroustrup,在 Algol 68、Simula 67 和 C语言的基础上,发明了 C+语言,它

36、既保持了 C 语言的面向机器硬件的优点,又具有Algol 语言的面向求解问题的优点,因此适合于大规模的程序设计。1.2.2 C 语言的特点C 语言是一种通用的编程语言,从诞生到现在的三十多年间,取得了长足的发展。可以毫不夸张地说,C 语言是迄今为止人类发明的最为成功的计算机语言之一,它对计算机科学和软件产业的发展起着广泛而深刻的影响。这种成功与它的特点密切相关,C语言的主要特点如下。(1)简单。C 语言的语法简洁、紧凑,是一个比较小的语言。不管是关键字的命名、变量的定义、运算符的设置,还是程序的结构,处处体现出简洁、紧凑的风格,压缩了一切不必要的成分。如果有两个语言特性的功能是差不多的,那么

37、C 语言只保留其中的一个。例如,在 C 语言中,在描述整型数据类型的时候,使用的是单词缩写int,而不是完整的英语单词 integer;在定义一个数组的时候,使用的是数组符号,而不是英语单词 array。另外, C 语言不支持对组合对象的直接操作。例如,在 C 语言当中,并没有一个运算符来比较两个字符串的大小,也没有一个运算符来计算一个数组的长度。总之,C 语言的基本思路就是能省则省,连专门的输入输出运算符都没有。由于C 语言的这种简短、精练的特点,使得人们在学习的时候比较容易入门,只要知道很少的东西就可以开始编程。计算机语言与程序设计10(2)实用。C 语言的语法虽然简洁、紧凑,但表达能力强

38、,使用灵活、方便。如果你是一个 C 语言高手,那么当你拿到一个问题的时候,能够在很短的时间内写出相应的程序。事实上,当初 Ritchie 在发明 C 语言的时候,也是为了编写 UNIX 操作系统的实际需要。因此,可以说 C 语言的发明是“by programmer,for programmer”,也就是说,C 语言是由职业程序员发明的,也是为职业程序员量身定做的,是职业程序员所使用的语言。所以,C 语言的语法简明扼要,对程序员的限制很少,从理论上来说,程序员几乎可以做他们想做的任何事情。另外,C 语言还提供了一组标准的库函数,能够帮助程序员完成各种各样的功能,如文件的访问、格式化输入输出、内存

39、分配和字符串操作等。(3)高效。如前所述,C 语言是一种高级程序设计语言,但是从某种意义上来说,C 语言又是一种“低级”语言,是一种接近于机器硬件的语言。因为从数据类型来看,C 语言处理的都是基本的数据类型,如字符、整数、实数和地址等,而计算机硬件一般都能直接处理这些数据对象;从运算符来看,C 语言的运算符大都来源于真实的机器指令。例如,对于算术运算符、关系运算符、赋值运算符、指针运算符、位(bit )运算符、自增运算符和自减运算符等,在一般的计算机硬件上,都有与它们相对应的机器指令;从硬件访问来看,C 语言可以直接去访问内存地址单元,也可以直接去访问 I/O。总之,C 语言与硬件的关系非常密

40、切,可以把它看成是汇编语言之上的一层抽象,凡是汇编语言能实现的功能,C 语言基本上都能实现。事实上,甚至可以在 C 语言程序当中直接嵌入汇编语言程序。基于这些原因,人们很容易用 C 语言来编写出在时间上和空间上效率都很高的程序。根据一项统计,C 语言程序生成的目标代码的效率只比汇编语言低10。(4)可移植性好。虽然 C 语言与机器硬件的关系非常密切,但它并不依赖于某一种特定的硬件平台。事实上,小至 PC、大至超级计算机,几乎在所有的硬件平台和操作系统上都有 C 语言的编译器。这就使得用 C 语言编写的程序具有很好的可移植性,基本上不做修改就能在不同型号的计算机上运行。由于以上的这些特点,使得

41、C 语言在工业界获得了广泛的应用和好评。根据 2003年的一项统计,在企业招聘的软件工程师职位当中,有 22.7%的职位要求使用 C/C+编程,在所有的编程语言中排名第二。1.2.3 C 语言的应用领域如前所述,C 语言是一种偏向于机器硬件的高级语言,因此它比较适合于底层的系统软件的开发。例如,在操作系统领域,UNIX 和 Linux 的绝大部分代码都是用 C 语言编写的,只有少量的与硬件直接打交道的代码是用汇编语言编写的,如系统引导程序、底层的设备驱动程序等。对于 Windows 操作系统,它的大部分代码也是用 C 语言来编写的,而一些图形用户界面方面的代码则是用 C+编写的。在系统软件领域

42、,数据库管理系统、磁盘管理工具乃至一些病毒程序,都是用 C 语言编写的,尤其是在嵌入式系统领域,根据一项统计,81% 的嵌入式系统开发都要用到 C 语言,远远超过其他的任何第 1 章 程序设计概述11一种编程语言。在商业应用领域,例子就更多了,如多媒体播放软件、游戏软件、专家系统软件和绘图软件等。在教学领域,著名的数学软件工具 MATLAB 就是用 C 语言来编写的。在数字信号处理领域,也经常用 C 语言来编程。另外,像数据结构这样的基础课程,以前都是用 Pascal 语言来教学,现在也都改成了 C 语言。所以说,学好了 C语言以后,不管是对今后的其他一些后继课程,还是对将来的职业发展,都会带

43、来很大的帮助。1.3 一个简单的 C 程序下面通过一个简单的例子,来回顾一下程序设计的过程,并且看一下,一个典型的C 语言程序是个什么样子。1.3.1 问题描述与分析考虑这样的一个问题:判断一个给定的数是奇数还是偶数。对于这个问题,是用人类的自然语言来描述的,而且描述得比较简单,如果把这句话直接提交给计算机,那么计算机是看不懂的,也不知道如何去解决这个问题。所以,必须用某种计算机语言来进行编程,也就是说,用计算机能够看懂的方式来与它交流。那么如何来编程呢?这就要用到前面讲过的 4 个步骤,即需求分析、算法设计、编码实现和测试调试。从需求分析来看,我们的需求只有一句话:“判断一个给定的数是奇数还

44、是偶数” 。从这句话当中,可以派生出一系列的问题。首先,这个数应该是哪一种类型?是实数还是整数?显然应该是整数,因为只有整数才有奇偶之分。其次,对于计算机来说,它怎么样从用户那里得到这个数?另外,什么叫“奇数”?什么叫“偶数”?如何判断一个整数是奇数还是偶数?最后,如果计算机得出了判断的结果,那么怎么样把这个结果通报给用户?从算法设计来看,显然,在刚才提出的这些问题当中,最核心的问题就是如何判断一个整数是奇数还是偶数,对于这个问题,可以采用除 2 取余法,也就是说,把这个整数除以 2,然后看余数是 0 还是 1。例如,对于 92 543 这个整数,把它除以 2,得到的余数为 1,这说明它是一个

45、奇数。下面,我们就可以把求解这个问题的思路抽象为算法的形式。(1)计算机接收用户从键盘输入的一个整数。(2)把这个整数除以 2。(3)如果得到的余数为 0,这说明是一个偶数,因此就在屏幕上显示“该数是偶数” 。(4)如果得到的余数为 1,这说明是一个奇数,因此就在屏幕上显示“该数是奇数” 。当然,求解这个问题的算法并不是唯一的,还可以想出其他的算法。例如,可以采用末位判定法:如果这个整数的末位数是 0、2、4、6 或 8,那么它就是一个偶数;否计算机语言与程序设计12则,它就是一个奇数。所以说,对于同一个问题,可以设计出不同的算法,从而编写出不同的程序。1.3.2 C 语言程序有了算法以后,就

46、可以进入编码实现阶段,写出相应的 C 语言程序,如下所示。程序 1.1/* 本程序的功能:输入一个整数,判断它是奇数 还是偶数 */#include void main( )int num;/* 用于存放输入的整数 */ int rem;/* 用于存放除 2以后的余数 */* 从用户处得到该整数 */printf(“请输入一个整数:“); scanf(“%d“, /* 计算除 2以后的余数并输出结果 */rem = num % 2;if(rem = 0)printf(“该数是偶数n“);elseprintf(“该数是奇数n“);这个程序的功能就是输入一个整数,然后判断它是奇数还是偶数。以下是它

47、的一次运行结果:请输入一个整数:92543该数是奇数对于上述这个 C 语言程序,有很多的语法细节现在还不是很清楚,这没有关系,以后会慢慢地介绍,而在这里,只需对该程序有一个大致的了解即可。程序首先定义了两个变量,num 和 rem,所谓的变量,可以把它想象为一个箱子,既然是箱子,就是用来装东西的。num 用来保存用户输入的整数,rem 用来保存除 2 以后的余数。接下来的 printf 语句,表示在屏幕上显示一行提示信息,即“请输入一个整数:” 。接下来的 scanf 语句表示从用户那里,通过键盘输入得到一个整数,并把它保存在 num当中。所以这两条语句,就相当于是完成了刚才所说的算法里面的第

48、 1 步,即“计算机接收用户从键盘输入的一个整数” ,这样一来,就把用自然语言描述的算法步骤,转换为了用计算机语言来描述的程序。接下来,语句“rem = num % 2”表示把保存在 num 这个变量当中的整数除以 2,然后把余数保存在 rem 当中。这条语句相当于是算法里面的第 2 步。第 1 章 程序设计概述13接下来的 if 语句判断该余数是否等于 0,如果是,表明输入的整数是一个偶数,所以就在屏幕上显示“该数是偶数”这句话;否则,如果余数不等于 0,这说明该整数是一个奇数,所以就在屏幕上显示“该数是奇数”这句话。这样一来,就完成了算法的第3 步和第 4 步,也就完成了整个的程序。以上就

49、是该程序的主要功能,下面再以它为例,来简单地介绍一下一个 C 语言程序的各个组成部分,使读者对 C 语言程序的整体结构有一个初步的了解。首先,在这个程序当中,我们注意到有几个地方比较特别,如第 1 行、第 5 行和第6 行的后半部分、第 7 行等,它们有一个共同的特点,即都是以一个斜杠加一个星号(/ *)开头,接下来是一段文字,然后又都是以一个星号加一个斜杠( */)结尾。我们把这种形式的程序片断称为是注释。所谓的注释,顾名思义,就是说它本身并不会去执行什么具体的操作,它在程序运行时是会被忽略掉的。它的存在主要是用来帮助读者去理解 程序。接下来的第 2 行“#include ”,这种以符号“#”开头的行,称为编译预处理行,它可以用来设置各种编译预处理命令。如果在“#”后面加上“include” ,则表示这是一个文件包含命令,也就是说,把尖括号里面的 stdio.h 文件的内容包含到当前这个程序当中。stdio.h 是系统提供的一个头文件, stdio 表示标准输入输出( standard input output)的意思,在这个文件当中,包含了一些与输入输出有关的库函数,有了它之后,才能在程序中进行各种输入输出操作。所以读者在编程时,要记得把这一行代码敲进去。接下来定义了一个 ma

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报