




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、程序设计概述1.1 计算机与程序1.1.1 功能强大的计算机计算机是20世纪人类最伟大的发明之一,它的发展历史可以追溯到中国古代的算盘。算盘是一种辅助计算工具,人们在进行算术运算的时候,无需复杂的心算,只要使用一些固定的口诀来拨弄几下算珠,就可以把答案算出来。1642 年,法国物理学家帕斯卡利用机械齿轮原理,发明了第一部能计算加减法的计算机。1671 年,德国数学家莱布尼兹发明了一种能作四则运算的手摇式计算机,这些工作都是早期的机械式计算机的代表。20世纪初,随着电子管的出现,计算机有了新的发展。1946 年,由于第二次大战的军事需要,美国宾夕法尼亚大学和有关单位
2、研制成功了第一台真正意义上的电子计算机电子数字积分仪与计算机(Electronic Numerical Integrator and Computer,ENIAC)。几十年过去了,计算机取得了迅猛的发展,其使用的元件也经历了四代的变化:第一代的电子管、第二代的晶体管、第三代的集成电路和第四代的大规模集成电路。如今,电子计算机的功能已不仅仅是计算,它已渗入了人类的活动领域,成为人们工作和生活中必不可少的工具。在我们的周围,有着各种各样的计算机,如笔记本计算机、台式机、个人数字助理(PDA)、小型机和大型机等。现代计算机的功能非常强大,能够为人类做许许多多的事情。比如说,在中国古代,一些书香门第或
3、官宦家庭,为了培养一个人的人文素养,通常都要求他掌握4项基本的技能,即琴、棋、书、画。对于这4项技能,如果能做到样样精通,那么就是一个高雅的人,是一名文人雅士。当然,对于现代人来说,在“分数压倒一切”的背景下,不要说精通这4项技能,只要会其中的一项就很不容易了。但是计算机就能够做到样样精通。首先是弹琴,这对于计算机来说是小菜一碟,计算机合成的音乐很早以前就有了。其次是下棋,这更是计算机的强项,计算机不仅能够下棋,而且下得非常好。1997年的5月,由IBM公司开发出来的“深蓝”计算机,就战胜了当时的国际象棋世界冠军卡斯帕罗夫。卡斯帕罗夫是俄国人,曾被认为是有史以来最厉害的棋手之一,但他却被计算机
4、给打败了。当然,古人所说的棋指的是围棋,而围棋比象棋要复杂得多,所以在这个方面,计算机还很难有大的突破。第三种技能是书法,这对于计算机来说,是再简单不过的了,什么样的字体它都能打印出来,如宋体、楷体、隶书等。第四种技能是画画,这也不是什么难事,在计算机的控制下,能够在布匹上刺绣,甚至还能编织任意图案的毛线衣!除了琴棋书画,计算机还能做到听说读写。所谓的“听”,指的是语音识别技术,也就是说,人对着计算机说话,然后计算机就会把这些语音信号转换成相应的文字。比如说,读者需要把一篇稿子录入到计算机当中,但是又不想通过键盘输入,因为通过键盘输入得太慢、太辛苦了,这时就可以使用语音识别软件。你只要对着话筒
5、把这篇稿子念一遍,它就被录入计算机了,非常的方便。当然,这只是一种理想状态,而实际的语音识别软件目前还做不到这么完美,它们的识别正确率还达不到百分之百。但即便如此,这项技术在文字录入、身份认证等领域还是得到了广泛的应用。所谓的“说”,指的是文语转换技术(Text-To-Speech,TTS)。它和语音识别正好相反,一个是把声音变成文字,另一个是把文字变成声音。比如说,我们上网去看今天的新闻,但是又不想用眼睛去看,因为看得比较累,这时就可以使用TTS技术,让计算机把新闻念给你听。再比如,我们都知道英国著名的理论物理学家霍金,他是一个全身瘫痪的人,除了大脑以外,身体的其他部分都是处于肌肉萎缩状态,
6、连说话都不行。那么他是如何与别人交流的呢?就是通过TTS技术。当他想要说话的时候,就用手指尖去操作一台计算机,输入他想要说的话,然后,计算机就采用TTS技术,把这句话转换成语音播放出来。TTS系统的关键指标是自然度,一般来说,计算机合成出来的声音不是很好听,语调比较生硬。就像电影星球大战中的机器人C-3PO,说起话来有点怪声怪气的。当然,现有的TTS技术已经取得了长足的进展,已经能够合成出比较好听、比较自然的声音。所谓的“读”,指的是自然语言理解,也就是说,对于一段自然语言文字(如中文、英文等),计算机能够看懂它的意思是什么。自然语言理解有很多的应用,如机器翻译,能够把一种语言的文字翻译成另一
7、种语言;再比如因特网上的基于内容的智能搜索。我们可以向计算机提出各种问题,如“北京有什么好玩的地方?”,计算机能够看懂这句话的意思,然后经过搜索,就会把北京的一些旅游景点列出来,如故宫、颐和园、圆明园及长城等。所谓的“写”,就是说,计算机能够自动写作文。这其实也不是什么太难的事情,一般的做法是去搜集很多写得比较好的句子,然后把它们拼接在一起即可。曾经有人对某个国际学术会议的组织者表示不满,认为他们盲目扩大会议规模,而忽视了论文质量的审查。于是他就开了一个玩笑,把一篇计算机自动生成的“论文”提交给该会议,后来这篇论文居然被录用了 以上所说的这些技术,实际上都是计算机科学领域当中的一些研究课题。读
8、者如果感兴趣,将来可以从事相关方面的 研究。那么,计算机为什么能够做这么多的事情呢?是不是它的内部结构非常复杂,比人的大脑还要复杂?答案是否定的。实际上,计算机的工作原理非常简单。从本质上来说,计算机是一种用来处理数据的通用机器。它所能够做的事情只有一件计算。因此,从某种意义上来说,可以把计算机看成是一个超级计算器。图1.1是计算机硬件的体系结构图。一般来说,一台计算机主要由三个部件组成,中央处理器(Central Processing Unit,CPU)、内存(memory)和各种输入输出(Input/ Output,I/O)设备,如显示器、键盘、磁盘和鼠标等。其中,CPU是计算机的“心脏”
9、,所有的计算都是在CPU上进行的;内存是计算机的“大脑”,当计算机在运行时,所有的信息都存储在内存当中,包括指令和数据;而I/O设备是计算机的“手脚”和“五官”,对于用户来说,正是通过这些I/O设备来与计算机打交道。那么计算机是如何来工作的呢?很简单,就是从内存当中,取出一条指令,放在CPU上去运行。这条指令可能是一条算术运算指令,对两个数据进行加、减、乘、除;也可能是一条内存访问指令,去内存存储或读写数据;也可能是一条数据比较指令或控制指令。当这条指令执行完以后,系统又从内存当中取出下一条指令,放在CPU上去运行。就这样一条指令接一条指令地运行,直到程序运行结束。这就是计算机工作的整个过程。
10、那么指令和数据是怎么样从内存跑到CPU上去的呢?它们是坐“公共汽车”(bus)去的。当然,这只是一个玩笑。实际上这里的英文单词Bus,在中文里一般翻译为总线,指令和数据就是通过总线进入到CPU的。图1.1 计算机体系结构图通过刚才的介绍可以知道,计算机的工作原理其实是非常简单的,它就是在那里不断地执行指令,不断地计算。那么,为什么这么简单的工作原理,却能够完成那么多不可思议的任务呢?原因主要有两个,首先,计算机的运算速度非常快。比如说,如果让我们去心算一下53×7等于多少,那么我们可能需要1秒钟左右的时间才能给出正确的答案,但是对于奔腾系列的CPU来说,它只需要十亿分之一秒就够了。“
11、深蓝”之所以能够战胜卡斯帕罗夫,就是因为它算得实在是太快了,每秒钟能够算2亿步。这样,不管你采用什么招法,它只要进行遍历式搜索,把各种可能的走法都算一遍,然后从中选择一个最佳的走法即可。当然,在围棋方面计算机还暂时没有太大的突破,原因很简单:围棋的棋盘有19×19个格子,361个点,每个点有3种可能,即黑棋、白棋或空白,这样,棋盘的每一个状态就有3361种可能,这是一个天文数字。除了运算速度快,计算机的第二个优点在于它的精度非常高,它可以不知疲倦地在那里计算,而且不会出错。例如,根据一项统计数据,计算机在访问磁盘的时候,每隔10亿个数据位才可能会发生一个错误。所以说,计算机的工作原理
12、虽然很简单,但由于它速度快、精度高,所以能够实现很多不可思议的功能。虽然计算机的功能非常强大,但需要指出的是,计算机并不能直接帮助人们去解决问题。因为人们在描述这些问题的时候,采用的都是人类的自然语言的形式,而不是机器指令的形式,这样的话,计算机就听不懂人们所说的话,更不知道该去做什么。比如说,假设我们想要知道1加1等于多少,那么我们不能拿起话筒,然后对一台计算机说:“计算机,请你告诉我,1加1等于多少?”这样做是不行的,计算机根本就不会搭理你,因为它听不懂你说的话,不知道你想要的是什么。那么我们要怎么做,才能够让计算机来帮助我们解决这个问题呢?答案就是计算机程序!1.1.2 计算机程序所谓的
13、计算机程序(computer program),就是计算机能够识别、执行的一组指令。如前所述,人们正是通过编写程序(programming)来让计算机帮助我们解决各种各样的问题。这个过程一般可以分为以下的4个步骤。(1)需求分析。当我们拿到一个问题以后,首先要对它进行分析,弄清楚我们的核心任务是什么,输入是什么,输出是什么等。比如说,假设我们要编写一个程序,实现从华氏温度到摄氏温度的转换。显然,对于这个问题来说,输入是一个华氏温度,输出是相应的摄氏温度,而我们的核心任务就是如何来实现这种转换。(2)算法(algorithm)设计。对于给定的问题,采用分而治之的策略,把它进一步分解为若干个子问题
14、,然后对每个子问题逐一进行求解,并且用精确而抽象的语言来描述整个的求解过程。算法设计一般是在纸上完成的,最后得到的结果通常是流程图或伪代码的形式。例如,对于上述的温度转换问题,我们可以设计出如下的算法: 从用户那里输入一个华氏温度F; 利用公式,计算出相应的摄氏温度C; 把计算出来的结果显示给用户看。(3)编码实现。在计算机上,使用某种程序设计语言,把算法转换成相应的程序,然后交给计算机去执行。如前所述,我们只能使用计算机能够看懂的语言来跟它交流,而不能用人类的自然语言来命令它。(4)测试与调试。最后一个步骤是测试与调试程序。我们在编写程序的时候,由于疏忽,经常会犯一些错误,如少写了一个字符、
15、多写了一个字符或拼写错误等,但是计算机是非常严格的,或者说是非常苛刻的,它不允许有任何的错误存在,哪怕是再小的错误,它也会给你指出来。所以在编完了程序以后,我们通常还要进行测试和调试,以确保程序能够正确运行。通过以上的分析可以知道,要想成为一名优秀的程序员,必须具备多种不同的能力。首先是理解能力和沟通能力,要善于与客户沟通、交流,弄明白我们的任务是什么,需要解决的是什么问题。其次是算法设计能力,当我们拿到一个问题以后,如何对它进行分析,如何设计出一种巧妙、高效的算法来解决它。第三是编码能力,对于给定的一个算法,如何用某种计算机语言来实现它。第四是良好的心理素质,在真正编程的时候,要非常的耐心、
16、细致,因为计算机非常的严格,任何一个小小的错误都有可能导致程序的失败,甚至根本就运行不了。尤其是在刚开始学习编程的时候,一个看似简单的小程序,可能也要花上几个小时甚至是几天的时间才能完全做对,所以这个时候就特别要有耐心和毅力。对于本书而言,主要的目标是第二点和第三点,即通过本书的介绍,一方面,也是最重要的一点,就是使读者能够掌握程序设计的基本思路和基本方法,提高读者分析问题、解决问题的能力,也就是算法设计的能力;另一方面,使读者能够掌握一种编程语言(C语言),掌握使用C语言来编写代码的能力。事实上,在我们的教学实践中,经常碰到一些学生,他们对C语言的语法都非常熟悉,说起来头头是道,但是一旦要让
17、他们动手实践,通过编程解决一个实际的问题,就不行了。既然在编写程序的时候,必须使用计算机能够看懂的语言。那么,计算机语言包含有哪些类型呢?首先是机器语言,机器语言是与计算机硬件关系最为密切的一种计算机语言,在计算机硬件上执行的就是一条条用机器语言编写的指令。对于任何一个计算机程序来说,都要先把它变成机器指令的形式,然后才能够在计算机上运行。不过,这种指令完全是由二进制的0和1所组成的,一条指令就是由若干个0和若干个1所组成的一个字符串,所以很难看懂。例如,图1.2就是一段机器语言代码,每一行表示一条指令,有的指令长一点,有的指令短一点。图1.2 一段机器语言代码显然,对于那些不太熟悉机器语言的
18、人来说,看到这些由0和1所组成的字符串,完全就像看天书一样,根本就看不懂。所以说,如果要采用机器语言来编写程序,那么工作效率将会极其低下,而且编写出来的代码,它的正确性也很难保证。比如说,在图1.2的某条指令当中,如果不小心把其中的一个1写成了0,那么这条指令的含义可能就完全变了,而整个程序的运行结果也可能就完全不同了。为了克服机器语言的缺点,在20世纪50年代,人们提出了汇编语言的概念。它的基本思路是:用符号的形式来代替二进制的指令。比如说,对于一条机器指令00110101,我们可能不知道它是干什么的。但如果用符号ADD来代替它,那么这条指令的功能就很容易猜到:它是一个加法运算。所以说,采用
19、汇编语言来编写程序,就比机器语言要方便得多,也容易得多。例如,对于图1.2当中的机器语言代码,把它翻译为相应的汇编语言的形式,如图1.3所示。显然,这段代码就比刚才的机器指令要好理解得多,虽然我们并不知道这种汇编语言的语法,但我们能够大致地猜测出每条指令的功能。例如,mov可能是一个赋值操作,cmp可能是一个比较操作,jle和jmp可能是跳转指令等。不过即便如此,这段代码看起来还是比较费劲,我们还是不太明白整段代码的功能是什么,它解决的是什么问题。所以,对于汇编语言来说,它的层次仍然太低了,使用起来还是不太方便,程序开发和维护的效率还是比较低。另外,刚才讲了,在计算机硬件上执行的必须是机器指令
20、,所以用汇编语言编写出来的程序就不能直接地在计算机上运行,而必须先使用专门的汇编系统把它翻译成机器指令的形式,然后才能够运行。为了更好地进行程序设计,人们又提出了高级程序设计语言的概念。它的基本思路是:用一种更自然、更接近于人类语言习惯的符号形式(如数学公式)来编写程序,这样写出来的程序更容易理解和使用。例如,对于图1.3中的汇编语言代码,它所对应的C语言代码如图1.4所示。 图1.3 一段汇编语言代码 图1.4 一段C语言代码显然,对于这样的一段程序,即使读者现在还没有学过C语言语法,也能够很容易猜测出,它的功能就是计算x和y当中的较大值,然后把它赋给z。与汇编语言一样,用高级语言编写的程序
21、也不能直接在计算机上运行,因为计算机硬件只认识机器语言指令,其他的一概不认。所以先要用编译器(compiler)把高级语言程序翻译成机器指令的形式,然后才能够运行。这里所说的编译器,其实也是软件,是一个专用的计算机程序,它能直接在计算机上运行。在计算机学科中,有一门“编译原理”课程,介绍的就是如何来编写一个编译器软件。从高级语言的发展历史来看,在20世纪50年代,诞生了第一个高级程序设计语言FORTRAN,它主要用于科学计算。同时期还出现了Lisp语言,也就是表处理语言,它主要用于人工智能领域。在20世纪60年代,出现了Cobol语言、Algol语言和APL语言。在20世纪70年代,又出现了B
22、asic语言、Pascal语言和C语言。其中,Basic语言非常简单,比较适合于初学者。Pascal语言非常规范,比较适合于教学。在过去的很长一段时间内,它一直是作为计算机系学生的第一门编程语言课程,但目前已经基本退出了历史舞台,现在一般都是直接从C语言开始。到了20世纪80年代,出现了一些面向对象的编程语言,如SmallTalk、C+等,另外,还出现了Modula、Ada和Prolog语言。到了20世纪90年代,著名的Java语言也出现了,一方面,它是一种面向对象的编程语言;另一方面,它又是一种独立于具体的硬件平台的开发环境,所以Java语言已经成为当今的一大热点。1.2 C语言简介由于C语
23、言具有简单、高效、应用广泛等特点,在本书中,将采用C语言来作为基本的教学语言。下面就对C语言做一个简单地介绍。1.2.1 C语言的历史首先来看C语言的历史。说到C语言,就不能不谈UNIX操作系统,因为C语言的诞生与UNIX操作系统的发展是密切相关的。那么什么是操作系统(Operating System,OS)呢?前面已经介绍了计算机硬件的体系结构,我们知道,在一台计算机当中,包含有CPU、内存和各种输入输出设备。但是,有了这些硬件设备以后,计算机是不是就能正常地工作了呢?当然不能。图1.5是一个计算机系统的示意图,从图中可以看到,在一个计算机系统中,除了硬件以外,还必须包含有各种各样的软件。打
24、个比方来说,硬件只是躯体,而软件才是灵魂,没有软件的计算机就像一个漂亮的花瓶,虚有其表。那么在各种软件当中,最重要的就是操作系统。操作系统是与硬件关系最为密切的一层软件,它的功能就是管理和分配计算机的各种软硬件资源,合理地组织计算机的工作流程,并且向上层提供各种各样的服务功能。操作系统的种类有很多,其中最主要的有两大类,一类是Windows系列操作系统,如Windows 2000、Windows XP等;另一类是UNIX系列操作系统,如UNIX、Linux、Solaris和AIX等。在操作系统的上面,是其他的一些系统软件,如编译器和数据库管理系统等。再上面就是各种应用软件了,如文字处理软件Wo
25、rd、上网用的IE浏览器、VCD播放软件、QQ即时通信软件和各种游戏软件等。对于计算机用户来说,则是位于系统的最上层,人们正是通过这些应用软件和系统软件,来使用计算机的。图1.5 计算机系统示意图从UNIX操作系统的发展历史来看,1963年,美国麻省理工学院MIT、贝尔实验室和通用电器公司决定联合开发一个操作系统MULTICS,其设计目标是“公用计算服务系统”。那时,计算机还很昂贵,主要是安装在一些政府部门、企业和科研机构,一般的家庭买不起,但有时人们又想使用计算机来完成一些计算任务。所以该项目的出发点是想提供一种计算服务,也就是说,在城市里布置一台计算机主机,然后用户在自己的家里,使用终端并
26、且通过电话线来接入这台主机。终端很便宜,只有显示器、键盘和通信模块,每个家庭都买得起,他们使用终端来连接计算机,然后像使用水、电、煤气等生活资源那样来使用这台计算机的计算资源,并缴纳相应的费用。这样一来,在主机上必须运行一个操作系统,来对整个系统的资源进行管理。MULTICS系统非常庞大、复杂,它的研制难度远远超出了人们的预料,因此,贝尔实验室和通用电器公司先后退出了这个项目。1969年,当贝尔实验室退出该项目后,它的一个研究员Ken Thompson在MULTICS操作系统上编写了一个名为“太空旅行”(space travel)的游戏,模拟了一个飞行员驾驶着一艘宇宙飞船在太阳系中遨游,并在各
27、个星体上着陆。后来,由于无法继续访问MULTICS操作系统,他就在贝尔实验室里找了一台没有人使用的PDP-7计算机,想把游戏程序移植到这台机器上。但是,正如前面所说的,计算机硬件所能执行的都是用机器语言来描述的指令,而对于不同类型的计算机来说,它们的机器语言是不一样的,所以在MULTICS系统上运行的程序,不能直接把它搬到PDP-7这种类型的计算机上去运行。因此,Thompson就和贝尔实验室的另外一名研究员Dennis Ritchie,他们两个人一起,在另外一台GE-635计算机上,利用它的操作系统,即GECOS所提供的一个交叉汇编器,把空间旅行游戏用PDP-7的汇编语言重新编写了一遍,并且
28、生成PDP-7的机器语言指令,然后用穿孔纸带的形式把它转移到了PDP-7上面,这样,就可以玩了。有的读者可能会问,为什么需要使用第三台机器GE635呢?为什么不直接在PDP-7这台计算机上编程呢?原因很简单,这台PDP-7计算机之所以没人来用,是因为它是一台光秃秃的计算机,只有硬件而没有任何软件,连汇编程序都没有,这样,人们就没有办法在上面编程,如果实在想编程的话,只能直接使用机器语言。但机器语言都是一些0、1字符串,太难懂了,所以没有人愿意使用它。后来,Thompson觉得这台PDP-7计算机空在那里有点可惜,所以就和Ritchie等人开始为它编写一个新的操作系统,也就是说,在硬件的基础上,
29、再给它增加一些软件,这样,这台机器就能够用起来,就能做更多的事情。他们先是写好了这个操作系统的文件系统和一组基本的软件工具,然后再编写了一个PDP-7汇编语言的编译器。有了这些软件工具后,就能直接在PDP-7上编程了。到了1970年,这个操作系统的基本元素都已经完成了,他们给系统起了一个名字,也就是UNIX。到了1970年的夏季,研究小组得到了一台新的、功能更强大的机器PDP-11,因此需要把UNIX系统从PDP-7移植到PDP-11上面去,但是这项工作非常的烦琐,因为整个系统都是用汇编语言来编写的,需要把每一条PDP-7汇编语言指令都转换为相应的PDP-11汇编语言指令,工作量非常大。而且更
30、重要的是,这种移植工作是一次性的,如果以后又来了一台新的机器,那么整个移植工作又得重新来过,所以这是一个很大的问题。那么如何来解决这个问题呢?研究小组就开始考虑用某种高级语言来重写整个系统,以提高系统的可移植性和可懂性。有了这些背景知识后,我们言归正传,来看一下C语言的发展历史。C语言的起源可以追溯到1960年出现的Algol 60,它是一种面向问题的高级语言,离硬件比较远,不适合用来编写系统程序。1963年英国剑桥大学推出了“组合编程语言”(Combined Programming Language,CPL),它在Algol 60的基础上更接近于硬件,但规模较大,难以实现。因此,1967年剑
31、桥大学的Matin Richards对CPL进行了简化,提出了BCPL(Basic Combined Programming Language)语言。那么到了1970年的时候,就回到了刚才所说的话题,也就是说,Thompson为了提高UNIX操作系统的可移植性,想要用某种高级语言来重写整个系统。但是采用哪一种高级语言来做这件事呢?他的想法是自己去设计一种高级语言。所以就以BCPL语言为基础,又作了进一步的简化,设计出很简单而且很接近硬件的B语言,这个名称取自于BCPL的第一个字母。但是B语言过于简单,是一种没有数据类型的语言,功能很有限。因此,当他试图用B语言来重写UNIX操作系统时,效果并不
32、太好。到了1972年,Ritchie在B语言的基础上又设计出了C语言,这个名称取自于BCPL的第二个字母。C语言既保持了BCPL和B语言的精炼、接近硬件等优点,又克服了它们过于简单、数据无类型等缺点,所以很快就成为研究小组内部的首选编程语言。后来,Ritchie和Thompson两个人合作,把整个UNIX系统用C语言重新写了一遍,这样,以后再需要移植的时候,就方便多了,大部分的系统代码都无需改动。1977年,出现了不依赖于具体机器的C语言编译器,使得把一个C程序从一台机器移植到另一台机器上所需要的工作大大地简化了,这就推动了UNIX操作系统迅速地在各种类型的机器上得以实现。反过来,随着UNIX
33、系统日益广泛的使用,C语言也得到了迅速地推广。所以说,C语言和UNIX系统关系非常密切,在发展过程中它们是相辅相成的。1983年,美国国家标准化协会(ANSI)根据C语言问世以来,各种版本对它的发展和扩充,制定了一个标准,称为ANSI C。1988年,ANSI又公布了新的标准。目前流行的各种C编译系统都是以它为基础。另一方面,1983年,贝尔实验室的另外一个研究员Bjarne Stroustrup,在Algol 68、Simula 67和C语言的基础上,发明了C+语言,它既保持了C语言的面向机器硬件的优点,又具有Algol语言的面向求解问题的优点,因此适合于大规模的程序设计。1.2.2 C语言
34、的特点C语言是一种通用的编程语言,从诞生到现在的三十多年间,取得了长足的发展。可以毫不夸张地说,C语言是迄今为止人类发明的最为成功的计算机语言之一,它对计算机科学和软件产业的发展起着广泛而深刻的影响。这种成功与它的特点密切相关,C语言的主要特点如下。(1)简单。C语言的语法简洁、紧凑,是一个比较小的语言。不管是关键字的命名、变量的定义、运算符的设置,还是程序的结构,处处体现出简洁、紧凑的风格,压缩了一切不必要的成分。如果有两个语言特性的功能是差不多的,那么C语言只保留其中的一个。例如,在C语言中,在描述整型数据类型的时候,使用的是单词缩写int,而不是完整的英语单词integer;在定义一个数
35、组的时候,使用的是数组符号,而不是英语单词array。另外,C语言不支持对组合对象的直接操作。例如,在C语言当中,并没有一个运算符来比较两个字符串的大小,也没有一个运算符来计算一个数组的长度。总之,C语言的基本思路就是能省则省,连专门的输入输出运算符都没有。由于C语言的这种简短、精练的特点,使得人们在学习的时候比较容易入门,只要知道很少的东西就可以开始编程。(2)实用。C语言的语法虽然简洁、紧凑,但表达能力强,使用灵活、方便。如果你是一个C语言高手,那么当你拿到一个问题的时候,能够在很短的时间内写出相应的程序。事实上,当初Ritchie在发明C语言的时候,也是为了编写UNIX操作系统的实际需要
36、。因此,可以说C语言的发明是“by programmer,for programmer”,也就是说,C语言是由职业程序员发明的,也是为职业程序员量身定做的,是职业程序员所使用的语言。所以,C语言的语法简明扼要,对程序员的限制很少,从理论上来说,程序员几乎可以做他们想做的任何事情。另外,C语言还提供了一组标准的库函数,能够帮助程序员完成各种各样的功能,如文件的访问、格式化输入输出、内存分配和字符串操作等。(3)高效。如前所述,C语言是一种高级程序设计语言,但是从某种意义上来说,C语言又是一种“低级”语言,是一种接近于机器硬件的语言。因为从数据类型来看,C语言处理的都是基本的数据类型,如字符、整数
37、、实数和地址等,而计算机硬件一般都能直接处理这些数据对象;从运算符来看,C语言的运算符大都来源于真实的机器指令。例如,对于算术运算符、关系运算符、赋值运算符、指针运算符、位(bit)运算符、自增运算符和自减运算符等,在一般的计算机硬件上,都有与它们相对应的机器指令;从硬件访问来看,C语言可以直接去访问内存地址单元,也可以直接去访问I/O。总之,C语言与硬件的关系非常密切,可以把它看成是汇编语言之上的一层抽象,凡是汇编语言能实现的功能,C语言基本上都能实现。事实上,甚至可以在C语言程序当中直接嵌入汇编语言程序。基于这些原因,人们很容易用C语言来编写出在时间上和空间上效率都很高的程序。根据一项统计
38、,C语言程序生成的目标代码的效率只比汇编语言低10。(4)可移植性好。虽然C语言与机器硬件的关系非常密切,但它并不依赖于某一种特定的硬件平台。事实上,小至PC、大至超级计算机,几乎在所有的硬件平台和操作系统上都有C语言的编译器。这就使得用C语言编写的程序具有很好的可移植性,基本上不做修改就能在不同型号的计算机上运行。由于以上的这些特点,使得C语言在工业界获得了广泛的应用和好评。根据2003年的一项统计,在企业招聘的软件工程师职位当中,有22.7%的职位要求使用C/C+编程,在所有的编程语言中排名第二。1.2.3 C语言的应用领域如前所述,C语言是一种偏向于机器硬件的高级语言,因此它比较适合于底
39、层的系统软件的开发。例如,在操作系统领域,UNIX和Linux的绝大部分代码都是用C语言编写的,只有少量的与硬件直接打交道的代码是用汇编语言编写的,如系统引导程序、底层的设备驱动程序等。对于Windows操作系统,它的大部分代码也是用C语言来编写的,而一些图形用户界面方面的代码则是用C+编写的。在系统软件领域,数据库管理系统、磁盘管理工具乃至一些病毒程序,都是用C语言编写的,尤其是在嵌入式系统领域,根据一项统计,81%的嵌入式系统开发都要用到C语言,远远超过其他的任何一种编程语言。在商业应用领域,例子就更多了,如多媒体播放软件、游戏软件、专家系统软件和绘图软件等。在教学领域,著名的数学软件工具
40、MATLAB就是用C语言来编写的。在数字信号处理领域,也经常用C语言来编程。另外,像数据结构这样的基础课程,以前都是用Pascal语言来教学,现在也都改成了C语言。所以说,学好了C语言以后,不管是对今后的其他一些后继课程,还是对将来的职业发展,都会带来很大的帮助。1.3 一个简单的C程序下面通过一个简单的例子,来回顾一下程序设计的过程,并且看一下,一个典型的C语言程序是个什么样子。1.3.1 问题描述与分析考虑这样的一个问题:判断一个给定的数是奇数还是偶数。对于这个问题,是用人类的自然语言来描述的,而且描述得比较简单,如果把这句话直接提交给计算机,那么计算机是看不懂的,也不知道如何去解决这个问
41、题。所以,必须用某种计算机语言来进行编程,也就是说,用计算机能够看懂的方式来与它交流。那么如何来编程呢?这就要用到前面讲过的4个步骤,即需求分析、算法设计、编码实现和测试调试。从需求分析来看,我们的需求只有一句话:“判断一个给定的数是奇数还是偶数”。从这句话当中,可以派生出一系列的问题。首先,这个数应该是哪一种类型?是实数还是整数?显然应该是整数,因为只有整数才有奇偶之分。其次,对于计算机来说,它怎么样从用户那里得到这个数?另外,什么叫“奇数”?什么叫“偶数”?如何判断一个整数是奇数还是偶数?最后,如果计算机得出了判断的结果,那么怎么样把这个结果通报给用户?从算法设计来看,显然,在刚才提出的这
42、些问题当中,最核心的问题就是如何判断一个整数是奇数还是偶数,对于这个问题,可以采用除2取余法,也就是说,把这个整数除以2,然后看余数是0还是1。例如,对于92 543这个整数,把它除以2,得到的余数为1,这说明它是一个奇数。下面,我们就可以把求解这个问题的思路抽象为算法的形式。(1)计算机接收用户从键盘输入的一个整数。(2)把这个整数除以2。(3)如果得到的余数为0,这说明是一个偶数,因此就在屏幕上显示“该数是偶数”。(4)如果得到的余数为1,这说明是一个奇数,因此就在屏幕上显示“该数是奇数”。当然,求解这个问题的算法并不是唯一的,还可以想出其他的算法。例如,可以采用末位判定法:如果这个整数的
43、末位数是0、2、4、6或8,那么它就是一个偶数;否则,它就是一个奇数。所以说,对于同一个问题,可以设计出不同的算法,从而编写出不同的程序。1.3.2 C语言程序有了算法以后,就可以进入编码实现阶段,写出相应的C语言程序,如下所示。程序1.1/* 本程序的功能:输入一个整数,判断它是奇数还是偶数 */#include <stdio.h>void main( ) int num;/* 用于存放输入的整数 */ int rem;/* 用于存放除2以后的余数 */ /* 从用户处得到该整数 */ printf("请输入一个整数:"); scanf("%d&qu
44、ot;, &num); /* 计算除2以后的余数并输出结果 */ rem = num % 2; if(rem = 0) printf("该数是偶数n"); else printf("该数是奇数n");这个程序的功能就是输入一个整数,然后判断它是奇数还是偶数。以下是它的一次运行结果:请输入一个整数:92543该数是奇数对于上述这个C语言程序,有很多的语法细节现在还不是很清楚,这没有关系,以后会慢慢地介绍,而在这里,只需对该程序有一个大致的了解即可。程序首先定义了两个变量,num和rem,所谓的变量,可以把它想象为一个箱子,既然是箱子,就是用来装东西
45、的。num用来保存用户输入的整数,rem用来保存除2以后的余数。接下来的printf语句,表示在屏幕上显示一行提示信息,即“请输入一个整数:”。接下来的scanf语句表示从用户那里,通过键盘输入得到一个整数,并把它保存在num当中。所以这两条语句,就相当于是完成了刚才所说的算法里面的第1步,即“计算机接收用户从键盘输入的一个整数”,这样一来,就把用自然语言描述的算法步骤,转换为了用计算机语言来描述的程序。接下来,语句“rem = num % 2”表示把保存在num这个变量当中的整数除以2,然后把余数保存在rem当中。这条语句相当于是算法里面的第2步。接下来的if语句判断该余数是否等于0,如果是
46、,表明输入的整数是一个偶数,所以就在屏幕上显示“该数是偶数”这句话;否则,如果余数不等于0,这说明该整数是一个奇数,所以就在屏幕上显示“该数是奇数”这句话。这样一来,就完成了算法的第3步和第4步,也就完成了整个的程序。以上就是该程序的主要功能,下面再以它为例,来简单地介绍一下一个C语言程序的各个组成部分,使读者对C语言程序的整体结构有一个初步的了解。首先,在这个程序当中,我们注意到有几个地方比较特别,如第1行、第5行和第6行的后半部分、第7行等,它们有一个共同的特点,即都是以一个斜杠加一个星号(/*)开头,接下来是一段文字,然后又都是以一个星号加一个斜杠(*/)结尾。我们把这种形式的程序片断称
47、为是注释。所谓的注释,顾名思义,就是说它本身并不会去执行什么具体的操作,它在程序运行时是会被忽略掉的。它的存在主要是用来帮助读者去理解 程序。接下来的第2行“#include <stdio.h>”,这种以符号“#”开头的行,称为编译预处理行,它可以用来设置各种编译预处理命令。如果在“#”后面加上“include”,则表示这是一个文件包含命令,也就是说,把尖括号里面的stdio.h文件的内容包含到当前这个程序当中。stdio.h是系统提供的一个头文件,stdio表示标准输入输出(standard input output)的意思,在这个文件当中,包含了一些与输入输出有关的库函数,有了它之后,才能在程序中进行各种输入输出操作。所以读者在编程时,要记得把这一行代码敲进去。接下来定义了一个main函数。对于任何一个C语言程序来说,不论其大小如何,都是由各种函数所组成的。这就好像小朋友玩搭积木的游戏,每一个函数好比是一种积木,然后把不同的函数组合在一起,就构成了整个的程序。这些函数可以是系统提供的库函数,如本例中的printf和scanf函数,也可以是程序员根据自己的需要来定义的函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电力档案培训课件
- DB36T-批而未用土地清数建库技术指南编制说明
- 2024年农业植保员考试成绩评估标准试题及答案
- 2024年模具设计师考试高效复习法试题及答案
- 2024足球裁判员的职场挑战与试题与答案
- 关于体育经纪人的职业规划试题及答案
- 提高实战水平的2024年足球裁判员试题及答案
- 2024年篮球裁判员重要知识试题及答案
- 2024年农作物种子繁育员考试内容解读试题及答案
- 2024年体育经纪人考试辅导试题及答案
- JGJ59-2011建筑施工安全检查评分表-(完整版)
- 梁思成《千篇一律与千变万化》(课件)
- 《分子生物学》复习考试题库(带答案)
- 阿育吠陀体质测试
- 智能汽车传感器技术-激光雷达
- 2023年四年级奥林匹克英语竞赛试题
- 专利挖掘与技术交底书撰写
- 输液泵、微量泵的使用
- 35kv电缆敷设施工方案正式版
- GB/T 3098.26-2021紧固件机械性能平垫圈
- 四年级安全教育珍爱生命预防溺水安全知识主题班会
评论
0/150
提交评论