新書推薦:
《
尼罗河往事:古埃及文明4000年
》
售價:NT$
347.0
《
一个人·谁也不是·十万人(诺贝尔文学奖得主反思自我的巅峰之作)
》
售價:NT$
250.0
《
重写晚明史(全5册 精装)
》
售價:NT$
3560.0
《
汉末晋初之际政治研究
》
售價:NT$
602.0
《
强者破局:资治通鉴成事之道
》
售價:NT$
367.0
《
鸣沙丛书·鼎革:南北议和与清帝退位
》
售價:NT$
551.0
《
从康德到黑格尔的发展:兼论宗教哲学(英国观念论名著译丛)
》
售價:NT$
275.0
《
突破不可能:用特工思维提升领导力
》
售價:NT$
352.0
|
編輯推薦: |
计算机知识已成为在校学生必须掌握的一门技能,要能熟练地使用计算机,特别是利用计算机开发软件,必须至少熟练地掌握一门计算机语言。
杜友福等编著的《C语言程序设计第3版)》为《C语言程序设计》的修订第三版,全书共十三章,全面地介绍了C语言的基本语法及C语言程序的设计方法。每章后面均配有大量的习题,在做选择题时,不仅要选择答案,更重要的是要学会分析,为什么是对的?错在什么地方?这样才有收获。在做程序填空题时,最好是将填空后的完整程序在机器上调试一下,这样有助于对程序及算法的分析和理解。编程题,要自己独立编写并上机调试。通过一系列环节的训练,才能达到学好C语言的目的。
|
內容簡介: |
《C语言程序设计(第三版)》是《C语言程序设计》的第三版,为C语言程序设计课程教材。《C语言程序设计(第三版)》共分13章,全面地介绍了C语言的基本语法及C语言程序的设计方法,内容包括:C语言程序设计概述,数据类型、运算符与表达式,顺序结构程序设计,选择结构程序设计,循环结构程序设计,数组,函数,用户标识符的作用域和存储类,编译预处理,指针,结构体、共用体和用户定义类型,位运算,文件。每章后面均配有大量的习题,附录中介绍了C语言的关键字、ASCII代码表、运算符及其优先级和结合性、C语言的常用库函数。为了便于教学和自学,《C语言程序设计(第三版)》配有《C语言程序设计导学》(第三版)。
《C语言程序设计(第三版)》特别适合于本、专科非计算机专业的初学者,也可供计算机等级考试者和其他各类学习者使用参考。
|
目錄:
|
第1章 C语言程序设计概述
1.1 程序和程序设计语言
1.1.1 程序与程序设计
1.1.2 程序设计语言
1.1.3 语言处理程序
1.1.4 设计程序的基本原则
1.2 算法
1.2.1 算法及算法的特性
1.2.2 算法的表示
1.3 结构化程序设计方法
1.4 C程序的基本结构
习题1
第2章 数据类型、运算符与表达式
2.1 C语言的数据类型
2.2 常量、变量与标识符
2.3 整型数据
2.4 实型数据
2.5 字符型数据
2.6 算术运算符和算术表达式
2.7 赋值运算符与赋值表达式
2.8 逗号运算符与逗号表达式
2.9 求字节数运算符
习题2
第3章 顺序结构程序设计
3.1 C语句概述
3.2 赋值语句
3.3 数据的输入与输出
3.3.1 printf函数
3.3.2 putchar函数
3.3.3 scanf函数
3.3.4 getchar函数
3.4 顺序结构程序举例
习题3
第4章 选择结构程序设计
4.1 关系运算和逻辑运算
4.1.1 逻辑值及其在C语言中的表示
4.1.2 关系运算符与关系表达式
4.1.3 逻辑运算符与逻辑表达式
4.2 if语句
4.2.1 if语句的三种常用形式
4.2.2 if语句的嵌套
4.3 条件运算符和条件表达式
4.4 switch语句
4.4.1 switch语句的一般形式与执行过程
4.4.2 switch语句体中的break语句
4.5 选择结构程序举例
习题4
第5章 循环结构程序设计
5.1 语句标号、goto语句及用goto语句构成的循环
5.2 while语句和用while语句构成的循环
5.3 do-while语句和用do-while语句构成的循环
5.4 for语句和用for语句构成的循环
5.5 循环结构的嵌套
5.6 break语句和continue语句在循环体中的作用
5.6.1 break语句
5.6.2 continue语句
5.7 循环结构程序举例
习题5
第6章 数组
6.1 一维数组
6.1.1 一维数组的定义
6.1.2 一维数组元素的引用
6.1.3 一维数组的初始化
6.1.4 一维数组的定义和数组元素引用举例
6.2 二维数组
6.2.1 二维数组的定义
6.2.2 二维数组元素的引用
6.2.3 二维数组的初始化
6.2.4 二维数组的定义和数组元素引用举例
6.3 字符数组
6.3.1 字符数组的定义与引用
6.3.2 字符数组的初始化
6.3.3 用字符数组来存放字符串
6.3.4 字符数组的输入与输出
6.3.5 用于字符串处理的函数
6.3.6 字符数组应用举例
习题6
第7章 函数
7.1 库函数
7.2 函数的定义和返回值
7.2.1 函数的定义
7.2.2 函数的返回值
7.3 函数的调用
7.3.1 函数调用的一般形式
7.3.2 函数调用的方式
7.4 函数的声明
7.4.1 函数声明的形式
7.4.2 函数声明的位置
7.5 调用函数和被调用函数之间的数据传递
7.5.1 变量作为参数
7.5.2 数组名作为参数
7.6 函数的嵌套调用与递归调用
7.6.1 函数的嵌套调用
7.6.2 函数的递归调用
7.7 程序举例
习题7
第8章 用户标识符的作用域和存储类
8.1 局部变量、全局变量和存储分类
8.1.1 用户标识符的作用域及变量的生存期
8.1.2 局部变量、全局变量和存储分类
8.2 局部变量及其作用域和生存期
8.2.1 auto变量
8.2.2 register变量
8.2.3 静态存储类的局部变量
8.3 全局变量及其作用域和生存期
8.3.1 全局变量的作用域和生存期
8.3.2 全局变量的作用域扩展
8.3.3 静态全局变量
8.4 外部函数与内部函数
8.4.1 外部函数
8.4.2 内部函数
习题8
第9章 编译预处理
9.1 宏定义
9.1.1 不带参数的宏定义
9.1.2 带参数的宏定义
9.1.3 终止宏定义
9.2 文件包含
9.3 条件编译
习题9
第10章 指针
10.1 指针的基本概念
10.2 指针变量的定义与引用
10.2.1 指针变量的定义
10.2.2 指针变量的引用
10.2.3 指针变量的赋值运算
10.2.4 二重指针变量
10.2.5 空指针和void类型指针
10.3 函数之间地址值的传递
10.3.1 指针变量作为函数参数
10.3.2 返回地址值的函数
10.4 一维数组和指针
10.4.1 通过指针引用数组元素
10.4.2 数组名或指针变量作形参
10.4.3 使用指针变量处理一维数组的应用举例
10.4.4 用指向字符的指针变量处理字符串
10.4.5 使用指针变量处理字符串应用举例
10.5 多维数组和指针
10.5.1 二维数组和数组元素的地址
10.5.2 通过指向数组元素的指针引用二维数组
10.5.3 通过行指针引用二维数组
10.5.4 指针数组
10.6 函数和指针
10.6.1 用函数指针变量调用函数
10.6.2 用指向函数的指针作函数参数
10.7 小结
10.7.1 指针基本概念与性质小结
10.7.2 有关指针的数据类型的小结
10.7.3 指针运算的小结
习题10
第11章 结构体、共用体和用户定义类型
11.1 结构体类型及结构体变量
11.1.1 结构体类型的定义
11.1.2 结构体类型变量的定义
11.1.3 结构体变量的内存空间大小
11.1.4 结构体变量的引用
11.1.5 结构体变量的初始化
11.2 结构体数组
11.3 指向结构体的指针
11.3.1 指向结构体变量的指针
11.3.2 指向结构体数组的指针
11.4 结构体与函数
11.5 链表
11.5.1 链表概述
11.5.2 链表的基本操作
11.6 共用体
11.6.1 共用体类型的定义
11.6.2 共用体类型变量的定义
11.6.3 共用体变量的引用
11.7 枚举类型
11.8 用typedef定义一种新类型名
习题11
第12章 位运算
12.1 位运算符与位运算
12.2 位运算举例
12.3 位段
习题12
第13章 文件
13.1 C语言文件的基本概念
13.2 文件指针
13.3 文件的打开与关闭
13.3.1 文件的打开fopen函数
13.3.2 文件的关闭fclose函数
13.4 文件的读写
13.4.1 字符的输入与输出fputc函数、fgetc函数、putc函数、getc函数
13.4.2 检查文件是否结束feof函数
13.4.3 字符串的输入与输出fgets函数和fputs函数
13.4.4 二进制数据块的输入与输出fread函数和fwrite函数
13.4.5 格式化的文件输入与输出fscanf函数和fprintf函数
13.5 文件的定位
13.5.1 改变文件读写位置fseek函数
13.5.2 ftell函数
13.5.3 反绕rewind函数
13.6 文件的出错检测
13.6.1 出错检测ferror函数
13.6.2 清除错误标志clearerr函数
习题13
附录A C语言的关键字
附录B ASCII代码表
附录C 运算符及其优先级和结合性
附录D C语言的常用库函数
|
內容試閱:
|
1.1 程序和程序设计语言
计算机是在程序的控制下进行工作的。要想让一台通用的计算机能够正常运行,需要预先安装好一系列的系统程序,如Windows 系统等,它们是由计算机的专业人员编制出来的程序。一般的用户如果要想利用计算机来解决某个具体的实际问题,就需要用户自己动手编写相应的应用程序。程序设计是计算机应用人员的一项基本功,也是当代大学生必须经历的一项基本的思维方式训练。只有学会了程序设计,才能更深入地使用计算机。
1.1.1 程序与程序设计
所谓程序,就是用计算机能够识别的语言所描述的解决某个特定问题的方法和步骤,是由一组相关的指令组成的。通常一个程序主要描述两个方面的内容:一是描述问题的每个对象及它们之间的关系,即数据结构的内容;二是描述对这些对象进行处理的动作、动作的先后顺序,即求解的算法。因此,程序也可以用经典的公式来表示:程序= 数据结构+ 算法所谓程序设计,就是利用计算机解决问题的全过程。通常是对问题进行分析并建立数学模型;在此基础上设计出相应的数据结构和算法;然后用某种程序设计语言编写相应的程序代码;最后调试程序,使之运行后能产生预期的结果。
1.1.2 程序设计语言
程序设计语言是人们根据计算机的特点及描述问题的需要设计出来的、介于人与计算机之间的一种中间语言。随着计算机技术的发展,涌现出了几百种不同风格的程序设计语言,最常用的不过十多种。按照程序设计语言的发展过程,可以将它们分为以下四类。
1.机器语言
机器语言是由二进制代码按一定的规则组成的、能被机器直接理解和执行的指令的集合。机器语言中的每一条语句实际上是一条二进制形式的指令代码(即机器指令) ,机器指令一般由操作码和操作数两个部分组成,操作码表示该指令所要完成的功能,操作数指出完成这个功能所需要的数据或数据在内存中的地址。
例如,某种计算机上计算A = 15 + 10 的机器语言程序如下:10110000 00001111
把15其二进制值为00001111放入累加器A中00101100 00001010 把10与累加器A中的值相加,结果仍放入A中11110100 结束,停机用机器语言编写的程序,计算机可以直接识别和执行,因而执行效率高。但由于机器语言指令跟具体的计算机内部结构有关,不同类型的计算机,其指令系统不同,因此机器语言程序通用性差。另外,机器语言的指令不直观,难认、难记、难理解、难修改、易出错。
因此,很少有人用机器语言直接编程。
2.汇编语言
为了便于理解和记忆,人们采用能够帮助记忆的指令助记符来代替机器语言指令代码中的操作码,用地址标识符或十进制数来代替操作数。指令助记符一般采用描述该指令功能的英文单词的缩写,如用ADD 表示加法操作、SUB 表示减法操作、JMP 表示程序跳转等。这种采用指令助记符的语言就是汇编语言,又称为符号语言。
例如,上述计算A = 15 + 10 的汇编语言程序如下:MOVA,15 把15放入累加器A中ADDA,10 把10与累加器A中的值相加,结果仍放入A中HLT 结束,停机计算机不能直接执行用汇编语言编写的程序,必须由一种专门的翻译程序(即汇编程序)将汇编语言源程序翻译成机器语言程序,计算机才能执行。
3.高级语言
机器语言和汇编语言都是面向机器的语言,一般称其为低级语言。它们对计算机硬件结构的依赖性很大,这就要求程序的开发者必须熟悉和了解计算机硬件的内部结构,因此,它们面对的用户一般是计算机专业人员,用它们开发出来的程序通用性也比较差。
随着计算机技术的发展及计算机应用领域的不断扩大,计算机用户的队伍也在不断壮大,而且这个队伍中绝大部分人不是计算机专业人员。为此,从20 世纪50 年代中期开始,逐步发展并出现了多种面向过程的程序设计语言,称为高级语言。高级语言与具体的计算机硬件无关,其表达方式接近于被描述的问题,接近于自然语言和数学语言,易为人们接受和掌握。使用高级语言,只要关心描述问题的求解过程,不必关心计算机的内部结构。因此,用高级语言编写程序要比用低级语言容易得多,大大简化了程序的编制和调试过程,使编程效率得到大幅度的提高。
例如,上述计算A = 15 + 10 的BASIC 语言程序如下:A=15+10 ''15与10相加的结果放入A中PRINT A ''输出AEND ''程序结束用高级语言编写的程序易学、易读、易修改,通用性好。但是,计算机同样不能直接执行高级语言程序,必须经过语言处理程序的翻译后才能被计算机接受。
下面列出几种最常用的高级语言及其最适用的领域:BASIC 教学和微小型应用程序的开发FORTRAN 科学及工程计算程序的开发PASCAL 专业教学和应用程序的开发C 中、小型系统程序的开发FoxPro 数据库应用程序的开发COBOL 商业、交通和银行等行业应用程序的开发LISP 人工智能程序的开发Prol og 人工智能程序的开发4.面向对象的高级语言面向对象的程序设计语言是在早期的高级语言(面向过程)的基础上发展而来的。面向对象的程序比面向过程的程序更清晰、易懂,更适宜于编写大规模的应用程序,正在成为当代主流的程序设计工具。常用的面向对象的高级语言主要有:Visual Basic ,VisualFoxPro ,Visual C + + ,Java 和C # 等。
面向对象的程序设计方法是一种结构模拟方法,它把现实世界模拟成由许多对象组成的实体,对象与对象之间通过互相发送和接收消息进行联系;消息激发对象本身的运动,形成对象状态的变化。从程序设计的角度来看,每个对象都是一个由若干数据和方法组成的封装体―― 抽象数据类型。
目前,国内外大多数计算机上运行的程序,大多采用高级语言编写。因此,应当熟练掌握用高级语言编写程序的方法和技巧。由于面向过程的语言是程序设计的基础,所以本书以面向过程的C 语言为背景,介绍程序设计的基本概念和基本方法。
1.1.3 语言处理程序
计算机只能直接识别和执行机器语言程序。用汇编语言和高级语言编写的程序,都必须经过一个翻译过程才能转换为计算机所能识别的机器语言程序,实现这个翻译过程的工具是语言处理程序,即翻译程序。翻译程序除了要完成语言间的转换外,还要进行语法、语义等方面的检查。针对不同的程序设计语言编写出的源程序,有各自对应的翻译程序,不能互相通用。翻译程序可分为汇编程序和高级语言翻译程序;高级语言翻译程序有两种工作方式,即解释方式和编译方式,对应的是解释程序和编译程序。
1.汇编程序
汇编程序是一种由专业的软件开发商提供的系统软件,它能将用汇编语言编写的源程序翻译成某种类型的计算机的机器语言程序,即目标程序,这一翻译过程称为汇编。图1.1 是汇编语言源程序的汇编、连接与运行过程示意图。
汇编程序通常是将一条汇编语言指令翻译成一条机器语言指令。在翻译的过程中,还要对每一条指令进行语法检查,若有错误,就中断汇编过程,并以某种方式输出错误的类型及有关信息,以便用户进行修改。若没有错误,就自动生成相应的目标程序,再经过连接处理之后,便可以运行了。运行的是汇编并连接后产生的可执行程序,若源程序作了某些修改,则必须再重新进行汇编与连接处理。
2.解释程序
解释程序的工作过程是将高级语言源程序一句一句地读入,每读入一个语句都要对它进行分析和解释,若有错误就即时中断其解释过程,并通知用户进行修改,若没有错误就按照解释结果执行所要求的操作,其工作过程如图1.2 所示。
BASIC 、LISP 等语言采用解释方式。解释方式灵活、方便,交互性好,解释执行程序的过程中也不会产生目标程序。但因为是边解释边执行,所以程序的执行速度很慢,如果源程序中出现循环结构,解释程序也要重复多次地解释循环体中的每一条语句,造成很大浪费;而且解释方式在程序运行期间始终离不开翻译程序。
3.编译程序
编译程序的功能是将用高级语言编写的源程序翻译成机器语言程序,即目标程序,这一翻译过程称为编译。但目标程序还不能立即装入机器执行,因为还没有连接成一个整体,在目标程序中还可能要调用一些其他语言编写的程序和标准程序库中的标准子程序。
连接程序的作用是将目标程序与有关的程序库组合成一个完整的可执行程序,产生的可执行程序可以脱离编译程序和源程序独立存在并可反复使用。由于经过编译并连接后所产生的可执行程序具有运行速度快、保密性好等优点,大多数高级语言都采用编译方式,如CC + + ,PASCAL ,FORTRAN ,COBOL 等。但每次修改源程序后,都必须重新进行编译与连接处理,其工作过程如图1.3 所示。
与汇编程序不同的是,编译程序往往需要将一条高级语言的语句转换成若干条机器语言指令,而且翻译的过程也要复杂得多。
1.1.4 设计程序的基本原则要设计出一个好的程序,必须了解利用计算机解决实际问题的过程,掌握程序设计的基本技术,并熟练地掌握一种程序设计语言。计算机解决问题的基本过程如图1.4 所示。
如何才能编写出高质量的程序呢? 下面是设计程序时应遵循的基本原则:
(1) 正确性。正确性是指程序本身必须具备且只能具备程序设计规格说明书中所列举的全部功能。它是判断程序质量的首要标准。
(2) 可靠性。可靠性是指程序在多次反复使用过程中不失败的概率。
(3) 简明性。简明性的目标是要求程序简明易读。
(4) 有效性。程序在计算机上运行需要使用一定数量的计算机资源,如CPU 的时间、存储器的存储空间。有效性就是要在一定的软、硬件条件下,反映出程序的综合效率。
(5) 可维护性。程序的维护可分为校正性维护、适应性维护和完善性维护。一个软件的可维护性直接关系到程序的可用性,因此应特别予以关注。
(6) 可移植性。程序主要与其所完成的任务有关,但也与它的运行环境有着一定的联系。软件的开发应尽可能远离机器的特征,以提高它的可移植程度。
1.2 算法为了有效地进行程序设计,不仅要掌握一门程序设计语言,还应该学会对各类问题拟定出有效的解题步骤,即算法设计。有了正确的算法,才能够编制程序。算法的好坏决定了程序的优劣,因此程序设计的核心任务之一就是设计算法。
1.2.1 算法及算法的特性
1.算法所谓算法,就是问题的求解方法。例如,期末考试前的复习计划,就是“复习算法” ;到医院看病,先挂号,后诊断并开出药方,最后再取药等,是“看病算法” 。在计算机中,把解题过程准确的、完整的描述称为解题算法。
一个算法由一些操作组成,而这些操作又是按一定的控制结构所规定的次序执行的,也就是算法由操作与控制结构两个要素组成。
2.算法的特性一个算法应该具有如下特点:
(1) 有穷性。一个算法应该包含有限的操作步骤,而不能是无限的;并且能在有限的时间内完成。
(2) 确定性。每一个步骤都是确定的,而不能是含糊的、模棱两可的。
(3) 有效性。每一个步骤都能得到有效地执行,并得到确定的结果。
(4) 有零个或多个输入。所谓输入是指执行算法时需要从外界取得必要的信息。
(5) 有一个或多个输出。算法的目的就是为了求解,“解”就是输出。
上述所讲的算法特性约束人们去正确地设计算法,使之能够正确无误地执行,达到求解问题的预期效果。同时,算法还应该具有直观、清晰、易懂的表示形式,以利于交流、维护与修改。
1.2.2 算法的表示表示算法的方法有许多种,如自然语言、伪代码、传统流程图、结构化流程图等。
1.自然语言自然语言表示法是表示算法的最原始方法。自然语言就是人们日常使用的语言,可以是汉语、英语或其他自然语言。
例1.1 给出求x1 + x2 + x3 + x4 + x5 的值的算法。
算法分析如下:
(1) 适合手工计算的算法。解题步骤为:
① 将x1 与x2 相加,得到两个数之和;
② 将第① 步的和与x3 相加,得到三个数之和;
③ 将第② 步的和与x4 相加,得到四个数之和;
④ 将第③ 步的和与x5 相加,得到五个数之和。
这种算法虽然是正确的,但太烦琐。如果要求x1 + x2 + … + x100 ,则要写99 个步
骤,显然是不可取的。
(2)适合计算机处理的算法。该算法能更加简洁地表达上述解题过程,并具有通用
性。先定义几个变量:设置变量s 表示多项式之和,其初值为零;设置变量a 表示多项式
中的一项,它的值可以为x1 ,x2 ,… ,x5 ;用i 记录被加了几次,其初值为1 。解题步骤为:
① s 0 ;
② i 1 ;
③ a xi ; (使a 等于多项式中的第i 项)
④ s s + a ;(求和,并将结果保留在s 中)
⑤ i i + 1 ;(计数增值)
⑥ 若i ≤ 5 ,则重复③ 、④ 、⑤ 步,否则计算结束;
⑦ 输出s 。
这个算法就比较灵活,如果想求出100 个数据的累加和,只需将上述算法的第⑥ 步中
的“i ≤ 5”改为“i ≤ 100”即可。
例1.2 求两个正整数m 和n 的最大公约数的欧几里得算法。
欧几里得算法可描述为:
① 从键盘输入两个正整数m 和n 的值;
② 求出m 除以n 的余数r ;
③ 若r = 0 ,则转至第⑥ 步,否则,执行第④ 步;
④ 用n 取代m ,用r 取代n ;
⑤ 转到第② 步,继续求新的m 和n 的最大公约数;
⑥ 输出n 的值,n 的值即为当初那两个数的最大公约数。
用自然语言表示的算法通俗易懂,但文字冗长,容易出现“歧义性” ,在表示包含分支
结构和循环结构的算法时,不太方便和直观。因此,除了很简单的问题以外,一般不用自
然语言来表示算法。
2.伪代码
伪代码是一种介于自然语言和计算机语言之间的、用文字和符号表示的算法。算法中的每一行(或几行)表示一个基本操作,它可以是一行文字,也可以是一个数学公式,还可以是一个某种计算机语言的语句等。它不用图形符号,因此书写方便,格式紧凑,也比较好懂,便于向计算机语言描述的算法(即程序)过渡。但读者必须先了解一种计算机语言之后,才能读懂这些算法,现代的程序设计一般不采用伪代码表示方法。
3.流程图
流程图(flowchart)表示法是在自然语言与伪代码表示法之后出现的一种新的、更加
|
|