《程序设计基础》课件第1章_第1页
《程序设计基础》课件第1章_第2页
《程序设计基础》课件第1章_第3页
《程序设计基础》课件第1章_第4页
《程序设计基础》课件第1章_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章程序设计概述1.1程序工作原理1.2程序设计语言1.3算法概述1.4C语言程序设计习题

1.1程序工作原理

1.1.1冯·诺伊曼原理

一台计算机由硬件系统和软件系统两大部分组成,硬件是计算机的物质基础,而软件是计算机的灵魂。没有软件,计算机只是一台“裸机”,有了软件,计算机才能成为一台真正的“电脑”。而所有的软件,都是用计算机程序设计语言编写的。程序是指计算机可以直接或间接执行的指令的集合。计算机系统通过运行程序来实现各种不同的应用。程序设计语言(ProgrammingLanguage)是一组用来定义计算机程序的语法规则。一种程序设计语言能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。当今的计算机模型是由数学家冯·诺依曼(vonNeumann)提出来的,我们称其为冯·诺依曼模型(vonNeumannModel)或冯·诺依曼机(vonNeumannMachine)。直到今天,几乎所有的计算机都是沿用这一模型设计的。冯·诺依曼机概念基于一个存储器(用来存储指令和数据)、一个控制器(负责从存储器中逐条取出指令)和一个处理器(通过算术或逻辑操作来处理数据),最后的结果必须送回存储器中。可以把这些特点归结为以下几条:

(1)数据或指令以二进制形式存储(数据和指令在外形上没有什么区别,但每一位二进制数字有不同的含义)。

(2)“存储程序”的工作方式(事先要编好程序,执行之前先将程序存放到存储器某个可知的地方)。

(3)程序顺序执行(可强行改变执行顺序)。

(4)存储器的内容可以被修改(存储器的某个单元一旦进入新的数据,则该单元原来的数据立即消失,被新数据代替)。冯·诺依曼体系结构的作用体现在命令式语言的下述三大特性上:

(1)变量存储器由大量的存储单元(MemoryCell,MemoryLocation)组成,数据就存放在这些单元中。汇编语言通过对存储单元的命名来访问数据。在命令式语言中,存储单元及它的名称由变量(Variable)的概念代替。变量代表一个(或一组)命名的存储单元,单元可存放值,值可以被修改。

(2)赋值使用存储概念的另一个后果是每一计算结果必须存储,即赋值于某个存储单元,从而改变该单元的值。

(3)重复语句按顺序执行,指令存储在有限的存储器中,要完成任何复杂的计算,唯一的办法是重复执行某些指令序列。

冯·诺依曼型计算机的两大特征是“程序存储”和“采用二进制”。具体地说,在上述计算机中,要实现机器的自动计算,必须先根据题目的要求,编制出求解该问题的计算程序,并通过输入设备将该程序存入计算机的存储器中,称之为“程序存储”。在计算机中,计算程序及数据是用二进制代码表示的,计算机只能存储并识别二进制代码表示的计算程序和数据,称之为“采用二进制”。

冯·诺伊曼思想实际上是电子计算机设计的基本思想,奠定了现代电子计算机的基本结构,开创了程序设计的时代。1.1.2计算机的构成原理

电子计算机硬件通常由5大功能部件组成:存储器、运算器、控制器、输入设备和输出设备,5大部件通过总线有机地连接在一起组成计算机的硬件系统。

运算器用来实现算术、逻辑等各种运算。

存储器用来存放计算程序及参与运算的各种数据。存储器可以分为内存储器(内存)和外存储器(外存)。

控制器实现对整个运算过程的有规律的控制。

输入设备实现计算程序和原始数据的输入。

输出设备实现计算结果的输出。随着制造计算机的器件的发展,特别是微机的发展,产生了中央处理器(CPU)。CPU中包括运算器和控制器。

计算机工作时要预先把指挥计算机如何进行操作的指令序列(通常称为程序)和原始数据通过输入设备输入到计算机的内部存储器中。每一条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地址等步骤。计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定的操作。依此进行下去,直至遇到停止指令。简而言之,即将程序与数据一样存储,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作。

我们把按照冯·诺依曼原理构造的计算机叫冯·诺依曼计算机,其体系结构称为冯·诺依曼结构。目前计算机已发展到了第五代,基本上仍然遵循着冯·诺依曼原理和结构。

1.2程序设计语言

1.2.1程序设计语言的发展

语言是人们交流思想的工具。人类在长期的历史发展过程中,为了交流思想、表达感情和交换信息,逐步形成了语言。这类语言,如汉语和英语,通常称为自然语言。另一方面,人们为了某种专门用途,创造出种种不同的语言,这类语言通常称为人工语言。专门用于编制计算机程序的各种人工语言称为程序设计语言(ProgramingLanguage)。程序设计语言按照语言级别可以分为低级语言和高级语言。低级语言包括机器语言和汇编语言。低级语言与特定的机器有关,其功效高,但使用复杂、繁琐、费时、易出差错。机器语言是表示成数码形式的机器基本指令集。汇编语言是机器语言部分符号化的结果。高级语言的表示方法要比低级语言更接近于待解问题的表示方法,其特点是在一定程度上与具体机器无关,易学、易用、易维护。

计算机的每一个动作、每一个步骤都是按照已经编好的程序来执行的,而程序需要用人们能掌握的语言来编写,于是出现了程序设计语言。计算机程序设计语言的发展经历了从机器语言、汇编语言到高级语言的历程。

1.机器语言

电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机语言的基础。计算机发明之初,人们只能用计算机的语言去命令计算机工作,也就是写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言就是机器语言。使用机器语言编写程序是一件十分繁琐的工作,特别是在程序有错需要修改时更加困难,而且编出的程序不便于记忆、阅读和书写,还容易出错。由于每台计算机的指令系统往往各不相同,因此在一台计算机上执行的程序要想在另一台计算机上执行,必须另编程序,可移植性较差,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而机器语言运算效率是所有语言中最高的。机器语言是第一代计算机语言。

2.汇编语言

为了克服机器语言难读、难编、难记和易出错的缺点,人们用与代码指令实际含义相近的英文缩写词、字母和数字等符号取代指令代码,例如用ADD代表加法,用MOV代表数据传递等。这样,人们能较容易读懂并理解程序,使得纠错及维护变得方便了。这种程序设计语言称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序负责将这些符号翻译成二进制数的机器语言,这种翻译程序称为汇编程序。汇编语言仍然是面向机器的语言,使用起来还是比较繁琐,通用性也差。汇编语言是低级语言。但是,用汇编语言编写的程序,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。

3.高级语言

不论是机器语言还是汇编语言,都是面向硬件具体操作的,对机器过分依赖,要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员来说是难以达到的,对计算机的推广应用不利。计算机事业的发展促使人们寻求一些与人类自然语言相接近且能为计算机所接受的通用易学的计算机语言。这种与自然语言相近并被计算机接受和执行的计算机语言称为高级语言。高级语言是面向用户的语言。无论何种机型的计算机,只要配备上相应高级语言的编译或解释程序,则用该高级语言编写的程序就可以运行。

1954年,第一个完全脱离机器硬件的高级语言FORTRAN问世了,自此之后,共有几百种高级语言出现,其中有重要意义的有几十种,影响较大、使用较普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、Java等。高级语言的出现使得计算机程序设计语言不再过度地依赖某种特定的机器或环境。这是因为高级语言在不同的平台上会被编译成不同的机器语言,而不是直接被机器执行的。计算机并不能直接地接受和执行用高级语言编写的源程序。高级语言源程序在输入计算机时,通过“翻译程序”翻译成机器语言形式的目标程序,计算机才能识别和执行。这种“翻译”通常有两种方式,即编译方式和解释方式。编译方式是指在源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.obj)才能执行。

解释方式是应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器。但这种方式比较灵活,可以动态地调整、修改应用程序。高级语言的发展经历了从早期语言到结构化程序设计语言,从面向过程到非过程化程序语言的过程。20世纪60年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是各自为政,缺乏科学规范的系统规划与测试、评估标准。其结果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可靠,以致几乎没有不出错的软件。这一切,极大地震动了计算机界,历史上称之为“软件危机”。人们认识到:大型程序的编制不同于小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。1969年,提出了结构化程序设计方法;1970年,第一个结构化程序设计语言Pascal出现,标志着结构化程序设计时期的开始。

4.面向对象程序设计语言

20世纪80年代初开始,在软件设计思想上,又产生了一次革命,其成果就是面向对象的程序设计。在此之前的高级语言,几乎都是面向过程的,程序的执行是流水线式的,在一个模块被执行完成前,计算机不能干别的事,也无法动态地改变程序的执行方向。这和人们日常处理事物的方式是不一致的。对人而言,希望发生一件事就处理一件事,也就是说,不能面向过程,而应是面向具体的应用功能,也就是面向对象(Object)。面向对象程序设计(ObjectOrientedProgramming)语言与以往各种编程语言的根本区别是程序设计思维方法不同。面向对象程序设计可以更直接地描述客观世界存在的事物(即对象)及事物之间的相互关系。面向对象技术强调的基本原则是直接面对客观事物本身进行抽象并在此基础上进行软件开发,将人类的思维方式与表达方式直接应用在软件设计中。1.2.2典型高级语言

目前有各种高级程序设计语言,其中以下几种应用非常广泛。

FORTRAN,全称为FormulaTranslator,意即公式翻译。它是一种适用于科学计算的高级程序设计语言。

COBOL,全称为CommonBusinessOrientedLanguage,意即通用商业语言。它是适用于数据处理的高级程序设计语言。

BASIC,全称为Beginner’sAll-purposeSymbolicInstructionCode,意即初学者通用符号指令代码。这是一种简单易学,具有会话功能的,适用于科学计算、数据处理和实时处理的程序设计语言。1964年由美国达尔摩斯学院的基米尼和科茨完成设计并提出了BASIC语言的第一个版本,后经过不断丰富和发展,从基本的BASIC发展到GWBASIC、QuickBASIC、TrueBASIC、TurboBASIC、VisualBasic等。VisualBasic是一个基于Windows操作系统的面向对象的可视化集成开发环境和程序设计语言,它既有传统BASIC易学、易懂、易记、易用的特点,又有面向对象、可视化设计、事件驱动、动态数据交换等特点。

Pascal是一种结构化程序设计语言,由瑞士苏黎世联邦工业大学的沃斯教授研制,于1971年正式发表。它是以ALGOL语言为基础,按照结构化程序设计原则设计出来的,它的优点是小巧、简洁、结构清晰、表达能力强、实现效能高。Pascal既重视数据结构,又重视程序的结构,具有大量的控制结构,充分反映了结构化程序设计的思想和要求,直观易懂,使用灵活,既可用于科学计算,又能用来编写系统软件。它适用于科学计算、数据处理和描述系统软件。

C语言是由美国贝尔实验室提出的。1973年首先用于编写UNIX操作系统。C程序易读,程序效率很高,适于描述操作系统、编译程序和各种软件工具,已得到广泛的应用。C语言的主要特色是兼顾了高级语言和汇编语言的特点,简洁、丰富、可移植。C语言提供了结构式编程所需要的各种现代化的控制结构。C语言是一种通用编程语言,使用C语言编写程序,既能感觉到使用高级语言的自然,也能体会到利用计算机硬件指令的直接。

LISP是一种表处理语言,是20世纪50年代末60年代初为解决人工智能问题而发展起来的一种高级程序设计语言。LISP的理论基础是数理逻辑,它很简单又有很强的表达能力。

Java是Sun公司推出的一种编程语言。它是一种通过解释方式来执行的语言,语法规则和C++ 类似。同时,Java也是一种跨平台的程序设计语言。Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一。Java有许多优点:简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等。1.2.3程序设计语言发展趋势

程序设计语言是软件的重要方面。它的发展趋势是可视化、智能化和构件化。

1.可视化程序设计技术

随着Windows操作系统的广泛推广与应用,它的可视化图形界面与所见即所得的视觉效果越来越成为编程语言效仿的典范。典型的可视化程序设计语言集成环境有Microsoft公司提供的VisualStudio系列等。Windows系统本身就提供了相应的接口功能与系统调用供程序开发者使用,所以可视化程序设计技术成为程序设计语言发展的一个趋势。

2.智能化程序设计技术

程序设计技术的智能化主要体现在第4代程序设计语言中,它改变了传统的完全手工的编程工作方式,而将编程变成了提问式与填空式的工作方式。在系统给出部分甚至大部分代码以后,由程序员填入适当的其他内容而完成整个编程工作,这样的工作方式不仅提高了编程工作效率,而且避免了很多在传统手工方式中存在或容易出现的错误。

3.构件化程序设计技术

以面向对象程序设计为基础,在可视化程序设计语言集成环境的支持下,还出现了构件化程序设计的趋势。程序设计过程中以标准的构件为基本单位来构造一个完整的程序,这种工作类似于房屋建筑过程中以砖和瓦为基本单位,只需将它们放置到合适的位置并固定就可以了。而构件就相当于程序设计过程中的砖和瓦,完成对构件属性的定义和操作的说明就完成了所有编程工作。

1.3算法概述

著名计算机科学家沃思提出一个公式:

程序 = 数据结构 + 算法

其中,数据结构是对程序中数据的描述,主要是数据的类型和数据的组织形式;算法是对程序中操作的描述,即操作步骤。数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。算法是灵魂,数据结构是加工对象。

1.算法的基本概念

在日常生活中,人们处理问题都有一定的步骤。例如考大学就要有这样的步骤:要填报名单,交报名费,拿到准考证,再参加考试,填报志愿,得到录取通知书。这些步骤都按一定的次序进行,缺一不可,次序错了也不行。广义地说,为解决一个问题而采取的方法和步骤,就称为算法。算法解决“做什么”和“怎么做”的问题。计算机算法是用计算机求解一个具体问题或执行特定任务的一组有序的操作步骤(或指令)。解决一个问题,可以有不同的方法和步骤。一般来说,希望采用简单的和运算步骤少的方法。不仅要保证算法正确,还要考虑算法的质量,选择合适的算法。算法是根据问题定义中的信息得来的,是对问题处理过程的进一步细化,但它不是计算机可以直接执行的,只是编制程序代码前对处理思想的一种描述,因此它是独立于计算机的,但它的具体实现是在计算机上进行的。

2.算法的特性

一个算法应该具有以下5个重要的特征。

(1)有穷性:一个算法必须保证执行有限步之后结束。在执行有限步之后,计算必须终止,并得到解答。也就是说,一个算法的实现应该在有限的时间内完成。

(2)确切性:算法的每一步骤必须有确切的定义。算法中对每个步骤的解释是唯一的。

(3)零个或多个输入:输入指在执行算法时需要从外界取得的必要的信息。一个算法有零个(即没有)或多个输入,以刻画运算对象的初始情况。

(4)一个或多个输出:输出是算法的执行结果。一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。

(5)有效性:又称可行性。算法中的每一个步骤能够精确地运行,并得到确定的结果,即用笔和纸通过有限次运算可完成。

3.算法的描述

算法的常用表示方法有如下几种:

(1)使用自然语言描述算法;

(2)使用流程图描述算法;

(3)使用N-S结构图表示算法;

(4)使用伪代码描述算法。

下面以求解n!=1×2×3×4×5×…×(n-1)×n为例说明算法的3种描述方法。第1种:使用自然语言描述求n!的算法。

①确定一个n的值;

②假设等号右边的算式项中的初始值i为1;

③假设变量f中存放n!的值,且初始值为1;

④ i≤n时,执行⑤,否则转出执行⑧;

⑤计算f乘以i的值后,重新赋值给f;

⑥计算i加1,然后将值重新赋值给i;

⑦转去执行④;

⑧输出f的值,即n! 的值,算法结束。从上面的这个描述的求解过程中不难发现,使用自然语言描述算法的方法虽然比较容易掌握,但是存在着很大的缺陷。例如,当算法中含有多分支或循环操作时很难表述清楚。另外,使用自然语言描述算法还很容易造成歧义(称之为二义性),可能使他人对相同的一句话产生不同的理解。

第2种:使用流程图描述求n!的算法,如图1-1所示。图1-1求n!的算法流程图从图1-1中,可以比较清晰地看出求解问题的执行过程。流程图用一些图框表示各种操作。用图形表示算法,直观形象,易于理解。在进一步学习使用流程图描述算法之前,有必要对流程图中的一些常用符号做一个解释。流程图的符号如表1-1所示。表1-1流程图的符号流程图的缺点是在使用标准中没有规定流程线的用法,因为流程线能够转移、指出流程控制方向,即算法中操作步骤的执行次序。在早期的程序设计中,曾经由于滥用流程线的转移而导致了可怕的“软件危机”,震动了整个软件业,并展开了关于“转移”用法的大讨论。

第3种:使用N-S结构图描述求n! 的算法。

针对传统流程图存在的问题,美国学者I.Nassi和B.Shneiderman于1973年提出一种新的结构化流程图形式,即N-S结构图。Chapin在1974年对其进行了进一步扩展,因此,N-S结构图又称为Chapin图或盒状图。

N-S结构图的主要特点是完全取消了流程线,不允许有随意的控制流,全部算法写在一个矩形框内,该矩形框以3种基本结构(顺序、选择、循环)描述符号为基本复合而成。

无论是使用自然语言还是使用流程图描述算法,都仅仅是表述了编程者解决问题的一种思路,无法被计算机直接接受并操作。由此引进了第4种非常接近于计算机编程语言的算法描述方法——伪代码。第4种:使用伪代码描述求n! 的算法。

算法开始:

输入n的值;

置i的初值为1;

置f的初值为1;

当i<= n时,执行下面的操作

使f= f*i;

使i=i+1;

(循环体到此结束)

输出f的值;

算法结束也可以写成以下形式:

BEGIN /*算法开始*/

输入n的值;

i←1; /*为变量i赋初值*/

f←1; /*为变量f赋初值*/

whilei<=n

/*当变量i<=n时,执行下面的循环体语句*/

{f←f*i;

i←i+1;}

输出f的值;

END /*算法结束*/伪代码是一种在书写程序或描述算法时使用的非正式、透明的表述方法,它并非是一种编程语言。这种方法针对的是一台虚拟的计算机。伪代码通常采用自然语言、数学公式和符号来描述算法的操作步骤,同时采用计算机高级语言(如C、Pascal、VB、C++、Java等)的控制结构来描述算法步骤的执行顺序。伪代码书写格式比较自由,容易表达出设计者的思想,写出的算法很容易修改。但是用伪代码写的算法不如流程图直观,可能会出现逻辑上的错误。

4.算法分析

对于同一个问题可以设计出不同的算法,各种算法之间肯定有是否适合和“好”“差”之分。衡量一个适合的、“好”的算法,在其必须是正确的基础上,还应遵循下列几个方面:

(1)易读性:算法应易于阅读和理解,以便于调试、修改和扩充。

(2)高效性:算法应具有较高的时间效率和空间效率,即占用较短的执行时间和较少的存储空间。当然,这两者都和问题的规模有关。

(3)健壮性:正确的输入能得到正确的输出,这是算法必须具有的特性之一。但当遇到非法输入时,算法应能做出反应或处理(如提示信息等),而不会产生不需要的或不正确的结果。

例如,在算法中总是采用较简单的方法以及模块化函数以增强算法的易读性;采用步骤较少的求解方法以提高算法的时间效率;对可能发生的各种现象及输入形式给出应对措施以提高算法的健壮性。要确定一个算法是适合的、“好”的算法,就需要进行算法分析。算法分析的两个主要方面是分析算法的时间效率和空间效率,目的是以求改进算法或对不同的算法进行比较。鉴于目前情况下运算空间较为充足,我们把算法的时间效率分析作为主要内容。

算法运行的时间分析和程序运行的时间分析是有区别的。同一算法由不同的程序员所编写的程序有优劣之分,程序运行的时间也就有所不同;程序在不同的机器上运行的速度又和机器本身的速度有关。而我们感兴趣的是对解决问题的算法作时间上的度量分析,或对解决同一问题的两种或两种以上的算法运行时间加以比较。

1.4C语言程序设计

1.4.1C语言的发展历史

C语言是国际上流行的、很有发展前途的计算机高级语言。C语言适合作为“系统描述语言”。它既可以用来编写系统软件,也可以用来编写应用程序。以前操作系统等系统软件主要采用汇编语言编写。汇编语言依赖于计算机硬件,程序的可读性、可移植性都比较差。为了提高可读性和可移植性,人们希望采用高级语言编写这些软件,但是一般的高级语言难以实现汇编语言的某些操作,特别是针对硬件的一些操作(如内存地址的读写,直接硬件、二进制位的操作)。人们设法寻找一种既具有一般高级语言特性,又具有低级语言特性的语言,C语言就在这种情况下应运而生。

C语言的发展如下:

ALGOL60→CPL→BCPL→B→C→标准C→ANSIC→ISOC

ALGOL60:一种面向问题的高级语言。ALGOL60离硬件较远,不适合编写系统程序。

CPL(CombinedProgrammingLanguage,组合编程语言):CPL是一种在ALGOL60基础上发展出来的更接近硬件的语言。CPL规模大,实现困难。

BCPL(BasicCombinedProgramminglanguage,基本的组合编程语言):BCPL是对CPL进行简化后的一种语言。

B语言:B语言是对BCPL进一步简化所得到的一种很简单的接近硬件的语言。B语言取BCPL语言的第一个字母。B语言精练、接近硬件,但过于简单,数据无类型。B语言诞生后,UNIX开始用B语言改写。

C语言:C语言是在B语言基础上增加数据类型而设计出的一种语言。C语言取BCPL的第二个字母。C语言诞生后,UNIX很快用C语言改写,并被移植到其他计算机系统。

标准C、ANSIC、ISOC:标准化的C语言。

最初UNIX操作系统是采用汇编语言编写的,B语言版本的UNIX是第一个用高级语言编写的UNIX。在C语言诞生后,UNIX很快用C语言改写,C语言良好的可移植性很快使UNIX从PDP计算机移植到其他计算机平台,随着UNIX的广泛应用,C语言也得到推广。从此C语言和UNIX像一对孪生兄弟,在发展中相辅相成,UNIX和C很快风靡全球。从C语言的发展历史可以看出,C语言是一种既具有一般高级语言特性(ALGOL60带来的高级语言特性),又具有低级语言特性(BCPL带来的接近硬件的低级语言特性)的程序设计语言。C语言从一开始就是用于编写大型、复杂系统软件的,当然C语言也可以用来编写一般的应用程序。也就是说,C语言是程序员的语言。

IBMPC微机DOS、Windows平台上常见的C语言版本有Borland公司的TurboC、TurboC++、BorlandC++,C++Builder(Windows版本),以及Microsoft公司的MicrosoftC,VisualC++(Windows版本)等。1.4.2C语言的特点

C语言具有下列特点(其中(1)~(6)属于高级语言特性,(7)、(8)属于低级语言特性):

(1) C语言的语言成分简洁、紧凑,书写形式自由。

将C语言程序段与实现同样功能的Pascal语言程序段进行比较,如表1-2所示。表1-2C语言程序段与Pascal语言程序段的比较

(2) C语言拥有丰富的数据类型。C语言具有整型、实型、字符型、数组类型、指针类型、结构体类型、共同体类型等数据类型,能方便地构造更加复杂的数据结构(如使用指针构造链表、树、栈)。

(3) C语言的运算符丰富,功能更强大。

①C语言具有复合的赋值运算符“+[-*/%]=”(加等、减等、乘等、除等),“>>=”“<<=”(右移等、左移等),“&[||!]=”(与等、或等、非等)。

x+=5等价于x=x+5

②C语言有条件运算符“?:”,可代替简单的if/else语句。如果需要表示:“如果x小于或等于0,则y为0;否则y为1”可以采用:

y=x<=0?0:1;

如果用一般的程序设计语言表示,就应该像下面这样表示:

if(x<=0)y=0;

elsey=1;

C语言避免了一切可能的啰嗦。③C语言中连赋值这种操作都定义为运算符,也就是说赋值操作本身可以作为表达式的一部分,参与运算。如:

if((p=malloc(sizeof(int)))==NULL){printf(“Error!”);exit(1);}

改写为一般形式:

p=malloc(sizeof(int));

if(p==NULL){printf(“Error!”);exit(1);}

又如下面算式是正确的:

x=y=z=6;

改写为一般形式:

z=6;y=6;x=6;

(4) C语言是结构化的程序设计语言。C语言具有结构化的控制语句(if/else,switch/case,for,while,do…while)。函数是C语言程序的模块单位。

(5) C语言对语法限制不严格,程序设计灵活。

C语言不检查数组下标越界,不限制对各种数据的转化(编译系统可能对不合适的转化进行警告,但不限制),不限制指针的使用,程序正确性由程序员保证。实践中,C语言程序编译时会提示“警告错”或“严重错误”。警告错表示使用的语法可能有问题,但有时可以忽略,程序仍然可以完成编译工作,然后运行。(但是一般情况下警告错往往意味着程序真的有问题,应该认真地检查。)“严重错误”是不能忽略的,编译系统发现严重错误,就不会产生目标代码。灵活和安全是一对矛盾,对语法限制的不严格可能也是C语言的一个缺点,比如黑客可能使用越界的数组攻击计算机系统。Java语言是优秀的网络应用程序开发语言,它绝对不允许数组越界。此外Java不使用指针,不能直接操作客户计算机上的文件,语法检查相当严格,程序正确性容易保证,但是Java在编程时却缺乏灵活性。

(6) C语言编写的程序具有良好的可移植性。用C语言编制的程序基本上不需要修改或只需要少量修改就可以移植到其他的计算机系统或其他的操作系统。

(7) C语言可以实现汇编语言的大部分功能。C语言可以直接操作计算机硬件,如寄存器、各种外设I/O端口等。C语言的指针可以直接访问内存物理地址。C语言类似汇编语言的位操作可以方便地检查系统硬件的状态。C语言适合编写系统软件。

(8) C语言编译后生成的目标代码小,质量高,程序的执行效率高。有资料显示,C语言编译后生成的目标代码只比汇编代码效率低10%~20%。1.4.3C语言程序基本结构

1.C语言字符集

字符是C语言最基本的元素。C语言字符集由字母、数字、空白、标点和特殊字符组成(在字符串常量和注释中还可以使用汉字等其他图形符号)。由字符集中的字符可以构成C语言进一步的语法成分(如标识符、关键词、运算符等)。

(1)字母:A~Z,a~z。

(2)数字:0~9。

(3)空白符:空格、制表符(跳格)、换行符(空行)的总称。空白符除了在字符、字符串中有意义外,编译系统忽略其他位置的空白。空白符在程序中只是起到间隔作用。在程序的恰当位置使用空白将使程序更加清晰,增强程序的可读性。

(4)标点符号、特殊字符。

(5)标识符(名字):用来标识变量名、符号常量名、函数名、数组名、类型名等实体(程序对象)的有效字符序列。标识符由用户自定义(取名字)。

2.C语言标识符定义规则

(1)标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。例如:

合法的标识符:Sum,average,_total,Class,day,stu_name,p4050

不合法的标识符:M.D.John,$123,#33,3D64,a>b

(2)大小写敏感。C程序员习惯变量名小写,常量名大写。例如:sum不同于Sum,BOOK不同于book。

(3) ANSIC没有限制标识符长度,但各个编译系统都有自己的规定和限制(TC为32个字符,MSC为8个字符)。例如:student_name和student_number,如果取8个字符,则这两个标识符是相同的。

(4)标识符不能与“关键词”同名,也不能与系统预先定义的“标准标识符”同名。

建议标识符命名应当有一定的意义,做到见名知义。

3.关键词(保留字)

关键词是C语言规定的具有特定意义的字符串。

4.运算符

运算符将常量、变量、函数连接起来组成表达式,表示各种运算。运算符可以由一个或多个字符组成。运算符根据参与运算的操作数的个数分为单目、双目和三目运算符。

5.分隔符

分隔符包括逗号和空格,起分隔、间隔作用。

6.注释符

“/*”和“*/”构成一组注释符。编译系统将“/*”和“*/”之间的所有内容看做注释。编译时编译系统忽略注释。

(1)注释在程序中的作用是提示或解释。

注释与软件的文档同等重要,要养成使用注释的良好习惯,这对软件的维护相当重要。程序是要给别人看的,自己也许还会看自己几年前编制的程序(相当于别人看程序),清晰的注释有助于他人理解程序、算法的思路。

(2)在软件开发过程中,还可以将注释用于程序的调试——暂时屏蔽一些语句。

例如,在调试程序时暂时不需要运行某段语句,而又不希望从程序中删除它们,则可以使用注释符将这段程序框起来,暂时屏蔽这段程序,在以后可以方便地恢复。7.程序基本组成

下面通过一些简单例子来说明C程序的基本组成。

/*源程序1-1*/

main()

{

printf(“ThisisaCprogram.\n”);

}

说明:本程序的功能是输出一行信息:

ThisisaCprogram.

main表示“主函数”。每个C语言程序都必须有一个main函数,它是每一个C语言程序的执行起始点(入口点)。main()表示“主函数”main的函数头。

用{}括起来的是“主函数”main的函数体。main函数中的所有操作(或语句)都在这一对{}之间。也就是说,main函数的所有操作都在main函数体中。

“主函数”main中只有一条语句,它是C语言的库函数,功能是用于程序的输出(显示在屏幕上)。本例用于将一个字符串“ThisisaCprogram.\n”的内容输出,即在屏幕上显示如下内容:

ThisisaCprogram.

_(回车/换行)

注意:每条语句都要用“;”号结束。

/*源程序1-2*/

main() /*计算两数之和*/

{

inta,b,sum; /*这是定义变量*/

a=123;b=456; /*以下3行为C语句*/

sum=a+b;

printf(“sum=%d\n”,sum);

}说明:本程序计算两数之和,并输出结果。

同样,此程序也必须包含一个main函数作为程序执行的起点。{}之间为main函数的函数体,main函数所有操作均在main函数体中。

/* 和 */ 括起来的部分是一段注释,注释只是为了改善程序的可读性,在编译、运行时不起作用(事实上编译时会跳过注释,目标代码中不会包含注释)。注释可以放在程序任何位置,并允许占用多行,只是需要注意“/*”和“*/”匹配,一般不要嵌套注释。

inta,b,sum;是变量声明,声明了3个具有整数类型的变量a、b、sum。C语言的变量必须先声明再使用。

a=123;b=456;是两条赋值语句。将整数123赋给整型变量a,将整数456赋给整型变量b。a、b两个变量分别为123、456。

注意这是两条赋值语句,每条语句均用“;”结束。

也可以将这两条语句写成两行,即:

a=123;

b=456;

由此可见,C语言程序的书写相当随意,但是为了保证容易阅读,要遵循一定的规范。

sum=a+b;是将a、b两变量内容相加,然后将结果赋值给整型变量sum。此时sum的内容为579。

printf(“sum=%d\n”,sum);是调用库函数输出sum的结果。%d为格式控制,表示sum的值以十进制整数形式输出。

程序运行后,输出(显示)如下内容:

sum=579

_(回车/换行)

/*源程序1-3*/

main() /*主函数*/

{ /*main函数体开始*/

inta,b,c;/*声明部分定义变量*/

scanf(“%d,%d”,&a,&b);

c=max(a,b);/*调用max,将调用结果赋给c*/printf("max=%d",c);

} /*main函数体结束*/

intmax(intx,inty) /*计算两数中较大的数*/

{ /*max函数体开始*/

intz; /*声明部分,定义变量*/

if(x>y)z=x;

elsez=y;

returnz; /*将z值返回,通过max带回调用处*/

} /*max函数体结束*/说明:输入两个整数,计算两者较大的数,并输出。

本程序包括两个函数。其中主函数main仍然是整个程序执行的起点。函数max计算两数中较大的数。

主函数main调用scanf函数获得两个整数,存入a、b两个变量,然后调用函数max获得两个数字中较大的值,并赋给变量c。最后输出变量c的值(结果)。

intmax(intx,inty)是函数max的函数头。函数max的函数头表明此函数获得两个整数,返回一个整数。

函数max同样也用{}将函数体括起来。max的函数体是函数max的具体实现。从参数表获得数据,处理后得到结果z,然后将z返回调用函数main。本例还表明:除了可以调用库函数外,还可以调用用户自己定义、编制的函数。

综合上述三个例子,我们对C语言程序的基本组成和形式(程序结构)有了一个初步了解:

(1) C程序由函数构成(C是函数式的语言,函数是C程序的基本单位)。

一个C源程序至少包含一个main函数,也可以包含一个main函数和若干个其他函数。函数是C程序的基本单位。

被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编写设计的函数。C是函数式的语言,程序的全部工作都是由各个函数完成的。编写C程序就是编写一个个函数。

C函数库非常丰富,ANSIC提供100多个库函数,TurboC提供300多个库函数。

(2) main函数(主函数)是每个程序执行的起始点。

一个C程序总是从main函数开始执行的,而不论main函数在程序中的位置如何。可以将main函数放在整个程序的最前面,也可以放在整个程序的最后,或者放在其他函数之间。

(3)一个函数由函数首部和函数体两部分组成。

①函数首部:一个函数的第一行。

返回值类型函数名([函数参数类型1函数参数名1]

[,…,函数参数类型2,函数参数名2])注意:函数可以没有参数,但是后面的一对()不能省略,这是格式的规定。

②函数体:函数首部下用一对{}括起来的部分。如果函数体内有多个{},则最外层是函数体的范围。函数体一般包括声明部分和执行部分两部分。

{

[声明部分]:在这部分定义本函数所使用的变量。

[执行部分]:由若干条语句组成命令序列(可以在其中调用其他函数)。

}

(4) C程序书写格式自由,一行可以写几个语句,一个语句也可以写在多行上。

C程序没有行号,也没有FORTRAN、COBOL那样严格规定的书写格式(语句必须从某一列开始)。

C语言每条语句的最后必须有一个分号“;”表示语句的结束。

可以使用 /* … */ 对C程序中的任何部分作注释。注释可以提高程序可读性,使用注释是编程人员的良好习惯。实践中,编写好的程序往往需要修改、完善,事实上没有一个应用系统是不需要修改、完善的。很多人会发现自己编写的程序在经历了一些时间以后,由于缺乏必要的文档和注释,最后连自己都很难再读懂,需要花费大量时间重新思考、理解原来的程序。这浪费了大量的时间。如果一开始编程就对程序进行注释,虽然刚开始麻烦一些,但日后可以节省大量的时间。

一个实际的系统往往由多人合作开发,程序文档和注释是其中重要的交流工具。

8.输入/输出

C语言本身不提供输入/输出语句,输入/输出的操作是通过调用库函数(scanf,printf)完成的。

输入/输出操作涉及具体计算机硬件,把输入/输出操作放在函数中处理,可以简化C语言和C的编译系统,便于C语言在各种计算机上实现。不同的计算机系统需要对函数库中的函数做不同的处理,以便实现同样或类似的功能。

不同的计算机系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。因此不同计算机系统提供的函数数量和功能会有一定差异。1.4.4C语言程序的开发环境

由高级语言编写的程序称为源程序。由于CPU只能直接理解机器语言,不能直接理解源程序,因此由高级语言编写的源程序必须经编译或解释加工以后才能被计算机理解。把源程序“翻译”为机器语言的过程称为“编译(compile)”,使用称为“编译程序(compiler)”的程序完成编译任务。编译程序把程序员编写的类自然语言的源程序文件翻译为机器指令,并以目标文件(*.obj)的形式存放在磁盘上。目标文件不能装入内存运行,必须使用“连接程序(如link.exe)”连接为可执行程序文件(*.exe)后才能被执行。高级语言编程步骤如图1-2所示。图1-2高级语言编程步骤下面以源程序1-3为例说明C程序的上机方法。程序文件名为2.C,C程序开发环境为VisualC++6.0。

1.启动VisualC++6.0开发环境

从“开始”菜单中选择“程序\MicrosoftVisualStudio6.0\

MicrosoftVisualC++6.0”,启动VC++,显示VisualC++6.0开发环境窗口,如图1-3所示。图1-3VisualC++6.0开发环境窗口

2.创建一个新项目

(1)单击“文件(File)”菜单中的“新建(New)”选项,显示“新建”对话框,如图1-4所示。选择对话框中的“工程(Project)”选项卡,以便生成新的工程。在产生新工程时,系统自动生成一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论