C语言程序设计教程(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2021-03-07 11:17:36

点击下载

作者:张敏霞,孙丽凤,等

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

C语言程序设计教程(第2版)

C语言程序设计教程(第2版)试读:

前言

计算机程序设计基础是高等学校各专业开设的一门必修的计算机基础课程,课程的重点在于培养学生的程序设计思想和程序设计能力,以适应当今社会对人才的需求。C语言由于其自身简洁、紧凑和灵活的特点,以及具备其他高级语言所不具备的低级语言的特性,而使得它成为一种在计算机软件设计和计算机程序设计教学中备受欢迎的程序设计语言。

本书是作者多年教学经验和应用C语言体会的结晶,根据教育部高教司非计算机专业计算机教学指导分委员会提出的高等学校计算机基础课程教学基本要求,在广泛参考有关资料的基础上编写而成。

内容分为基础篇、提高篇和实验篇。

基础篇主要包括程序设计和C语言基础知识,以及顺序、选择和循环三种结构化程序设计基本结构的C语言实现,使读者初步建立起利用C语言进行简单程序设计的思想,学会进行简单程序设计。

提高篇主要包括函数、编译预处理、数组等构造型数据类型、指针类型及对文件的操作,使读者理解并体会C语言模块化的编程思想及对数组、指针类型的应用,学会使用构造型数据类型和指针类型处理问题,学会对文件进行操作。

实验篇共设计了10个实验,采用循序渐进的方式引导读者掌握C语言程序设计的特点,详细的上机实践练习,便于读者深入理解语法和培养程序设计能力。在实验篇的最后还设计了若干综合性实验项目以开拓读者的思路,激发读者的学习兴趣。

同时本书在编写时兼顾了全国计算机等级考试的要求。

本书在结构组织上合乎学习逻辑,内容循序渐进,每个知识点的介绍都以引起读者的学习热情和兴趣为出发点,以提高读者的程序设计思想和能力为目标,既注重理论知识,又突出实用性。书中例题丰富,注重实用,且均在Visual C++6.0环境下调试通过。各章均配有丰富的习题,以帮助读者深入理解教材内容,巩固基本概念,达到培养良好的程序设计能力和习惯的目的。

本书可作为高等学校本科、高职高专软件专业及相关专业程序设计的入门教材,也可作为全国计算机等级考试的辅导教材,还可供广大程序设计初学者自学使用。

本书具有以下特点:

① 突出算法理解,重视实际操作。

② 加强对学生程序设计思想和实际编程能力的培养,以适应信息社会对人才的需求。

③提供多样式的学习环境。本书同时提供丰富的教学资源,包括课程学习网站(http://211.64.192.109/jpkc)、例题源代码、配套教学用多媒体电子课件及习题指导与参考答案。例题源代码、配套教学用多媒体电子课件及习题指导与参考答案,请登录华信教育资源网(http://www.hxedu.com.cn)注册下载。

④ 注重可读性。本书的编写小组由具有丰富的教学经验,多年来一直从事计算机基础教育的一线资深教师组成,教材内容组织合理,语言使用规范,符合教学规律。

全书由张敏霞和孙丽凤两位老师统稿,其中第2、4、5、8、9章由张敏霞老师编写,第1、3、6、7、10、11、12章由孙丽凤老师编写,实验篇由王秀鸾老师编写,电子课件由罗容老师和迟春梅老师制作。本书的编写得到了众位专家和领导的关心和支持,在此一并表示诚挚的感谢。

由于作者水平有限,书中误漏之处在所难免,敬请广大读者批评指正。

作 者基础篇第1章 程序设计及C语言概况

本章主要介绍程序设计的基本概念、算法描述及结构化程序设计方法、C语言的起源与发展、C语言的特点、简单的C语言程序和C语言程序的开发过程。通过本章的学习,读者可对程序设计的基本概念和C语言的概貌有一个大致的了解。1.1 程序设计的基本概念1.1.1 程序和程序设计语言

什么是程序?怎样设计程序?这往往是计算机语言初学者首先遇到的问题。有人以为计算机是“万能”的,只要把任务告诉计算机,计算机就会自动完成一切,并给出正确结果。这其实是一种误解,要让计算机按照人的意志来完成某项任务,首先要制订该项任务的解决方案,再将其分解成计算机能够识别并可以执行的基本操作指令,把这些指令按一定的规则组织排列起来存放于计算机内存储器中,当给出执行命令后,计算机按照规定的流程依次执行存放在内存储器中的指令,最终完成所要实现的目标。人们把这种计算机能够识别并可以执行的指令序列称为程序。也就是说,程序是人与计算机进行“交流”的工具,它用我们常说的程序设计语言来描述。

程序设计语言是计算机能够理解和识别的语言。它通过一定的方式向计算机传送操作指令,从而使计算机能够按照人们的意愿进行各种操作处理。任何一种程序设计语言都有一定的使用规则,通常称为语法规则。要学习程序设计语言,必须注意学习它的语法规则,就像学习汉语要学习汉语语法一样。而学习程序设计语言的目的就是为了设计计算机程序。

程序设计语言的种类很多,大体上经过了由低级语言到高级语言的发展过程,目前广泛使用的有C、C++、Java、Visual BASIC、Visual FoxPro等高级语言,这些高级语言采用的都是接近于人们熟悉的数学语言和自然语言的表达形式,使人们的学习和使用更加容易和方便。我们把由高级语言编写的程序称为源程序。显而易见,用高级语言编写的源程序,计算机不能直接识别并执行,因为计算机只能识别和执行二进制形式的指令或数据,因此,必须有一个工具先将源程序转换成计算机能够识别的二进制形式的程序,我们把这种二进制形式表示的程序称为目标程序,而承担转换的工具称为语言处理程序。每一种程序设计语言都有与它对应的语言处理程序,语言处理程序对源程序的处理方式有编译方式和解释方式两种,相应的转换工具分别称为编译程序和解释程序。编译方式是指将源程序输入到计算机中后,用相应的编译程序将整个源程序转换成目标程序,然后再通过装配连接程序形成可执行程序,最后运行可执行程序得到结果。目标程序和可执行程序都是以文件的方式存放在磁盘上的,再次运行该程序,只需直接运行可执行程序,不必重新编译和连接。解释方式是指将源程序输入到计算机中后,用相应的解释程序将其逐条解释,边解释边执行,得到结果,而不保存解释后的机器代码,下次运行该程序时还要重新解释执行。采用编译方式,程序的运行速度快,效率高。因此,在目前常用的高级语言中除BASIC语言采用解释方式外,大部分高级语言都采用编译方式。1.1.2 程序设计

对于初学者来说,往往把程序设计简单地理解为只是编写一个程序,这是不全面的。程序设计是指利用计算机解决问题的全过程,它包含多方面的内容,而编写程序只是其中的一部分。利用计算机解决实际问题,通常先要对问题的性质与要求进行深入分析并确定求解问题的数学模型或方法,然后考虑数据的组织方式和算法,并用某一种程序设计语言编写程序,最后调试程序,使之运行后能产生预期的结果,这个过程称为程序设计。程序设计的基本目标是实现算法和对初始数据进行处理,从而完成对问题的求解。

有些初学者,在没有把所要解决的问题分析清楚之前就急于编写程序,结果编程思路紊乱,很难得到预期的效果。因此,为了用计算机解决一个实际问题,作为设计人员,从拿到任务到得出正确结果,往往要经过以下6个设计阶段。

① 分析问题。即分析问题需求,也就是弄清楚该问题有哪些已知数据,程序运行需要输入什么数据,需要输出什么结果,需要进行哪些处理,等等。

② 确定处理方案。如果是数学问题,就要根据该问题的数学解法,考虑所用到的数学公式或相关函数;如果是工程问题,就要先建立该问题的数学模型,把工程问题转化成数学问题,以便用计算机解决。对同一个问题可以用不同的方案来处理,不同的方案决定了不同的处理步骤,效率也有所不同。

③ 确定操作步骤。根据选定的处理方案,具体列出让计算机如何进行操作的步骤。这种规定的操作步骤称为算法,而这些操作步骤之间的执行顺序就是控制结构。通常使用流程图来描述算法,把算法思想表达清楚,比较简单的问题可直接进入编写程序阶段。

④ 根据操作步骤编写源程序。用计算机语言编写的操作步骤就是计算机程序。

⑤ 运行调试程序。将计算机程序输入计算机中,经过编译、连接和运行,如果程序是正确的,应该能得到预期的结果。如果得不到正确的结果,应检查程序是否有错误,改正后再试运行,直到得出正确的结果为止。

⑥ 整理输出结果,写出相关文档。

图1.1所示为程序设计的一般过程。图1.1 程序设计的一般过程

图1.1中,前两个步骤类似于人们解决问题的一般过程,即分析问题,然后确定一种处理方案。后4步则是程序设计的环节,其中最关键的是第③步“确定操作步骤”,或称算法设计。只要算法是正确的,编写程序就不会太困难。对于一个具体问题,编程者应该具备设计算法和正确使用已有算法的能力。1.2 算法1.2.1 算法及算法的特性

算法是对具体问题求解步骤的一种描述。做任何事情都必须事先想好执行的步骤,然后按步骤进行操作,才能避免产生错乱。对同一个问题,可以有不同的解题方法和步骤。有的方法需要的步骤很少,而有些方法需要的步骤则较多。一般来说,希望采用过程简单明了和思路清晰正确的方法。因此,为了有效地解题,一个算法应具有下列5个特性。

① 有穷性。一个算法必须在执行有限个操作步骤之后结束,且每一步都可以在有穷时间内完成。

② 确定性。算法中的每一条指令必须有确切的含义,不会产生二义性。

③ 可行性。算法中描述的操作在计算机上都是可以实现的。

④ 输入。一个算法应有零个或多个输入。

⑤ 输出。一个算法应有一个或多个输出。1.2.2 算法的描述工具

为了使算法表达得更清晰,更容易实现算法的编写,在程序设计时通常使用专门的算法表达工具对算法进行描述。对于复杂的问题,可以先用算法表达工具对算法进行描述,再进行编程,算法的最终实现应该是计算机程序。算法的评价标准涉及很多方面,但正确性和清晰易懂性永远是一个好算法的基本条件。

计算机算法的表达工具通常有以下4种。1.用自然语言表示算法

用自然语言表示算法就是把算法的各个步骤用人们所熟悉的自然语言依次表示出来。但要注意,用自然语言所表示的每一个操作步骤必须是计算机能够实现的。【例1.1】 求两个整数m与n的和,用自然语言求解该问题的步骤如下。

步骤1:输入整数n和m。

步骤2:求和sum=m+n。

步骤3:输出两数之和sum。

以上3个步骤都是在计算机上可以实现的,所以是一个正确的算法描述。用自然语言表示算法,人们比较容易理解,但书写较烦琐,而且在某些场合,由于自然语言含义的不确切性,容易引起歧义,造成误解;另外对比较复杂的问题,用自然语言又难以表达准确。因此,较少采用自然语言表示复杂算法。2.用流程图表示算法

用流程图表示算法就是用一些大家共识的专用图形符号和带有箭头的流程线来表示算法。用图形符号表示算法必须要有一组统一规定、含义确定的专用符号。表1.1所示为传统流程图所用的基本符号。图1.2所示为例1.1中求两个整数m与n之和的传统流程图算法。

可见,用流程图来表示算法,直观形象,绘制简单方便,流程清晰,各种操作一目了然,而且不会产生“二义性”。缺点是,占用面积大,由于使用流程线指出各框的执行顺序,且对流程线的方向没有任何限制,可以随意转向,往往使人弄不清楚流程的思路。

针对上述问题,1973年由美国计算机科学家I.Nassi和B.Shneiderman提出了结构化程序设计流程图,又称N-S流程图。N-S流程图保留了传统流程图可以形象直观地表示算法的优点,去掉了流程线,即不允许流程任意转移,只能从上到下顺序进行,算法的每一步都用一个矩形框来描述,把这些矩形框按执行的次序连接起来就是一个完整的算法。这种流程图规定了几种基本结构作为构造算法的基本单元,将在下一节中结合3种基本结构来介绍。图1.2 例1.1算法表1.1 传统流程图所用的基本符号表3.用伪代码表示算法

所谓伪代码是指用介于自然语言和程序设计语言之间的一种代码来描述算法。它的表示形式比较自由灵活,而且由于与程序设计语言比较接近,因此可以比较容易地转换成计算机程序。伪代码无统一的语法,只要自己或别人能看懂就行。4.用程序设计语言表示算法

用自然语言和用图形符号所表示的算法有一个共同的缺点就是计算机都不能识别和执行。只有用计算机能理解和执行的程序设计语言把算法表示出来,然后把程序输入到计算机并执行,计算机才能按照预定的算法去解决问题。1.3 结构化程序设计方法

结构化程序设计是指,为使程序具有一个合理的结构以保证程序正确性而规定的一套如何进行程序设计的原则。结构化程序设计的原则是:采用自顶向下、逐步求精的方法;程序结构模块化,每个模块只有一个入口和一个出口;使用3种基本控制结构描述程序流程。其中,模块化是结构化程序设计的重要原则。所谓模块化就是把一个大型的程序按照功能分解为若干相对独立的、较小的子程序(即模块),并把这些模块按层次关系进行组织。按照结构化程序设计的原则,一个程序只能由顺序结构、选择结构和循环结构这3种基本结构组成。

人们解决复杂问题普遍采用自顶向下、逐步求精和模块化的方法,在这种设计方法的指导下开发出来的程序,具有清晰的层次结构,容易阅读和维护,软件开发的成功率和生产率可极大地提高。因此,使用结构化方法设计出的程序等于数据结构加算法。

已经证明,任何复杂的算法都可以用顺序、选择、循环这3种结构组合而成。所以,这3种控制结构称为程序的3种基本控制结构。1.顺序结构

顺序结构如图1.3所示,图中(b)是N-S流程图。其中A和B是顺序执行的关系,即先执行模块A操作,再执行模块B操作。

图1.2就是例1.1中求两个整数m与n之和的传统流程图结构,它只需顺序结构就能解决问题。2.选择结构

选择结构又称为分支结构,如图1.4所示,图中(b)是N-S流程图。其中,P代表一个条件,当条件P成立时(或称为“真”时),执行模块A,否则执行模块B。注意,只能执行A或B之一,两条路径汇合在一起结束该分支结构。通过下面的例子,读者可以了解如何用自然语言、N-S流程图描述分支结构。图1.3 顺序结构图1.4 选择结构图1.5 例1.2算法【例1.2】 求a、b两个整数中较小的数。

用自然语言求解该问题的步骤如下。

步骤1:输入整数a和b。

步骤2:进行判断,如果a

步骤3:输出两数中较小的数min。

用N-S流程图求解该问题的过程如图1.5所示。3.循环结构

循环结构又称为重复结构,有两种循环形式。一种是当型循环结构,如图1.6所示。其中,P代表一个条件,当条件P成立(“真”)时,反复执行模块A操作,直到P为“假”时才停止循环。另一种是直到型循环结构,如图1.7所示。先执行模块A操作,再判断条件P是否为“假”,若P为“假”,再执行A,如此反复,直到P为“真”为止。图1.6 当型循环结构图1.7 直到型循环结构

下面通过例题,使读者了解如何用自然语言、N-S结构图描述循环结构。【例1.3】 计算1+2+3+4+…+100。

用自然语言求解该问题的步骤如下。

步骤1:定义变量sum用来存放和值,并将初值0赋给sum,使sum的值为0;定义变量k,用来存放每一项的值,并将1赋给k。

步骤2:判断k的值是否小于或等于100,如果是,则继续执行步骤3,否则转到步骤5,退出循环。

步骤3:将sum与k的和赋给sum。

步骤4:将k的值增1,返回步骤2重复执行。

步骤5:输出和值sum。

用N-S流程图求解该问题的过程如图1.8所示。

可以看到,3种基本控制结构共有的特点是:有一个入口,有一个出口;结构中每一部分都有被执行到的机会,也就是说,每一部分都有一条从入口到出口的路径通过它(至少通过一次);没有死循环(无终止的循环)。图1.8 例1.3算法

结构化程序要求每一基本控制结构具有单入口和单出口的性质是非常重要的,这是为了便于保证和验证程序的正确性。在设计程序时,一个结构一个结构地顺序写下来,整个程序结构如同砌墙一样顺序清楚,层次分明;在需要修改程序时,可以将某一基本控制结构单独取出来进行修改,由于其具有单入口单出口的性质,不会影响到其他的基本控制结构。可以把每个基本控制结构看作是一个算法单位,整个算法则由若干个算法单位组合而成。这样的算法称为结构化算法。而这样设计出的程序清晰易读,可理解性好,容易设计,容易验证其正确性,也容易维护。同时,由于采用了“自顶向下、逐步细化”的实施方法,能有效地组织人们的思路,有利于软件的工程化开发,提高编程工作的效率,降低软件的开发成本。1.4 C语言的初步知识1.4.1 C语言的起源与发展

C语言诞生于1972年,由美国电话电报公司(AT&T)贝尔实验室的D.M.Ritchie设计,并首先在一台使用UNIX操作系统的DEC PDP-11计算机上实现。

C语言是在B语言的基础上发展起来的,早在1970年,美国贝尔实验室的K.Thompson就以BCPL语言(Basic Combined Promgramming Language)为基础,设计出一种既简单又接近于硬件的B语言,并用它编写了第一个UNIX操作系统。而BCPL语言是英国剑桥大学的Matin Richards于1967年基于CPL语言(Combined Programming Language)提出的一种改进语言。CPL语言又是英国剑桥大学于1963年根据ALGOL60 推出的一种接近硬件的语言。由此可见,C语言的根源可以追溯到ALGOL 60,其演变过程如下:

ALGOL 60(1960年)→CPL(1963年)→BCPL(1967年)→B(1970年)→C(1972年)

C语言问世以后,在应用中多次进行了改进。1973年贝尔实验室的K.Thompson和D.M.Rithie用C语言将UNIX系统(即UNIX第5版)重写了一遍,增加了多道程序设计功能,使整个系统,包括C语言的编译程序都建立在C语言的基础上。第5版UNIX系统(UNIX V5)奠定了UNIX系统的基础。到1975年,UNIX第6版问世。随着UNIX的巨大成功和被广泛移植到各种机器上,C语言也被人们所接受,并移植到大型、中型、小型和微型机上,它很快风靡全世界,成为世界上应用最广泛的计算机程序设计语言之一。

1978年又推出了UNIX第7版,以该版本中的C语言编译程序为基础,B.W.Kernighan和D.M.Ritchie合作(被称为K&R)出版了“The C Programming Language”一书。该书介绍的C语言被称为标准C,这本书成为后来被广泛使用的C语言的基础。1983年,美国国家标准化协会(ANSI)对C语言的各种版本做了扩充和完善,推出了新的标准,被称为ANSI C,它比原来的标准C有了很大的改进和发展。1987年,ANSI又公布了87 ANSI C新版本。目前流行的各种C语言编译系统都是以87 ANSI C为基础的。在微机上使用的C语言编译系统多为Microsoft C、Turbo C、Borland C和Quick C等,它们略有差异,但按标准C书写的程序,基本上都可运行。读者要了解不同版本的编译系统的特点和规定可参阅有关手册。1.4.2 C语言的特点

C语言之所以成为世界上应用最广泛、最受人们喜爱的计算机高级语言之一,与它本身所具有的突出的优点是分不开的。C语言的主要特点概括如下。

① 语言简洁、紧凑,使用方便、灵活。C语言一共只有32个关键字,9种控制语句。程序书写形式自由,主要用小写字母表示。

② 支持结构化程序设计。C语言具有结构化的控制语句,以函数作为程序的模块单位,这使得它可以很方便地实现这种构造。

③ 运算符丰富。C语言除了拥有一般高级语言都有的运算符外,还拥有不少独特的运算符,可以实现其他高级语言不能实现的运算,增强了C语言的运算功能。

④ 数据类型丰富。C语言能方便地实现各种复杂的数据结构,具有很强的数据处理能力。

⑤ 较强的编译预处理功能。C语言的编译预处理功能,为开发规模较大的程序提供了方便,极大地提高了程序开发的效率。

⑥ C语言的可移植性好。C语言本身只需稍加修改便可用于各种型号的计算机和各类操作系统,因此,用C语言编写的程序也可以很方便地用于不同的系统,这也是C语言得以广泛应用的原因之一。

⑦ C语言本身既有一般高级语言的优点,又有低级(汇编)语言的特点。C语言可以允许直接访问内存地址,可以进行位(bit)运算,也可以直接对机器硬件进行操作。因此,既可以用它来编写大型系统软件,也可以用它编写各种应用软件,许多以前只能用汇编语言处理的问题,现在可以改用C语言处理了。

⑧ 语法限制不太严格,程序设计自由度大。C语言由于放宽了语法检查,使程序员有较大的自由度。例如,对数组下标越界不做检查,要由程序设计人员自己保证其正确性。因此,用C语言编写程序,对程序设计人员的要求相应地就要高一些。

上述C语言的特点,在初学时也许还不能深刻理解,待学完C语言之后就会有比较深的体会和感受。1.4.3 C语言程序的构成

下面通过两个简单的C语言程序,使大家能够对C语言程序有一个最基本的认识。【例1.4】 求两个整数m与n的和。

程序中,m和n分别表示两个整数,sum表示两个整数的和。

程序代码如下:

以上程序由一个称为主函数的main()函数构成。C语言规定必须用main作为主函数名,其后的一对圆括号“()”中间可以是空的,但这一对圆括号不能省略。主函数后面是函数体,由一对大括号“{}”括起来,左大括号“{”表示函数体开始,右大括号“}”表示函数体结束。“/*……*/”表示注释部分,它只是起到帮助阅读程序的作用,对编译和运行不产生任何影响。为方便理解,可采用汉字来注释,注释部分可以出现在程序的任何地方。程序第4行是变量定义语句,定义m、n和sum为整型(int)变量;程序第5行是两条赋值语句,使m和n的值分别为5和3;程序第6行也是一条赋值语句,使sum的值为表达式m+n的值;程序第7行是输出语句,其中,printf()是C语言的标准输出函数(当引用C语言的标准函数时,需在程序开始处使用文件包含命令将该函数所对应的头文件包含进来。本程序第1行就是文件包含命令,它将标准输入/输出函数的头文件stdio.h包含进来了。关于文件包含的知识将在第 7 章介绍),双引号中的%d 表示在此位置以十进制整数类型输出变量 sum的值,\n 为回车换行符,双引号中其他内容将作为字符串原样输出。因此,该程序的运行结果如下:

sum is 8【例1.5】 求两个整数中的较小者。

程序中,x、y分别表示两个整数,min表示两个整数之中的较小值。

程序代码如下:

该程序包括两个函数:主函数main()和用户自定义函数fun()。主函数的第7行是输入语句。scanf()是C语言的标准输入函数,它的作用是让用户从键盘上输入数据;双引号中的两个%d 是格式说明,表示用户输入的数据应该是两个整数;&x和&y中&的含义是取地址,它表示用户从键盘上输入的两个整数将分别送到变量x和y所对应的存储单元中,也就是输入给变量x和y。第8行是调用fun()函数,调用时将x和y的值传送给被调函数fun()中的形参a和b,在被调函数fun()中,求出两个数中的较小值赋给变量c,最后由return语句返回c的值到主调函数main()中的调用处,并将返回的值送给变量min。

该程序的运行情况如下:

input x,y:10,2

min=2

以上两例中,关于标准输入/输出函数的使用、函数调用、实参和形参的概念,大家可能还不十分清楚,可以先不予以深究,今后在有关章节中还要详细介绍。分析上述程序可以总结出C语言程序的基本构成如下。(1)C语言程序由函数构成

一个C语言程序至少应包含一个main()函数(如例1.4),或者包含一个main()函数和若干个用户自定义函数(如例1.5)。因此,函数是C语言程序的基本单位,相当于其他语言的子程序或过程。

C语言的函数可以分为系统提供的标准函数(库函数,如例1.5中的printf()和scanf()函数)和用户自定义函数(如例1.5中的fun()函数)。各种C语言的编译系统所提供的标准函数的数量和功能以及函数名都不完全相同,标准C提供了100多个标准函数,函数调用使C语言很容易实现程序的模块化。

为了增加程序的可读性,可以用“/*……*/”在任何位置上对C语言程序的任何部分作注释,一般在一个程序或函数的开始或某些程序的难点之处加上必要的注释(在VC++6.0环境下也可使用符号“//……”引出注释)。(2)一个C语言函数通常由两部分组成:函数的首部和函数体

函数的首部包括函数类型、函数名、一对圆括号、函数参数(形参)名和参数类型的说明。比如,例1.5中fun()函数的首部如图1.9所示。图1.9 例1.5中fun()函数的首部

注意:C语言规定,一个函数名后面必须紧跟一对圆括号,函数的所有形参都必须写在括号内。如果函数没有形参,则括号内可以是空的,但不能省略圆括号,例如,主函数main()经常不带参数。

函数体就是函数首部后面一对花括号{}内的部分。如果一个函数内有多对花括号,则最外面的一对花括号{}所包含的内容就是该函数的函数体。函数体一般包括说明部分和执行部分。① 说明部分

说明部分由若干条变量定义语句或函数声明语句组成。C 语言规定,函数中使用的所有变量(或数组)必须在使用前进行定义,否则会在编译时出错。如例1.5中main()函数的变量定义语句“int x,y,min;”。当然也可以没有说明部分。例如下面的程序代码:

main()

{printf("It is fine today!");}

该程序的作用是在屏幕上显示以下文字:

It is fine today!

这里没有用到任何变量,所以不需要变量的定义。② 执行部分

执行部分由若干条执行语句组成。程序的功能就是通过执行部分实现的。C语言的任何语句都必须以分号“;”结束,分号是C语句的必要组成部分。例如:

y=x+b;

C语言的语句可以从任意位置开始书写,书写格式自由,一行内可以写多条语句,语句中多个空格与一个空格等效。

一个函数甚至可以既无说明部分,也无执行部分,例如:

comp()

{}

这个函数是一个空函数,什么作用也没有,但却是合法的。(3)main()函数

一个C语言的程序总是从main()函数开始执行,并终止于main()函数,而不论main()函数在整个程序中处于什么样的位置(main()函数可以放在程序的开头、最后,或某两个函数之间)。但是,为便于理解,通常将main()函数放在程序的开头或最后。1.4.4 C语言程序的上机调试过程

如何调试一个C语言程序呢?在不同的环境下调试的方法稍有差异(在VC++6.0环境下C语言程序的调试过程请参见本教材实验篇中的实验一)。但归纳起来一般是依照图1.10所示的过程调试的。图1.10 程序调试过程

从图1.10可以看出,C语言程序的调试过程基本上可以分为以下4步。1.编辑

编辑就是用C语言写出源程序。其方法有两种:一种是使用文本编辑程序将源程序输入计算机,经修改认为无误后,以.c为后缀存入文件系统(C源程序的后缀一般定为“.c”)中;另一种是使用C语言编译系统提供的编辑器将源程序输入计算机,并且存入文件系统中。例如在图1.10中,某用户将自己的源程序文件定名为file.c。2.编译

调用C语言编译程序对源文件进行编译,即检查其词法、语法、语义方面是否存在错误。

通俗点说,就是检查是否有拼错的关键词,是否有不符合C语言语法规则的表达式及语义方面的矛盾和含混。这些错误在编译阶段都可以查出。

如果有错误,则系统将显示“错误信息”。用户根据指出的错误信息,对源程序进行编辑修改,修改后再重新进行编译,直到编译无误为止。编译后生成的机器指令程序,被称为目标程序,此目标程序名与相应的源程序同名,但其后缀为.obj。上述源程序文件file.c经编译后得到目标程序file.obj。3.连接

编译产生的目标文件一般不能直接运行,必须把它所引用的标准函数及源程序指定的目标文件一起装配连接起来,形成完整的可执行文件。一般可执行文件名与源程序文件名同名,后缀为.exe。例如,上述源程序文件file.c经编译连接后得到可执行文件file.exe。4.执行程序

当程序编译连接后,生成可执行程序便可以运行了,以后用户只需输入可执行目标文件名即可,例如:

file本章小结

1.程序是人与计算机进行“交流”的工具,用我们常说的“程序设计语言”来描述。

2.程序设计语言是计算机能够理解和识别的语言。

3.任何一种程序设计语言都有一定的使用规则,通常称为语法规则。

4.C语言是伴随UNIX操作系统产生和发展起来的,它既具有高级语言的优点,又具有汇编语言的特点,有人称它是“高级汇编语言”。C语言的语法紧凑、简洁,数据类型丰富,运算功能强大,高效率的代码和高度的可移植性使它成为编写大型工具软件和硬件控制程序不可替代的一门高级语言。目前,C语言已经广泛应用于各个领域中。

5.程序设计是指利用计算机解决问题的全过程。程序设计的基本目标是实现算法和对初始数据进行处理,从而完成对问题的求解。

6.算法是对具体问题求解步骤的一种描述。已经证明,任何复杂的算法都可以用顺序、选择、循环3种结构组合而成。所以,这3种控制结构称为结构化程序设计的3种基本控制结构。

7.C语言程序是由一个或多个函数组成的,这些函数中必须包含一个名为main()的主函数,整个程序由它开始执行,一般来说,也以该函数的结束而结束整个程序。

8.C语言程序的调试基本上可以分为4步:即编辑、编译、连接和运行。习题11.1 填空题

1.C语言程序的基本单位是__________。

2.一个C语言程序总是从__________开始执行,并终止于__________。

3.一个C语言程序是由一个或若干个函数构成的,程序中至少应包含一个__________函数。

4.一个C语言函数一般由两部分组成,它们分别是__________和__________。

5.函数体以__________开始,以__________结束。

6.结构化程序的3种基本结构是__________、__________和__________。

7.C语言源程序文件名的后缀是__________,经过编译后,生成的目标文件名的后缀是__________,经过连接后,生成的可执行文件名的后缀是__________。1.2 思考题

1.什么是结构化程序设计,其基本结构有哪几种?

2.何谓算法,如何描述算法?

3.请根据自己的认识,写出C语言的主要特点。1.3 编程题

1.试参照本章例题编写计算梯形面积的C语言程序:梯形的上底、下底和高分别用a、b和h表示,面积用s表示,并用a=10,b=20,h=5测试所编写的程序。

2.编写程序显示如图1.11所示信息。图1.11 显示信息第2章 C语言基础

著名的计算机科学家沃思(Nikiklaus Wirth)提出了一个著名的公式:

程序=数据结构+算法

所以在一个程序中应包括两个方面的内容,即数据结构的描述和算法的描述。在高级程序设计语言中,对数据结构的描述是通过数据类型的形式实现的,而对算法的描述则是通过各种语句功能实现的。目前在国际上广泛流行的C结构化程序设计语言(简称C语言)提供了非常丰富的数据类型用于描述数据结构。本章将介绍:C语言的基本数据类型,标识符、常量和变量,数据类型的转换,部分常用运算符及表达式。

本章内容是学习C语言的基础,概念较多,希望大家重视并能理解掌握。2.1 数据类型

C语言的数据结构以数据类型的形式出现,不同的数据类型代表了不同的数据结构。C语言提供了非常丰富的数据类型,包括基本数据类型、构造类型、指针类型和空类型4类。

基本数据类型又称非构造型数据类型,包括整型、字符型、实型(又称浮点型)和枚举类型。实型又包括单精度型和双精度型。基本数据类型最主要的特点是,如果某个数据为基本数据类型,则该数据的值不可以再分解为其他数据类型。

构造类型又称复杂数据类型,是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型数据的值可以分解成若干个“成员”(或“元素”或“域”),其中每个“成员”的值为基本数据类型或构造类型。在C语言中,构造类型包括数组类型、结构体类型、共用体类型。

指针类型是一种特殊的,同时又具有重要作用的数据类型。其值用来表示某个量在内存储器中的地址。

空类型(void)通常用于明确说明调用一个函数不需要向被调函数返回函数值,这时被调用的函数类型说明符为void。

C语言的数据类型综合表示如图2.1所示。

C语言中的基本类型数据在程序中按其值是否可以改变分为常量和变量两种表示形式。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。常量和变量与基本数据类型结合起来可分为整型常量、整型变量、实型常量、实型变量、字符型常量、字符型变量、枚举型常量、枚举型变量。在程序中,常量可以不经说明而直接引用,而变量则必须先定义后使用。图2.1 C语言的数据类型

在C语言程序中,每一个数据(常量或变量)都必须明确其数据类型,不存在不属于某种数据类型的数据。

本章主要介绍C语言基本数据类型(除枚举类型外),其他数据类型将在后续章节中详细介绍。2.2 标识符、常量和变量2.2.1 字符集

字符(Character)是组成语言最基本的元素。C语言的字符集由字母、数字、空白符、标点和特殊字符组成。

① 字母:26个英文字母,包括大小写共52个。

② 数字:0~9共10个。

③ 空白符:空格符、制表符、换行符统称为空白符,共3个。

④ 标点和特殊字符:如+-*/%_.=<>&|()[]{};?:′"!#等共25个。2.2.2 标识符

标识符(Identifier)是一个由有限个有效字符组成的序列,在C语言中只起标识作用,可用作符号常量名、变量名、函数名、数组名、文件名等。1.标识符的构成规则

C语言允许用作标识符的有效字符包括:

● 26个英文字母,包括大小写

● 数字0,1,…,9

● 下划线

合法的标识符必须由字母(A~Z,a~z)或下划线(_)开头,后面可以跟随任意的字母、数字或下划线。C语言标识符的长度(即一个标识符允许包含的字符个数)受C语言编译系统的限制,比如,某C语言编译系统规定标识符的有效长度是31,若超过31个字符,则后面的字符无效。不同的C语言编译系统规定的标识符的长度可能会不同,学习者在使用标识符时应当了解所用编译系统的规定。

合法的标识符:student,a10,Ij,_5n,x_sum

不合法的标识符:30d 错在以数字开头

a$n 错在出现“$”

n abc 错在中间有空格2.C语言标识符的分类

标识符是形成C语言代码的基础。C语言中的标识符有3种类型:关键字、预定义标识符和用户标识符,每种标识符都有自己的要求。(1)关键字

C语言中有一些标识符被称为关键字或保留字,在系统中具有特殊用途,只能以特定的方式用在特定的地方,如果试图将关键字用于其他用途,编译程序将产生一个编译错误。例如,标识符int是整型数据类型关键字。

表2.1列出了C语言完整的关键字列表,随着教材内容的深入,读者将理解在什么地方、为什么和如何使用这些关键字。表2.1 C语言关键字(2)预定义标识符

C语言中有些标识符虽然不是关键字,但总是以固定的形式用于专门的地方,使用较多的预定义标识符是C语言标准函数(参见附录B)。例如,printf是C语言提供的标准函数名,define是C语言提供的编译预处理命令等。因此,用户也不要把它们当作一般标识符使用,以免造成混乱。(3)用户标识符

用户标识符是由用户根据需要定义的标识符。一般用于给变量、符号常量、数组、函数、指针、文件等命名。在程序中使用用户标识符时除了要遵守标识符的构成规则外,还应注意以下两点。

① 大小写字母有不同的含义,例如,sum、Sum和SUM是3个不同的标识符。习惯上,变量名用小写字母表示,符号常量名用大写字母表示。

② 在构造用户标识符时,应注意做到“见名知意”,即选用有含义的字符组合(如英文单词或汉语拼音)作为标识符,以增加程序的可读性。例如,表示日期可用day,表示长度可用length,表示和可用sum等。2.2.3 常量

常量是指在程序运行过程中其值不发生改变的量。在C语言中,有直接常量(或字面常量)和符号常量两种常量。直接常量可以从其字面形式上区分其数据类型,如12和-10为整型常量,2.5和-10.2为实型常量。

符号常量是用用户标识符表示的常量。通常习惯用大写字母表示符号常量。符号常量在使用之前必须在程序开头定义。符号常量的定义形式为:

#define 符号常量名 常量

例如:

#define PRICE 30

符号常量一旦定义,凡是本程序中出现PRICE的地方,系统均用30来替换。【例2.1】 已知某产品的单价和数量,求总价格。

程序代码如下:

程序运行结果为:

total=300

注意:

① 定义符号常量时。必须以#开始,在#define命令行的最后不能加分号。有关#define命令的使用,将在第7章详细介绍。

② 符号常量所代表的值是不能改变的。正确使用符号常量可以增强程序的可读性和可维护性。2.2.4 变量

变量是指在程序执行过程中其值可以改变的量。在源程序中,变量用标识符标识,表示变量的标识符称为变量名。图2.2 变量名、存储单元和变量的值的关系

在内存中,变量和一个存储单元相对应,该存储单元用于存放变量所代表的数据值。变量名、存储单元和变量的值三者之间的关系如图2.2所示。变量所对应存储单元的大小(组成一个存储单元的字节数)取决于变量值的数据类型,所以每个变量都与一个数据类型相联系,类型决定了变量在内存中占据的存储空间的大小,也就决定了变量可以取值的范围和变量值可以参加的运算。所以变量名、变量类型和变量的值是一个变量的三要素。

在C语言程序中出现的任何一个变量必须首先确定其数据类型,即必须遵循“先定义,后使用”的原则,否则会在编译时出错。

变量定义的一般形式为:

类型标识符 变量名1,变量名2,……;

变量的定义一般出现在函数的开头部分,如例2.1主函数中的语句“int num,total;”使用类型标识符int定义了两个整型变量num和total,系统分别为它们各自分配由4个字节组成的存储单元,以存放整型数据。

注意:一个定义语句必须以一个“;”结束。2.3 基本类型数据2.3.1 整型数据1.整型数据类型标识符

整型数据分为基本整型、短整型、长整型和无符号型4种。

① 基本整型(简称整型):类型标识符为int。

② 短整型:类型标识符为short int或short。

③ 长整型:类型标识符为1ong int或1ong。

④ 无符号型:表示不带符号的整数。

无符号型整数又可分为以下3种。

① 无符号整型:类型标识符为unsigned int。

② 无符号短整型:类型标识符为unsigned short。

③ 无符号长整型:类型标识符为unsigned 1ong。

C语言标准没有具体规定以上各类数据所占的内存字节数,不同C编译系统有不同的规定。表2.2所示为在VC++6.0编译环境中各种整型数据所占的内存字节数和取值范围。表2.2 整型数据类型所占内存字节数和取值范围

在一个存储单元中存储一个有符号整数时,用最高位表示符号,最高位为0说明是正数,最高位为 1 说明是负数,其余二进制位表示数值,并且以二进制补码的形式表示。如果存储的是一个无符号整数,则所有二进制位都用来表示数值。例如:用两个字节存放一个短整型数时,假设两个字节的所有二进制位全部为1,如果说明为short类型,则它代表的是-1,如果说明为unsigned short类型,则它代表的是65535。2.整型变量的定义

根据表2.2给出的整型数据类型标识符可以定义相应的整型变量。例如:

当按上述方法定义变量时,编译系统仅为所定义的变量分配了存储单元,而没有在存储单元中存放任何数据,此时的变量不能正确使用,因为变量中的值无意义。

C语言允许在定义变量的同时,对该变量预先设置初值,也称变量的初始化。例如:

也可以为被定义变量的一部分赋初值,例如:

int i1,i2,i3=10;

定义i1、i2和i3为整型变量,并只对i3初始化,值为10。

如果对几个变量赋以同一个初值,不能写成:

int a=b=c=8;

而应写成:

int a=8,b=8,c=8;3.整型常量

整型常量简称为整数或整常数。C语言程序中整型常量有以下3种表示形式。

① 十进制整数:按通常习惯的十进制整数形式表示,例如,102、-98、0等。

② 八进制整数:以数字0开头的八进制数符串,数字0是八进制整数的前缀,八进制数符为0~7。八进制数通常是无符号数。例如,025(表示十进制数21)、0400(表示十进制数256)。

③ 十六进制整数:以0x或0X开头的十六进制数符串,0x或0X 是十六进制整数的前缀,十六进制数符为0~9和a~f(或A~F),其中a~f(或A~F)对应于十进制数10~15。十六进制数通常是无符号数。例如,0x14(表示十进制数20)、0xFFFF(表示十进制数65535)。

整型数又分为长整型数、短整型数和无符号整型数。长整型数在表示上与其他整型数的区别是加后缀L或l。所谓后缀是指在数字后面加写的字母,如1234L、0X2abL等。无符号数的后缀是U或u,如7543U、0125u等。前缀和后缀可同时使用以表示不同类型、不同进制的整型数。例如,03456LU表示八进制无符号长整型数。

在程序中出现的整数根据前缀来区分各种进制数,根据后缀来区分不同类型,因此在书写常数时不要把前缀和后缀弄错造成结果不正确。2.3.2 实型数据1.实型数据类型标识符

实型数据有单精度型和双精度型两种。

● 单精度型:类型标识符为float。

● 双精度型:类型标识符为double。

在VC++6.0中,实型数据占内存大小、取值范围和有效数据位数如表2.3所示。表2.3 实型数据类型占内存大小、取值范围和有效数据位数

注意:在VC++6.0中,所有的float类型数据在运算中都自动转换成double型数据。

与整型数据的存储方式不同,实型数据是按照规范化的指数形式存储的。所谓规范化的指数形式是指其尾数部分为纯小数,即小数点前整数部分小于1,小数点后的第1位大于0。2.实型变量的定义

根据表2.3给出的实型数据类型标识符可以定义相应的实型变量,并可在定义时赋初值。例如:3.实型常量

实型常量即实数,又称浮点数。在C语言中实型数只有十进制形式,可以用十进制小数形式或十进制指数形式表示。(1)十进制小数形式

一般由数字和小数点组成(必须有小数点,但小数点前后的0可以省略)。例如,0.246,.246,246.0,246.,0.0等都是正确的小数表示形式。(2)十进制指数形式

由尾数、字母e或E及指数部分组成。具体格式如下所示:

尾数e指数部分 或 尾数E指数部分

字母e或E左边部分的尾数可以是“整数部分.小数部分”形式,也可以只有整数部分不含小数点和小数部分,或者只有小数部分前面含有小数点而不含整数部分。指数部分必须为整数,可以是正的,也可以是负的。例如,下面指数形式都是正确的:

而下面的指数形式是错误的:

e2 3.5e1.5.e e5 e2.3.3 字符型数据1.字符型数据类型标识符

字符型数据的类型标识符为char,在内存中存储一个字符型数据需要1个字节。2.字符型变量的定义

使用字符型数据类型标识符char可以定义字符型变量,并可在定义时赋初值,例如:3.字符型常量

C语言中,一个字符型常量代表ASCII字符集中的一个字符。在C语言程序中字符型常量有以下两种形式。

① 用一对单引号(即撇号)括起来的单个字符。例如,′b′、′Y′、′9′、′(′、′y′ 等都是合法的字符型常量。

② 用一对单引号(即撇号)括起来的以一个反斜杠(\)开头的转义字符,形如′\n′,′\t′等,意思是将反斜杠(\)后面的字符转变成另外的意义。例如,′\n′不代表字母n而是作为换行符。像换行这种非显示字符难以用一般形式的字符表示,所以C语言规定用转义字符这种特殊形式表示。常见的以反斜杠(\)开头的转义字符见表2.4。表2.4 转义字符表

单引号是字符型常量的定界符。注意,′Y′和′y′是不同的字符型常量。

表2.4中最后两行用ASCII码(八进制数或十六进制数)表示一个字符,即它将字符的ASCII码值转换为对应的字符。例如,′\103′代表字符C,′\012′代表换行,′\376′代表图形字符■。可见,使用表2.4中的表示方法可以表示任何可输出的字母字符、专用字符、图形字符和控制字符。请注意,′\0′或′\000′代表ASCII码为0的控制字符,即“空操作”字符,它可被用在字符串中。【例2.2】 字符型常量的输出。

程序代码如下:

该程序中3次调用printf()函数,直接输出双引号内的各个字符。请注意其中的转义字符。第1个printf()函数先从第一行左端开始输出“Hello!”,然后遇到“\t”,它的作用是跳格,即跳到下一个输出位置,在所用系统中,一个输出区占8列。下一输出位置从第9列开始,故从第9列开始输出“how are you?”。下面遇到“\n”,代表回车换行,返回到下一行最左端(第1列),输出字符“I”,然后遇到“\′”,表示输出“′”,接着输出“m fine”。下面是“\n”,作用是“回车换行”,即光标被移到下一行第一个字符位置。

第2个printf()函数先输出字符“This is a cup”,后面遇到3个“\b”,“\b”的作用是“退一格”,因此“\b\b\b”的作用是使当前输出位置回退3格到“c”的位置,接着输出“pen.”。最后是“\n”,即“回车换行”。

第3个printf()函数先输出“A,”,然后遇到“\101”,它的作用是输出ASCII码(八进制数101)所对应的字符,即“A”字符。

程序运行后在显示屏上最后看到的结果是:

Hello!how are you?

I′m fine!

This is a pen.

A,A

注意:第2次调用printf()函数时,先输出“This is cup”,退3格后再输出“pen.”,“pen.”将取代原来的“cup”。程序执行时在屏幕上看不到“cup”。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的字符已取代了旧的字符。4.字符型数据在内存中的存储形式

字符型变量存放一个字符,实际上并不是把该字符本身存放到内存单元中去,而是将该字符的ASCII码(ASCII码对照表见附录C)存放到存储单元中。例如,字符′A′的ASCII码为65,′\n′的ASCII码为10,则程序段:

char c1,c2;

c1=′A′;c2=′\n′;图2.4 3 字符型数据的存储

执行后,在内存中变量c1和c2的值如图2.3所示。

因为在内存中,字符数据是以ASCII码的形式存储的,它的存储形式与整数的存储形式类似。因此,在C语言中,字符型数据可以与整型数据混合使用。C语言允许对整型变量赋予字符值,也允许对字

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载