C语言开发技术详解(含光盘1张)(txt+pdf+epub+mobi电子书下载)


发布时间:2021-01-24 07:14:22

点击下载

作者:戴建华 等

出版社:电子工业出版社

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

C语言开发技术详解(含光盘1张)

C语言开发技术详解(含光盘1张)试读:

前言

PREFACE引子:C语言作为一门最通用的语言,在过去很流行,将来依然会如此。几乎每一个理工科或者其他专业的学生毫不例外地要学习它。记得大学里,很多学校都把谭浩强教授的《C程序设计》作为入门教材,这是绝佳的选择。然而,要更进一步,更全面而深入地学习呢?显然有点力不从心。本书正是为了弥补这个缺憾而写的,希望能对想比较全面而深入学习C语言程序设计的人有所帮助。从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同。学习、掌握C语言是每一个计算机技术人员的基本功之一。C语言具有高级语言的强大功能,却又有很多直接操作计算机硬件的功能(这些都是汇编语言的功能),因此,C语言通常又被称为中级语言。学习和掌握C语言,既可以增进对于计算机底层工作机制的了解,又为进一步学习其他高级语言打下了坚实的基础。本书特点● 从入门到精通:本书分上下两篇,上篇针对初学者,从C语言的基础开始,使略有计算机基础的人都能容易地学会C语言编程;下篇则介绍了C语言的高级程序设计技巧,包括常用算法、底层控制鼠标、绘图、加密、压缩等应用。● 适用多种操作系统:本书实例都通过GCC编译器调试,读者不仅可在Windows环境下使用本书学习C语言,也可在Linux环境下使用本书学习C语言。● 循序渐进:本书编写顺序按C语言的知识点循序渐进地介绍。例如,先介绍数据的存储,再介绍数据的输入/输出;先介绍简单的程序设计概念,再介绍指针等C语言的难点。● 重点突出:指针是C语言的重点和难点,本书用了大量的篇幅,从不同方面对其进行讲解,并列举了大量的实例,帮助读者理解并掌握指针。● 实例丰富,讲解详细:学习程序设计时,必须要多上机操作。本书对每个知识点都配有实例代码,并对实例代码进行了详细的讲解,在实例后,一般都附有实例程序的运行结果,方便读者对比理解相应的知识点。● 注重实用:在本书下篇,详细介绍了数据加密、压缩、控制鼠标、绘制图形等实用程序。通过这些内容,可进一步提高读者C语言的应用能力。● 实用超值的DVD光盘:为帮助读者更深入地学习,本书附赠DVD光盘1张,内容包括本书所有的章节实例,入门视频以及长达21小时的C语言学习视频教学课件,讲解关键知识点界面操作,手把手教会读者使用。本书内容本书分上下两篇,共26章,上篇共16章,主要介绍C语言的语法基础;下篇共10章,主要介绍C语言的高级程序设计。各章内容如下:第1章为C语言概述,介绍了C语言的发展、特点,C语言程序的开发过程,最后,以一个简单的C程序,演示了编写C语言程序的方法。第2章介绍了一个完整的C程序各部分的含义。第3章介绍了C语言几种常见的开发环境,包括Dev-C++、Visual C++、Linux下C语言开发环境的使用等内容。第4章介绍了C语言数据的表示方法,包括数据的存储、常量、变量、整数类型、字符类型、实数类型、混合运算及类型转换、C99新增数据类型等内容。第5章详细介绍C语言中的表达式、各种运算符及运算优先级、C语言各类语句等内容。第6章介绍了格式化输入/输出函数的使用,包括printf函数、scanf函数、getchar函数、getch函数、gets函数、putch函数、puts函数等的使用。第7章介绍C语言分支结构程序设计的方法,包括使用if语句、嵌套if语句、if else if语句、switch语句等进行多种分支程序设计的内容。第8章介绍C语言循环结构程序设计的方法,包括使用while循环、for循环,以及循环嵌套等内容。第9章介绍在C语言中使用数组的方法,主要介绍了一维数组、二维数组、字符数组和字符串的使用。第10章介绍在C语言中创建和使用函数的方法,包括函数的概念、编写函数、设置函数的参数、函数调用、递归函数的编写等内容。第11章介绍模块化程序设计方法,包括模块化程序设计概念、C程序的组织、变量的作用域、变量的存储类型等内容。第12章介绍C语言中指针的使用,指针是C语言最显著的特征。本章首先介绍变量在内存中的保存形式,然后介绍了指针和简单变量、指针和数组、指向多维数组的指针、指针和字符串、指针数组、指针和函数等内容。第13章介绍结构、联合和枚举,包括结构的概念、结构的嵌套、结构数组、结构指针、向函数传递结构、联合、枚举等内容。第14章介绍位运算和位域的使用,通过位运算符,可以方便地操作二进制位。第15章介绍文件输入/输出的方法,主要介绍了数据流的概念、文件的打开与关闭、从文件中读写字符、从文件中读写字符串、二进制文件的读写、文件检测函数、文件的随机读写、管理缓冲区、输入/输出的重定向、文件管理等内容。第16章介绍编译预处理,包括宏定义命令、条件编译、其他预处理命令、内联函数等内容。第17章介绍处理字符串的方法,包括字符串的存储、字符和字符串检测函数、查找字符串、比较字符串、连接字符串、复制字符串、字符和字符串的转换等内容。第18章介绍C语言的数学函数和时间函数,使用这些函数,可方便地处理数值、日期时间等类型的数据。第19章介绍常用算法的C语言程序,包括用C语言编写的完成排序、查找、队列、堆栈、链表等程序。第20章介绍用C语言进行存储管理的方法,包括内存动态分配和回收等内容。第21章介绍用C语言编写鼠标的底层操作函数,包括初始化鼠标、复位鼠标、显示鼠标指针、隐藏鼠标指针、获取按钮信息等操作鼠标的底层函数。第22章介绍用C语言编写数据加密程序的方法,如换位加密法、替换加密法、位加密法等程序的编写,最后,还简单介绍了MD5算法。第23章介绍用C语言编写数据压缩程序的方法,首先,介绍了数据压缩基础,最后,详细介绍了LZW压缩算法的原理及实现过程。第24章介绍C语言底层图形函数的编程,首先介绍了显示系统的基本概念,然后介绍了直接读取显存编写图形函数的方法,在此基础上,完成绘制线、圆、矩形、多边形等函数,最后还介绍了编辑图形的方法。第25章介绍GCC调用汇编程序的方法,包括AT&T汇编简介、GCC内嵌汇编、调用汇编程序等内容。第26章为一个用C语言编写的信息管理系统——员工管理系统,通过该实例程序的编写,可巩固本书前面各章所学内容。读者对象● 程序设计初学者入门● 大中院校学生● 大中院校教师● C程序员● 电脑培训班● 计算机爱好者由于计算机技术发展很快,且编者水平和学识有限,书中难免有疏漏之处,敬请广大读者朋友批评指正,并多提出宝贵意见。编者2009年3月第1篇C语言基础第1章 C语言概述第2章 C程序的组成第3章 C语言开发环境第4章 数据的表示第5章 表达式、运算符和语句第6章 格式化输出/输入第7章 分支结构程序设计第8章 循环结构程序设计第9章 使用数组第10章 使用函数第11章 模块化程序设计方法第12章 使用指针第13章 结构、联合和枚举第14章 位运算和位域第15章 文件输入/输出第1 章 C语言概述本章简要介绍C语言的产生、发展,C语言的标准,C语言的特点,以及C语言编程开发过程等内容。最后还将通过一个小例子演示C语言开发过程中程序编写、编译及调试的过程。1.1 C语言发展历史C语言是一种典型的从实用中产生出来的语言,它走过了一个独特的发展历程。下面首先简单介绍C语言的发展过程,接着介绍C语言的两个标准。1.1.1 C语言发展过程20世纪40年代,计算机问世,这个发明给世界带来巨大的变化。然而随之而来的是相当复杂的计算机程序的开发。早期程序开发使用的是汇编语言,汇编语言和机器语言一样能够直接对计算机硬件操作,但是比机器语言更容易记忆和理解。由于计算机程序规模越来越大,汇编语言已经不能胜任程序开发,这个时候产生了高级语言。高级语言比汇编语言简练,容易阅读,而且可以做到模块化。这就大大降低了计算机程序开发的难度,缩短了程序开发时间,常见的如Basic、Fortran、Pascal和C都是高级语言。20世纪60年代,ALGOL语言问世。ALGOL是第一个结构化程序设计语言。在此后的几年内产生了许多新的程序设计语言,如广泛使用的Basic语言就是1965年由Thomas E. Kurtz和John Kemeny开发完成的。1963年,剑桥大学将ALGOL 60语言发展成为CPL (Combined Programming Language)语言。1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,形成了BCPL语言。受BCPL语言的影响,美国贝尔实验室的Ken Thompson于1970年将BCPL进行了修改,形成了“B语言”,并用B语言写了第一个UNIX操作系统。1973年,美国贝尔实验室的Dennis Ritchie在B语言的基础上,最终设计出了一种新的语言,并以BCPL的第二个字母作为这种语言的名字——这就是C语言。随着计算机技术的日益发展,C语言出现了多种版本。由于C语言没有一个统一的标准,各个版本之间存在着差异,各版本之间不兼容给程序开发带来了各种各样的问题。为了改变这种情况,1983年初美国国家标准研究所(ANSI)成立一个委员会,该委员会制定了C语言的标准。ANSI C标准于1989年被完全采用,国际标准化组织ISO也采纳了ANSI C标准,并对ANSI C做了部分修改。鉴于ISO的权威性,ANSI于1990年初重新采纳ISO C,合称为ANSI/ISO Standard C。1989年的C标准称为C89。20世纪末,随着计算机技术的飞速发展,新的程序设计语言和技术不断产生。此时出现了结合C语言的优点和面向对象编程技术的程序设计语言——C++。但是C语言并没有因此退出历史舞台,而是结合了新的计算机技术的特点,不断改进,最终于1999年形成新的C语言标准,称为C99。1.1.2 C语言标准随着C语言的发展和广泛使用,出现了多个版本的C编译器,程序设计人员意识到需要一个全面、系统的标准。为满足这一要求,美国国家标准化组织(ANSI)在1983年设置了一个专门委员会,制作C语言的标准。该标准于1989年被正式采用,称为ANSI C(又称C89)标准。在推出ANSI C标准化后,在相当长一段时间内该标准都保持不变。从1994年起, ANSI开始了修订标准的工作,这就是后来推出的ISO9899:1999(1999年出版)。这个版本就是通常提及的C99。它被ANSI于2000年3月采用。C99和C89的大多数特性差别很小。总的来说,C99和C89之间主要有以下区别:● C99修改了C89的一些语法。● C99在C89的基础上增加一些关键字。提示初学者只需要知道C语言有C89和C99两个标准即可,可在学习本书后面的内容后再了解具体的修改或增加特性。为了知识结构的完整性,在此处简单列出C99修改或增加的特性。1.C99修改的特性在C99中增加的大多数特性,都是标准委员会做的创新。其中多数是以各种C工具提供的语言扩展为基础,还有一些是从C++中借用的。C99中修改的特性主要包括以下内容:● 增加单行注释。这种注释以“//”为开头,“//”以后的同一行内所有字符都是注释内容。● 长度可变数组。在C89中数组的长度必须是固定的;在C99中数组的长度可以用变量或表达式表示,根据变量或表达式的值确定数组的长度。● C89中所有变量必须在第一条表达式之前声明;C99取消了这个限制,可以在使用该变量之前任何位置声明此变量。● 函数必须有返回值。C89中如果函数没有指定类型,则默认为int类型;C99取消了这个特性,并且必须明确指定返回类型。● 预处理中宏可以设定参数,宏定义中用(…)表示,预处理标识符__VA_ARGS__表示在什么情况下替换参数,如#define ClassAVG(…) avg(__VA_ARGS__)。● C99中增加了__func__预定义标识符,此标识符用来表示它所在的函数的名字。2.C99增加的关键字与C89标准相比,C99标准新增加以下关键字:● _Bool:C99增加了_Bool类型。C++中有bool类型,用来保存布尔类型,该类型有两个常量:true和false。但是,C99中的_Bool和C++中的bool是不同的。C99标准中增加了头文件stdbool.h,并在该文件中定义了宏bool、true和false。如果在C99的程序中使用这些宏就需要把头文件stdbool.h包含到程序中。● _Complex:由于C89标准不支持复数类型,在进行复数运算时需要自定义数据类型。在C99标准中可以使用_Complex和_Imaginary关键字,进行复数运算。在C99中增加了头文件complex.h,在该文件中增加了两个宏complex和imaginary,使用时需要在程序中包含头文件complex.h。● inline:在C99和C++中都有这个关键字,都是用在函数之前,表示该函数为内联函数,程序在编译的时候直接扩展为函数的代码而不是调用函数。● restrict:restrict关键字只用来修饰指针。最初由restrict指针所指向的对象,必须由第二个指针基于restrict指针时才能进行对象的存取动作。1.2 C语言的特点从C语言产生到现在,C语言已经成为最重要和最流行的编程语言之一。在最近10多年中,虽然有许多人从C语言转向使用功能更强大的C++语言,但C语言有其自身的优势,仍然是一种重要的语言。例如,C++、C#、Java等现在流行的程序设计语言都是以C语言的语法为基础的,因此,精通C语言是通向这些C++、C#、Java的必由之路。在学习C语言的过程中,读者将了解到C语言的许多特点,下面先简单列出几个优点。1.2.1 简洁紧凑C语言一共有32个关键字,9种控制语句。程序书写自由,主要用小写字母表示,它把高级语言的基本结构和语句与低级语言的实用性结合起来。1.2.2 灵活高效C语言是一种高效的语言,其代码很紧凑且运行效率高。C语言是“中级语言”,但并不是指C语言比高级语言低级,而是指C语言吸收了其他高级语言的许多优点,又结合汇编语言的特点。因此C语言比其他任何一种高级语言强大、灵活,又比汇编语言更适合程序开发。高效不仅仅是指程序开发上的高效,更重要的是其执行效率高。C语言和汇编语言一样可以对硬件进行编程,所以大部分系统都用C语言做底层开发。C语言程序生成代码质量高,程序执行效率高,一般只比汇编程序生成的目标代码效率低10%~20%。1.2.3 强大的控制结构C语言是结构化程序设计语言。结构化程序设计可以对代码和数据进行封装,既能保证代码和数据的安全,又可以实现模块化程序设计,实现代码的可重用,从而既可以保证程序安全,又能提供程序开发效率。C语言功能强大,包含多种循环语句和条件分支语句。通过这些语句开发人员可以轻松实现各种复杂的功能,开发人员根据实际情况选择最合适的语句。C语言还支持自定义数据类型,通过自定义数据类型,开发人员可以进行复杂的运算。另外,C语言还支持指针和逻辑运算。1.2.4 可移植性C语言是可移植的语言。C语言适合多种操作系统,包括DOS、Windows、UNIX和Linux等。在一个操作系统中编写的C程序可不修改(或进行少量修改)就在其他系统上运行。除了在不同操作系统间进行移植外,C语言还可使用在不同架构的计算机系统。C编译器可在约40种系统上使用,从PC机(个人计算机)、小型机、直至大型超级计算机。在这些不同的系统中移植代码时,只需修改指针对特殊硬件操作的代码即可。提示C编译器是指将C语言源代码转换为计算机内部机器码的程序。在UNIX和Linux中都包含C编译器。在DOS、Windows等操作系统中,可有多种C编译器供选择使用,需另外安装。1.2.5 C语言的缺点C语言在提供上述优点的同时,也有自身的一些缺点。常见的缺点有以下几种:● C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。● 指针是C语言的一大特色,可以说C语言优于其他高级语言的一个重要原因就是因为它有指针。通过指针可以直接对硬件进行操作。但是,C的指针操作也给它带来了很多不安全因素。C++在这方面做了很好的改进,在保留指针操作的同时又增强了安全性。Java取消了指针操作,提高了安全性。● 由于C语言的简洁性,可能经常会在代码中见到多个运算符重叠结合的情况。有时候,这种表示方式将导致C程序代码极难理解。解决该缺点的方法是,程序员要养成良好的编码习惯,尽量将代码写得简单易懂(多增加代码行数是一个可行的方法)。1.2.6 C与C++的关系C++是由Bjarne Stroustrup设计并实现、建立在C基础上的面向对象的编程语言。可以说C是C++的子集,C++是C的超集,C++包含了全部的C语言特性。C++和C最大的不同就是引入了“类”的概念,同时对C++又增强了一些C语言的特性(这里所说的C是以C89为标准)。现在大部分的C++编译器能编译C语言代码,但是由于C++是以C89标准为基础的,而C99对C89做了一些修改,在使用C++编译器编译C程序时注意代码要符合相应的标准。只有编译器支持C99标准,才能在程序中包含符合C99特性的代码。1.3 C语言程序开发过程如果读者在学习C语言之前使用过其他程序设计语言,应该对程序开发过程有一定的了解。使用C语言进行程序开发一般的过程可分为7个步骤,如图1-1所示。图1-1 C语言程序的开发过程1.3.1 定义程序目标在程序开发过程中,首先要明确目标,如果没有了目标,程序开发就成了空谈。所谓程序目标,就是希望程序做什么。然后围绕这一目标,考虑需要向计算机输入哪些信息,再通过什么样的操作,最后输出需要的信息。例如,编制程序用来计算圆的面积,需要用户输入圆的半径或直径,通过程序计算后输出圆的面积。程序开发的目标还要具有可行性。在明确目标的时候要对目标的可行性进行详细分析,如果目标不可行,那么就要及时更改目标。只有开发目标可行,才能制订详细的开发计划,进行程序开发。1.3.2 设计程序程序设计在整个程序开发过程中至关重要。程序设计分为概要设计和详细设计两个阶段。概要设计要对整个程序设计形成一个完整的说明书。该说明书包含程序设计的基本流程、功能划分、模块设计、数据结构和异常处理等内容。设计完程序的基本结构之后,需要对程序的各个部分进行详细设计,最终形成详细设计说明书。详细设计是对程序的流程控制、功能的实现、算法和异常处理等进行详细设计。对于简单的程序,可直接进入详细设计。注意在这一步中并不进行详细的代码设计,主要侧重于怎么表示数据,用什么方法处理数据,程序的逻辑流程等方面的构思。1.3.3 编写源代码在将程序的逻辑结构设计好之后,就可以使用C语言来进行编码了。从这一步开始,就需要使用C的相关知识了。源代码由一系列的C语句组成,用于指示计算机执行设定的任务。一般的C开发环境都提供编写代码的环境,如图1-2所示为Dev-C++开发环境中输入代码的界面。也可在其他文本编辑器(如DOS中的Edit、Windows中的“记事本”、Linux中的ed或vi等)中编写C语言代码,然后再使用C编译器对源代码进行处理。如图1-3为使用UltraEdit编辑器编写C代码。图1-2 在C开发环境中输入代码图1-3 在UltraEdit中输入代码提示UltraEdit是一个功能强大的编辑器,可以编辑文本、十六进制、ASCII码。使用该编辑器将输入的C、C++、VB、HTML等代码关键字突出显示,可同时编辑多个文件。C源代码文件必须为纯文件格式,即不能包含设置文档格式的特殊代码。如在Windows中使用“写字板”或Word等程序编写的文档可对文字设置特殊的格式,若要使用这类编辑程序编写C源代码,在保存文件时需将其保存为“纯文本”格式。编写代码是一个非常烦琐、复杂的工作,代码的编写不但要符合上一步的设计要求,还要尽量在格式上保持一致。良好的编码格式不但便于阅读理解,更有利于检查调试。保存源代码时,必须为每个源文件取一个文件名。C语言程序的源文件以.c为扩展名,头文件以.h为扩展名。1.3.4 编译和链接C源代码可供程序员进行阅读,了解程序的执行过程。但计算机并不能识别源代码中的字符,计算机只能识别称为机器语言的二进制指令。C编译器就是将C源代码转换为对应的机器代码的程序。C的核心是编译器。编译器将上一步编写的源代码(文本格式)转换为可执行的代码。可执行代码是用计算机机器语言表示的代码,是控制计算机执行不同操作的指令。不同的硬件系统具有不同的机器语言,C编译器用来将C源代码转换为特定计算机的指令。C编译器还检查每一行源代码是否正确,通过编译可以及时发现代码编写中的错误,并将错误信息显示出来,方便用户根据错误修改源代码。根据错误级别也可能不生成二进制文件。编译顺利完成后,将生成二进制的中间文件,该文件以.obj或.o为扩展名。编译完整后还需要进行链接,链接时把编译产生的.obj文件或.o文件和其他库文件链接到一起,生成一个可执行文件——扩展名为.exe。库中包含许多标准函数供用户调用,这些函数不需要用户额外编码即可直接调用,可提高程序的开发效率。1.3.5 测试C程序通过编译链接后,将生成一个可执行文件。在DOS和Windows中通过扩展名.exe来标志可执行文件。运行生成的可执行文件,检查程序是否能顺利执行、界面是否和程序设计要求一致。若程序不能运行,或界面不符合设计要求,还需返回到设计或编码阶段,检查设计和编码的问题,再重新编译链接生成新的可执行文件。编译后的程序能运行并不表示其运行正确。程序在交给用户使用之前还必须进行多种测试。测试不需要知道程序的具体实现方式,只需检查给定的输入能不能产生设计要求的输出。通过测试可以及时发现程序设计和代码编写存在的问题。如果程序运行中出现异常、某些方面未能达到设计要求,就要进行调试。利用调试工具对程序运行过程中出现的异常进行跟踪,确定程序出现问题的位置,进行修改,并重新编译运行,直到程序能稳定运行并达到设计要求为止。1.3.6 维护和修改程序交付使用后,可能在使用过程中发现新的问题,使用者有可能会对程序提出新的要求,这就需要对程序重新设计、对程序代码进行修改、编译运行,直到测试通过。1.3.7 总结程序开发是一个周期性的过程,每个程序的开发经过以上各个阶段最终才能成为一个成熟的作品。程序的开发,从提出目标,经过设计开发、使用维护、程序修改,最终会因为不再适用使用者的需求而停止使用。这个时候就需要设计开发另一种程序,这就是程序的生命周期。1.4 创建第一个C程序学习程序设计最好的方法就是编写程序代码,并上机调试。本章最后一节介绍一个最简单的C程序,让读者了解C程序代码输入、编译链接、测试的过程。提示因为还未介绍C的任何语法成分,读者可能无法理解本例中的所有内容。在这里,读者只需按步骤操作即可。本例的C程序用来在计算机屏幕上显示文字“这是第一个C程序!”。程序清单如下,在向编辑器中输入程序时,不要输入最左边的行号和冒号。在程序清单中添加行号,主要方便后面对程序各语句的讲解。【程序1-1】第一个C语言程序1.4.1 C程序结构每一种程序设计语言都有其特定的语法规则,按照规则编写程序不仅仅便于阅读,更有利于减少错误的发生。C语言程序一般由两大部分组成:程序头部、完成程序功能的一个或多个函数。(1)程序头部:在程序开头部分一般是一个或多个#include语句,用来导入头文件程序中将使用库函数的声明部分;在程序开头部分还可能包括宏定义、变量的定义语句。(2)函数:C语言完成具体功能的代码必须编写在函数中。一个C程序可以有一个或多个函数,但必须有一个(且只能有一个)函数的名称为main。C语言程序运行时总是先从main()函数开始的。1.4.2 输入程序代码本例中的程序代码很短,可以直接在开发环境中编写输入。下面演示在Dev-C++中输入本例代码的过程。启动Dev-C++开发环境。执行菜单“文件/新建/源代码”命令(或按快捷键“Ctrl+N”)新建一个空白代码文件。在新打开的窗体中依次输入本节开头部分给出的C源代码,按Enter键换行。行号不需要输入,左侧的行号是开发环境生成的,并不是源代码的一部分。最后得到如图1-4所示的代码。图1-4 输入源代码输入代码后,可根据需要随时对每行代码进行检查修改。在Dev-C++开发环境中,语句的不同部分将显示不同的颜色,非常醒目。注意C程序对大小写敏感,即代码中要区分大小写的,在输入代码时要特别注意。使用过Basic语言的读者要特别注意这点。代码输入完毕后,执行菜单“文件/保存”命令保存源代码,将打开如图1-5所示对话框,选择保存源文件的位置,在“保存类型”中选择保存为扩展名为“.c”的文件(C++源文件保存的扩展名为“.cpp”),输入源文件名称(如“1-1”),单击“保存”按钮完成保存操作。图1-5 保存源代码1.4.3 编译链接程序在Dev-C++开发环境中,编译链接程序的操作可直接在开发环境中进行,非常简单,具体步骤如下:执行菜单“运行/编译”命令,将对当前源代码进行编译操作,同时显示如图1-6所示编译进度对话框。完成编译后,该对话框的“Status”将显示为“Done”。单击“关闭”按钮退出对话框。在Dev-C++中执行编译命令时,将同时将编译生成的目标文件链接成可执行文件。因此编译后就可执行菜单“运行/运行”命令查看程序的运行结果。编译生成的程序在DOS环境中运行,因此,执行菜单“运行/运行”命令后,会看到Windows XP的命令窗口闪一下就消失了。这时,可转到命令窗口模型去执行编译生成的程序。例如:本例编译链接后将生成一个名为“1-1.exe”的文件。进入命令窗口,通过DOS命令切换到编译生成文件的目录,在命令提示符中输入文件名“1-1”,按Enter键将运行该程序。在屏幕上输出一个字符串,如图1-7所示。图1-6 编译图1-7 在命令窗口运行程序除了在集成开发环境中,通过菜单方式对源代码进行编译链接外,许多编译器也提供了通过命令方式编译链接。1.4.4 调试程序对于初学者,在输入代码时可能会出现一些错误,如关键字的大小写、少输入语句结束符等。这些错误都可以在编译时被编译器发现,并将错误信息显示在开发环境的下方。例如,在如图1-8所示的代码中,第5行代码printf后面未输入分号。图1-8 编译错误执行菜单“运行/编译”命令时会发现错误,并显示在下方,如图1-8所示。在下方的错误信息分为两行:第1行提示错误是由main函数中的语句产生的;第2行提示错误在第6行,错误原因是return的语法错误。这里发现一个问题,明明是第5行错误,为什么编译器报错在第6行,而且是语法错误呢?在C代码中,每条语句结束都要用分号“;”隔开。在第5行中少输入分号,编译器将第5行和第6行作为一条语句,当然就出现语法错误了。编译到第6行时发现语法错误,所以报错时显示的是第6行。所以,如果在指定行找不到编译器指出的错误,在上一行代码中一般都能找到。这只是一个常见错误,在程序中还可能出现各种错误,通过错误信息提示,一般都能快速找到出错的行。1.4.5 程序语句的含义因还未正式学习C语言的相关语法,对本节的程序代码无法理解。下面对【程序1-1】中各语句的作用进行简要说明:第1行语句中,#include是一个预处理标识符,用来导入头文件stdio.h。stdio.h中包含标准输入/输出函数的定义(如,在本例中使用的printf函数的定义,若不包含该头文件,就不能使用printf函数向屏幕输出信息)。第2行为一个空行,在C源程序文件中,常用空行来分隔程序段,提高源代码的可读性。在C编译器中将忽略这些空行(也就是说,在代码行之间可插入多个空行,而不影响最终生成的程序)。第3行定义一个名为main的函数。C程序是由一个或多个函数组成的,其中必须有一个(且只能有一个)名为main的函数,该函数是程序的入口。该行中的int表示main()函数返回数据的类型。第4行和第7行为一对大括号,大括号中是main函数的代码。在C语言中可使用大括号将一条或多条语句括起来作为一个代码块。在C语言中,代码块的作用很多,在本书后面将会介绍。第5行代码调用printf函数,向屏幕上输出一个字符串。printf是最常用的输出函数,其声明包含在头文件“stdio.h”中,因此,在要使用printf函数的C源代码中,必须要使用#include包含该头文件。在printf函数中,用(半角)双引号包括的字符串将输出到屏幕上。在双引号包含的字符串中有两个特殊的字符“\n”,在C语言中这两个符号合在一起表示一个换行,即在屏幕上输出字符串后,将光标换到下一行。语句的结尾是一个半角的分号“;”,在C语言中每条语句都必须以“;”为结尾,如果两条语句之间没有“;”,C语言在编译的时候会认为是一条语句。在最后以“”包含的部分为程序的注释,在程序中添加注释可提高程序的可读性,C编译器将忽略注释的内容。第6行语句用来给函数返回值。在C程序中,每个函数都可以有一个返回值。程序在执行完return语句后将退出return语句所在的函数。这条语句表示main函数的返回值为0。第2 章 C程序的组成在第1章中介绍了一个向屏幕上输出字符串的简单程序,这是最简单的C程序,仅用来演示C程序的结构外,实用价值不大。本章将编写一个完整的程序,也有一定的实用价值,使读者对C程序的组成有一个完整的概念。2.1 一个完整的C程序本章编写一个C程序,用来计算圆的面积和周长。运行程序时,将接收用户输入的数据,然后调用计算面积函数和计算周长的函数进行计算,并将计算结果输出到屏幕上。2.1.1 分析程序目标示例程序需要达到的目标:● 计算圆的面积。● 计算圆的周长。这两个目标都是可行的,其中计算圆的面积的公式为:计算圆的周长的公式为:从以上两个公式可以看出,要达到这两个目标,必须要知道圆的半径r。若在程序中直接定义r的值,则程序只能得到半径为r的圆的面积和周长,不具有通用性。为了使程序具有通用性,可让程序运行时让用户输入r值。2.1.2 设计程序通过对程序目标进行分析,知道了程序需要的输入、输出值。接着就可以设计程序,以达到需要的目标。本例的程序很简单,可直接进行详细设计阶段。程序可分为3个函数:● 主函数main:接收用户输入的半径,调用函数area计算面积、调用函数perimeter计算周长,将并计算结果输出到屏幕上。● 计算面积的函数area:根据参数r,计算并返回圆的面积。● 计算周长的函数perimeter:根据参数r,计算并返回圆的周长。C程序由多个函数组成,本例将使用上面列出的3个函数。在一个C源文件中可包含一个或多个函数,另外在函数外还可定义包含语句、定义常量、声明自定义函数的原型等语句。本例程序的流程图如图2-1所示,其中(a)图为函数外的语句流程,(b)图为主函数main的流程,(c)图为计算面积函数area的流程,(d)图为计算周长函数perimeter的流程。图2-1 程序流程图2.1.3 编写代码根据图2-1设计的程序流程编写C代码,具体的代码如下:【程序2-1】C语言程序组成示例提示每行代码前的行号是为了后面分析程序方便而添加的,不是C程序中的内容,读者在输入程序代码时不能输入这些行号和后面的冒号。执行菜单“文件/保存”命令,将输入的C代码保存到名为“2-1.c”的文件中。2.1.4 编译运行程序在Dev-C++开发环境中输入上面的代码后,执行菜单“运行/编译”命令对代码进行编译。本例的代码有38行,可能会有输入错误的情况,根据编译提示进行修改,直到通过编译为止。另外,本例代码第7行中定义的main函数类型为void(不返回值),在编译时将产生如下所示提示信息:以上警告信息的意思是:函数main的返回值不是int类型。编译通过后,进入Windows的命令窗口,使用DOS命令切换到保存编译文件的目录,在DOS提示符后面输入编译生成的文件“2-1”,按Enter键,将弹出提示信息,要求用户输入半径,输入5按Enter键,将显示半径为5的圆面积和周长,如图2-2所图2-2 程序运行结果示。注意程序中使用中文字符显示提示信息,若命令窗口不在中文模式,将只能看到乱码。2.2 C程序的组成上节的C程序共有38行,本节将对程序中各行语句进行分析,使读者对C程序的组成有一个完整的认识。2.2.1 包含指令在程序的第1行为一个包含指令#include。在C程序中,一般文件的开始部分都是包含指令。C编译器遇到包含指令时,将指定的包含文件添加到程序中。包含文件的扩展名为“.h”,一般称为头文件。在这些头文件中,包含了对库函数原型的声明、常量的定义等内容。在一般的C开发环境中都包含有多个头文件,分别对应不同的库函数。例如,要使用printf函数,就必须在程序中包含“stdio.h”头文件;要使用数学函数pow,则必须包含“math.h”头文件。用户也可定义自己的头文件,在其中包含函数原型声明、常量定义等内容。有两种方式使用#include指令:● 一种是在包含指令后用“<>”将头文件名括起来。这种方式用于标准或系统提供的头文件,到保存系统标准头文件的位置查找头文件。保存系统标准头文件的位置可进行设置,Dev-C++中设置包含文件目录的相关操作,参见下一章中的介绍。● 另一种是在包含指令后用双引号将头文件名括起来。这种方式常用于程序员自己的头文件。用这种格式时,C编译器先查找当前目录是否有指定名称的头文件,然后再从标准头文件目录中查找。例如:以下两行代码是分别使用两种不同方式编写的包含语句。第1行语句指定编译器从标准头文件目录查找头文件“stdio.h”;第2行语句指定编译器先从当前目录查找头文件“stdio.h”,若当前目录未找到该头文件,再从标准头文件目录中查找。2.2.2 定义常量在程序的第2行,使用#define定义一个符号名PI,其值为3.1415926。当程序被编译时,程序中第2行后面的PI都会被替换成3.1415926。有关#define语句的详细使用,参见本书第17章中的介绍。使用符号常量的好处在于,其名称可以给程序员起提示作用。例如:本例中的PI表示圆周率。另一个好处是修改方便,例如,在本例中要修改圆周率的精度(如修改为3.14),只需修改第2行定义符号常量的语句即可。若不使用符号常量,则需要修改第22行和第33行。2.2.3 声明函数原型程序中第4行和第5行声明函数原型。在C语言中,函数声明称为函数原型。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。以前C版本的函数声明方式不是采用函数原型,而只是声明函数名和函数类型。例如:以上声明不包括参数类型和参数个数。系统不检查参数类型和参数个数。新版本也兼容这种用法,但不提倡这种用法,因为它未进行全面检查。实际上,如果在函数调用前,没有对函数作声明,编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。使用这种方法时,系统无法对参数的类型做检查。或调用函数时参数使用不当,在编译时也不会报错。因此,为了程序的清晰和安全,建议都加以声明为好。2.2.4 main函数第7行至第20行为main函数的代码。在C程序中,必须有且只有一个名为main的函数,最简单的C程序只有一个main函数(如上一章中的例子)。C程序将main函数作为入口程序,在该函数中编写代码完成程序功能,或调用其他函数完成程序功能。执行到main函数的return语句,结束整个程序的运行。main函数的定义有多种格式。如:第1种形式说明main函数没有返回值、也没有参数。第2种形式说明main函数的返回值为int型(需在程序中使用return返回一个整型值),不接收参数。第3种形式说明main函数的返回值为int型,并且函数接收命令行参数。在C89标准中,第1种形式是可以接受的,但在编译时将显示一个警告信息。而C99标准只支持后两种形式,因此,建议读者尽量使用后两种形式定义main函数。2.2.5 程序语句C程序是由多语句构成的,不同的语句完成不同的功能。在C程序中,一般一个语句占用一行,语句以分号“;”结束。在本例的程序中使用了以下语句:1.变量定义程序中的第9行、第10行、第25行、第34行为变量定义语句。C语言中,使用变量之前必须先定义。编译器遇到变量定义语句时,按变量的类型为变量分配内存空间。2.输出语句程序中第12行、第18行、第19行使用printf库函数向屏幕上输出信息。第12行在屏幕上显示一个提示信息,提示用户输入圆的半径;第18行输出圆的面积、第19行输出圆的周长。3.输入语句程序的第13行为输入语句。scanf库函数用于从键盘接收用户的输入,并将结果保存到指定的变量中。在本例第13行中,将用户输入的数值保存到变量r中。在scanf语句中,需在保存输入值的变量前加上符号“&”。本书后面将要介绍,这是一个取地址运算。4.运算语句程序的第15行、第16行、第27行和第36行为运算语句。第15行和第16行分别调用area和perimeter函数,将函数运算的结果保存到变量s和l中。第27行为计算圆面积的公式,第36行为计算圆周长的公式。5.返回语句程序的第28行和第37行为返回语句,使用return语句返回函数的结果。第15行和第16行的语句将接收函数的返回值。函数的返回值的类型必须与定义函数时指明的类型相同。若函数的类型为void,则不需要返回值。2.2.6 函数定义在C语言中的函数相当于Basic语言的子程序、Pascal语言的过程。通过函数将相关功能封装,调用函数时不必了解函数的实现细节。在ANSI C中提供了数量众多的库函数,这些库函数都是程序中常用的功能,如本例中使用的scanf和printf两个库函数。在更多的情况下,用户需要编写自己的函数,以完成特定的功能。函数定义包括两部分:函数头和函数体。函数头定义函数的名称、参数和函数返回值的类型,而函数体则定义函数具体完成的工作。在本例中有3个函数main、area和perimeter,第7行、第23行和第32行分别为三个函数的函数头。从函数头的定义可看出,main函数无参数无返回值,area和perimeter函数需要一个float类型的参数,并返回一个float类型的值。紧跟在函数头后面是一个左大括号“{”,从该处开始定义函数体。main函数的函数体为第8~20行,area函数的函数体为第24~29行,perimeter函数的函数体为第33~38行。2.2.7 注释为程序添加注释是一个好的编程习惯。C编译器将忽略所有注释内容,注释不是写给编译器的,而是写给程序员阅读的。当一个程序比较简单时,注释显得有点多余。但随着程序的变大,参与开发人员的增多,在程序中通过注释说明程序结构和逻辑,可使代码的可读性大大提高。在ANSIC中,使用“”作为注释的定界符,包含在该符号内部的字符都被作为注释,编译将忽略。注释可单独占一行(如本例程序中的第22、31行),也可占用一行的部分如第2、4、5行等。另外,注释还可以占用多行,如以下代码:利用这一特性,可在调试程序时快速屏蔽程序行。在需要屏蔽的程序行前面加上注释符“”,在屏蔽程序最后一行的后面加上“”,即可将这部分代码作为注释,编译器将不再对其进行编译。注释不能嵌套,即一个注释中又包含另一个注释。如以下形式的注释在大部分编译器中都将产生错误:即使有的编译器支持这种嵌套,读者也应养成不使用嵌套注释的习惯。在C99中支持单行注释,这是C++中早就有的特性。单行注释使用双斜杠来标志注释,例如:

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载